diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateDTO.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateDTO.java index 40de4841..4f454da4 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateDTO.java +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/dto/LklSeparateDTO.java @@ -61,8 +61,8 @@ public class LklSeparateDTO { // 测试基于可分账金额的分账算法(正常情况) System.out.println("\n=== 基于可分账金额的分账算法测试(正常情况) ==="); LklSeparateDTO dto2 = new LklSeparateDTO(); - dto2.setTotalSeparateAmount(2); // 分账总额 1000分 - dto2.setShippingFee(1); // 配送费 100分 + dto2.setTotalSeparateAmount(1); // 分账总额 1000分 + dto2.setShippingFee(0); // 配送费 100分 // dto2.setRefCanSeparateAmount(null); dto2.setLklRatio(new BigDecimal("0.0025")); // 拉卡拉分账比例 0.0025 dto2.setMchRatio(new BigDecimal("0.94")); // 商家分账比例 0.857 (会产生小数) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java index 50f2b330..21330707 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklOrderSeparateService.java @@ -74,4 +74,12 @@ public interface LklOrderSeparateService extends IBaseService */ List getUnSuccessSeparateList(Date beginDate, Date endDate, Integer page, Integer size); + /** + * 判断订单是否已经分账 + * 记录不存在或 status final_status 不是 SUCCESS 都表示没有分账 + * + * @param orderId + * @return + */ + Boolean isOrderSeparated(String orderId); } 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 d33c22b9..ec2f9a6a 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 @@ -2320,7 +2320,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.debug("[分账操作] 分账参数计算结果:{}", lklSeparateDTO); // 更新分账计算结果 - shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString()); + shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString()); // 写入分账具体情况 if (CheckUtil.isEmpty(canSeparateAmt)) { shopOrderLkl.setSplit_amt(lklSeparateDTO.getCanSeparateAmount()); canSeparateAmt = lklSeparateDTO.getCanSeparateAmount(); @@ -2406,7 +2406,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (StrUtil.isBlank(response)) { String errorMsg = String.format("[分账操作] 拉卡拉无响应,订单=%s,商户=%s,分账流水号=%s", orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no()); - shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, errorMsg); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); log.error(errorMsg); return Pair.of(false, "拉卡拉无响应"); } @@ -2418,7 +2418,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (respJson == null || !lklSacsSuccessCode.equals(respJson.getStr("code")) || respJson.getJSONObject("resp_data") == null) { String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s,商户=%s,分账流水号=%s,响应=%s", orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response); - shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, errorMsg); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); log.error(errorMsg); return Pair.of(false, "拉卡拉分账异常:[" + (respJson != null ? respJson.getStr("code") : "未知错误码") + "]" + (respJson != null ? respJson.getStr("msg") : "未知错误")); @@ -2473,20 +2473,22 @@ public class LakalaApiServiceImpl implements LakalaApiService { *

* * @param request - * @param merchantNo 分账方商户号,非空表示是事后补偿 - * @param separateNo 分账指令流水号,非空表示是事后补偿 - * + * @param merchantNoParam 分账方商户号,非空表示是事后补偿 + * @param separateNoParam 分账指令流水号,非空表示是事后补偿 + * */ @Override - public JSONObject sacsSeparateNotify(HttpServletRequest request, String merchantNo, String separateNo) { + public JSONObject sacsSeparateNotify(HttpServletRequest request, String merchantNoParam, String separateNoParam) { + String channel = ""; try { JSONObject paramsJson = null; - if (!StrUtil.hasBlank(merchantNo, separateNo)) { - log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果查询补偿"); - paramsJson = sacsQuery(merchantNo, separateNo); + if (!StrUtil.hasBlank(merchantNoParam, separateNoParam)) { + channel = "(补偿)"; + log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调 merchantNoParam={},separateNoParam={}" + channel, merchantNoParam, separateNoParam); + paramsJson = sacsQuery(merchantNoParam, separateNoParam); } else { log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调"); @@ -2504,9 +2506,8 @@ public class LakalaApiServiceImpl implements LakalaApiService { paramsJson = JSONUtil.parseObj(signCheckResult.getSecond()); } - if (paramsJson == null) { - String errorMsg = "分账通知参数解析失败: 请求参数为空"; + String errorMsg = "分账通知参数解析失败: 请求参数为空" + channel; log.error("[拉卡拉分账通知] {}", errorMsg); return JSONUtil.createObj() .put("code", "FAIL") @@ -2515,7 +2516,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 3. 提取关键参数并校验 - 确保必要参数完整 String logNo = paramsJson.getStr("log_no"); // 合单订单是子单(确认收货)流水号,非合单时是主单(确认收货)流水号 - String separateNoNew = paramsJson.getStr("separate_no"); + String separateNo = paramsJson.getStr("separate_no"); String outSeparateNo = paramsJson.getStr("out_separate_no"); String status = paramsJson.getStr("status"); String finalStatus = paramsJson.getStr("final_status"); @@ -2523,12 +2524,12 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 必要参数 List missingParams = new ArrayList<>(); if (StrUtil.isBlank(outSeparateNo)) missingParams.add("outSeparateNo"); - if (StrUtil.isBlank(separateNoNew)) missingParams.add("separateNo"); + if (StrUtil.isBlank(separateNo)) missingParams.add("separateNo"); if (StrUtil.isBlank(status)) missingParams.add("status"); if (!missingParams.isEmpty()) { - String errorMsg = "分账通知缺少必要参数: " + String.join(", ", missingParams); - log.error("[拉卡拉分账通知] {},参数详情: {}", errorMsg, paramsJson); + String errorMsg = "分账通知缺少必要参数" + channel + String.join(", ", missingParams); + log.error("[拉卡拉分账通知] {} {},参数详情: {}", channel, errorMsg, paramsJson); return JSONUtil.createObj() .put("code", "FAIL") .put("message", errorMsg); @@ -2537,9 +2538,9 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 4. 查询现有分账记录 LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByLogNoAndOutTradeNo(logNo, outSeparateNo); if (lklOrderSeparateExist == null) { - String errorMsg = "未找到对应的分账记录"; + String errorMsg = "未找到对应的分账记录" + channel; log.error("[拉卡拉分账通知] {},外部分账单号={},分账单号={},参数详情: {}", - errorMsg, outSeparateNo, separateNo, paramsJson); + errorMsg, outSeparateNo, separateNoParam, paramsJson); return JSONUtil.createObj() .put("code", "FAIL") .put("message", errorMsg); @@ -2548,7 +2549,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 5. 检查分账记录状态,避免重复处理 String existingFinalStatus = lklOrderSeparateExist.getFinal_status(); if ("SUCCESS".equals(existingFinalStatus) && "SUCCESS".equals(lklOrderSeparateExist.getStatus())) { - String warnMsg = "分账已处理成功,请不要重复通知"; + String warnMsg = "分账已处理成功,请不要重复通知" + channel; log.warn("[拉卡拉分账通知] {},订单号={},外部分账单号={},参数详情: {}", warnMsg, logNo, outSeparateNo, paramsJson); return JSONUtil.createObj() @@ -2557,7 +2558,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { } // 6. 记录关键参数信息,便于问题排查 - log.info("[拉卡拉分账通知] 接收到分账通知,分账单号={},外部分账单号={},状态={},最终状态={}", + log.info("[拉卡拉分账通知] 接收到分账通知,分账单号={},外部分账单号={},状态={},最终状态={}" + channel, separateNo, outSeparateNo, status, finalStatus); // 7. 构建分账记录对象 - 准备更新数据库的分账记录 @@ -2585,9 +2586,9 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 8. 持久化处理 - 更新分账记录到数据库 boolean updateSuccess = lklOrderSeparateService.addOrUpdateByReceiverNo(lklOrderSeparate); if (!updateSuccess) { - String errorMsg = String.format("分账记录更新失败, separateNo=%s", separateNo); + String errorMsg = String.format("分账记录更新失败, separateNo=%s", separateNo) + channel; // 更改分账状态:分账失败 - shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Fail, errorMsg); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Fail, ""); log.error("[拉卡拉分账通知] {}", errorMsg); return JSONUtil.createObj() .put("code", "FAIL") @@ -2598,13 +2599,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success, ""); // 9. 记录处理成功日志 - log.info("[拉卡拉分账通知] 分账通知处理成功, separateNo={}, status={}", separateNo, status); + log.info("[拉卡拉分账通知] 分账通知处理成功, separateNo={}, status={}" + channel, separateNo, status); return JSONUtil.createObj() .put("code", "SUCCESS") .put("message", "操作成功"); } catch (Exception e) { // 10. 异常处理 - String errorMsg = String.format("分账通知数据处理异常: %s", e.getMessage()); + String errorMsg = String.format("分账通知数据处理异常: %s" + channel, e.getMessage()); log.error("[拉卡拉分账通知] {}", errorMsg, e); return JSONUtil.createObj() .put("code", "FAIL") diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java index 0d5a637d..32b6303f 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java @@ -214,4 +214,40 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl() + .eq("order_id", orderId) + .eq("status", "SUCCESS") + .eq("final_status", "SUCCESS") + .orderByDesc("id")); + + // 如果查询到分账成功的记录,返回true + if (lklOrderSeparate == null) { + log.debug("订单[{}]分账未完成或不存在分账记录", orderId); + return false; + } + + log.debug("订单[{}]分账已完成", orderId); + return true; + } catch (Exception e) { + log.error("查询订单[{}]分账状态异常", orderId, e); + return 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 0347e23f..ec7b624f 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 @@ -38,12 +38,12 @@ import com.suisung.mall.common.modules.store.ShopStoreShippingAddress; import com.suisung.mall.common.service.MessageService; import com.suisung.mall.common.utils.*; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; -import com.suisung.mall.shop.base.service.AccountBaseConfigService; import com.suisung.mall.shop.base.service.ShopBaseProductUnitService; import com.suisung.mall.shop.base.service.ShopBaseStateCodeService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserCommissionService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserOrderItemService; import com.suisung.mall.shop.distribution.service.ShopDistributionUserOrderService; +import com.suisung.mall.shop.lakala.service.LklOrderSeparateService; import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.number.service.ShopNumberSeqService; import com.suisung.mall.shop.order.mapper.ShopOrderReturnMapper; @@ -191,10 +191,11 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl orderItems = shopOrderItemService.find(new QueryWrapper().eq("order_id", orderId)); - if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("订单没有可退货的商品"); - - + if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("无可退货商品"); + // === 3. 检查退货单 === ShopOrderReturn refundOrder = findOne(new QueryWrapper() .eq("order_id", orderId) @@ -2614,8 +2619,8 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl0的 @@ -2639,13 +2644,13 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl 0); if (!validItems) { - return CommonResult.failed("退款商品信息不正确:请检查商品ID、退款金额和数量是否有效"); + return CommonResult.failed("退款金额或数量无效"); } List orderReturnItems = orderReturnInputVo.getReturn_items(); refundGoodsAmount = orderReturnItems.stream().map(OrderReturnItemInputVo::getReturn_refund_amount).reduce(BigDecimal.ZERO, BigDecimal::add); if (refundGoodsAmount.compareTo(orderGoodsAmount) > 0) { - return CommonResult.failed("退款金额有误!退款金额不能大于订单商品总金额"); + return CommonResult.failed("退款金额超限"); } refundRequest.setReturn_buyer_message(StrUtil.isBlank(reason) ? "订单部分商品退款" : reason); @@ -2669,7 +2674,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl