From 2a26e37d6287de99df6382018cba52e77d1cde20 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 17 Sep 2025 20:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E7=94=A8=E5=88=86=E8=B4=A6=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/modules/order/ShopOrderLkl.java | 6 ++ .../mall/common/pojo/dto/LklSeparateDTO.java | 4 +- .../admin/LakalaAdminController.java | 42 ++++++++++ .../controller/mobile/LakalaController.java | 7 -- .../shop/lakala/service/LakalaApiService.java | 17 ++++ .../service/impl/LakalaApiServiceImpl.java | 78 +++++++++++++++---- .../order/service/ShopOrderLklService.java | 3 +- .../service/impl/ShopOrderLklServiceImpl.java | 3 +- .../src/main/resources/bootstrap-dev.yml | 4 + .../src/main/resources/bootstrap-local.yml | 4 + .../src/main/resources/bootstrap-prod.yml | 4 + .../src/main/resources/bootstrap-test.yml | 4 + .../src/main/resources/bootstrap-uat.yml | 4 + 13 files changed, 156 insertions(+), 24 deletions(-) create mode 100644 mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java 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 0eacc338..f1b4ce81 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 @@ -44,8 +44,12 @@ public class ShopOrderLkl implements Serializable { private Integer split_amt; + private Integer split_amt_ref; + private Integer shopping_fee; + private Integer shopping_fee_inner; + private BigDecimal split_ratio; private String payment_time; @@ -92,6 +96,8 @@ public class ShopOrderLkl implements Serializable { private Integer separate_status; + private String separate_remark; + private Integer status; private Date created_at; 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 5e67a982..48e5e2ab 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 @@ -142,8 +142,8 @@ public class LklSeparateDTO implements java.io.Serializable { // 基于总金额的分账计算测试用例(带refCanSeparateAmount) logger.info("\n\n基于总金额的分账计算测试用例 - 带参考可分账金额:"); LklSeparateDTO dto7 = new LklSeparateDTO(); - dto7.setTotalSeparateAmount(502); - dto7.setShippingFee(500); + dto7.setTotalSeparateAmount(1); + dto7.setShippingFee(0); dto7.setLklRatio(new BigDecimal("0.0025")); // 拉卡拉比例0.25% dto7.setMchRatio(new BigDecimal("0.94")); // 商户比例90% dto7.setPlatRatio(new BigDecimal("0.01")); // 平台比例5% 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 new file mode 100644 index 00000000..238aa1cc --- /dev/null +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/admin/LakalaAdminController.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.shop.lakala.controller.admin; + +import cn.hutool.json.JSONObject; +import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.common.service.impl.BaseControllerImpl; +import com.suisung.mall.shop.lakala.service.LakalaApiService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags = "拉卡拉相关接口 - 后端控制器") +@RestController +@RequestMapping("/admin/shop/lakala") +public class LakalaAdminController extends BaseControllerImpl { + + @Resource + private LakalaApiService lakalaPayService; + + @ApiOperation(value = "查询拉卡拉商户可分账的金额", notes = "查询拉卡拉商户可分账的金额") + @RequestMapping(value = "/sacs/queryMchSplitAmt", method = RequestMethod.POST) + public CommonResult queryMchCanSplitAmt(@RequestBody JSONObject paramsJSON) { + JSONObject resultJSON = lakalaPayService.queryMchCanSplitAmtInner(paramsJSON.getStr("merchantNo"), paramsJSON.getStr("logNo"), paramsJSON.getStr("logDate")); + if (resultJSON != null) { + return CommonResult.success(resultJSON); + } + return CommonResult.failed(); + } + +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java index 42ae878b..921fa37a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/controller/mobile/LakalaController.java @@ -162,13 +162,6 @@ public class LakalaController extends BaseControllerImpl { @ApiOperation(value = "跳转到拉卡拉签署合同链接", notes = "跳转到拉卡拉签署合同链接") @RequestMapping(value = "/sign/ec/{code}", method = RequestMethod.GET) public ModelAndView jumpToSignLklEcLink(@PathVariable Long code) { -// // 根据 code 值决定重定向到哪个 URL -// String resultUrl = lklLedgerEcService.getLklEcResultUrl(code); -// if (StrUtil.isBlank(resultUrl)) { -// return new RedirectView("https://mall.gpxscs.cn/mchapp"); -// } -// return new RedirectView(resultUrl); - // 根据 code 值获取结果 URL String resultUrl = lklLedgerEcService.getLklEcResultUrl(code); 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 71df8386..abfdb6b7 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 @@ -235,6 +235,23 @@ public interface LakalaApiService { */ Pair queryMchCanSplitAmt(String merchantNo, String logNo, String logDate); + /** + * 查询拉卡拉商户可分账的金额 + * 参考:https://o.lakala.com/#/home/document/detail?id=394 + * + * @param merchantNo 拉卡拉外部商户号 + * @param logNo 拉卡拉对账单流水号 + * @param logDate 拉卡拉对账单交易日期 yyyyMMdd + * @return 响应结果 { + * "merchant_no": "82229005943096D", + * "total_separate_amt": "9900", + * "can_separate_amt": "0", + * "log_date": "20221220", + * "log_no": "66210306990190" + * } + */ + JSONObject queryMchCanSplitAmtInner(String merchantNo, String logNo, String logDate); + /** * 订单分账撤销 * 参考:https://o.lakala.com/#/home/document/detail?id=390 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 5b7a279d..0e886123 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 @@ -1747,6 +1747,52 @@ public class LakalaApiServiceImpl implements LakalaApiService { return null; } + try { + JSONObject respData = queryMchCanSplitAmtInner(merchantNo, logNo, logDate); + if (respData == null) { + log.error("[查询可分账金额] 内部查询返回空结果, merchantNo={}, logNo={}, logDate={}", merchantNo, logNo, logDate); + return null; + } + + String totalSeparateAmt = respData.getStr("total_separate_amt"); + String canSeparateAmt = respData.getStr("can_separate_amt"); + + if (StringUtils.isAnyBlank(totalSeparateAmt, canSeparateAmt)) { + log.error("[查询可分账金额] 返回数据字段缺失, merchantNo={}, logNo={}, logDate={}, totalSeparateAmt={}, canSeparateAmt={}", + merchantNo, logNo, logDate, totalSeparateAmt, canSeparateAmt); + return null; + } + + return Pair.of(totalSeparateAmt, canSeparateAmt); + } catch (Exception e) { + log.error("[查询可分账金额] 查询过程中发生未知异常, merchantNo={}, logNo={}, logDate={}", merchantNo, logNo, logDate, e); + return null; + } + } + + /** + * 查询拉卡拉商户可分账的金额 + * 参考:https://o.lakala.com/#/home/document/detail?id=394 + * + * @param merchantNo 拉卡拉外部商户号 + * @param logNo 拉卡拉对账单流水号 + * @param logDate 拉卡拉对账单交易日期 yyyyMMdd + * @return 响应结果 { + * "merchant_no": "82229005943096D", + * "total_separate_amt": "9900", + * "can_separate_amt": "0", + * "log_date": "20221220", + * "log_no": "66210306990190" + * } + */ + @Override + public JSONObject queryMchCanSplitAmtInner(String merchantNo, String logNo, String logDate) { + + if (StringUtils.isAnyBlank(merchantNo, logNo, logDate)) { + log.warn("[查询可分账金额] 参数校验失败:缺少必要参数, merchantNo={}, logNo={}, logDate={}", merchantNo, logNo, logDate); + return null; + } + try { log.info("[查询可分账金额] 开始查询商户可分账金额, merchantNo={}, logNo={}, logDate={}", merchantNo, logNo, logDate); @@ -1767,27 +1813,33 @@ public class LakalaApiServiceImpl implements LakalaApiService { } JSONObject lklRespJSON = JSONUtil.parseObj(responseStr); - if (lklRespJSON == null || !lklSacsSuccessCode.equals(lklRespJSON.getStr("code")) || lklRespJSON.get("resp_data") == null) { + if (lklRespJSON == null || !lklSacsSuccessCode.equals(lklRespJSON.getStr("code"))) { log.error("[查询可分账金额] 返回值有误, merchantNo={}, logNo={}, logDate={}, response={}", merchantNo, logNo, logDate, responseStr); return null; } - JSONObject respData = (JSONObject) lklRespJSON.get("resp_data"); - if (respData == null - || StringUtils.isAnyBlank(respData.getStr("total_separate_amt"), respData.getStr("can_separate_amt"))) { + Object respDataObj = lklRespJSON.get("resp_data"); + if (respDataObj == null || !(respDataObj instanceof JSONObject)) { + log.error("[查询可分账金额] 返回数据字段缺失或格式错误, merchantNo={}, logNo={}, logDate={}, respData={}", + merchantNo, logNo, logDate, respDataObj); + return null; + } + + JSONObject respData = (JSONObject) respDataObj; + String totalSeparateAmt = respData.getStr("total_separate_amt"); + String canSeparateAmt = respData.getStr("can_separate_amt"); + + if (StringUtils.isAnyBlank(totalSeparateAmt, canSeparateAmt)) { log.error("[查询可分账金额] 返回数据字段缺失, merchantNo={}, logNo={}, logDate={}, respData={}", merchantNo, logNo, logDate, respData); return null; } - String totalSeparateAmt = respData.getStr("total_separate_amt"); - String canSeparateAmt = respData.getStr("can_separate_amt"); - log.info("[查询可分账金额] 查询成功, merchantNo={}, logNo={}, logDate={}, totalSeparateAmt={}, canSeparateAmt={}", merchantNo, logNo, logDate, totalSeparateAmt, canSeparateAmt); - return Pair.of(totalSeparateAmt, canSeparateAmt); + return respData; } catch (SDKException e) { log.error("[查询可分账金额] 账户余额查询失败, merchantNo={}, logNo={}, logDate={}", merchantNo, logNo, logDate, e); return null; @@ -2265,7 +2317,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { 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); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, errorMsg); log.error(errorMsg); return Pair.of(false, "拉卡拉无响应"); } @@ -2278,7 +2330,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s,商户=%s,分账流水号=%s,响应=%s,respJson=%s", orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response, respJson); // 更改分账状态:分账失败 - 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.getStr("code") + "]" + respJson.getStr("msg")); } @@ -2452,9 +2504,9 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 8. 持久化处理 - 更新分账记录到数据库 boolean updateSuccess = lklOrderSeparateService.addOrUpdateByReceiverNo(lklOrderSeparate); if (!updateSuccess) { - // 更改分账状态:分账失败 - shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Fail); String errorMsg = String.format("分账记录更新失败, separateNo=%s", separateNo); + // 更改分账状态:分账失败 + shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Fail, errorMsg); log.error("[拉卡拉分账通知] {}", errorMsg); return JSONUtil.createObj() .put("code", "FAIL") @@ -2462,7 +2514,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { } // 更改分账状态:分账成功 - shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success); + shopOrderLklService.updateSeparateStatusByReceiveLogNo(logNo, CommonConstant.Sta_Separate_Success, "分账成功"); // 9. 记录处理成功日志 log.info("[拉卡拉分账通知] 分账通知处理成功, separateNo={}, status={}", separateNo, status); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderLklService.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderLklService.java index 4c386648..19c16ae5 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderLklService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/ShopOrderLklService.java @@ -100,7 +100,8 @@ public interface ShopOrderLklService extends IBaseService { * * @param lklReceiveLogNo 拉卡拉确认收货对账单流水号 * @param separateStatus 分账状态:1-已分账;2-未分账;3-分账已失败; + * @param separateRemark 分账问题备注; * @return */ - Boolean updateSeparateStatusByReceiveLogNo(String lklReceiveLogNo, Integer separateStatus); + Boolean updateSeparateStatusByReceiveLogNo(String lklReceiveLogNo, Integer separateStatus, String separateRemark); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java index 14cede5c..b9efdbaa 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderLklServiceImpl.java @@ -509,10 +509,11 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl