分账金额的计算逻辑更改,分账接收方和代理商的关系更正

This commit is contained in:
Jack 2025-10-13 23:52:03 +08:00
parent 1070a9c9fd
commit 54b0cae1c1
7 changed files with 154 additions and 75 deletions

View File

@ -115,4 +115,10 @@ public class CommonConstant {
public static final int SeparateCalcMode_CanSeparateAmt = 2; 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;
} }

View File

@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@Data @Data
@ -45,6 +46,9 @@ public class LklLedgerMerReceiverBind implements Serializable {
private String audit_status; private String audit_status;
private String audit_status_text; private String audit_status_text;
private String remark; private String remark;
private Integer level;
private BigDecimal split_ratio;
private Integer shipping_fee;
private String version; private String version;
private Date created_at; private Date created_at;
private Date updated_at; private Date updated_at;

View File

@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@Data @Data
@ -54,6 +55,9 @@ public class LklLedgerReceiver implements Serializable {
private String attach_list; private String attach_list;
private String settle_type; private String settle_type;
private Long platform_id; private Long platform_id;
private Integer level;
private BigDecimal split_ratio;
private Integer shipping_fee;
private String version; private String version;
private Integer status; private Integer status;
private Date created_at; private Date created_at;

View File

@ -51,6 +51,30 @@ public interface LklLedgerMerReceiverBindService extends IBaseService<LklLedgerM
*/ */
LklLedgerMerReceiverBind getPlatformByMerCupNo(String merCupNo); LklLedgerMerReceiverBind getPlatformByMerCupNo(String merCupNo);
/**
* 根据商户编号查询商户的代理商绑定列表记录
*
* @param merCupNo
* @return
*/
List<LklLedgerMerReceiverBind> 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<LklLedgerM
*/ */
LklLedgerMerReceiverBind getMerReceiverByApplyId(String applyId); LklLedgerMerReceiverBind getMerReceiverByApplyId(String applyId);
/**
* 根据商户编号查询一条代理商绑定记录
*
* @param merCupNo
* @return
*/
List<LklLedgerMerReceiverBind> selectDistributorByMerCupNo(String merCupNo);
/** /**
* 判断商户是否已经绑定了分账接收方 * 判断商户是否已经绑定了分账接收方

View File

@ -2274,7 +2274,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
BigDecimal distributorSplitRatio = BigDecimal.ZERO; BigDecimal distributorSplitRatio = BigDecimal.ZERO;
BigDecimal platformSplitRatio = BigDecimal.ONE; BigDecimal platformSplitRatio = BigDecimal.ONE;
// 分账代理商接收方信息 // 分账代理商接收方信息
List<LklLedgerMerReceiverBind> distributorReceivers = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); List<LklLedgerMerReceiverBind> distributorReceivers = lklLedgerMerReceiverBindService.selectAgentByMerCupNo(merchantNo);
if (distributorReceivers != null && !distributorReceivers.isEmpty()) { if (distributorReceivers != null && !distributorReceivers.isEmpty()) {
distributorSplitRatio = new BigDecimal("0.8"); distributorSplitRatio = new BigDecimal("0.8");
platformSplitRatio = new BigDecimal("0.2"); platformSplitRatio = new BigDecimal("0.2");
@ -2478,7 +2478,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
log.info("[分账操作] 查询拉卡拉可分账余额接口:lklMerchantNo={} logDate={} receiveLogNo={} 结果:{}", log.info("[分账操作] 查询拉卡拉可分账余额接口:lklMerchantNo={} logDate={} receiveLogNo={} 结果:{}",
lklMerchantNo, shopOrderLkl.getLkl_log_date(), receiveLogNo, mchCanSplitAmt); lklMerchantNo, shopOrderLkl.getLkl_log_date(), receiveLogNo, mchCanSplitAmt);
// 可分账金额 // 拉卡拉返回的实际可分账金额
refCanSeparateAmt = Convert.toInt(mchCanSplitAmt.getSecond()); refCanSeparateAmt = Convert.toInt(mchCanSplitAmt.getSecond());
if (CheckUtil.isEmpty(refCanSeparateAmt)) { if (CheckUtil.isEmpty(refCanSeparateAmt)) {
log.warn("[分账操作] lklMerchantNo={} receiveTradeNo={} receiveLogNo={} 拉卡拉可分账金额无值或0系统将自动计算可分账金额", log.warn("[分账操作] lklMerchantNo={} receiveTradeNo={} receiveLogNo={} 拉卡拉可分账金额无值或0系统将自动计算可分账金额",
@ -2509,19 +2509,21 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return Pair.of(false, "平台方未绑定账户"); return Pair.of(false, "平台方未绑定账户");
} }
// 获取代理商分账信息
BigDecimal platformSplitRatio = BigDecimal.valueOf(0.01); // 默认平台比例 1%
BigDecimal agent2ndSplitRatio = null;
// 代理商绑定列表 // 获取代理商分账信息
List<LklLedgerMerReceiverBind> lklLedgerMerReceiverBindList = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo); BigDecimal platformSplitRatio = CheckUtil.isEmpty(platformReceiver.getSplit_ratio()) ? BigDecimal.valueOf(0.01) : platformReceiver.getSplit_ratio(); // 默认平台比例 1%
if (CollUtil.isNotEmpty(lklLedgerMerReceiverBindList)) {
// 县级代理商比例值 = 1-商家比例值-平台比例值 LklLedgerMerReceiverBind agent1stReceiver = lklLedgerMerReceiverBindService.getAgent1stByMerCupNo(merchantNo);
agent2ndSplitRatio = BigDecimal.ONE.subtract(mchSplitRatio).subtract(platformSplitRatio); LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindService.getAgent2ndByMerCupNo(merchantNo);
log.debug("[分账操作] 检测到代理商存在,调整分账比例: 代理商比例={}, 平台比例={}", agent2ndSplitRatio, platformSplitRatio);
} else { BigDecimal agent1stSplitRatio = null;
// 平台比例值 = 1-商家比例值 BigDecimal agent2ndSplitRatio = null;
platformSplitRatio = BigDecimal.ONE.subtract(mchSplitRatio); 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, shoppingFeeInner,
mchSplitRatio, mchSplitRatio,
platformSplitRatio, platformSplitRatio,
null, agent2ndSplitRatio, refCanSeparateAmt); agent1stSplitRatio, agent2ndSplitRatio, refCanSeparateAmt);
if (calcResult == null || !calcResult.getFirst() || calcResult.getSecond() == null) { if (calcResult == null || !calcResult.getFirst() || calcResult.getSecond() == null) {
log.error("[分账操作] 分账参数评估,结果无法分账"); log.error("[分账操作] 分账参数评估,结果无法分账");
@ -2562,15 +2564,15 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
return Pair.of(false, "订单可分账金额低于1分钱"); return Pair.of(false, "订单可分账金额低于1分钱");
} }
Integer merchantAmount = lklSeparateDTO.getMchAmount(); Integer merchantAmount = lklSeparateDTO.getMchAmount();
Integer platformAmount = lklSeparateDTO.getPlatAmount(); Integer platformAmount = lklSeparateDTO.getPlatAmount();
Integer agent1stAmount = lklSeparateDTO.getAgent1stAmount();
Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount(); Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount();
log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 县级代理商比例={}, 县级代理商分得={}分", log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 省级代理商比例={}, 省级代理商分得={}分, 县级代理商比例={}, 县级代理商分得={}分",
orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, mchSplitRatio, merchantAmount, orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, mchSplitRatio, merchantAmount,
platformSplitRatio, platformAmount, agent2ndSplitRatio, agent2ndAmount); platformSplitRatio, platformAmount, agent1stSplitRatio, agent1stAmount, agent2ndSplitRatio, agent2ndAmount);
// 构建分账接收方分账列表参数 // 构建分账接收方分账列表参数
List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>(); List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>();
@ -2578,7 +2580,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (CheckUtil.isNotEmpty(merchantAmount)) { if (CheckUtil.isNotEmpty(merchantAmount)) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvMerchantNo(merchantNo); receiver.setRecvMerchantNo(merchantNo);
receiver.setSeparateValue(merchantAmount.toString()); receiver.setSeparateValue(Convert.toStr(merchantAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加商家接收方: merchantNo={}, amount={}", merchantNo, merchantAmount); log.debug("[分账操作] 添加商家接收方: merchantNo={}, amount={}", merchantNo, merchantAmount);
@ -2588,29 +2590,37 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (CheckUtil.isNotEmpty(platformAmount)) { if (CheckUtil.isNotEmpty(platformAmount)) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(platformReceiver.getReceiver_no()); receiver.setRecvNo(platformReceiver.getReceiver_no());
receiver.setSeparateValue(platformAmount.toString()); receiver.setSeparateValue(Convert.toStr(platformAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加平台接收方: receiverNo={}, amount={}", platformReceiver.getReceiver_no(), platformAmount); 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)) { if (agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no()) && CheckUtil.isNotEmpty(agent2ndAmount)) {
LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindList.get(0); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
if (agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no())) { receiver.setRecvNo(agent2ndReceiver.getReceiver_no());
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); receiver.setSeparateValue(Convert.toStr(agent2ndAmount));
receiver.setRecvNo(agent2ndReceiver.getReceiver_no()); recvDatas.add(receiver);
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 { } else {
// 没有县级代理商的时候配送费暂由平台代收 add 2025-10-11 // 没有县级代理商的时候配送费暂由平台代收 add 2025-10-11
V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas();

View File

@ -112,44 +112,98 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl<LklLedg
/** /**
* 根据商户编号查询多条平台或代理商记录 * 根据商户编号查询多条平台或代理商记录
* *
* @param merCupNo * @param merCupNo 商户银联编号
* @param isPlatform 是否平台 * @param isPlatform 是否平台true:平台, false:代理商, null:不区分
* @return * @return 符合条件的记录列表
*/ */
@Override @Override
public List<LklLedgerMerReceiverBind> selectListByMerCupNo(String merCupNo, Boolean isPlatform) { public List<LklLedgerMerReceiverBind> selectListByMerCupNo(String merCupNo, Boolean isPlatform) {
if (StrUtil.isBlank(merCupNo)) { if (StrUtil.isBlank(merCupNo)) {
return null; return Collections.emptyList();
} }
QueryWrapper<LklLedgerMerReceiverBind> queryWrapper = new QueryWrapper<>(); QueryWrapper<LklLedgerMerReceiverBind> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mer_cup_no", merCupNo) queryWrapper.eq("mer_cup_no", merCupNo)
.eq("audit_status", CommonConstant.Enable); .eq("audit_status", CommonConstant.Enable)
if (isPlatform != null && isPlatform) { .orderByAsc("id");
queryWrapper.eq("platform_id", 0);
} else if (isPlatform != null && !isPlatform) { if (isPlatform != null) {
queryWrapper.gt("platform_id", 0); 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); return list(queryWrapper);
} }
/** /**
* 根据商户编号查询一条平台绑定记录 * 根据商户编号查询一条平台绑定记录
* *
* @param merCupNo * @param merCupNo 商户银联编号
* @return * @return 平台绑定记录不存在时返回null
*/ */
@Override @Override
public LklLedgerMerReceiverBind getPlatformByMerCupNo(String merCupNo) { public LklLedgerMerReceiverBind getPlatformByMerCupNo(String merCupNo) {
List<LklLedgerMerReceiverBind> list = selectListByMerCupNo(merCupNo, true); List<LklLedgerMerReceiverBind> list = selectListByMerCupNo(merCupNo, true);
if (CollectionUtil.isEmpty(list)) { return CollectionUtil.isEmpty(list) ? null : list.get(0);
}
/**
* 根据商户编号查询代理商绑定记录列表
*
* @param merCupNo 商户银联编号
* @return 代理商绑定记录列表不存在时返回空列表
*/
@Override
public List<LklLedgerMerReceiverBind> selectAgentByMerCupNo(String merCupNo) {
return selectListByMerCupNo(merCupNo, false);
}
/**
* 根据商户编号查询一级代理商绑定记录
*
* @param merCupNo 商户银联编号
* @return 一级代理商绑定记录不存在时返回null
*/
@Override
public LklLedgerMerReceiverBind getAgent1stByMerCupNo(String merCupNo) {
if (StrUtil.isBlank(merCupNo)) {
return null; return null;
} }
return list.get(0); QueryWrapper<LklLedgerMerReceiverBind> 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<LklLedgerMerReceiverBind> 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<LklLedg
return findOne(queryWrapper); return findOne(queryWrapper);
} }
/**
* 根据商户编号查询一条代理商绑定记录
*
* @param merCupNo
* @return
*/
@Override
public List<LklLedgerMerReceiverBind> selectDistributorByMerCupNo(String merCupNo) {
List<LklLedgerMerReceiverBind> list = selectListByMerCupNo(merCupNo, false);
if (CollectionUtil.isEmpty(list)) {
return null;
}
return list;
}
/** /**
* 判断商户是否已经绑定了分账接收方 * 判断商户是否已经绑定了分账接收方

View File

@ -1741,12 +1741,12 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
try { try {
if (!payService.doRefund(returnOrder)) { if (!payService.doRefund(returnOrder)) {
logger.error("执行退款操作失败!退单列表: {}", return_ids); logger.error("执行退款操作失败!退单列表: {}", return_ids);
throw new ApiException("暂无法退款,请稍候再重试!"); throw new ApiException("余额不足,请稍后重试");
} }
} catch (Exception e) { } catch (Exception e) {
logger.error("执行退款操作异常!退单列表: {}", return_ids, e); logger.error("执行退款操作异常!退单列表: {}", return_ids, e);
// 根据业务需要决定是抛出异常触发回滚还是其他处理方式 // 根据业务需要决定是抛出异常触发回滚还是其他处理方式
throw new ApiException("暂无法退款,请稍候再重试!"); throw new ApiException("余额不足,请稍后重试");
} }
logger.info("退款操作执行成功,退单列表: {}", return_ids); logger.info("退款操作执行成功,退单列表: {}", return_ids);