From 9f62bf8ddd5d67785fd42ba4247b2929b81d5623 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 27 Sep 2025 12:16:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=89=E5=8D=A1=E6=8B=89=E5=88=86=E8=B4=A6?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E9=80=9A=E7=9F=A5=E5=A4=84=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E6=8F=90=E7=8E=B0=E6=B5=81=E7=A8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quartz/job/UpdateOrderSeparateJob.java | 2 +- .../admin/LakalaAdminController.java | 2 +- .../shop/lakala/service/LakalaApiService.java | 5 +- .../service/impl/LakalaApiServiceImpl.java | 59 +++++++++++-------- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderSeparateJob.java b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderSeparateJob.java index ccaf0825..8fea6e7c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderSeparateJob.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/job/UpdateOrderSeparateJob.java @@ -27,7 +27,7 @@ public class UpdateOrderSeparateJob extends QuartzJobBean { return; } - Integer processedCount = lakalaApiService.fixedUnSuccessSeparateStatusJob(); + Integer processedCount = lakalaApiService.fixUnSuccessSeparateStatusJob(); logger.info("[分账状态修复定时任务] 执行完成,共处理 {} 条记录", processedCount); } catch (Exception e) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java index 1eb0afe7..f1da4113 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java @@ -49,7 +49,7 @@ public class LakalaAdminController extends BaseControllerImpl { } // 执行业务逻辑 - Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("remark"), paramsJSON.getStr("summary")); + Boolean success = lakalaPayService.ewalletWithDrawD1(paramsJSON.getStr("mercId"), paramsJSON.getStr("merOrderNo"), paramsJSON.getStr("drawAmt"), paramsJSON.getStr("summary")); if (success) { return CommonResult.success("账户D1提现提交成功"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java index 49366084..6f12006b 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java @@ -299,7 +299,7 @@ public interface LakalaApiService { * * @return */ - Integer fixedUnSuccessSeparateStatusJob(); + Integer fixUnSuccessSeparateStatusJob(); /** * 检测修复补全商户的商户分账业务信息及分账接收方绑定关系(分账业务申请异步通知的补偿机制) @@ -337,10 +337,9 @@ public interface LakalaApiService { * @param mercId 822商户号或receiveNo * @param merOrderNo 商户订单号 * @param drawAmt 提现金额(分) - * @param remark * @param summary */ - Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String remark, String summary); + Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary); /** * 拉卡拉账户D1提现结果通知 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 70dea245..ab640bfc 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 @@ -2693,13 +2693,14 @@ public class LakalaApiServiceImpl implements LakalaApiService { * 参考文档:https://o.lakala.com/#/home/document/detail?id=393 *

