支付合单变成非合单

This commit is contained in:
Jack 2025-10-11 20:55:40 +08:00
parent 8b2a127ce3
commit 97e20776c5
9 changed files with 103 additions and 78 deletions

View File

@ -101,6 +101,9 @@ public class ShopOrderData implements Serializable {
@ApiModelProperty(value = "平台费(分给平台或代理商的费用),根据不同的店铺分类,从商品原价中扣除相应的费用。")
private BigDecimal platform_fee;
@ApiModelProperty(value = "拉卡拉手续费")
private BigDecimal lkl_fee;
@ApiModelProperty(value = "店铺统一设置的打包费")
private BigDecimal packing_fee;

View File

@ -74,6 +74,8 @@ public class MchOrderInfoDTO implements Serializable {
private BigDecimal order_shipping_fee;
@ApiModelProperty(value = "平台内部配送费")
private BigDecimal order_shipping_fee_inner;
@ApiModelProperty(value = "拉卡拉手续费")
private BigDecimal lkl_fee;
@ApiModelProperty(value = "平台费")
private BigDecimal platform_fee;
@ApiModelProperty(value = "店铺统一设置的打包费")

View File

@ -559,24 +559,26 @@ public class LakalaPayServiceImpl implements LakalaPayService {
return Pair.of(false, I18nUtil._("退款金额不合法!"));
}
// 3. 初始化拉卡拉SDK
initLKLSDK();
if (StrUtil.hasBlank(lklMerchantNo, lklTermNo)) {
// 4. 获取店铺的拉卡拉商户号和终端号
ShopStoreBase shopStoreBase = shopService.getLklMerchantNoAndTermNo(storeId);
if (shopStoreBase == null) {
log.error("[拉卡拉退款] 无法获取店铺信息: storeId={}", storeId);
return Pair.of(false, I18nUtil._("无法获取店铺信息,退款失败!"));
}
// 4. 获取店铺的拉卡拉商户号和终端号
ShopStoreBase shopStoreBase = shopService.getLklMerchantNoAndTermNo(storeId);
if (shopStoreBase == null) {
log.error("[拉卡拉退款] 无法获取店铺信息: storeId={}", storeId);
return Pair.of(false, I18nUtil._("无法获取店铺信息,退款失败!"));
}
if (StrUtil.isBlank(shopStoreBase.getLkl_merchant_no()) || StrUtil.isBlank(shopStoreBase.getLkl_term_no())) {
log.error("[拉卡拉退款] 无法获取店铺的拉卡拉商户号或终端号: storeId={}, merchantNo={}, termNo={}",
storeId, shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no());
return Pair.of(false, I18nUtil._("缺少商户号参数,退款失败!"));
}
if (StrUtil.isBlank(shopStoreBase.getLkl_merchant_no()) || StrUtil.isBlank(shopStoreBase.getLkl_term_no())) {
log.error("[拉卡拉退款] 无法获取店铺的拉卡拉商户号或终端号: storeId={}, merchantNo={}, termNo={}",
storeId, shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no());
return Pair.of(false, I18nUtil._("缺少商户号参数,退款失败!"));
// 如果商户号和终端号是空的
lklMerchantNo = StrUtil.isBlank(lklMerchantNo) ? shopStoreBase.getLkl_merchant_no() : lklMerchantNo;
lklTermNo = StrUtil.isBlank(lklTermNo) ? shopStoreBase.getLkl_term_no() : lklTermNo;
}
// TODO 重要的逻辑获取是否已经分账已分账分账退回查商家账户余额够不够退回够就执行退回
if (StrUtil.isBlank(refundReason)) {
refundReason = "商家与买方协商退款";
}
@ -585,17 +587,16 @@ public class LakalaPayServiceImpl implements LakalaPayService {
V3LabsRelationRefundRequest refundRequest = new V3LabsRelationRefundRequest();
refundRequest.setOutTradeNo(outTradeNo);
refundRequest.setOriginTradeNo(originTradeNo);
lklMerchantNo = StrUtil.isBlank(lklMerchantNo) ? shopStoreBase.getLkl_merchant_no() : lklMerchantNo;
lklTermNo = StrUtil.isBlank(lklTermNo) ? shopStoreBase.getLkl_term_no() : lklTermNo;
refundRequest.setMerchantNo(lklMerchantNo);
refundRequest.setTermNo(lklTermNo);
refundRequest.setRefundAmount(refundAmount);
refundRequest.setRefundReason(refundReason);
refundRequest.setLocationInfo(new V3LabsTradeLocationInfo(requestIp, null, ""));
log.info("[拉卡拉退款] 请求参数: {}", JSONUtil.toJsonStr(refundRequest));
// 3. 初始化拉卡拉SDK
initLKLSDK();
String responseString = LKLSDK.httpPost(refundRequest);
// 6. 处理响应
if (StrUtil.isBlank(responseString)) {

File diff suppressed because one or more lines are too long

View File

@ -291,8 +291,8 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
// }
if (StrUtil.isBlank(trade_row.getTrade_title())) {
trade_row.setTrade_title("小发同城线上订单商品");
trade_row.setTrade_desc("小发同城线上订单商品");
trade_row.setTrade_title("小发同城-线上商品");
trade_row.setTrade_desc("小发同城-线上购买的商品");
}
// 设置店铺ID
@ -672,9 +672,6 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
String notifyUrl = domain + "/lkl_wxPay_notify_url";
String storeIdStr = Convert.toStr(storeId);// 店铺Id
// TODO 判断订单有没有运费有运费请求合单交易没有运费请求聚合主扫交易
cn.hutool.json.JSONObject lakalaRespJSON = new cn.hutool.json.JSONObject();
BigDecimal shippingFee = shopService.getOrderShippingFee(out_trade_no);
if (shippingFee == null || shippingFee.intValue() <= 0) {
shippingFee = BigDecimal.ZERO;
@ -686,24 +683,25 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
logger.debug("预支付时,查到的订单{},商家配送费:{}元,平台最低配送费要求:{}分", out_trade_no, shippingFee, innerMinDeliverFee);
// 平台最低配送费单位
if (innerMinDeliverFee == null || innerMinDeliverFee.intValue() <= 0) {
// 没有运费
// 拉卡拉预支付返回参数
lakalaRespJSON = lakalaPayService.lklTransPreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(),
appId, openId, storeIdStr, out_trade_no, subject, total_amt,
notifyUrl,
requestIP, trade_remark);
} else { // 有运费的情况
// 拉卡拉合单预支付返回参数
// RMK 这里只有固定一个运费代理商代收运费以后代理商模块做好了要动态读取店铺的运费代理商
lakalaRespJSON = lakalaPayService.lklTransMergePreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(),
delivery_merchant_no, delivery_term_no, // 以后根据代理商动态分配
appId, openId, storeIdStr, out_trade_no, subject, total_amt,
// Convert.toStr(shippingFee.multiply(BigDecimal.valueOf(100)).intValue()),
Convert.toStr(innerMinDeliverFee),
notifyUrl,
requestIP, trade_remark);
}
// if (innerMinDeliverFee == null || innerMinDeliverFee.intValue() <= 0) { // 没有运费
// 内部运费统一由分账接收方收取了 2025-10-11
// 拉卡拉预支付返回参数
// TODO 判断订单有没有运费有运费请求合单交易没有运费请求聚合主扫交易
cn.hutool.json.JSONObject lakalaRespJSON = lakalaPayService.lklTransPreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(),
appId, openId, storeIdStr, out_trade_no, subject, total_amt,
notifyUrl,
requestIP, trade_remark);
// } else { // 有运费的情况
// // 拉卡拉合单预支付返回参数
// // RMK 这里只有固定一个运费代理商代收运费以后代理商模块做好了要动态读取店铺的运费代理商
// lakalaRespJSON = lakalaPayService.lklTransMergePreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(),
// delivery_merchant_no, delivery_term_no, // 以后根据代理商动态分配
// appId, openId, storeIdStr, out_trade_no, subject, total_amt,
// Convert.toStr(innerMinDeliverFee),
// notifyUrl,
// requestIP, trade_remark);
// }
logger.debug("拉卡拉合单预支付返回参数:{}", lakalaRespJSON);

View File

@ -7696,19 +7696,23 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
BigDecimal platformFee = BigDecimal.valueOf(lklSeparateDTO.getPlatAmount() + lklSeparateDTO.getAgent1stAmount() + lklSeparateDTO.getAgent2ndAmount())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
BigDecimal lklFee = BigDecimal.valueOf(lklSeparateDTO.getLklAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
// 防止负值
data_row.setTotal_separate_value(totalSeparateAmount.max(BigDecimal.ZERO));
data_row.setPlatform_fee(platformFee.max(BigDecimal.ZERO));
data_row.setLkl_fee(lklFee.max(BigDecimal.ZERO));
} catch (Exception e) {
log.warn("分账金额计算异常,使用默认值: {}", e.getMessage());
data_row.setTotal_separate_value(BigDecimal.ZERO);
data_row.setPlatform_fee(BigDecimal.ZERO);
data_row.setLkl_fee(BigDecimal.ZERO);
}
} else {
log.warn("拉卡拉分账参数计算失败,使用默认值");
data_row.setTotal_separate_value(BigDecimal.ZERO);
data_row.setPlatform_fee(BigDecimal.ZERO);
data_row.setLkl_fee(BigDecimal.ZERO);
}
Integer voucher_id = (Integer) order_voucher_row.get("voucher_id");

View File

@ -1619,10 +1619,15 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
logger.debug("最后一个商品已添加打包费到退款金额订单ID: {}", order_id);
}
// 有运费的重新生成一个运费退单
// if (order_data_row != null &&
// order_data_row.getOrder_shipping_fee_inner() != null &&
// order_data_row.getOrder_shipping_fee_inner().compareTo(BigDecimal.ZERO) > 0) {
// 注意商家配置的配送费
if (order_data_row != null &&
order_data_row.getOrder_shipping_fee_inner() != null &&
order_data_row.getOrder_shipping_fee_inner().compareTo(BigDecimal.ZERO) > 0) {
order_data_row.getOrder_shipping_fee() != null &&
order_data_row.getOrder_shipping_fee().compareTo(BigDecimal.ZERO) > 0) {
// 运费大于0的 执行退运费操作, 有两种方案1生成退运费售后服务单 2直接执行退款
// 1生成独立退运费售后服务单需注意运费是退给运费代理商的需要获取代理商的交易单号
@ -1631,13 +1636,16 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
Integer buyer_user_id = info_row.getBuyer_user_id();
Integer storeId = info_row.getStore_id();
// 平台内部订单
BigDecimal orderShippingFeeInner = order_data_row.getOrder_shipping_fee_inner();
if (orderShippingFeeInner == null || orderShippingFeeInner.compareTo(BigDecimal.ZERO) <= 0) {
orderShippingFeeInner = shopOrderLklService.getOrderShippingFeeInnerToDecimal(storeId, order_id);
}
// // 平台内部订单配送
// BigDecimal orderShippingFeeInner = order_data_row.getOrder_shipping_fee_inner();
// if (orderShippingFeeInner == null || orderShippingFeeInner.compareTo(BigDecimal.ZERO) <= 0) {
// orderShippingFeeInner = shopOrderLklService.getOrderShippingFeeInnerToDecimal(storeId, order_id);
// }
return_order_shipping_fee_row.setReturn_refund_amount(orderShippingFeeInner); // 平台内部配送费退款金额
// 商家设置的配送费
BigDecimal orderShippingFee = order_data_row.getOrder_shipping_fee();
return_order_shipping_fee_row.setReturn_refund_amount(orderShippingFee); // 平台内部配送费退款金额
BigDecimal order_points_fee = ObjectUtil.defaultIfNull(order_data_row.getOrder_points_fee(), BigDecimal.ZERO);
BigDecimal order_refund_agree_points = ObjectUtil.defaultIfNull(order_data_row.getOrder_refund_agree_points(), BigDecimal.ZERO);
@ -1649,7 +1657,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
return_order_shipping_fee_row.setReturn_reason_id(0);
return_order_shipping_fee_row.setReturn_buyer_message(I18nUtil._("订单(配送费)退款"));
return_order_shipping_fee_row.setStore_id(storeId);
return_order_shipping_fee_row.setReturn_refund_point(NumberUtil.min(return_refund_point, orderShippingFeeInner));
return_order_shipping_fee_row.setReturn_refund_point(NumberUtil.min(return_refund_point, orderShippingFee));
return_order_shipping_fee_row.setReturn_add_time(now); // 添加时间
return_order_shipping_fee_row.setReturn_tel("");
@ -1733,12 +1741,12 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
try {
if (!payService.doRefund(returnOrder)) {
logger.error("执行退款操作失败!退单列表: {}", return_ids);
throw new ApiException(ResultCode.FAILED);
throw new ApiException("暂无法退款,请稍候再重试!");
}
} catch (Exception e) {
logger.error("执行退款操作异常!退单列表: {}", return_ids, e);
// 根据业务需要决定是抛出异常触发回滚还是其他处理方式
throw new ApiException("退款服务调用异常: " + e.getMessage());
throw new ApiException("暂无法退款,请稍候再重试!");
}
logger.info("退款操作执行成功,退单列表: {}", return_ids);

View File

@ -521,10 +521,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
shopOrderInfoService.changeOrderStatus(shopOrderId, StateCode.ORDER_STATE_PICKING, 0, 0);
// 个推推送消息
JSONObject payload = new JSONObject();
payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
payload.put("orderId", shopOrderId);
pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "您有一笔新的订单", "您有一笔同城订单[" + shopOrderId + "],请及时处理。", payload);
// JSONObject payload = new JSONObject();
// payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
// payload.put("orderId", shopOrderId);
// pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "您有一笔新的订单", "您有一笔同城订单[" + shopOrderId + "],请及时处理。", payload);
return Pair.of(true, "顺丰同城下单成功!");
}
@ -988,6 +988,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
// 上传发货信息到微信
wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderId);
} else if (shopStoreSfOrder.getOrder_status().equals(StateCode.SF_ORDER_STATUS_ARRIVED)) {
// 顺丰同城状态12-配送员到店;
// 商城订单状态 2020-待配货 2030; //待发货
@ -1007,6 +1008,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
pushRemark = "配送员已取货。";
// 上传发货信息到微信
wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderId);
} else if (shopStoreSfOrder.getOrder_status().equals(StateCode.SF_ORDER_STATUS_FINISH)) {
// 顺丰同城状态17-配送员妥投完单;
// orderStatus = StateCode.ORDER_STATE_FINISH;
@ -1028,10 +1030,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
shopOrderInfoService.changeOrderStatus(shopOrderId, orderStatus, orderIsOutStatus, orderIsShippedStatus);
// 消息推送
JSONObject payload = new JSONObject();
payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
payload.put("orderId", shopOrderId);
pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "", "顺丰同城订单[" + shopOrderId + "]" + pushRemark, payload);
// JSONObject payload = new JSONObject();
// payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
// payload.put("orderId", shopOrderId);
// pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "", "顺丰同城订单[" + shopOrderId + "]" + pushRemark, payload);
return new ThirdApiRes().success("success");
}
@ -1118,10 +1120,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
String orderId = shopStoreSfOrder.getShop_order_id();
// 消息推送
JSONObject payload = new JSONObject();
payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
payload.put("orderId", orderId);
pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "", "顺丰同城订单[" + orderId + "]已完成配送。", null);
// JSONObject payload = new JSONObject();
// payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL);
// payload.put("orderId", orderId);
// pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "", "顺丰同城订单[" + orderId + "]已完成配送。", null);
return new ThirdApiRes().success("success");

