From 814f905e346b53f3c7b752e7e24bf1975b4b26ba Mon Sep 17 00:00:00 2001
From: Jack <46790855@qq.com>
Date: Sun, 7 Sep 2025 21:10:16 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=86=E8=B4=A6=E6=8C=87=E4=BB=A4=E6=96=B9?=
=?UTF-8?q?=E6=B3=95=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97=EF=BC=8C=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E6=8E=A5=E6=94=B6=E5=BC=82=E6=AD=A5=E9=80=9A=E7=9F=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../impl/AnalyticsUserServiceImpl.java | 9 +-
.../mall/common/constant/CommonConstant.java | 4 +
.../common/modules/order/ShopOrderLkl.java | 6 +
.../pay/service/PayConsumeTradeService.java | 41 +++
.../impl/AnalytiscTradeServiceImpl.java | 2 +-
.../service/impl/LakalaPayServiceImpl.java | 7 +-
.../impl/PayConsumeTradeServiceImpl.java | 76 ++++-
.../service/impl/PayUserPayServiceImpl.java | 29 +-
.../impl/AnalyticsOrderServiceImpl.java | 25 +-
.../impl/AnalyticsProductServiceImpl.java | 5 +-
.../impl/AnalyticsReturnServiceImpl.java | 17 +-
.../impl/AnalyticsStoreServiceImpl.java | 9 +-
.../service/impl/AnalyticsSysServiceImpl.java | 21 +-
.../ShopBaseStoreCategoryAdminController.java | 2 +-
.../ShopBaseStoreCategoryServiceImpl.java | 34 +--
.../controller/mobile/LakalaController.java | 20 ++
.../service/LklOrderSeparateService.java | 11 +
.../service/impl/LakalaApiServiceImpl.java | 275 ++++++++++++------
.../impl/LklOrderSeparateServiceImpl.java | 34 ++-
.../order/service/ShopOrderLklService.java | 12 +-
.../impl/ShopOrderBaseServiceImpl.java | 6 +-
.../service/impl/ShopOrderLklServiceImpl.java | 41 ++-
.../service/impl/ShopMchEntryServiceImpl.java | 2 +-
.../impl/ShopStoreBaseServiceImpl.java | 6 +-
.../sync/Utils/ProductPriceCalculator.java | 9 +-
.../sync/listen/ShopBatchSubmitListener.java | 4 +-
26 files changed, 513 insertions(+), 194 deletions(-)
diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AnalyticsUserServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AnalyticsUserServiceImpl.java
index 8ccaefd7..38bfc6cf 100644
--- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AnalyticsUserServiceImpl.java
+++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AnalyticsUserServiceImpl.java
@@ -26,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.List;
@Service
@@ -66,8 +67,8 @@ public class AnalyticsUserServiceImpl implements AnalyticsUserService {
// 计算日环比 日环比 = (当日数据 - 前一日数据) / 前一日数据 * 100%
BigDecimal daym2m = BigDecimal.ZERO;
if (yestodayRegUser.getNum().compareTo(BigDecimal.ZERO) != 0) {
- daym2m = (todayRegUser.getNum().subtract(yestodayRegUser.getNum())).divide(yestodayRegUser.getNum(), 2, BigDecimal.ROUND_HALF_UP);
- //.multiply(new BigDecimal("100"));
+ daym2m = (todayRegUser.getNum().subtract(yestodayRegUser.getNum())).divide(yestodayRegUser.getNum(), 2, RoundingMode.HALF_UP);
+ //.multiply(new BigDecimal(100));
} else {
}
@@ -126,8 +127,8 @@ public class AnalyticsUserServiceImpl implements AnalyticsUserService {
// 计算日环比 日环比 = (当日数据 - 前一日数据) / 前一日数据 * 100%
BigDecimal daym2m = BigDecimal.ZERO;
if (preRegNum.getNum().compareTo(BigDecimal.ZERO) != 0) {
- daym2m = (currentRegNum.getNum().subtract(preRegNum.getNum())).divide(preRegNum.getNum(), 2, BigDecimal.ROUND_HALF_UP);
- //.multiply(new BigDecimal("100"));
+ daym2m = (currentRegNum.getNum().subtract(preRegNum.getNum())).divide(preRegNum.getNum(), 2, RoundingMode.HALF_UP);
+ //.multiply(new BigDecimal(100));
} else {
}
diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java
index b4f6a8ef..d38548e1 100644
--- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java
+++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java
@@ -94,4 +94,8 @@ public class CommonConstant {
public static final String SPLIT_ = "diffCityOrderExpireSeconds";
+ // 订单分拆后 运费和商品子订单前缀
+ public static final String Sep_DeliveryFee_Prefix = "DF-";
+ public static final String Sep_GoodsFee_Prefix = "ORD-";
+
}
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 efba36be..f717cb6d 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
@@ -38,8 +38,12 @@ public class ShopOrderLkl implements Serializable {
private String order_id;
+ private String out_separate_no;
+
private Integer total_amt;
+ private Integer split_amt;
+
private Integer shopping_fee;
private BigDecimal split_ratio;
@@ -56,6 +60,8 @@ public class ShopOrderLkl implements Serializable {
private String lkl_log_date;
+ private String lkl_split_log_no;
+
private String lkl_trade_no;
private String lkl_merchant_no;
diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/PayConsumeTradeService.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/PayConsumeTradeService.java
index 05691e94..93167aa7 100644
--- a/mall-pay/src/main/java/com/suisung/mall/pay/service/PayConsumeTradeService.java
+++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/PayConsumeTradeService.java
@@ -1,5 +1,6 @@
package com.suisung.mall.pay.service;
+import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.order.ShopOrderReturn;
import com.suisung.mall.common.modules.pay.PayConsumeTrade;
@@ -61,4 +62,44 @@ public interface PayConsumeTradeService extends IBaseService {
*/
Boolean updateTradeByPrimaryKey(PayConsumeTrade payConsumeTrade);
+
+ /**
+ * 从拉卡拉分账响应信息中提取合单运费或商品订单信息
+ * 该方法用于处理合单支付场景,从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息
+ *
+ * @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:
+ * [
+ * {
+ * "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
+ * "merchant_no":"822584059990FYP", // 商户号
+ * "amount":"1", // 分账金额
+ * "settle_type":"0", // 结算类型
+ * "sub_log_no":"66250034401288", // 子流水号
+ * "out_sub_trade_no":"DF-DD-20250830-21", // 外部子交易订单号(DF开头为运费订单)
+ * "term_no":"N5811590" // 终端设备号
+ * },
+ * {
+ * "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
+ * "merchant_no":"8226330541100GU", // 商户号
+ * "amount":"1", // 分账金额
+ * "settle_type":"0", // 结算类型
+ * "sub_log_no":"66250034401289", // 子流水号
+ * "out_sub_trade_no":"ORD-DD-20250830-21", // 外部子交易订单号(ORD开头为商品订单)
+ * "term_no":"N5817779" // 终端设备号
+ * }
+ * ]
+ * @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
+ * @return JSONObject 返回匹配的子单信息,格式如下:
+ * {
+ * "sub_trade_no":"20250830110113130266250034401288",
+ * "merchant_no":"822584059990FYP",
+ * "amount":"1",
+ * "settle_type":"0",
+ * "sub_log_no":"66250034401288",
+ * "out_sub_trade_no":"DF-DD-20250830-21",
+ * "term_no":"N5811590"
+ * }
+ */
+ JSONObject getLklCombineSplitRespInfo(String outSplitRspInfos, boolean isDeliveryFee);
+
}
diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/AnalytiscTradeServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/AnalytiscTradeServiceImpl.java
index 7f7f352c..c771fbc7 100644
--- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/AnalytiscTradeServiceImpl.java
+++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/AnalytiscTradeServiceImpl.java
@@ -83,7 +83,7 @@ public class AnalytiscTradeServiceImpl implements AnalytiscTradeService {
BigDecimal daym2m = BigDecimal.ZERO;
if (yestodayTradeAmount.getAmount().compareTo(BigDecimal.ZERO) != 0) {
daym2m = (todayTradeAmount.getAmount().subtract(yestodayTradeAmount.getAmount())).divide(yestodayTradeAmount.getAmount(), 2, RoundingMode.HALF_UP);
- //.multiply(new BigDecimal("100"));
+ //.multiply(new BigDecimal(100));
} else {
}
diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java
index 8943dd01..24adce56 100644
--- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java
+++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java
@@ -23,6 +23,7 @@ import com.lkl.laop.sdk.request.V3LabsRelationRefundRequest;
import com.lkl.laop.sdk.request.V3LabsTransPreorderRequest;
import com.lkl.laop.sdk.request.model.V3LabsTradeLocationInfo;
import com.lkl.laop.sdk.request.model.V3LabsTradePreorderWechatBus;
+import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.feignService.ShopService;
import com.suisung.mall.common.modules.store.ShopStoreBase;
@@ -265,7 +266,7 @@ public class LakalaPayServiceImpl implements LakalaPayService {
// 重要约定,订单号规则:商品订单:ORD-订单号,运费订单:DF-订单号
// 分单信息
JSONObject goodsSplitInfo = new JSONObject();
- goodsSplitInfo.put("out_sub_trade_no", "ORD-" + orderId); // 子订单号
+ goodsSplitInfo.put("out_sub_trade_no", CommonConstant.Sep_GoodsFee_Prefix + orderId); // 商品子订单号
goodsSplitInfo.put("merchant_no", merchantNo); // 分账商户号
goodsSplitInfo.put("term_no", termNo); // 分账终端号
int totalAmountInt = Convert.toInt(totalAmount) - Convert.toInt(agentAmount);
@@ -274,7 +275,7 @@ public class LakalaPayServiceImpl implements LakalaPayService {
goodsSplitInfo.put("sub_remark", "商品订单金额"); // 子单备注信息
JSONObject deliverySplitInfo = new JSONObject();
- deliverySplitInfo.put("out_sub_trade_no", "DF-" + orderId); // 子订单号
+ deliverySplitInfo.put("out_sub_trade_no", CommonConstant.Sep_DeliveryFee_Prefix + orderId); // 运费子订单号
deliverySplitInfo.put("merchant_no", agentMerchantNo); // 分账商户号
deliverySplitInfo.put("term_no", agentTermNo); // 分账终端号
deliverySplitInfo.put("amount", agentAmount); // 分账金额
@@ -320,6 +321,8 @@ public class LakalaPayServiceImpl implements LakalaPayService {
JSONObject lklPayReqAndRespJson = new JSONObject();
lklPayReqAndRespJson.put("req", reqData);
lklPayReqAndRespJson.put("resp", respBody); // 返回原始响应数据
+
+ // 新增 shopOrderLkl 记录
shopService.lklPayAddShopOrderLkl(lklPayReqAndRespJson);
// 8. 返回响应结果
diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayConsumeTradeServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayConsumeTradeServiceImpl.java
index f82046ac..3ef41562 100644
--- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayConsumeTradeServiceImpl.java
+++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayConsumeTradeServiceImpl.java
@@ -189,7 +189,7 @@ public class PayConsumeTradeServiceImpl extends BaseServiceImpl该方法用于处理合单支付场景,从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息
*
- * @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:[{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"},{"sub_trade_no":"20250830110113130266250034401289","merchant_no":"8226330541100GU","amount":"1","settle_type":"0","sub_log_no":"66250034401289","out_sub_trade_no":"ORD-DD-20250830-21","term_no":"N5817779"}]
- * @return 返回包含合单运费 JSON 信息:{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"}
+ * @param outSplitRspInfos 拉卡拉分账响应信息,格式为JSON数组字符串:
+ * [
+ * {
+ * "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
+ * "merchant_no":"822584059990FYP", // 商户号
+ * "amount":"1", // 分账金额
+ * "settle_type":"0", // 结算类型
+ * "sub_log_no":"66250034401288", // 子流水号
+ * "out_sub_trade_no":"DF-DD-20250830-21", // 外部子交易订单号(DF开头为运费订单)
+ * "term_no":"N5811590" // 终端设备号
+ * },
+ * {
+ * "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
+ * "merchant_no":"8226330541100GU", // 商户号
+ * "amount":"1", // 分账金额
+ * "settle_type":"0", // 结算类型
+ * "sub_log_no":"66250034401289", // 子流水号
+ * "out_sub_trade_no":"ORD-DD-20250830-21", // 外部子交易订单号(ORD开头为商品订单)
+ * "term_no":"N5817779" // 终端设备号
+ * }
+ * ]
+ * @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
+ * @return JSONObject 返回匹配的子单信息,格式如下:
+ * {
+ * "sub_trade_no":"20250830110113130266250034401288",
+ * "merchant_no":"822584059990FYP",
+ * "amount":"1",
+ * "settle_type":"0",
+ * "sub_log_no":"66250034401288",
+ * "out_sub_trade_no":"DF-DD-20250830-21",
+ * "term_no":"N5811590"
+ * }
*/
- protected JSONObject getLklCombineDeliveryFeeInfo(String outSplitRspInfos) {
- // 1. 输入参数校验
+ @Override
+ public JSONObject getLklCombineSplitRespInfo(String outSplitRspInfos, boolean isDeliveryFee) {
+ // 输入参数校验:检查分账信息是否为空
if (StrUtil.isBlank(outSplitRspInfos)) {
logger.warn("获取子流水号失败:输入的分账信息为空");
return null;
}
- // 2. 解析JSON数组
+ // 解析JSON数组:将字符串转换为JSONArray对象
JSONArray outSplitRspInfoArray;
try {
outSplitRspInfoArray = JSONUtil.parseArray(outSplitRspInfos);
@@ -2114,20 +2146,40 @@ public class PayConsumeTradeServiceImpl extends BaseServiceImpl subTradeNos = getLklSubTradeNo(outSplitRspInfos);
if (subTradeNos != null) {
+ // 商品子订单号
payConsumeDeposit.setOrd_sub_trade_no(subTradeNos.getFirst());
+ // 商品运费子订单号
payConsumeDeposit.setDf_sub_trade_no(subTradeNos.getSecond());
}
+
+ // 获取拉卡拉订单合单商品信息
+ cn.hutool.json.JSONObject goodsOrderInfo = payConsumeTradeService.getLklCombineSplitRespInfo(outSplitRspInfos, false);
+ if (goodsOrderInfo != null) {
+ lklNotifyRespJSON.set("out_separate_no", goodsOrderInfo.getStr("out_sub_trade_no"));// 合单子订单号
+ lklNotifyRespJSON.set("lkl_split_log_no", lklNotifyRespJSON.getStr("sub_log_no")); // 合单子商品订单的流水号
+ lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("amount")); // 合单子商品订单支付金额
+ }
}
// 判断是否联合支付
@@ -1900,13 +1921,13 @@ public class PayUserPayServiceImpl extends BaseServiceImpl 0) {
+ if (shopBaseStoreCategory.getSplit_ratio().compareTo(new BigDecimal(100)) > 0) {
return CommonResult.failed(I18nUtil._("分成比例不能大于100"));
}
diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java
index 347072e4..56c66c52 100644
--- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java
+++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseStoreCategoryServiceImpl.java
@@ -10,8 +10,8 @@ import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.base.mapper.ShopBaseStoreCategoryMapper;
import com.suisung.mall.shop.base.service.ShopBaseStoreCategoryService;
-import lombok.extern.slf4j.Slf4j;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
@@ -66,7 +66,7 @@ public class ShopBaseStoreCategoryServiceImpl extends BaseServiceImpl> futures = new ArrayList<>();
- Map storeLis = new HashMap<>();
- if(openFindStore){
+ Map storeLis = new HashMap<>();
+ if (openFindStore) {
long startTime = System.currentTimeMillis();
for (Map category_row : category_rows) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
- RequestContextHolder.setRequestAttributes(requestAttributes,true);
+ RequestContextHolder.setRequestAttributes(requestAttributes, true);
Integer store_category_id = (Integer) category_row.get("store_category_id");
Map row = new HashMap<>();
row.put("store_category_id", String.valueOf(store_category_id));
- row.put("findStore",true);
- row.put("store_type","1");
- Map storeListMap= shopStoreBaseService.getStoreList(1, pageSize,row);
+ row.put("findStore", true);
+ row.put("store_type", "1");
+ Map storeListMap = shopStoreBaseService.getStoreList(1, pageSize, row);
storeLis.put(String.valueOf(store_category_id), storeListMap);
return null;
});
futures.add(future);
}
- CompletableFuture allOfFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
- .thenRun(() -> {
- long endTime = System.currentTimeMillis();
- SwingUtilities.invokeLater(() -> {
- log.debug("异步调用完成! 总耗时: "+(endTime - startTime) + "ms\n");
+ CompletableFuture allOfFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
+ .thenRun(() -> {
+ long endTime = System.currentTimeMillis();
+ SwingUtilities.invokeLater(() -> {
+ log.debug("异步调用完成! 总耗时: " + (endTime - startTime) + "ms\n");
+ });
});
- });
allOfFuture.join();
}
for (Map category_row : category_rows) {
Integer store_category_id = (Integer) category_row.get("store_category_id");
List