* - * @param request + * @param request HTTP请求对象,包含拉卡拉分账结果通知的参数 * @param merchantNoParam 分账方商户号,非空表示是事后补偿 * @param separateNoParam 分账指令流水号,非空表示是事后补偿 - * + * @return 处理结果JSON对象 + * */ @Override public JSONObject sacsSeparateNotify(HttpServletRequest request, String merchantNoParam, String separateNoParam) { @@ -2708,7 +2709,8 @@ public class LakalaApiServiceImpl implements LakalaApiService { JSONObject paramsJson = null; if (!StrUtil.hasBlank(merchantNoParam, separateNoParam)) { channel = "(补偿)"; - log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调 merchantNoParam={},separateNoParam={}" + channel, merchantNoParam, separateNoParam); + log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调{},merchantNoParam={},separateNoParam={}", + channel, merchantNoParam, separateNoParam); paramsJson = sacsQuery(merchantNoParam, separateNoParam); } else { log.info("[拉卡拉分账通知] 开始处理拉卡拉分账结果通知异步回调"); @@ -2742,15 +2744,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { String status = paramsJson.getStr("status"); String finalStatus = paramsJson.getStr("final_status"); - // 必要参数 + // 必要参数校验 List missingParams = new ArrayList<>(); if (StrUtil.isBlank(outSeparateNo)) missingParams.add("outSeparateNo"); if (StrUtil.isBlank(separateNo)) missingParams.add("separateNo"); if (StrUtil.isBlank(status)) missingParams.add("status"); if (!missingParams.isEmpty()) { - String errorMsg = "分账通知缺少必要参数" + channel + String.join(", ", missingParams); - log.error("[拉卡拉分账通知] {} {},参数详情: {}", channel, errorMsg, paramsJson); + String errorMsg = "分账通知缺少必要参数" + channel + ": " + String.join(", ", missingParams); + log.error("[拉卡拉分账通知] {},参数详情: {}", errorMsg, paramsJson); return JSONUtil.createObj() .put("code", "FAIL") .put("message", errorMsg); @@ -2761,7 +2763,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (lklOrderSeparateExist == null) { String errorMsg = "未找到对应的分账记录" + channel; log.error("[拉卡拉分账通知] {},外部分账单号={},分账单号={},参数详情: {}", - errorMsg, outSeparateNo, separateNoParam, paramsJson); + errorMsg, outSeparateNo, separateNo, paramsJson); return JSONUtil.createObj() .put("code", "FAIL") .put("message", errorMsg); @@ -2779,8 +2781,8 @@ public class LakalaApiServiceImpl implements LakalaApiService { } // 6. 记录关键参数信息,便于问题排查 - log.info("[拉卡拉分账通知] 接收到分账通知,分账单号={},外部分账单号={},状态={},最终状态={}" + channel, - separateNo, outSeparateNo, status, finalStatus); + log.info("[拉卡拉分账通知] 接收到分账通知{},分账单号={},外部分账单号={},状态={},最终状态={}", + channel, separateNo, outSeparateNo, status, finalStatus); // 7. 构建分账记录对象 - 准备更新数据库的分账记录 LklOrderSeparate lklOrderSeparate = new LklOrderSeparate(); @@ -2819,14 +2821,25 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 更改分账状态:分账成功 shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success, ""); + // RMK 本次分账成功后,给商户和接收方 D1提现到银行卡 + if (CollUtil.isNotEmpty(detailDatas)) { + for (JSONObject detailData : detailDatas.jsonIter()) { + String recvNo = detailData.getStr("recv_no"); // 822商户号或接收方号 + String amt = detailData.getStr("amt"); // 单位(分) + if (StrUtil.isNotBlank(recvNo) && StrUtil.isNotBlank(amt)) { + ewalletWithDrawD1(recvNo, outSeparateNo, amt, JSONUtil.toJsonStr(detailDatas)); + } + } + } + // 9. 记录处理成功日志 - log.info("[拉卡拉分账通知] 分账通知处理成功, separateNo={}, status={}" + channel, 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" + channel, e.getMessage()); + String errorMsg = String.format("分账通知数据处理异常: %s%s", e.getMessage(), channel); log.error("[拉卡拉分账通知] {}", errorMsg, e); return JSONUtil.createObj() .put("code", "FAIL") @@ -2920,15 +2933,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { * @return 成功处理的记录数量 */ @Override - public Integer fixedUnSuccessSeparateStatusJob() { + public Integer fixUnSuccessSeparateStatusJob() { log.info("[分账状态修复任务] 开始执行未成功分账记录的状态修复任务"); - // 获取3天前分账状态未成功的记录 + // 获取2天前分账状态未成功的记录 Date now = new Date(); - Date threeDaysAgo = DateUtils.addHours(now, -72); + Date threeDaysAgo = DateUtils.addHours(now, -48); // 分页参数 - int pageSize = 100; + int pageSize = 200; int currentPage = 1; int totalSuccessCount = 0; int totalProcessed = 0; @@ -3384,12 +3397,11 @@ public class LakalaApiServiceImpl implements LakalaApiService { * @param mercId 822商户号或receiveNo * @param merOrderNo 商户订单号 * @param drawAmt 提现金额(分) - * @param remark 备注信息 * @param summary 摘要信息 * @return 操作结果,成功返回true,失败返回false */ @Override - public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String remark, String summary) { + public Boolean ewalletWithDrawD1(String mercId, String merOrderNo, String drawAmt, String summary) { // 1. 参数校验 if (StrUtil.hasBlank(mercId, merOrderNo, drawAmt)) { log.warn("[D1提现申请] D1提现参数校验失败,关键参数为空: mercId={}, merOrderNo={}, drawAmt={}", @@ -3399,8 +3411,10 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 账号类型(01:收款账户,04:分账接收方账户) String payType = "04"; + String payTypeStr = "接收方账户04"; if (StrUtil.startWith(mercId, "822")) { payType = "01"; + payTypeStr = "收款账户01"; } try { @@ -3411,10 +3425,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { return false; } - // 设置默认值 - if (StrUtil.isBlank(remark)) { - remark = String.format("商户订单:%s 账号类型:%s 分账后立即提现", merOrderNo, payType); - } + String remark = String.format("订单:%s %s 分账后立即提现", merOrderNo, payTypeStr); log.info("[D1提现申请] 开始处理D1提现,商户号={},订单号={},提现金额={}分", mercId, merOrderNo, drawAmt);