View File

@ -576,6 +576,7 @@
<result property="order_payment_amount" column="order_payment_amount"/>
<result property="order_shipping_fee" column="order_shipping_fee"/>
<result property="order_shipping_fee_inner" column="order_shipping_fee_inner"/>
<result property="lkl_fee" column="lkl_fee"/>
<result property="packing_fee" column="packing_fee"/>
<!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee-->
<result property="total_discount_amount" column="total_discount_amount"/>
@ -782,13 +783,14 @@
oi.payment_time,
od.order_shipping_fee,
IFNULL(od.order_shipping_fee_inner, 0) as order_shipping_fee_inner,
IFNULL(od.lkl_fee, 0) as lkl_fee,
<!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee-->
(od.order_discount_amount + od.voucher_price + od.order_points_fee + od.order_adjust_fee) as
total_discount_amount,
<!--预计收入:订单原价金额-总计优惠金额-配送费-平台费 + 打包费-->
(ob.order_product_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-order_shipping_fee_inner+od.packing_fee)
<!--预计收入:订单原价金额-总计优惠金额-配送费-平台费-拉卡拉手续费 + 打包费-->
(ob.order_product_amount-od.order_discount_amount-od.voucher_price-od.order_points_fee-od.order_adjust_fee-od.platform_fee-order_shipping_fee_inner-lkl_fee+od.packing_fee)
as order_income_amount,
od.platform_fee,
(od.platform_fee+lkl_fee) as platform_fee,
od.packing_fee,
od.order_message,
sb.store_id,