分账金额的计算逻辑更改,分账接收方和代理商的关系更正
This commit is contained in:
parent
1070a9c9fd
commit
54b0cae1c1
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -51,6 +51,30 @@ public interface LklLedgerMerReceiverBindService extends IBaseService<LklLedgerM
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* 根据商户编号查询一条代理商绑定记录
|
||||
*
|
||||
* @param merCupNo
|
||||
* @return
|
||||
*/
|
||||
List<LklLedgerMerReceiverBind> selectDistributorByMerCupNo(String merCupNo);
|
||||
|
||||
|
||||
/**
|
||||
* 判断商户是否已经绑定了分账接收方
|
||||
|
||||
@ -2274,7 +2274,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
|
||||
BigDecimal distributorSplitRatio = BigDecimal.ZERO;
|
||||
BigDecimal platformSplitRatio = BigDecimal.ONE;
|
||||
// 分账代理商接收方信息
|
||||
List<LklLedgerMerReceiverBind> distributorReceivers = lklLedgerMerReceiverBindService.selectDistributorByMerCupNo(merchantNo);
|
||||
List<LklLedgerMerReceiverBind> 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<LklLedgerMerReceiverBind> 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<V3SacsSeparateRecvDatas> 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();
|
||||
|
||||
@ -112,44 +112,98 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl<LklLedg
|
||||
/**
|
||||
* 根据商户编号查询多条平台或代理商记录
|
||||
*
|
||||
* @param merCupNo
|
||||
* @param isPlatform 是否平台
|
||||
* @return
|
||||
* @param merCupNo 商户银联编号
|
||||
* @param isPlatform 是否平台(true:平台, false:代理商, null:不区分)
|
||||
* @return 符合条件的记录列表
|
||||
*/
|
||||
@Override
|
||||
public List<LklLedgerMerReceiverBind> selectListByMerCupNo(String merCupNo, Boolean isPlatform) {
|
||||
if (StrUtil.isBlank(merCupNo)) {
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
QueryWrapper<LklLedgerMerReceiverBind> 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<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 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据商户编号查询一条代理商绑定记录
|
||||
*
|
||||
* @param merCupNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<LklLedgerMerReceiverBind> selectDistributorByMerCupNo(String merCupNo) {
|
||||
List<LklLedgerMerReceiverBind> list = selectListByMerCupNo(merCupNo, false);
|
||||
if (CollectionUtil.isEmpty(list)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断商户是否已经绑定了分账接收方
|
||||
|
||||
@ -1741,12 +1741,12 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
|
||||
try {
|
||||
if (!payService.doRefund(returnOrder)) {
|
||||
logger.error("执行退款操作失败!退单列表: {}", return_ids);
|
||||
throw new ApiException("暂无法退款,请稍候再重试!");
|
||||
throw new ApiException("余额不足,请稍后重试");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("执行退款操作异常!退单列表: {}", return_ids, e);
|
||||
// 根据业务需要决定是抛出异常触发回滚,还是其他处理方式
|
||||
throw new ApiException("暂无法退款,请稍候再重试!");
|
||||
throw new ApiException("余额不足,请稍后重试");
|
||||
}
|
||||
|
||||
logger.info("退款操作执行成功,退单列表: {}", return_ids);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user