修改分账流程,运费由第三商户代收。

This commit is contained in:
Jack 2025-08-22 18:11:58 +08:00
parent fc72297f2a
commit 69e97f1b28
3 changed files with 34 additions and 29 deletions

View File

@ -591,7 +591,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
req.setVersion("2.0"); req.setVersion("2.0");
req.setOrderNo(StringUtils.genLklOrderNo(8));// 14位年月日时24小时制分秒+8位的随机数 req.setOrderNo(StringUtils.genLklOrderNo(8));// 14位年月日时24小时制分秒+8位的随机数
req.setOrgCode(orgCode); req.setOrgCode(orgCode);
// req.setMerInnerNo(shopMchEntry.getLkl_mer_inner_no());// 从进件申请返回的内部商户号
req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号不要传入内部商户号传银联商户号才有效 req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号不要传入内部商户号传银联商户号才有效
req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号 req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号
// 分账比例为了考虑低价订单的运费占比高分账比例暂时定70%分账给商户30%分账给平台 // 分账比例为了考虑低价订单的运费占比高分账比例暂时定70%分账给商户30%分账给平台
@ -601,13 +600,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
req.setSplitEntrustFileName(fileName); req.setSplitEntrustFileName(fileName);
// TODO 分账结算委托书文件上传到拉卡拉服务器 // TODO 分账结算委托书文件上传到拉卡拉服务器
// JSONObject fileUploadResp = uploadFile(req.getOrderNo(), "SPLIT_ENTRUST_FILE", StringUtils.getFileExt(fileName), UploadUtil.fileUrlToBase64(shopMchEntry.getContract_download_url()));
// if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) {
// log.error("商家分账授权委托书{}上传失败!", shopMchEntry.getContract_download_url());
// // return Pair.of(false, I18nUtil._("商家分账授权委托书上传失败!"));
//// throw new ApiException(I18nUtil._("商家分账授权委托书上传失败!"));
// }
String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); //fileUploadResp.getStr("attFileId"); String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); //fileUploadResp.getStr("attFileId");
req.setSplitEntrustFilePath(splitEntrustFilePath); //比如MMS/20250519/165150-39c8bbca513b4cccab1e942999021fd6.pdf; req.setSplitEntrustFilePath(splitEntrustFilePath); //比如MMS/20250519/165150-39c8bbca513b4cccab1e942999021fd6.pdf;
@ -1617,13 +1609,27 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
String merchantNo = shopOrderLkl.getLkl_merchant_no(); String merchantNo = shopOrderLkl.getLkl_merchant_no();
Integer paymentAmount = shopOrderLkl.getTotal_amt(); // 分账金额 = 应付总金额-运费
Integer totalAmt = shopOrderLkl.getTotal_amt();
totalAmt = CheckUtil.isEmpty(totalAmt) ? 0 : totalAmt;
Integer shoppingFee = shopOrderLkl.getShopping_fee(); Integer shoppingFee = shopOrderLkl.getShopping_fee();
shoppingFee = CheckUtil.isEmpty(shoppingFee) ? 0 : shoppingFee;
// 商家分账比例
BigDecimal splitRatioMch = shopOrderLkl.getSplit_ratio(); BigDecimal splitRatioMch = shopOrderLkl.getSplit_ratio();
// 金额合法性校验 // 金额合法性校验
if (paymentAmount <= 0 || (shoppingFee != null && paymentAmount <= shoppingFee)) { // if (paymentAmount <= 0 || (shoppingFee != null && paymentAmount <= shoppingFee)) {
String errorMsg = String.format("店铺[%s]订单金额异常或运费过高,跳过分账", shopOrderLkl.getStore_id()); // String errorMsg = String.format("店铺[%s]订单金额异常或运费过高,跳过分账", shopOrderLkl.getStore_id());
// log.error(errorMsg);
// errorMessages.append(errorMsg).append("; ");
// lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg);
// continue;
// }
// 分账总金额单位()
Integer splitAmount = totalAmt - shoppingFee;
if (splitAmount <= 0) {
String errorMsg = String.format("店铺[%s]订单分账金额异常,跳过分账", shopOrderLkl.getStore_id());
log.error(errorMsg); log.error(errorMsg);
errorMessages.append(errorMsg).append("; "); errorMessages.append(errorMsg).append("; ");
lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg); lklOrderSeparateService.updateRemark(lklOrderSeparateExist.getId(), errorMsg);
@ -1642,11 +1648,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
continue; continue;
} }
// 判断是否可以分账商家比例100% // 判断是否可以分账商家比例不超过100%
boolean canSplit = splitRatioMch != null && splitRatioMch.compareTo(new BigDecimal("100")) < 0; boolean canSplit = splitRatioMch != null && splitRatioMch.compareTo(new BigDecimal("100")) <= 0;
if (!canSplit) { if (!canSplit) {
String errorMsg = String.format("店铺[%s]分账比例为0仅扣除运费", shopOrderLkl.getStore_id()); String errorMsg = String.format("店铺[%s]分账比例异常,无法分账", shopOrderLkl.getStore_id());
log.error(errorMsg); log.error(errorMsg);
continue;
} }
// 构建分账请求对象 // 构建分账请求对象
@ -1655,7 +1662,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
request.setLogNo(shopOrderLkl.getLkl_log_no()); request.setLogNo(shopOrderLkl.getLkl_log_no());
request.setLogDate(shopOrderLkl.getLkl_log_date()); request.setLogDate(shopOrderLkl.getLkl_log_date());
request.setOutSeparateNo(orderId); request.setOutSeparateNo(orderId);
request.setTotalAmt(paymentAmount.toString()); request.setTotalAmt(splitAmount.toString());
request.setLklOrgNo(orgCode); request.setLklOrgNo(orgCode);
request.setCalType("0"); request.setCalType("0");
request.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/sacs/separateNotify"); request.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/sacs/separateNotify");
@ -1663,25 +1670,24 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 构建分账接收方列表 // 构建分账接收方列表
List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>(); List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>();
// 1. 先处理运费分账如果有运费 // 1. 先处理运费分账如果有运费 == update 2025-08-22 运费不分账了走合单拆分直接打给商家
if (shoppingFee != null && shoppingFee > 0) { // if (shoppingFee != null && shoppingFee > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); // V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(platform.getReceiver_no()); // receiver.setRecvNo(platform.getReceiver_no());
receiver.setSeparateValue(shoppingFee.toString()); // receiver.setSeparateValue(shoppingFee.toString());
recvDatas.add(receiver); // recvDatas.add(receiver);
} // }
Integer totalSeparateValue = 0;// 平台方和代理商总计分账金额 Integer totalSeparateValue = 0;// 平台方和代理商总计分账金额
// 2. 再处理剩余金额的分账如果可以分账 // 2. 再处理剩余金额的分账如果可以分账
if (canSplit) { if (canSplit) {
// 计算实际可分账金额扣除运费后 // 计算实际可分账金额扣除运费后
Integer splitAmount = paymentAmount - shoppingFee; // Integer splitAmount = totalAmt - shoppingFee;
// 计算平台+代理商的总比例 // 计算平台+代理商的总比例
BigDecimal splitRatioNoMch = new BigDecimal("100").subtract(splitRatioMch); BigDecimal splitRatioNoMch = new BigDecimal("100").subtract(splitRatioMch);
if (!CollectionUtils.isEmpty(distributors) && splitRatioNoMch.compareTo(BigDecimal.ONE) > 0) { if (!CollectionUtils.isEmpty(distributors) && splitRatioNoMch.compareTo(BigDecimal.ONE) > 0) { // 平台+代理商分账模式
// 平台+代理商分账模式
// 平台收取1%手续费 // 平台收取1%手续费
BigDecimal platformValue = CommonUtil.DecimalRoundHalfDown(new BigDecimal(splitAmount).multiply(new BigDecimal("0.01"))); BigDecimal platformValue = CommonUtil.DecimalRoundHalfDown(new BigDecimal(splitAmount).multiply(new BigDecimal("0.01")));
if (platformValue.compareTo(BigDecimal.ZERO) > 0) { if (platformValue.compareTo(BigDecimal.ZERO) > 0) {

View File

@ -155,7 +155,6 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
return false; return false;
} }
ShopOrderLkl record = new ShopOrderLkl(); ShopOrderLkl record = new ShopOrderLkl();
record.setOrder_id(orderId); record.setOrder_id(orderId);
@ -167,7 +166,7 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
log.error("订单{}金额无效: {}", orderId, amount); log.error("订单{}金额无效: {}", orderId, amount);
return false; return false;
} }
record.setTotal_amt(amount); record.setTotal_amt(amount); // 应支付总金额
record.setAccount_type(reqDataJson.getStr("accountType")); record.setAccount_type(reqDataJson.getStr("accountType"));
record.setTrans_type(reqDataJson.getStr("transType")); record.setTrans_type(reqDataJson.getStr("transType"));

View File

@ -175,9 +175,9 @@ lakala:
client_id: gpff client_id: gpff
client_secret: uRjvaJkWS1A0VsAv client_secret: uRjvaJkWS1A0VsAv
user_no: 22874827 user_no: 22874827
split_lowest_ratio: 70.00 split_lowest_ratio: 94.00
activity_id: 208 activity_id: 208
wx_fee: 0.25 # 微信手续费 2.5/1000 wx_fee: 0.25 # 微信手续费 千分之2.5
api_pub_key_path: payKey/lakala/prod/tk_api_public_key.txt api_pub_key_path: payKey/lakala/prod/tk_api_public_key.txt
api_pri_key_path: payKey/lakala/prod/tk_api_private_key.txt api_pri_key_path: payKey/lakala/prod/tk_api_private_key.txt
notify_pub_key_path: payKey/lakala/prod/tk_notify_public_key.txt notify_pub_key_path: payKey/lakala/prod/tk_notify_public_key.txt