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 5837be79..7a3b6e19 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 @@ -115,4 +115,10 @@ public class CommonConstant { public static final int SeparateCalcMode_CanSeparateAmt = 2; + // 代理商等级:0-平台方;1-一级代理;2-二级代理; + public static final Integer Agent_Level_Plat = 0; + public static final Integer Agent_Level_1st = 1; + public static final Integer Agent_Level_2nd = 2; + + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMerReceiverBind.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMerReceiverBind.java index 3a913973..12a86ea8 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMerReceiverBind.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerMerReceiverBind.java @@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @Data @@ -45,6 +46,9 @@ public class LklLedgerMerReceiverBind implements Serializable { private String audit_status; private String audit_status_text; private String remark; + private Integer level; + private BigDecimal split_ratio; + private Integer shipping_fee; private String version; private Date created_at; private Date updated_at; diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java index 1c13fce2..1beb64f3 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/lakala/LklLedgerReceiver.java @@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @Data @@ -54,6 +55,9 @@ public class LklLedgerReceiver implements Serializable { private String attach_list; private String settle_type; private Long platform_id; + private Integer level; + private BigDecimal split_ratio; + private Integer shipping_fee; private String version; private Integer status; private Date created_at; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java index 43a17ef5..779b333a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java @@ -51,6 +51,30 @@ public interface LklLedgerMerReceiverBindService extends IBaseService selectAgentByMerCupNo(String merCupNo); + + /** + * 根据商户编号查询商户的一级代理商绑定记录 + * + * @param merCupNo + * @return + */ + LklLedgerMerReceiverBind getAgent1stByMerCupNo(String merCupNo); + + /** + * 根据商户编号查询商户的二级代理商绑定记录 + * + * @param merCupNo + * @return + */ + LklLedgerMerReceiverBind getAgent2ndByMerCupNo(String merCupNo); + /** * 根据申请编号查询一条平台绑定记录 * @@ -59,14 +83,6 @@ public interface LklLedgerMerReceiverBindService extends IBaseService selectDistributorByMerCupNo(String merCupNo); - /** * 判断商户是否已经绑定了分账接收方 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 7b8b7135..d7de65a8 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 @@ -2274,7 +2274,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { BigDecimal distributorSplitRatio = BigDecimal.ZERO; BigDecimal platformSplitRatio = BigDecimal.ONE; // 分账代理商接收方信息 - List distributorReceivers = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); + List distributorReceivers = lklLedgerMerReceiverBindService.selectAgentByMerCupNo(merchantNo); if (distributorReceivers != null && !distributorReceivers.isEmpty()) { distributorSplitRatio = new BigDecimal("0.8"); platformSplitRatio = new BigDecimal("0.2"); @@ -2478,7 +2478,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.info("[分账操作] 查询拉卡拉可分账余额接口:lklMerchantNo={} logDate={} receiveLogNo={} 结果:{}", lklMerchantNo, shopOrderLkl.getLkl_log_date(), receiveLogNo, mchCanSplitAmt); - // 可分账金额 + // 拉卡拉返回的实际可分账金额 refCanSeparateAmt = Convert.toInt(mchCanSplitAmt.getSecond()); if (CheckUtil.isEmpty(refCanSeparateAmt)) { log.warn("[分账操作] lklMerchantNo={} receiveTradeNo={} receiveLogNo={} 拉卡拉可分账金额无值或0,系统将自动计算可分账金额", @@ -2509,19 +2509,21 @@ public class LakalaApiServiceImpl implements LakalaApiService { return Pair.of(false, "平台方未绑定账户"); } - // 获取代理商分账信息 - BigDecimal platformSplitRatio = BigDecimal.valueOf(0.01); // 默认平台比例 1% - BigDecimal agent2ndSplitRatio = null; - // 代理商绑定列表 - List lklLedgerMerReceiverBindList = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); - if (CollUtil.isNotEmpty(lklLedgerMerReceiverBindList)) { - // 县级代理商比例值 = 1-商家比例值-平台比例值 - agent2ndSplitRatio = BigDecimal.ONE.subtract(mchSplitRatio).subtract(platformSplitRatio); - log.debug("[分账操作] 检测到代理商存在,调整分账比例: 代理商比例={}, 平台比例={}", agent2ndSplitRatio, platformSplitRatio); - } else { - // 平台比例值 = 1-商家比例值 - platformSplitRatio = BigDecimal.ONE.subtract(mchSplitRatio); + // 获取代理商分账信息 + BigDecimal platformSplitRatio = CheckUtil.isEmpty(platformReceiver.getSplit_ratio()) ? BigDecimal.valueOf(0.01) : platformReceiver.getSplit_ratio(); // 默认平台比例 1% + + LklLedgerMerReceiverBind agent1stReceiver = lklLedgerMerReceiverBindService.getAgent1stByMerCupNo(merchantNo); + LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindService.getAgent2ndByMerCupNo(merchantNo); + + BigDecimal agent1stSplitRatio = null; + BigDecimal agent2ndSplitRatio = null; + if (agent1stReceiver != null) { + agent1stSplitRatio = CheckUtil.isEmpty(agent1stReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent1stReceiver.getSplit_ratio(); // 默认省级比例 + } + + if (agent2ndReceiver != null) { + agent2ndSplitRatio = CheckUtil.isEmpty(agent2ndReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent2ndReceiver.getSplit_ratio(); // 默认市级比例 } // 内部配送费(单位:分) @@ -2533,7 +2535,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { shoppingFeeInner, mchSplitRatio, platformSplitRatio, - null, agent2ndSplitRatio, refCanSeparateAmt); + agent1stSplitRatio, agent2ndSplitRatio, refCanSeparateAmt); if (calcResult == null || !calcResult.getFirst() || calcResult.getSecond() == null) { log.error("[分账操作] 分账参数评估,结果无法分账"); @@ -2562,15 +2564,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { } return Pair.of(false, "订单可分账金额低于1分钱"); } - - + Integer merchantAmount = lklSeparateDTO.getMchAmount(); Integer platformAmount = lklSeparateDTO.getPlatAmount(); + Integer agent1stAmount = lklSeparateDTO.getAgent1stAmount(); Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount(); - log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 县级代理商比例={}, 县级代理商分得={}分", + log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 省级代理商比例={}, 省级代理商分得={}分, 县级代理商比例={}, 县级代理商分得={}分", orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, mchSplitRatio, merchantAmount, - platformSplitRatio, platformAmount, agent2ndSplitRatio, agent2ndAmount); + platformSplitRatio, platformAmount, agent1stSplitRatio, agent1stAmount, agent2ndSplitRatio, agent2ndAmount); // 构建分账接收方分账列表参数 List recvDatas = new ArrayList<>(); @@ -2578,7 +2580,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (CheckUtil.isNotEmpty(merchantAmount)) { V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); receiver.setRecvMerchantNo(merchantNo); - receiver.setSeparateValue(merchantAmount.toString()); + receiver.setSeparateValue(Convert.toStr(merchantAmount)); recvDatas.add(receiver); log.debug("[分账操作] 添加商家接收方: merchantNo={}, amount={}", merchantNo, merchantAmount); @@ -2588,29 +2590,37 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (CheckUtil.isNotEmpty(platformAmount)) { V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); receiver.setRecvNo(platformReceiver.getReceiver_no()); - receiver.setSeparateValue(platformAmount.toString()); + receiver.setSeparateValue(Convert.toStr(platformAmount)); recvDatas.add(receiver); log.debug("[分账操作] 添加平台接收方: receiverNo={}, amount={}", platformReceiver.getReceiver_no(), platformAmount); } + // 省级代理商分账参数 + if (agent1stReceiver != null && StrUtil.isNotBlank(agent1stReceiver.getReceiver_no()) && CheckUtil.isNotEmpty(agent1stAmount)) { + V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); + receiver.setRecvNo(agent1stReceiver.getReceiver_no()); + receiver.setSeparateValue(Convert.toStr(agent1stAmount)); + recvDatas.add(receiver); + + log.debug("[分账操作] 添加省级代理商接收方: receiverNo={}, amount={}", agent1stReceiver.getReceiver_no(), agent1stAmount); + } + // 县级代理商分账参数 - if (CollUtil.isNotEmpty(lklLedgerMerReceiverBindList) && CheckUtil.isNotEmpty(agent2ndAmount)) { - LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindList.get(0); - if (agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no())) { - V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); - receiver.setRecvNo(agent2ndReceiver.getReceiver_no()); - receiver.setSeparateValue(Convert.toStr(agent2ndAmount)); - recvDatas.add(receiver); + if (agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no()) && CheckUtil.isNotEmpty(agent2ndAmount)) { + V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); + receiver.setRecvNo(agent2ndReceiver.getReceiver_no()); + receiver.setSeparateValue(Convert.toStr(agent2ndAmount)); + recvDatas.add(receiver); - log.debug("[分账操作] 添加县级代理商接收方: receiverNo={}, amount={}", agent2ndReceiver.getReceiver_no(), agent2ndAmount); + log.debug("[分账操作] 添加县级代理商接收方: receiverNo={}, amount={}", agent2ndReceiver.getReceiver_no(), agent2ndAmount); + + // 有县级代理商的时候,配送费暂由它代收 add 2025-10-11 + V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); + shippingFeeReceiver.setRecvNo(agent2ndReceiver.getReceiver_no()); + shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner)); + recvDatas.add(shippingFeeReceiver); - // 平台内部配送费,由县级代理商代收 add 2025-10-11 - V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); - shippingFeeReceiver.setRecvNo(agent2ndReceiver.getReceiver_no()); - shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner)); - recvDatas.add(shippingFeeReceiver); - } } else { // 没有县级代理商的时候,配送费暂由平台代收 add 2025-10-11 V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java index 7c5a0f37..9f38b7c5 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java @@ -112,44 +112,98 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl selectListByMerCupNo(String merCupNo, Boolean isPlatform) { if (StrUtil.isBlank(merCupNo)) { - return null; + return Collections.emptyList(); } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mer_cup_no", merCupNo) - .eq("audit_status", CommonConstant.Enable); - if (isPlatform != null && isPlatform) { - queryWrapper.eq("platform_id", 0); - } else if (isPlatform != null && !isPlatform) { - queryWrapper.gt("platform_id", 0); + .eq("audit_status", CommonConstant.Enable) + .orderByAsc("id"); + + if (isPlatform != null) { + if (isPlatform) { + queryWrapper.eq("platform_id", 0); + } else { + queryWrapper.gt("platform_id", 0) + .in("level", CommonConstant.Agent_Level_1st, CommonConstant.Agent_Level_2nd); + } } - queryWrapper.orderByAsc("id"); - return list(queryWrapper); } /** * 根据商户编号查询一条平台绑定记录 * - * @param merCupNo - * @return + * @param merCupNo 商户银联编号 + * @return 平台绑定记录,不存在时返回null */ @Override public LklLedgerMerReceiverBind getPlatformByMerCupNo(String merCupNo) { List list = selectListByMerCupNo(merCupNo, true); - if (CollectionUtil.isEmpty(list)) { + return CollectionUtil.isEmpty(list) ? null : list.get(0); + } + + /** + * 根据商户编号查询代理商绑定记录列表 + * + * @param merCupNo 商户银联编号 + * @return 代理商绑定记录列表,不存在时返回空列表 + */ + @Override + public List selectAgentByMerCupNo(String merCupNo) { + return selectListByMerCupNo(merCupNo, false); + } + + /** + * 根据商户编号查询一级代理商绑定记录 + * + * @param merCupNo 商户银联编号 + * @return 一级代理商绑定记录,不存在时返回null + */ + @Override + public LklLedgerMerReceiverBind getAgent1stByMerCupNo(String merCupNo) { + if (StrUtil.isBlank(merCupNo)) { return null; } - return list.get(0); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mer_cup_no", merCupNo) + .eq("audit_status", CommonConstant.Enable) + .gt("platform_id", 0) + .eq("level", CommonConstant.Agent_Level_1st) + .orderByAsc("id"); + + return findOne(queryWrapper); + } + + /** + * 根据商户编号查询二级代理商绑定记录 + * + * @param merCupNo 商户银联编号 + * @return 二级代理商绑定记录,不存在时返回null + */ + @Override + public LklLedgerMerReceiverBind getAgent2ndByMerCupNo(String merCupNo) { + if (StrUtil.isBlank(merCupNo)) { + return null; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mer_cup_no", merCupNo) + .eq("audit_status", CommonConstant.Enable) + .gt("platform_id", 0) + .eq("level", CommonConstant.Agent_Level_2nd) + .orderByAsc("id"); + + return findOne(queryWrapper); } /** @@ -170,21 +224,6 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl selectDistributorByMerCupNo(String merCupNo) { - List list = selectListByMerCupNo(merCupNo, false); - if (CollectionUtil.isEmpty(list)) { - return null; - } - - return list; - } /** * 判断商户是否已经绑定了分账接收方 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 7ecccde9..3a396142 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 @@ -1741,12 +1741,12 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl