清除配置文件无用的配置

This commit is contained in:
Jack 2025-09-18 11:23:01 +08:00
parent d9dd08e6d8
commit 0e94c5d24e
21 changed files with 201 additions and 115 deletions

View File

@ -103,5 +103,8 @@ public class CommonConstant {
public static final Integer Sta_Separate_Undone = 2; public static final Integer Sta_Separate_Undone = 2;
public static final Integer Sta_Separate_Fail = 3; public static final Integer Sta_Separate_Fail = 3;
// 最低平台内部配送费 配置key
public static final String Inner_Min_DeliveryFee_Key = "inner_min_delivery_fee";
} }

View File

@ -37,4 +37,5 @@ public class RedisConstant {
public static final String SF_Order_Proc_WillExpire_Key = ConstantRedis.Cache_NameSpace + "sf_order_proc_will_expire_key__"; public static final String SF_Order_Proc_WillExpire_Key = ConstantRedis.Cache_NameSpace + "sf_order_proc_will_expire_key__";
public static final String Order_Pay_Retry_Count_Key = ConstantRedis.Cache_NameSpace + "order_pay_retry_count:"; public static final String Order_Pay_Retry_Count_Key = ConstantRedis.Cache_NameSpace + "order_pay_retry_count:";
} }

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.util.Pair;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
@ -116,9 +117,9 @@ public class LklSeparateDTO implements java.io.Serializable {
dto2.getTotalSeparateAmount(), dto2.getShippingFee(), dto2.getLklRatio(), dto2.getTotalSeparateAmount(), dto2.getShippingFee(), dto2.getLklRatio(),
dto2.getMchRatio(), dto2.getPlatRatio()); dto2.getMchRatio(), dto2.getPlatRatio());
boolean result2 = dto2.calcOnCanAmount(); Pair<Boolean, String> result2 = dto2.calcOnCanSeparateAmount();
logger.info("分账计算结果: {}", (result2 ? "成功" : "失败")); logger.info("分账计算结果: {}", (result2.getFirst() ? "成功" : "失败"));
if (result2) { if (result2.getFirst()) {
logger.info("分账结果: 总金额={}分, 拉卡拉={}分, 配送费={}分, 可分账={}分, 参考可分账={}分, 商户={}分, 平台={}分, 一级代理商={}分, 二级代理商={}分", logger.info("分账结果: 总金额={}分, 拉卡拉={}分, 配送费={}分, 可分账={}分, 参考可分账={}分, 商户={}分, 平台={}分, 一级代理商={}分, 二级代理商={}分",
dto2.getTotalSeparateAmount(), dto2.getLklAmount(), dto2.getShippingFee(), dto2.getCanSeparateAmount(), dto2.getRefCanSeparateAmount(), dto2.getTotalSeparateAmount(), dto2.getLklAmount(), dto2.getShippingFee(), dto2.getCanSeparateAmount(), dto2.getRefCanSeparateAmount(),
dto2.getMchAmount(), dto2.getPlatAmount(), dto2.getAgent1stAmount(), dto2.getAgent2ndAmount()); dto2.getMchAmount(), dto2.getPlatAmount(), dto2.getAgent1stAmount(), dto2.getAgent2ndAmount());
@ -182,15 +183,15 @@ public class LklSeparateDTO implements java.io.Serializable {
* 5. 按优先级计算各参与方分账金额商户 > 平台 > 一级代理商 > 二级代理商 * 5. 按优先级计算各参与方分账金额商户 > 平台 > 一级代理商 > 二级代理商
* 6. 确保总额平衡并保障各参与方分账比例 * 6. 确保总额平衡并保障各参与方分账比例
* *
* @return 分账结果是否成功 * @return Pair<Boolean, String> 分账结果是否成功和失败的原因
*/ */
public boolean calcOnCanAmount() { public Pair<Boolean, String> calcOnCanSeparateAmount() {
// 设置分账计算方法类型 // 设置分账计算方法类型
isBasedOnTotalAmount = false; isBasedOnTotalAmount = false;
// 检查前提条件 // 检查前提条件
if (!validateInputs()) { if (!validateInputs()) {
return false; return Pair.of(false, "分账参数不全");
} }
logger.info("开始基于可分账金额的分账计算,总金额={}分,配送费={}分", totalSeparateAmount, shippingFee); logger.info("开始基于可分账金额的分账计算,总金额={}分,配送费={}分", totalSeparateAmount, shippingFee);
@ -201,8 +202,9 @@ public class LklSeparateDTO implements java.io.Serializable {
// 计算可分账金额 // 计算可分账金额
calculateCanSeparateAmount(); calculateCanSeparateAmount();
if (canSeparateAmount <= 0) { if (canSeparateAmount <= 0) {
logger.info("分账计算失败可分账金额必须大于0当前值={}", canSeparateAmount); String errorMsg = "分账计算失败可分账金额必须大于0当前值=" + canSeparateAmount;
return false; logger.info(errorMsg);
return Pair.of(false, errorMsg);
} }
// 检查并应用参考可分账金额 // 检查并应用参考可分账金额
@ -220,9 +222,10 @@ public class LklSeparateDTO implements java.io.Serializable {
// 保障各参与方分账比例 // 保障各参与方分账比例
guaranteeRatios(); guaranteeRatios();
logger.info("基于可分账金额的分账计算完成:拉卡拉={}分, 平台={}分, 一级代理商={}分, 二级代理商={}分, 商户={}", String successMsg = String.format("基于可分账金额的分账计算完成:拉卡拉=%d分, 平台=%d分, 一级代理商=%d分, 二级代理商=%d分, 商户=%d",
lklAmount, platAmount, agent1stAmount, agent2ndAmount, mchAmount); lklAmount, platAmount, agent1stAmount, agent2ndAmount, mchAmount);
return true; logger.info(successMsg);
return Pair.of(true, successMsg);
} }
/** /**
@ -236,15 +239,15 @@ public class LklSeparateDTO implements java.io.Serializable {
* 5. 按优先级计算各参与方分账金额平台 > 一级代理商 > 二级代理商 > 商户基于可分账金额进行分账 * 5. 按优先级计算各参与方分账金额平台 > 一级代理商 > 二级代理商 > 商户基于可分账金额进行分账
* 6. 确保总额平衡并保障各参与方分账比例 * 6. 确保总额平衡并保障各参与方分账比例
* *
* @return 分账结果是否成功 * @return Pair<Boolean, String> 分账结果是否成功和失败的原因
*/ */
public boolean calcOnTotalAmount() { public Pair<Boolean, String> calcOnTotalAmount() {
// 设置分账计算方法类型 // 设置分账计算方法类型
isBasedOnTotalAmount = true; isBasedOnTotalAmount = true;
// 检查前提条件 // 检查前提条件
if (!validateInputsForTotalAmount()) { if (!validateInputsForTotalAmount()) {
return false; return Pair.of(false, "分账参数不全");
} }
logger.info("开始基于总金额的分账计算,总金额={}分,配送费={}分", totalSeparateAmount, shippingFee); logger.info("开始基于总金额的分账计算,总金额={}分,配送费={}分", totalSeparateAmount, shippingFee);
@ -255,8 +258,9 @@ public class LklSeparateDTO implements java.io.Serializable {
// 计算可分账金额 // 计算可分账金额
calculateCanSeparateAmount(); calculateCanSeparateAmount();
if (canSeparateAmount <= 0) { if (canSeparateAmount <= 0) {
logger.info("基于总金额的分账计算失败可分账金额必须大于0当前值={}", canSeparateAmount); String errorMsg = "基于总金额的分账计算失败可分账金额必须大于0当前值=" + canSeparateAmount;
return false; logger.info(errorMsg);
return Pair.of(false, errorMsg);
} }
// 调整分账比例 // 调整分账比例
@ -274,9 +278,10 @@ public class LklSeparateDTO implements java.io.Serializable {
// 保障各参与方分账比例忽略商户比例保障 // 保障各参与方分账比例忽略商户比例保障
guaranteeRatiosForTotalAmount(); guaranteeRatiosForTotalAmount();
logger.info("基于总金额的分账计算完成:拉卡拉={}分, 平台={}分, 一级代理商={}分, 二级代理商={}分, 商户={}", String successMsg = String.format("基于总金额的分账计算完成:拉卡拉=%d分, 平台=%d分, 一级代理商=%d分, 二级代理商=%d分, 商户=%d",
lklAmount, platAmount, agent1stAmount, agent2ndAmount, mchAmount); lklAmount, platAmount, agent1stAmount, agent2ndAmount, mchAmount);
return true; logger.info(successMsg);
return Pair.of(true, successMsg);
} }
/** /**

View File

@ -257,4 +257,5 @@ public class CommonService {
return null; return null;
} }
} }

View File

@ -39,4 +39,19 @@ public interface AccountBaseConfigService extends IBaseService<AccountBaseConfig
boolean getTradeModePlantform(); boolean getTradeModePlantform();
/**
* 获取系统配置
*
* @param configKey
* @return
*/
String getSystemConfig(String configKey);
/**
* 获取平台内部最低配送费单位
*
* @return
*/
Integer getInnerMinDeliveryFee();
} }

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.constant.RedisConstant; import com.suisung.mall.common.constant.RedisConstant;
import com.suisung.mall.common.feignService.AccountService; import com.suisung.mall.common.feignService.AccountService;
import com.suisung.mall.common.modules.account.AccountBaseConfig; import com.suisung.mall.common.modules.account.AccountBaseConfig;
@ -226,6 +227,43 @@ public class AccountBaseConfigServiceImpl extends BaseServiceImpl<AccountBaseCon
return getTradeMode(); return getTradeMode();
} }
/**
* 获取系统配置值
* <p>
* 根据配置键获取对应的配置值如果配置值为空则返回空字符串
* </p>
*
* @param configKey 配置键
* @return 配置值如果找不到或为空则返回空字符串
*/
@Override
public String getSystemConfig(String configKey) {
// 参数校验
if (StrUtil.isBlank(configKey)) {
log.warn("[系统配置] 参数校验失败:配置键不能为空");
return "";
}
try {
String configValue = accountService.getAccountBaseConfigValue(configKey);
return StrUtil.blankToDefault(configValue, "0");
} catch (Exception e) {
log.error("[系统配置] 获取配置值异常configKey={}", configKey, e);
return "";
}
}
/**
* 获取平台内部最低配送费单位
*
* @return
*/
@Override
public Integer getInnerMinDeliveryFee() {
String v = getSystemConfig(CommonConstant.Inner_Min_DeliveryFee_Key);
return NumberUtil.isNumber(v) ? Convert.toInt(v) : 0;
}
/** /**
* 交易模式 2直接交易:商家直接收款 1担保交易平台收款平台和商家结算 * 交易模式 2直接交易:商家直接收款 1担保交易平台收款平台和商家结算
*/ */

View File

@ -28,10 +28,8 @@ import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.utils.DateTimeUtils; import com.suisung.mall.common.utils.DateTimeUtils;
import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.RestTemplateHttpUtil; import com.suisung.mall.common.utils.RestTemplateHttpUtil;
import com.suisung.mall.pay.service.AccountBaseConfigService;
import com.suisung.mall.pay.service.LakalaPayService; import com.suisung.mall.pay.service.LakalaPayService;
import com.suisung.mall.pay.service.LklLedgerMemberService;
import com.suisung.mall.pay.service.LklLedgerMerReceiverBindService;
import com.suisung.mall.pay.service.LklLedgerReceiverService;
import com.suisung.mall.pay.utils.LakalaUtil; import com.suisung.mall.pay.utils.LakalaUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -81,14 +79,9 @@ public class LakalaPayServiceImpl implements LakalaPayService {
@Autowired @Autowired
private ShopService shopService; private ShopService shopService;
@Lazy
@Autowired @Autowired
private LklLedgerMemberService lklLedgerMemberService; private AccountBaseConfigService accountBaseConfigService;
@Autowired
private LklLedgerReceiverService lklLedgerReceiverService;
@Autowired
private LklLedgerMerReceiverBindService lklLedgerMerReceiverBindService;
/** /**
* 初始化 拉卡拉SDK * 初始化 拉卡拉SDK
@ -254,6 +247,10 @@ public class LakalaPayServiceImpl implements LakalaPayService {
return respBody; return respBody;
} }
// 平台最低配送费单位
Integer innerMinDeliverFee = accountBaseConfigService.getInnerMinDeliveryFee();
reqData.set("shopping_fee_inner", innerMinDeliverFee); // 平台内部最低配送费单位
log.info("[拉卡拉预下单] 支付成功,准备保存订单记录, orderId={}", orderId); log.info("[拉卡拉预下单] 支付成功,准备保存订单记录, orderId={}", orderId);
// 新增一个拉卡拉订单记录 shop_order_lkl // 新增一个拉卡拉订单记录 shop_order_lkl
JSONObject lklPayReqAndRespJson = new JSONObject(); JSONObject lklPayReqAndRespJson = new JSONObject();
@ -479,7 +476,7 @@ public class LakalaPayServiceImpl implements LakalaPayService {
log.info("[拉卡拉合单预下单] 支付成功,准备保存订单记录, orderId={} shopping_fee_inner={}", orderId, agentAmountInt); log.info("[拉卡拉合单预下单] 支付成功,准备保存订单记录, orderId={} shopping_fee_inner={}", orderId, agentAmountInt);
// 新增一个拉卡拉订单记录 shop_order_lkl // 新增一个拉卡拉订单记录 shop_order_lkl
JSONObject lklPayReqAndRespJson = new JSONObject(); JSONObject lklPayReqAndRespJson = new JSONObject();
reqData.set("shopping_fee_inner", agentAmountInt); // 内部配送费 reqData.set("shopping_fee_inner", agentAmountInt); // 平台内部最低配送费单位
lklPayReqAndRespJson.put("req", reqData); lklPayReqAndRespJson.put("req", reqData);
lklPayReqAndRespJson.put("resp", respBody); // 返回原始响应数据 lklPayReqAndRespJson.put("resp", respBody); // 返回原始响应数据

View File

@ -130,10 +130,6 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
@Value("${lakala.delivery_term_no}") @Value("${lakala.delivery_term_no}")
private String delivery_term_no; private String delivery_term_no;
// 最低内部配送费要求单位
@Value("${lakala.min_delivery_fee_inner}")
private Integer min_delivery_fee_inner;
/** /**
* 获取支付密码 * 获取支付密码
* *
@ -683,10 +679,14 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
if (shippingFee == null || shippingFee.intValue() <= 0) { if (shippingFee == null || shippingFee.intValue() <= 0) {
shippingFee = BigDecimal.ZERO; shippingFee = BigDecimal.ZERO;
} }
logger.debug("预支付时,查到的订单{},商家配送费:{}元,平台最低配送费要求:{}分", out_trade_no, shippingFee, min_delivery_fee_inner);
// 平台最低配送费单位 // 平台最低配送费单位
if (min_delivery_fee_inner == null || min_delivery_fee_inner.intValue() <= 0) { Integer innerMinDeliverFee = accountBaseConfigService.getInnerMinDeliveryFee();
logger.debug("预支付时,查到的订单{},商家配送费:{}元,平台最低配送费要求:{}分", out_trade_no, shippingFee, innerMinDeliverFee);
// 平台最低配送费单位
if (innerMinDeliverFee == null || innerMinDeliverFee.intValue() <= 0) {
// 没有运费 // 没有运费
// 拉卡拉预支付返回参数 // 拉卡拉预支付返回参数
lakalaRespJSON = lakalaPayService.lklTransPreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(), lakalaRespJSON = lakalaPayService.lklTransPreOrder(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(),
@ -700,7 +700,7 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
delivery_merchant_no, delivery_term_no, // 以后根据代理商动态分配 delivery_merchant_no, delivery_term_no, // 以后根据代理商动态分配
appId, openId, storeIdStr, out_trade_no, subject, total_amt, appId, openId, storeIdStr, out_trade_no, subject, total_amt,
// Convert.toStr(shippingFee.multiply(BigDecimal.valueOf(100)).intValue()), // Convert.toStr(shippingFee.multiply(BigDecimal.valueOf(100)).intValue()),
Convert.toStr(min_delivery_fee_inner), Convert.toStr(innerMinDeliverFee),
notifyUrl, notifyUrl,
requestIP, trade_remark); requestIP, trade_remark);
} }

View File

@ -127,8 +127,6 @@ lakala:
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
# 机构代码 # 机构代码
org_code: 1 org_code: 1
#最低内部配送费要求,单位(分)
min_delivery_fee_inner: 0
#运费代理商商户号(深圳立挚) #运费代理商商户号(深圳立挚)
delivery_merchant_no: 822584059990FYP delivery_merchant_no: 822584059990FYP
#运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码 #运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码

View File

@ -129,8 +129,6 @@ lakala:
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
# 机构代码 # 机构代码
org_code: 1 org_code: 1
#最低内部配送费要求,单位(分)
min_delivery_fee_inner: 0
#运费代理商商户号(深圳立挚) #运费代理商商户号(深圳立挚)
delivery_merchant_no: 822584059990FYP delivery_merchant_no: 822584059990FYP
#运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码 #运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码

View File

@ -151,8 +151,6 @@ lakala:
lkl_platform_cer_path: payKey/lakala/prod/lkl_platform.cer lkl_platform_cer_path: payKey/lakala/prod/lkl_platform.cer
#机构代码 #机构代码
org_code: 980688 org_code: 980688
#最低内部配送费要求,单位(分)
min_delivery_fee_inner: 0
#运费代理商商户号(深圳立挚) #运费代理商商户号(深圳立挚)
delivery_merchant_no: 822584059990FYP delivery_merchant_no: 822584059990FYP
#运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码 #运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码

View File

@ -127,8 +127,6 @@ lakala:
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
# 机构代码 # 机构代码
org_code: 1 org_code: 1
#最低内部配送费要求,单位(分)
min_delivery_fee_inner: 0
#运费代理商商户号(深圳立挚) #运费代理商商户号(深圳立挚)
delivery_merchant_no: 822584059990FYP delivery_merchant_no: 822584059990FYP
#运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码 #运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码

View File

@ -127,8 +127,6 @@ lakala:
lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer lkl_platform_cer_path: payKey/lakala/dev/lkl_notify_cert_v2.cer
# 机构代码 # 机构代码
org_code: 1 org_code: 1
#最低内部配送费要求,单位(分)
min_delivery_fee_inner: 0
#运费代理商商户号(深圳立挚) #运费代理商商户号(深圳立挚)
delivery_merchant_no: 822584059990FYP delivery_merchant_no: 822584059990FYP
#运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码 #运费代理商终端号码深圳立挚M0780629B2B收银台 M0780798专业化扫码

View File

@ -9,6 +9,7 @@
package com.suisung.mall.shop.lakala.service.impl; package com.suisung.mall.shop.lakala.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
@ -2131,83 +2132,80 @@ public class LakalaApiServiceImpl implements LakalaApiService {
@Override @Override
public Pair<Boolean, String> innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo) { public Pair<Boolean, String> innerDoOrderSeparateByMerchantAndLogNo(String lklMerchantNo, String receiveTradeNo, String receiveLogNo) {
// 1. 输入参数校验 // 1. 输入参数校验
if (StrUtil.isBlank(lklMerchantNo) || StrUtil.isBlank(receiveTradeNo) || StrUtil.isBlank(receiveLogNo)) { if (StrUtil.hasBlank(lklMerchantNo, receiveTradeNo, receiveLogNo)) {
log.warn("[分账操作] 参数校验失败:缺少必要参数, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}", log.warn("[分账操作] 参数校验失败:缺少必要参数, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}",
lklMerchantNo, receiveTradeNo, receiveLogNo); lklMerchantNo, receiveTradeNo, receiveLogNo);
return Pair.of(false, "缺少必要参数"); return Pair.of(false, "缺少必要参数");
} }
try { try {
log.info("[分账操作] 开始处理分账请求, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}",
lklMerchantNo, receiveTradeNo, receiveLogNo);
// 2. 查询订单信息 // 2. 查询订单信息
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo); ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo);
if (shopOrderLkl == null) { if (shopOrderLkl == null) {
log.warn("[分账操作] 失败:对账流水号[{}]不存在", receiveLogNo); log.warn("[分账操作] lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={} 查询订单不存在", lklMerchantNo, receiveTradeNo, receiveLogNo);
return Pair.of(false, "订单不存在"); return Pair.of(false, "订单不存在");
} }
String orderId = shopOrderLkl.getOrder_id(); String orderId = shopOrderLkl.getOrder_id();
log.info("[分账操作] 开始处理订单[{}]的分账", orderId); log.info("[分账操作] 开始处理分账请求, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}orderId={}",
lklMerchantNo, receiveTradeNo, receiveLogNo, orderId);
// 3. 检查订单状态 // 3. 检查订单状态
if (!CommonConstant.Enable.equals(shopOrderLkl.getReceive_status())) { if (!CommonConstant.Enable.equals(shopOrderLkl.getReceive_status())) {
log.warn("[分账操作] 订单[{}]交易流水号[{}]未被确认收货,跳过处理", orderId, receiveTradeNo); log.warn("[分账操作] 订单{}交易流水号{}未被确认收货,跳过处理", orderId, receiveTradeNo);
return Pair.of(false, "订单未确认收货,暂无法分账"); return Pair.of(false, "订单未确认收货,暂无法分账");
} }
// 4. 检查分账状态避免重复处理 // 4. 检查分账状态避免重复处理
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByLogNoAndOutTradeNo(shopOrderLkl.getLkl_receive_log_no(), shopOrderLkl.getOut_separate_no()); LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByLogNoAndOutTradeNo(
shopOrderLkl.getLkl_receive_log_no(), shopOrderLkl.getOut_separate_no());
if (existingSeparateRecord != null) { if (existingSeparateRecord != null) {
String status = existingSeparateRecord.getStatus(); String status = existingSeparateRecord.getStatus();
if ("SUCCESS".equals(status)) { switch (status) {
log.info("[分账操作] 订单[{}]交易对账流水号[{}]已完成分账,跳过处理", orderId, shopOrderLkl.getLkl_receive_log_no()); case "SUCCESS":
return Pair.of(true, "订单已处理"); log.info("[分账操作] 订单[{}]交易对账流水号[{}]已完成分账,跳过处理", orderId, shopOrderLkl.getLkl_receive_log_no());
} return Pair.of(true, "订单已处理");
if ("PROCESSING".equals(status) || "ACCEPTED".equals(status)) { case "PROCESSING":
log.info("[分账操作] 订单[{}]交易对账流水号[{}]分账处理中或已受理,跳过处理", orderId, shopOrderLkl.getLkl_receive_log_no()); case "ACCEPTED":
return Pair.of(true, "订单已处理中或已受理"); log.info("[分账操作] 订单[{}]交易对账流水号[{}]分账处理中或已受理,跳过处理", orderId, shopOrderLkl.getLkl_receive_log_no());
} return Pair.of(true, "订单已处理中或已受理");
} else {
if (CommonConstant.Enable.equals(shopOrderLkl.getSeparate_status())) {
log.warn("[分账操作] 订单[{}]交易流水号[{}]订单已分账,跳过处理", orderId, receiveTradeNo);
return Pair.of(true, "订单已分账,请勿重复操作");
} }
} else if (CommonConstant.Enable.equals(shopOrderLkl.getSeparate_status())) {
log.warn("[分账操作] 订单[{}]交易流水号[{}]订单已分账,跳过处理", orderId, receiveTradeNo);
return Pair.of(true, "订单已分账,请勿重复操作");
} }
// 可分账金额
Integer canSeparateAmt = null;
// 5. 检查可分账余额 // 5. 检查可分账余额
Integer canSeparateAmt = null;
Pair<String, String> mchCanSplitAmt = queryMchCanSplitAmt(lklMerchantNo, receiveLogNo, shopOrderLkl.getLkl_log_date()); Pair<String, String> mchCanSplitAmt = queryMchCanSplitAmt(lklMerchantNo, receiveLogNo, shopOrderLkl.getLkl_log_date());
if (mchCanSplitAmt != null) { if (mchCanSplitAmt != null) {
log.error("[分账操作] 查询可分账余额失败:lklMerchantNo={} logDate={} receiveLogNo={}", lklMerchantNo, shopOrderLkl.getLkl_log_date(), receiveLogNo); log.info("[分账操作] 查询拉卡拉可分账余额接口:lklMerchantNo={} logDate={} receiveLogNo={}",
lklMerchantNo, shopOrderLkl.getLkl_log_date(), receiveLogNo);
// 可分账金额 // 可分账金额
canSeparateAmt = Convert.toInt(mchCanSplitAmt.getSecond()); canSeparateAmt = Convert.toInt(mchCanSplitAmt.getSecond());
if (canSeparateAmt == null || canSeparateAmt <= 0) { if (canSeparateAmt == null || canSeparateAmt <= 0) {
log.warn("[分账操作] lklMerchantNo={} receiveTradeNo={} receiveLogNo={} 查询拉卡拉返回的可分账金额={}分,系统将自动计算可分账金额", log.warn("[分账操作] lklMerchantNo={} receiveTradeNo={} receiveLogNo={} 拉卡拉可分账金额无值或0,系统将自动计算可分账金额",
lklMerchantNo, receiveTradeNo, receiveLogNo, canSeparateAmt); lklMerchantNo, receiveTradeNo, receiveLogNo);
} }
} }
// 6. 获取订单分账相关参数 // 6. 获取订单分账相关参数
String merchantNo = shopOrderLkl.getLkl_merchant_no(); String merchantNo = shopOrderLkl.getLkl_merchant_no();
// 获取商家分账比例并校验 // 获取商家分账比例并校验
BigDecimal merchantSplitRatioRaw = shopOrderLkl.getSplit_ratio(); BigDecimal mchSplitRatioRaw = shopOrderLkl.getSplit_ratio();
boolean canSplitForMerchant = merchantSplitRatioRaw != null if (mchSplitRatioRaw == null ||
&& merchantSplitRatioRaw.compareTo(BigDecimal.ZERO) > 0 mchSplitRatioRaw.compareTo(BigDecimal.ZERO) <= 0 ||
&& merchantSplitRatioRaw.compareTo(new BigDecimal(100)) <= 0; mchSplitRatioRaw.compareTo(new BigDecimal(100)) > 0) {
if (!canSplitForMerchant) {
log.error("[分账操作] 店铺[{}]商家分账比例[{}]不在(0-100]范围内,无法分账", log.error("[分账操作] 店铺[{}]商家分账比例[{}]不在(0-100]范围内,无法分账",
shopOrderLkl.getStore_id(), merchantSplitRatioRaw); shopOrderLkl.getStore_id(), mchSplitRatioRaw);
return Pair.of(false, "商家分账比例有误"); return Pair.of(false, "商家分账比例有误");
} }
// 计算商家分账比例转换为小数 // 计算商家分账比例转换为小数
BigDecimal merchantSplitRatio = merchantSplitRatioRaw.divide(new BigDecimal(100)); BigDecimal mchSplitRatio = mchSplitRatioRaw.divide(new BigDecimal(100));
// 获取分账平台接收方信息 // 获取分账平台接收方信息
LklLedgerMerReceiverBind platformReceiver = lklLedgerMerReceiverBindService.getPlatformByMerCupNo(merchantNo); LklLedgerMerReceiverBind platformReceiver = lklLedgerMerReceiverBindService.getPlatformByMerCupNo(merchantNo);
@ -2221,8 +2219,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
BigDecimal distributorSplitRatio = BigDecimal.ZERO; BigDecimal distributorSplitRatio = BigDecimal.ZERO;
List<LklLedgerMerReceiverBind> distributorReceivers = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); List<LklLedgerMerReceiverBind> distributorReceivers = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo);
if (distributorReceivers != null && !distributorReceivers.isEmpty()) { if (CollUtil.isNotEmpty(distributorReceivers)) {
distributorSplitRatio = BigDecimal.valueOf(1).subtract(platformSplitRatio).subtract(merchantSplitRatio); distributorSplitRatio = BigDecimal.valueOf(1).subtract(platformSplitRatio).subtract(mchSplitRatio);
log.debug("[分账操作] 检测到代理商存在,调整分账比例: 代理商比例={}, 平台比例={}", distributorSplitRatio, platformSplitRatio); log.debug("[分账操作] 检测到代理商存在,调整分账比例: 代理商比例={}, 平台比例={}", distributorSplitRatio, platformSplitRatio);
} }
@ -2235,30 +2233,31 @@ public class LakalaApiServiceImpl implements LakalaApiService {
lklSeparateDTO.setTotalSeparateAmount(shopOrderLkl.getTotal_amt()); lklSeparateDTO.setTotalSeparateAmount(shopOrderLkl.getTotal_amt());
lklSeparateDTO.setShippingFee(shoppingFeeInner); lklSeparateDTO.setShippingFee(shoppingFeeInner);
lklSeparateDTO.setLklRatio(wxFeeRatio); // 拉卡拉给的微信分账比例 0.0025 千分之2.5 lklSeparateDTO.setLklRatio(wxFeeRatio); // 拉卡拉给的微信分账比例 0.0025 千分之2.5
lklSeparateDTO.setMchRatio(merchantSplitRatio); lklSeparateDTO.setMchRatio(mchSplitRatio);
lklSeparateDTO.setPlatRatio(platformSplitRatio); lklSeparateDTO.setPlatRatio(platformSplitRatio);
if (distributorSplitRatio.compareTo(BigDecimal.ZERO) > 0) { // 二级代理商参与分账 if (distributorSplitRatio.compareTo(BigDecimal.ZERO) > 0) { // 二级代理商参与分账
lklSeparateDTO.setAgent2ndRatio(distributorSplitRatio); lklSeparateDTO.setAgent2ndRatio(distributorSplitRatio);
} }
lklSeparateDTO.setRefCanSeparateAmount(canSeparateAmt); // 拉卡拉实时返回的可分账金额 lklSeparateDTO.setRefCanSeparateAmount(canSeparateAmt); // 拉卡拉实时返回的可分账金额
// 分账方式根据可分账金额分账 // 分账方式根据可分账金额分账
if (!lklSeparateDTO.calcOnCanAmount()) { Pair<Boolean, String> canSeparateAmtResult = lklSeparateDTO.calcOnCanSeparateAmount();
log.error("[分账操作] 分账系统评估各项参数,发现无法分账 {}", lklSeparateDTO); if (!canSeparateAmtResult.getFirst()) {
return Pair.of(false, "分账系统评估各项参数,发现无法分账"); log.error("[分账操作] 分账参数评估,结果无法分账 {}", lklSeparateDTO);
} return Pair.of(false, "分账参数评估,结果无法分账");
if (CheckUtil.isEmpty(canSeparateAmt)) {
canSeparateAmt = lklSeparateDTO.getCanSeparateAmount();
} }
log.debug("[分账操作] 分账参数计算结果:{}", lklSeparateDTO); log.debug("[分账操作] 分账参数计算结果:{}", lklSeparateDTO);
// 更新分账计算结果 // 更新分账计算结果
shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString()); shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString());
shopOrderLkl.setSplit_amt(canSeparateAmt); if (CheckUtil.isEmpty(canSeparateAmt)) {
shopOrderLklService.updateById(shopOrderLkl); shopOrderLkl.setSplit_amt(lklSeparateDTO.getCanSeparateAmount());
canSeparateAmt = lklSeparateDTO.getCanSeparateAmount();
} else {
shopOrderLkl.setSplit_amt_ref(canSeparateAmt);
}
shopOrderLklService.safeUpdate(shopOrderLkl);
// 分账金额校验 // 分账金额校验
if (canSeparateAmt <= 0) { if (canSeparateAmt <= 0) {
@ -2279,11 +2278,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
Integer agentAmount = lklSeparateDTO.getAgent2ndAmount(); Integer agentAmount = lklSeparateDTO.getAgent2ndAmount();
log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 代理商比例={}, 代理商分得={}分", log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 代理商比例={}, 代理商分得={}分",
orderId, merchantNo, shopOrderLkl.getTotal_amt(), canSeparateAmt, merchantSplitRatio, merchantAmount, platformSplitRatio, platformAmount, distributorSplitRatio, agentAmount); orderId, merchantNo, shopOrderLkl.getTotal_amt(), canSeparateAmt, mchSplitRatio, merchantAmount,
platformSplitRatio, platformAmount, distributorSplitRatio, agentAmount);
// 构建分账接收方分账参数 // 构建分账接收方分账参数
// 商家分账参数 // 商家分账参数
if (merchantAmount > 0) { if (merchantAmount != null && merchantAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvMerchantNo(merchantNo); receiver.setRecvMerchantNo(merchantNo);
receiver.setSeparateValue(merchantAmount.toString()); receiver.setSeparateValue(merchantAmount.toString());
@ -2292,7 +2292,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
// 平台分账参数 // 平台分账参数
if (platformAmount > 0) { if (platformAmount != null && platformAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(platformReceiver.getReceiver_no()); receiver.setRecvNo(platformReceiver.getReceiver_no());
receiver.setSeparateValue(platformAmount.toString()); receiver.setSeparateValue(platformAmount.toString());
@ -2301,7 +2301,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
// 二级代理商县级分账参数 // 二级代理商县级分账参数
if (agentAmount > 0 && distributorReceivers != null && !distributorReceivers.isEmpty()) { if (agentAmount != null && agentAmount > 0 && CollUtil.isNotEmpty(distributorReceivers)) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(distributorReceivers.get(0).getReceiver_no()); receiver.setRecvNo(distributorReceivers.get(0).getReceiver_no());
receiver.setSeparateValue(agentAmount.toString()); receiver.setSeparateValue(agentAmount.toString());

View File

@ -104,4 +104,13 @@ public interface ShopOrderLklService extends IBaseService<ShopOrderLkl> {
* @return * @return
*/ */
Boolean updateSeparateStatusByReceiveLogNo(String lklReceiveLogNo, Integer separateStatus, String separateRemark); Boolean updateSeparateStatusByReceiveLogNo(String lklReceiveLogNo, Integer separateStatus, String separateRemark);
/**
* 不抛异常更新
*
* @param record
* @return
*/
Boolean safeUpdate(ShopOrderLkl record);
} }

View File

@ -534,6 +534,9 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
UpdateWrapper<ShopOrderLkl> updateWrapper = new UpdateWrapper<>(); UpdateWrapper<ShopOrderLkl> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("lkl_receive_log_no", lklReceiveLogNo); updateWrapper.eq("lkl_receive_log_no", lklReceiveLogNo);
updateWrapper.set("separate_status", separateStatus); updateWrapper.set("separate_status", separateStatus);
if (StrUtil.isNotBlank(separateRemark)) {
updateWrapper.set("separate_remark", separateRemark);
}
boolean result = update(updateWrapper); boolean result = update(updateWrapper);
@ -549,4 +552,48 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
return false; return false;
} }
} }
/**
* 安全更新拉卡拉订单记录
* <p>
* 该方法用于更新拉卡拉订单记录不会抛出异常而是在出现错误时返回false
* </p>
*
* @param record 拉卡拉订单记录
* @return 更新结果 true-成功 false-失败
*/
@Override
public Boolean safeUpdate(ShopOrderLkl record) {
// 参数校验
if (record == null) {
log.warn("[安全更新] 参数校验失败:记录不能为空");
return false;
}
if (record.getId() == null) {
log.warn("[安全更新] 参数校验失败记录ID不能为空");
return false;
}
try {
log.debug("[安全更新] 开始更新拉卡拉订单记录, orderId={}, id={}",
record.getOrder_id(), record.getId());
boolean result = updateById(record);
if (result) {
log.info("[安全更新] 拉卡拉订单记录更新成功, orderId={}, id={}",
record.getOrder_id(), record.getId());
} else {
log.warn("[安全更新] 拉卡拉订单记录更新失败, orderId={}, id={}",
record.getOrder_id(), record.getId());
}
return result;
} catch (Exception e) {
log.error("[安全更新] 拉卡拉订单记录更新异常, orderId={}, id={}",
record.getOrder_id(), record.getId(), e);
return false;
}
}
} }

View File

@ -161,10 +161,6 @@ lakala:
#机构代码 #机构代码
org_code: 1951582 org_code: 1951582
is_prod: false is_prod: false
# 是否收内部邮费
has_shopping_fee_inner: true
# 内部邮费,单位(分)
shopping_fee_inner: 500
# 拉卡拉拓客进件配置 # 拉卡拉拓客进件配置
tk: tk:
#服务地址 #服务地址

View File

@ -161,10 +161,6 @@ lakala:
#机构代码 #机构代码
org_code: 1951582 org_code: 1951582
is_prod: false is_prod: false
# 是否收内部邮费
has_shopping_fee_inner: true
# 内部邮费,单位(分)
shopping_fee_inner: 500
# 拉卡拉拓客进件配置 # 拉卡拉拓客进件配置
tk: tk:
#服务地址 #服务地址

View File

@ -177,10 +177,6 @@ lakala:
#机构代码 #机构代码
org_code: 980688 org_code: 980688
is_prod: true is_prod: true
# 是否收内部邮费
has_shopping_fee_inner: false
# 内部邮费,单位(分)
shopping_fee_inner: 500
tk: tk:
#服务地址 #服务地址
server_url: https://tkapi.lakala.com server_url: https://tkapi.lakala.com

View File

@ -165,10 +165,6 @@ lakala:
#机构代码 #机构代码
org_code: 1951582 org_code: 1951582
is_prod: false is_prod: false
# 是否收内部邮费
has_shopping_fee_inner: true
# 内部邮费,单位(分)
shopping_fee_inner: 500
# 拉卡拉拓客进件配置 # 拉卡拉拓客进件配置
tk: tk:
#服务地址 #服务地址

View File

@ -165,10 +165,6 @@ lakala:
#机构代码 #机构代码
org_code: 1951582 org_code: 1951582
is_prod: false is_prod: false
# 是否收内部邮费
has_shopping_fee_inner: true
# 内部邮费,单位(分)
shopping_fee_inner: 500
# 拉卡拉拓客进件配置 # 拉卡拉拓客进件配置
tk: tk:
#服务地址 #服务地址