diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderLkl.java b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderLkl.java index f1b4ce81..95b9ab22 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderLkl.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/order/ShopOrderLkl.java @@ -98,6 +98,8 @@ public class ShopOrderLkl implements Serializable { private String separate_remark; + private String separate_msg; + private Integer status; private Date created_at; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java index 67e0ce43..a2ecccbf 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java @@ -855,7 +855,12 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.warn("[确认收货通知] 未能获取到商品子单信息,使用原始参数进行处理"); } } else { - log.debug("[确认收货通知] 非合单订单,使用原始参数进行处理"); + // 非合单订单,确认收货响应数据:{"trade_no":"20251015110110000066202154232129","log_no":"66202154232129","trade_state":"SUCCESS", + // "total_amount":"2950","trade_time":"20251015165538", + // "complete_notify_url":"https://mall.gpxscs.cn/api/mobile/shop/lakala/trans/receive/completeNotify", + // "merchant_no":"8226330541100H4","sub_mch_id":"812310610","origin_trade_no":"20251015110113130266250075936522", + // "origin_log_no":"66250075936522","origin_out_trade_no":"DD_20251015_2"} + log.debug("[确认收货通知] 从订单信息中获取原始交易号: originTradeNo={} originLogNo={}", originTradeNo, originLogNo); } @@ -892,11 +897,19 @@ public class LakalaApiServiceImpl implements LakalaApiService { } log.info("[确认收货通知] 订单信息更新成功: orderId={}", shopOrderLkl.getOrder_id()); - // 准备发起分账指令 + // 重要:准备发起分账指令 log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}", merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo); Pair separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), shopOrderLkl.getLkl_receive_log_no()); if (!separateResult.getFirst()) { + + shopOrderLkl.setSeparate_msg(separateResult.getSecond()); + updateResult = shopOrderLklService.addOrUpdateByStoreOrder(shopOrderLkl); + if (Boolean.FALSE.equals(updateResult)) { + log.error("[确认收货通知] 更新订单信息失败: orderId={}", shopOrderLkl.getOrder_id()); + return JSONUtil.createObj().set("code", "FAIL").set("message", "更新订单信息失败!"); + } + log.error("[确认收货通知] 发起分账指令失败: orderId={}, reason={}", shopOrderLkl.getOrder_id(), separateResult.getSecond()); return JSONUtil.createObj().set("code", "FAIL").set("message", "发起分账指令失败:" + separateResult.getSecond()); } @@ -2450,9 +2463,11 @@ public class LakalaApiServiceImpl implements LakalaApiService { return Pair.of(false, "缺少必要参数"); } + ShopOrderLkl shopOrderLkl = null; + try { // 2. 查询订单信息 - ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo); + shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo); if (shopOrderLkl == null) { log.warn("[分账操作] 未找到对应订单记录, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}", lklMerchantNo, receiveTradeNo, receiveLogNo); @@ -2566,6 +2581,11 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (calcResult == null || !calcResult.getFirst() || calcResult.getSecond() == null) { log.error("[分账操作] 分账参数评估失败,无法分账, orderId={}, merchantNo={}", orderId, merchantNo); + + // 更新分账出错信息 + shopOrderLkl.setSeparate_msg("分账数据评估,结果无法分账"); + shopOrderLklService.safeUpdate(shopOrderLkl); + return Pair.of(false, "分账数据评估,结果无法分账"); } LklSeparateWithTotalAmountDTO lklSeparateDTO = calcResult.getSecond(); @@ -2588,6 +2608,11 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (existingSeparateRecord != null) { lklOrderSeparateService.updateRemark(existingSeparateRecord.getId(), errorMsg); } + + // 更新分账出错信息 + shopOrderLkl.setSeparate_msg("订单可分账金额低于1分钱,无法分账"); + shopOrderLklService.safeUpdate(shopOrderLkl); + return Pair.of(false, "订单可分账金额低于1分钱"); } @@ -2596,9 +2621,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { Integer agent1stAmount = lklSeparateDTO.getAgent1stAmount(); Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount(); - log.info("[分账操作] 分账金额明细: orderId={}, merchantNo={}, 总金额={}分, 可分金额={}分, 商家分得={}分, 平台分得={}分, 省级代理商分得={}分, 县级代理商分得={}分, 配送费={}分", - orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, merchantAmount, - platformAmount, agent1stAmount, agent2ndAmount, shoppingFeeInner); + String logMsg = String.format("[分账操作] 分账金额计算完成, orderId=%s, merchantNo=%s, 总金额=%d分, 可分金额=%d分, 配送费=%d分", + orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, shoppingFeeInner); + log.info(logMsg); + + // 更新分账计算结果 + shopOrderLkl.setSeparate_msg(logMsg); + shopOrderLklService.safeUpdate(shopOrderLkl); // 构建分账接收方分账列表参数 List recvDatas = new ArrayList<>(); @@ -2675,7 +2704,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (StrUtil.isBlank(response)) { String errorMsg = String.format("[分账操作] 拉卡拉无响应, orderId=%s, merchantNo=%s, receiveLogNo=%s", orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no()); - shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, errorMsg); log.error(errorMsg); return Pair.of(false, "拉卡拉无响应"); } @@ -2687,13 +2716,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (respJson == null || !lklSacsSuccessCode.equals(respJson.getStr("code")) || respJson.getJSONObject("resp_data") == null) { String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常, orderId=%s, merchantNo=%s, receiveLogNo=%s, response=%s", orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response); - shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, errorMsg); log.error(errorMsg); return Pair.of(false, "拉卡拉分账异常:[" + (respJson != null ? respJson.getStr("code") : "未知错误码") + "]" + (respJson != null ? respJson.getStr("msg") : "未知错误")); } - // 只有在分账请求成功发送后才更新分账备注 + // 分账请求成功发送后更新分账备注 shopOrderLklService.safeUpdate(shopOrderLkl); // 保存分账记录 @@ -2729,6 +2758,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { } catch (Exception e) { String errorMsg = String.format("[分账操作] 系统异常, receiveLogNo=%s, 错误=%s", receiveLogNo, e.getMessage()); log.error(errorMsg, e); + + if (shopOrderLkl != null) { + shopOrderLkl.setSeparate_msg(errorMsg); + shopOrderLkl.setSeparate_status(CommonConstant.Sta_Separate_Fail); + shopOrderLklService.safeUpdate(shopOrderLkl); + } + return Pair.of(false, "系统异常,请稍后重试"); } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 6708e474..049413ae 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1519,14 +1519,11 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0) { - // 退款金额+打包费 - BigDecimal orderRefundAmountAddFee = NumberUtil.add( - order_data_row.getOrder_refund_amount(), - order_data_row.getPacking_fee()); - // 最后一个退款订单如果有打包费,加上打包费 - return_row.setReturn_refund_amount(orderRefundAmountAddFee); - logger.debug("最后一个商品,已添加打包费到退款金额,订单ID: {}", order_id); - } + if (order_data_row != null) { + BigDecimal additionalFees = BigDecimal.ZERO; + List feeTypes = new ArrayList<>(); - - // 有运费的,重新生成一个运费退单 -// 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() != null && - order_data_row.getOrder_shipping_fee().compareTo(BigDecimal.ZERO) > 0) { - // 运费大于0的, 执行退运费操作, 有两种方案,1、生成退运费售后服务单; 2、直接执行退款 - // 1、生成独立退运费售后服务单,需注意运费是退给运费代理商的,需要获取代理商的交易单号 - - return_order_shipping_fee_row = new ShopOrderReturn(); - - 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 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); - BigDecimal return_refund_point = NumberUtil.round(NumberUtil.sub(order_points_fee, order_refund_agree_points), 2); - - return_order_shipping_fee_row.setOrder_id(order_id); // 订单编号 - return_order_shipping_fee_row.setBuyer_user_id(buyer_user_id); - return_order_shipping_fee_row.setReturn_is_shipping_fee(1); //退货类型(BOOL): 0-退款单;1-退运费单 - 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, orderShippingFee)); - return_order_shipping_fee_row.setReturn_add_time(now); // 添加时间 - return_order_shipping_fee_row.setReturn_tel(""); - - // 店铺审核操作员 - Integer storeUserId = user != null ? user.getId() : 0; - return_order_shipping_fee_row.setReturn_store_user_id(storeUserId); - return_order_shipping_fee_row.setReturn_telephone(""); - return_order_shipping_fee_row.setSubsite_id(info_row.getSubsite_id()); - - // update 2025-07-24 - return_order_shipping_fee_row.setReturn_flag(0); // 退货标识(BOOL): 0-正常退货;1-退货换货 - return_order_shipping_fee_row.setReturn_store_message(I18nUtil._("订单(配送费)退款")); - return_order_shipping_fee_row.setReturn_finish_time(now); - return_order_shipping_fee_row.setReturn_state_id(StateCode.RETURN_PROCESS_FINISH); - return_order_shipping_fee_row.setReturn_is_paid(1);// 退款完成 - return_order_shipping_fee_row.setReturn_channel_code("lakala"); - return_order_shipping_fee_row.setPayment_channel_id(1416); - - return_order_shipping_fee_row.setReturn_year(DateUtil.year(now)); // 退单年份-索引查询 - return_order_shipping_fee_row.setReturn_month(DateUtil.month(now) + 1); // 退单月份-索引查询 - return_order_shipping_fee_row.setReturn_day(DateUtil.dayOfMonth(now)); // 退单日-索引查询 - - // 生成退货单 - String type_code = stateCodeService.getCode(StateCode.ORDER_TYPE_FX, "state_code_code"); - String return_id = shopNumberSeqService.createNextSeq(type_code); - return_order_shipping_fee_row.setReturn_id(return_id); - - // 运费独立加一条退单记录 - if (!add(return_order_shipping_fee_row)) { - logger.error("配送费退款订单生成失败!订单ID: {}", order_id); - // 1、生成退运费售后服务单; - throw new ApiException(I18nUtil._("配送费退款订单生成失败!")); + // 处理打包费 + if (order_data_row.getPacking_fee() != null && + order_data_row.getPacking_fee().compareTo(BigDecimal.ZERO) > 0) { + additionalFees = additionalFees.add(order_data_row.getPacking_fee()); + feeTypes.add("打包费"); + logger.debug("添加打包费: {},订单ID: {}", order_data_row.getPacking_fee(), order_id); } - logger.info("配送费退款订单生成成功,退单号: {}", return_id); + // 处理配送费 + if (order_data_row.getOrder_shipping_fee() != null && + order_data_row.getOrder_shipping_fee().compareTo(BigDecimal.ZERO) > 0) { + additionalFees = additionalFees.add(order_data_row.getOrder_shipping_fee()); + feeTypes.add("配送费"); + logger.debug("添加配送费: {},订单ID: {}", order_data_row.getOrder_shipping_fee(), order_id); + } + + // 更新退款金额和说明 + if (additionalFees.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal newRefundAmount = return_row.getReturn_refund_amount().add(additionalFees); + return_row.setReturn_refund_amount(newRefundAmount); + return_row.setReturn_state_id(StateCode.RETURN_PROCESS_FINISH); + + // 构建费用说明 + String feeDescription = String.join("+", feeTypes); + String returnStoreMessage = return_row.getReturn_store_message(); + if (StrUtil.isBlank(returnStoreMessage)) { + returnStoreMessage = "商品退款"; + } + return_row.setReturn_store_message(returnStoreMessage + "+" + feeDescription); + + // 保存更新 + if (StrUtil.isNotBlank(return_row.getReturn_id()) && !edit(return_row)) { + logger.error("更新退货单退款金额失败!退货单ID: {}", return_row.getReturn_id()); + throw new ApiException(ResultCode.FAILED); + } + logger.debug("成功更新退款金额,新增费用: {},总退款金额: {},订单ID: {}", + additionalFees, newRefundAmount, order_id); + } + } else { + logger.warn("未找到订单数据,无法处理费用,订单ID: {}", order_id); } } @@ -1711,7 +1662,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl returnOrder = new ArrayList<>(); - if (return_rows != null) { - returnOrder.addAll(return_rows); - } - if (return_order_shipping_fee_row != null) { - returnOrder.add(return_order_shipping_fee_row); - } +// List returnOrder = new ArrayList<>(); +// if (return_rows != null) { +// returnOrder.addAll(return_rows); +// } +// if (return_order_shipping_fee_row != null) { +// returnOrder.add(return_order_shipping_fee_row); +// } // 重要:执行退款操作 try { - if (!payService.doRefund(returnOrder)) { + if (!payService.doRefund(return_rows)) { logger.error("执行退款操作失败!退单列表: {}", return_ids); throw new ApiException("余额不足,请稍后重试"); } @@ -1752,6 +1701,9 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl