分账计算和入驻接收方 流程补漏优化

This commit is contained in:
Jack 2025-10-16 01:51:00 +08:00
parent c0e6215f36
commit f754f41b55
5 changed files with 113 additions and 135 deletions

View File

@ -108,18 +108,21 @@ public class EsignPlatformInfoServiceImpl extends BaseServiceImpl<EsignPlatformI
return esignPlatformInfos; return esignPlatformInfos;
} }
try {
EsignPlatformInfo agent1st = get(agent2nd.getParent_id());
if (agent1st != null) {
esignPlatformInfos.add(agent1st);
log.debug("[获取平台和代理商信息] 成功获取一级代理信息ID: {}", agent1st.getId());
} else {
log.debug("[获取平台和代理商信息] 未找到一级代理parent_id: {}", agent2nd.getParent_id());
}
} catch (Exception e) {
log.error("[获取平台和代理商信息] 获取一级代理商时发生异常parent_id: {}", agent2nd.getParent_id(), e);
}
// 获取县级代理商的省级代理商
queryWrapper.clear();
queryWrapper.eq("id", agent2nd.getParent_id())
.eq("level", CommonConstant.Agent_Level_1st)
.gt("split_ratio", 0)
.eq("status", CommonConstant.Enable);
EsignPlatformInfo agent1st = findOne(queryWrapper);
if (agent1st != null) {
esignPlatformInfos.add(agent1st);
log.debug("[获取平台和代理商信息] 成功获取一级代理信息ID: {}", agent1st.getId());
} else {
log.debug("[获取平台和代理商信息] 未找到一级代理parent_id: {}", agent2nd.getParent_id());
}
log.debug("[获取平台和代理商信息] 查询完成,共获取 {} 条记录", esignPlatformInfos.size()); log.debug("[获取平台和代理商信息] 查询完成,共获取 {} 条记录", esignPlatformInfos.size());
return esignPlatformInfos; return esignPlatformInfos;
} }
@ -232,21 +235,28 @@ public class EsignPlatformInfoServiceImpl extends BaseServiceImpl<EsignPlatformI
.eq("status", CommonConstant.Enable) .eq("status", CommonConstant.Enable)
.orderByAsc("id"); .orderByAsc("id");
EsignPlatformInfo result = null;
// 优先使用指定的分销商ID查询否则使用区域信息查询 // 优先使用指定的分销商ID查询否则使用区域信息查询
if (shopMchEntry.getDistributor_id() != null && shopMchEntry.getDistributor_id() > 0) { if (shopMchEntry.getDistributor_id() != null && shopMchEntry.getDistributor_id() > 0) {
queryWrapper.eq("id", shopMchEntry.getDistributor_id()); queryWrapper.eq("id", shopMchEntry.getDistributor_id());
result = findOne(queryWrapper);
log.debug("[获取二级代理] 使用指定分销商ID查询distributorId={}", shopMchEntry.getDistributor_id()); log.debug("[获取二级代理] 使用指定分销商ID查询distributorId={}", shopMchEntry.getDistributor_id());
} else if (StrUtil.isNotBlank(shopMchEntry.getStore_district())) {
// 运费代理商 }
if (result == null && StrUtil.isNotBlank(shopMchEntry.getStore_district())) {
// 和商户同地区并且二级代理商有配送相关资质
queryWrapper.eq("license_district_id", shopMchEntry.getStore_district()) queryWrapper.eq("license_district_id", shopMchEntry.getStore_district())
.gt("shipping_fee", 0).ne("supplier_id", "") .gt("shipping_fee", 0).ne("supplier_id", "")
.orderByAsc("id"); .orderByAsc("id");
result = findOne(queryWrapper);
log.debug("[获取二级代理] 使用区域信息查询districtId={}", shopMchEntry.getStore_district()); log.debug("[获取二级代理] 使用区域信息查询districtId={}", shopMchEntry.getStore_district());
} else {
return null;
} }
EsignPlatformInfo result = findOne(queryWrapper);
if (result == null) { if (result == null) {
log.info("[获取二级代理] 未找到匹配的二级代理信息mchId={}", mchId); log.info("[获取二级代理] 未找到匹配的二级代理信息mchId={}", mchId);
} else { } else {

View File

@ -12,9 +12,9 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.base.service.ShopBaseDistrictService;
import com.suisung.mall.shop.lakala.service.LakalaApiService; import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.lakala.service.LklLedgerEcService; import com.suisung.mall.shop.lakala.service.LklLedgerEcService;
import com.suisung.mall.shop.lakala.service.LklLedgerReceiverService;
import com.suisung.mall.shop.library.service.LibraryProductService; import com.suisung.mall.shop.library.service.LibraryProductService;
import com.suisung.mall.shop.message.service.MqMessageService; import com.suisung.mall.shop.message.service.MqMessageService;
import com.suisung.mall.shop.message.service.PushMessageService; import com.suisung.mall.shop.message.service.PushMessageService;
@ -84,50 +84,13 @@ public class LakalaController extends BaseControllerImpl {
private LklLedgerEcService lklLedgerEcService; private LklLedgerEcService lklLedgerEcService;
@Resource @Resource
private ShopBaseDistrictService shopBaseDistrictService; private LklLedgerReceiverService lklLedgerReceiverService;
@ApiOperation(value = "测试案例", notes = "测试案例") @ApiOperation(value = "测试案例", notes = "测试案例")
@RequestMapping(value = "/testcase", method = RequestMethod.POST) @RequestMapping(value = "/testcase", method = RequestMethod.POST)
public Object testcase(@RequestBody JSONObject paramsJSON) { public Object testcase(@RequestBody JSONObject paramsJSON) {
// return shopOrderReturnService.sfExpressExpiredForceRefund(paramsJSON.getStr("orderId"));
// return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile"));
// return lakalaPayService.LedgerMerEcDownload(975790666910121984L);
// return storeSameCityTransportBaseService.initDefaultSameCityTransport(58); return lklLedgerReceiverService.selectAgentAndPlatformByMchId(36L);
// return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", "");
// return "";
//
// List<String> tags = new ArrayList<>();
//// tags.add("纯净水");
//// tags.add("放心");
// return libraryProductService.matchLibraryProducts(paramsJSON.getStr("barcode"), paramsJSON.getStr("productName"), tags);
// 测试推送消息
// List<String> clientIds = JSONUtil.toList(paramsJSON.getJSONArray("clientIds"), String.class);
// return pushMessageService.sendMessage(clientIds, paramsJSON.getStr("title"), paramsJSON.getStr("content"), paramsJSON.getJSONObject("payload"));
// JSONObject jsonObject = new JSONObject();
// String orderId = "DD-20250725-1";
// jsonObject.put("category", 1);
// jsonObject.put("orderId", "DD-20250725-1");
// jsonObject.put("storeId", 12);
// jsonObject.put("title", "有一笔已超时的订单!");
// jsonObject.put("message", "您有一笔已超时的订单[" + orderId + "],请及时处理。");
// mqMessageService.sendDelayMessage(jsonObject.toString(), 10000);
// return jsonObject;
// return shopOrderBaseService.sameCityOrderExpireSeconds(10000L);
// return sfExpressApiService.createSfExpressShop(66, "能辉超市", "桂平市", "广西壮族自治区贵港市桂平市广佰汇超市(桂平店)", "谢能坤", "17777525395", "110.07165452271", "23.369069486251");
// return lakalaApiService.sacsQuery("8226330541100GU", "20250918770188017227140800").toString();
String[] result = shopBaseDistrictService.convertDistrictPath(paramsJSON.getStr("id"), paramsJSON.getStr("name"));
log.info("result: " + result[0] + " " + result[1]);
return ""; //lakalaApiService.queryLedgerMer("8226330541100HA");
} }
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例") @ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")

View File

@ -1548,7 +1548,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
lklLedgerMember.setMer_inner_no(""); lklLedgerMember.setMer_inner_no("");
} }
// 分账接收方列表 // 获取商家的平台和代理商分账接收方列表平台至少有一个默认是桂平发发
log.debug("开始查询分账接收方列表"); log.debug("开始查询分账接收方列表");
List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.selectAgentAndPlatformByMchId(mchId); List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.selectAgentAndPlatformByMchId(mchId);
if (CollectionUtil.isEmpty(receiverList)) { if (CollectionUtil.isEmpty(receiverList)) {
@ -1655,7 +1655,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
paramsJSON.set("remark", respJson.getStr("retMsg")); paramsJSON.set("remark", respJson.getStr("retMsg"));
paramsJSON.set("platform_id", receiver.getPlatform_id()); paramsJSON.set("platform_id", receiver.getPlatform_id());
paramsJSON.set("mch_id", mchId); paramsJSON.set("mch_id", mchId);
paramsJSON.set("level", receiver.getLevel()); paramsJSON.set("level", receiver.getLevel());
paramsJSON.set("split_ratio", receiver.getSplit_ratio()); paramsJSON.set("split_ratio", receiver.getSplit_ratio());
paramsJSON.set("shipping_fee", receiver.getShipping_fee()); paramsJSON.set("shipping_fee", receiver.getShipping_fee());
@ -2455,17 +2454,18 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 2. 查询订单信息 // 2. 查询订单信息
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo); ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndReceiveTradeNoAndReceiveLogNo(lklMerchantNo, receiveTradeNo, receiveLogNo);
if (shopOrderLkl == null) { if (shopOrderLkl == null) {
log.warn("[分账操作] lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={} 查询订单不存在", lklMerchantNo, receiveTradeNo, 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("[分账操作] 开始处理分账请求, lklMerchantNo={}, receiveTradeNo={}, receiveLogNo={}orderId={}", log.info("[分账操作] 开始处理分账请求, orderId={}, merchantNo={}, receiveTradeNo={}, receiveLogNo={}",
lklMerchantNo, receiveTradeNo, receiveLogNo, orderId); orderId, lklMerchantNo, receiveTradeNo, receiveLogNo);
// 3. 检查订单状态 // 3. 检查订单状态
if (!CommonConstant.Enable.equals(shopOrderLkl.getReceive_status())) { if (!CommonConstant.Enable.equals(shopOrderLkl.getReceive_status())) {
log.warn("[分账操作] 订单{}交易流水号{}未被确认收货,跳过处理", orderId, receiveTradeNo); log.warn("[分账操作] 订单未确认收货,无法分账, orderId={}, receiveTradeNo={}", orderId, receiveTradeNo);
return Pair.of(false, "订单未确认收货,暂无法分账"); return Pair.of(false, "订单未确认收货,暂无法分账");
} }
@ -2477,7 +2477,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
&& "SUCCESS".equals(existingSeparateRecord.getStatus()) && "SUCCESS".equals(existingSeparateRecord.getStatus())
&& "SUCCESS".equals(existingSeparateRecord.getFinal_status()) && "SUCCESS".equals(existingSeparateRecord.getFinal_status())
&& CommonConstant.Enable.equals(shopOrderLkl.getSeparate_status())) { && CommonConstant.Enable.equals(shopOrderLkl.getSeparate_status())) {
log.info("[分账操作] 订单[{}]交易对账流水号[{}]已完成分账,跳过处理", orderId, shopOrderLkl.getLkl_receive_log_no()); log.info("[分账操作] 订单分账已完成,无需重复处理, orderId={}, receiveLogNo={}",
orderId, shopOrderLkl.getLkl_receive_log_no());
return Pair.of(true, "订单已分账,请勿重复操作"); return Pair.of(true, "订单已分账,请勿重复操作");
} }
@ -2485,14 +2486,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
Integer refCanSeparateAmt = null; Integer refCanSeparateAmt = 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.info("[分账操作] 查询拉卡拉可分账余额接口:lklMerchantNo={} logDate={} receiveLogNo={} 结果:{}", log.debug("[分账操作] 查询拉卡拉可分账余额, merchantNo={}, logDate={}, receiveLogNo={}, result={}",
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("[分账操作] 拉卡拉可分账金额为空或为0将使用系统计算金额, orderId={}, merchantNo={}",
lklMerchantNo, receiveTradeNo, receiveLogNo); orderId, lklMerchantNo);
} }
} }
@ -2504,23 +2505,23 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (mchSplitRatioRaw == null || if (mchSplitRatioRaw == null ||
mchSplitRatioRaw.compareTo(BigDecimal.ZERO) <= 0 || mchSplitRatioRaw.compareTo(BigDecimal.ZERO) <= 0 ||
mchSplitRatioRaw.compareTo(new BigDecimal(100)) >= 0) { mchSplitRatioRaw.compareTo(new BigDecimal(100)) >= 0) {
log.error("[分账操作] 店铺[{}]商家分账比例[{}]不在(0-100]范围内,无法分账", log.error("[分账操作] 商家分账比例不在有效范围内(0-100], orderId={}, merchantNo={}, splitRatio={}",
shopOrderLkl.getStore_id(), mchSplitRatioRaw); orderId, merchantNo, mchSplitRatioRaw);
return Pair.of(false, "商家分账比例有误"); return Pair.of(false, "商家分账比例有误");
} }
// 计算商家分账比例转换为小数 // 计算商家分账比例转换为小数
BigDecimal mchSplitRatio = mchSplitRatioRaw.divide(new BigDecimal(100)); BigDecimal mchSplitRatio = mchSplitRatioRaw.divide(new BigDecimal(100));
log.info("[分账操作] 开始执行分账计算, orderId={}, merchantNo={}", orderId, merchantNo);
// 获取分账平台接收方信息 // 获取分账平台接收方信息
LklLedgerMerReceiverBind platformReceiver = lklLedgerMerReceiverBindService.getPlatformByMerCupNo(merchantNo); LklLedgerMerReceiverBind platformReceiver = lklLedgerMerReceiverBindService.getPlatformByMerCupNo(merchantNo);
if (platformReceiver == null) { if (platformReceiver == null) {
log.error("[分账操作] 商户号{} 未绑定平台方接收账户,跳过分账", merchantNo); log.error("[分账操作] 未绑定平台方接收账户,无法分账, orderId={}, merchantNo={}", orderId, merchantNo);
return Pair.of(false, "平台方未绑定账户"); return Pair.of(false, "平台方未绑定账户");
} }
// 获取平台分账百分比值
// 获取代理商分账信息
BigDecimal platformSplitRatio = CheckUtil.isEmpty(platformReceiver.getSplit_ratio()) ? BigDecimal.valueOf(0.01) : platformReceiver.getSplit_ratio(); // 默认平台比例 1% BigDecimal platformSplitRatio = CheckUtil.isEmpty(platformReceiver.getSplit_ratio()) ? BigDecimal.valueOf(0.01) : platformReceiver.getSplit_ratio(); // 默认平台比例 1%
// 获取省级代理商接收方 // 获取省级代理商接收方
@ -2528,18 +2529,32 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 获取县级代理商接收方 // 获取县级代理商接收方
LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindService.getAgent2ndByMerCupNo(merchantNo); LklLedgerMerReceiverBind agent2ndReceiver = lklLedgerMerReceiverBindService.getAgent2ndByMerCupNo(merchantNo);
// 内部配送费单位
Integer shoppingFeeInner = CheckUtil.isEmpty(shopOrderLkl.getShopping_fee_inner()) ? 0 : shopOrderLkl.getShopping_fee_inner();
BigDecimal agent1stSplitRatio = null; BigDecimal agent1stSplitRatio = null;
BigDecimal agent2ndSplitRatio = null; BigDecimal agent2ndSplitRatio = null;
if (agent1stReceiver != null) { if (agent1stReceiver != null) {
agent1stSplitRatio = CheckUtil.isEmpty(agent1stReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent1stReceiver.getSplit_ratio(); // 默认省级比例 agent1stSplitRatio = CheckUtil.isEmpty(agent1stReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent1stReceiver.getSplit_ratio(); // 默认省级比例
log.warn("[分账操作] 获取到省级代理商的分账比例值, agent1stSplitRatio={}, merchantNo={}, 1streceiver={}", agent1stSplitRatio, merchantNo, agent1stReceiver.getReceiver_no());
} }
if (agent2ndReceiver != null) { if (agent2ndReceiver != null) {
agent2ndSplitRatio = CheckUtil.isEmpty(agent2ndReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent2ndReceiver.getSplit_ratio(); // 默认市级比例 agent2ndSplitRatio = CheckUtil.isEmpty(agent2ndReceiver.getSplit_ratio()) ? BigDecimal.ZERO : agent2ndReceiver.getSplit_ratio(); // 默认市级比例
log.warn("[分账操作] 获取到县级代理商的分账比例值, agent2stSplitRatio={}, merchantNo={}, 2ndreceiver={}", agent2ndSplitRatio, merchantNo, agent2ndReceiver.getReceiver_no());
// 如果县级代理商运费未配置金额使用平台的最低配送费如果平台配送费未配置金额则免运费
if (CheckUtil.isNotEmpty(agent2ndReceiver.getShipping_fee())) {
shoppingFeeInner = agent2ndReceiver.getShipping_fee();
log.warn("[分账操作] 获取到县级代理商的配送费金额(分), shoppingFeeInner={}, merchantNo={}, 2ndreceiver={}", shoppingFeeInner, merchantNo, agent2ndReceiver.getReceiver_no());
}
} }
// 内部配送费单位 // 如果商家没有代理商且平台分账比例低于等于0.01的则平台分账比例调整到 1-商家分账比例值但不能超过0.06.
Integer shoppingFeeInner = CheckUtil.isEmpty(shopOrderLkl.getShopping_fee_inner()) ? 0 : shopOrderLkl.getShopping_fee_inner(); if (agent1stReceiver == null && agent2ndReceiver == null && BigDecimal.valueOf(0.01).compareTo(platformSplitRatio) >= 0) {
// 平台比例: 1-商家比例百分值但不能超过0.06.
platformSplitRatio = BigDecimal.ONE.subtract(mchSplitRatio).min(BigDecimal.valueOf(0.06));
}
// 计算拉卡拉手续费商家分账金额平台和代理商的分账金额 // 计算拉卡拉手续费商家分账金额平台和代理商的分账金额
Pair<Boolean, LklSeparateWithTotalAmountDTO> calcResult = calculateAndEvaluateSharingParams( Pair<Boolean, LklSeparateWithTotalAmountDTO> calcResult = calculateAndEvaluateSharingParams(
@ -2550,26 +2565,25 @@ public class LakalaApiServiceImpl implements LakalaApiService {
agent1stSplitRatio, 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("[分账操作] 分账参数评估失败,无法分账, orderId={}, merchantNo={}", orderId, merchantNo);
return Pair.of(false, "分账数据评估,结果无法分账"); return Pair.of(false, "分账数据评估,结果无法分账");
} }
LklSeparateWithTotalAmountDTO lklSeparateDTO = calcResult.getSecond(); LklSeparateWithTotalAmountDTO lklSeparateDTO = calcResult.getSecond();
log.debug("[分账操作] 分账参数计算结果:{}", lklSeparateDTO); log.info("[分账操作] 分账计算完成, orderId={}, merchantNo={}, 分账总金额={}",
orderId, merchantNo, lklSeparateDTO.getCanSeparateAmount());
// 更新分账计算结果 // 更新分账计算结果
shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString()); // 写入分账具体情况 shopOrderLkl.setSeparate_remark(lklSeparateDTO.toString()); // 写入分账具体情况
if (CheckUtil.isEmpty(refCanSeparateAmt)) { if (CheckUtil.isEmpty(refCanSeparateAmt)) {
shopOrderLkl.setSplit_amt(lklSeparateDTO.getCanSeparateAmount());
refCanSeparateAmt = lklSeparateDTO.getCanSeparateAmount(); refCanSeparateAmt = lklSeparateDTO.getCanSeparateAmount();
} else {
shopOrderLkl.setSplit_amt_ref(refCanSeparateAmt);
} }
shopOrderLkl.setSplit_amt_ref(refCanSeparateAmt);
// 可分账金额校验 // 可分账金额校验
if (CheckUtil.isEmpty(refCanSeparateAmt)) { if (CheckUtil.isEmpty(refCanSeparateAmt) || refCanSeparateAmt <= 0) {
String errorMsg = String.format("[分账操作] 店铺[%s]订单[%s]可分账金额[%d]低于1分钱跳过分账", String errorMsg = String.format("[分账操作] 可分账金额低于1分钱跳过分账, orderId=%s, merchantNo=%s, amount=%d",
shopOrderLkl.getStore_id(), orderId, refCanSeparateAmt); orderId, merchantNo, refCanSeparateAmt);
log.error(errorMsg); log.error(errorMsg);
if (existingSeparateRecord != null) { if (existingSeparateRecord != null) {
lklOrderSeparateService.updateRemark(existingSeparateRecord.getId(), errorMsg); lklOrderSeparateService.updateRemark(existingSeparateRecord.getId(), errorMsg);
@ -2582,69 +2596,62 @@ public class LakalaApiServiceImpl implements LakalaApiService {
Integer agent1stAmount = lklSeparateDTO.getAgent1stAmount(); Integer agent1stAmount = lklSeparateDTO.getAgent1stAmount();
Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount(); Integer agent2ndAmount = lklSeparateDTO.getAgent2ndAmount();
log.info("[分账操作] 金额计算结果:订单={}, 商户={}, 总金额={}分, 可分金额={}分, 商家比例={}, 商家分得={}分, 平台比例={}, 平台分得={}分, 省级代理商比例={}, 省级代理商分得={}分, 县级代理商比例={}, 县级代理商分得={}分", log.info("[分账操作] 分账金额明细: orderId={}, merchantNo={}, 总金额={}分, 可分金额={}分, 商家分得={}分, 平台分得={}分, 省级代理商分得={}分, 县级代理商分得={}分, 配送费={}分",
orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, mchSplitRatio, merchantAmount, orderId, merchantNo, shopOrderLkl.getTotal_amt(), refCanSeparateAmt, merchantAmount,
platformSplitRatio, platformAmount, agent1stSplitRatio, agent1stAmount, agent2ndSplitRatio, agent2ndAmount); platformAmount, agent1stAmount, agent2ndAmount, shoppingFeeInner);
// 构建分账接收方分账列表参数 // 构建分账接收方分账列表参数
List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>(); List<V3SacsSeparateRecvDatas> recvDatas = new ArrayList<>();
// 商家分账参数 // 商家分账参数
if (CheckUtil.isNotEmpty(merchantAmount)) { if (CheckUtil.isNotEmpty(merchantAmount) && merchantAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvMerchantNo(merchantNo); receiver.setRecvMerchantNo(merchantNo);
receiver.setSeparateValue(Convert.toStr(merchantAmount)); receiver.setSeparateValue(Convert.toStr(merchantAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加商家接收方: merchantNo={}, amount={}", merchantNo, merchantAmount);
} }
// 平台分账参数 // 平台分账参数
if (CheckUtil.isNotEmpty(platformAmount)) { if (CheckUtil.isNotEmpty(platformAmount) && platformAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(platformReceiver.getReceiver_no()); receiver.setRecvNo(platformReceiver.getReceiver_no());
receiver.setSeparateValue(Convert.toStr(platformAmount)); receiver.setSeparateValue(Convert.toStr(platformAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加平台接收方: receiverNo={}, amount={}", platformReceiver.getReceiver_no(), platformAmount);
} }
// 省级代理商分账参数 // 省级代理商分账参数
if (agent1stReceiver != null && StrUtil.isNotBlank(agent1stReceiver.getReceiver_no()) && CheckUtil.isNotEmpty(agent1stAmount)) { if (CheckUtil.isNotEmpty(agent1stSplitRatio) && agent1stReceiver != null &&
StrUtil.isNotBlank(agent1stReceiver.getReceiver_no()) &&
CheckUtil.isNotEmpty(agent1stAmount) && agent1stAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(agent1stReceiver.getReceiver_no()); receiver.setRecvNo(agent1stReceiver.getReceiver_no());
receiver.setSeparateValue(Convert.toStr(agent1stAmount)); receiver.setSeparateValue(Convert.toStr(agent1stAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加省级代理商接收方: receiverNo={}, amount={}", agent1stReceiver.getReceiver_no(), agent1stAmount);
} }
// 县级代理商分账参数 // 县级代理商分账参数
if (agent2ndReceiver != null && StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no()) && CheckUtil.isNotEmpty(agent2ndAmount)) { if (CheckUtil.isNotEmpty(agent2ndSplitRatio) && agent2ndReceiver != null &&
StrUtil.isNotBlank(agent2ndReceiver.getReceiver_no()) &&
CheckUtil.isNotEmpty(agent2ndAmount) && agent2ndAmount > 0) {
V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas receiver = new V3SacsSeparateRecvDatas();
receiver.setRecvNo(agent2ndReceiver.getReceiver_no()); receiver.setRecvNo(agent2ndReceiver.getReceiver_no());
receiver.setSeparateValue(Convert.toStr(agent2ndAmount)); receiver.setSeparateValue(Convert.toStr(agent2ndAmount));
recvDatas.add(receiver); recvDatas.add(receiver);
log.debug("[分账操作] 添加县级代理商接收方: receiverNo={}, amount={}", agent2ndReceiver.getReceiver_no(), agent2ndAmount);
// 有县级代理商的时候配送费暂由它代收 add 2025-10-11 // 有县级代理商的时候配送费暂由它代收 add 2025-10-11
V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas();
shippingFeeReceiver.setRecvNo(agent2ndReceiver.getReceiver_no()); shippingFeeReceiver.setRecvNo(agent2ndReceiver.getReceiver_no());
shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner)); shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner));
recvDatas.add(shippingFeeReceiver); recvDatas.add(shippingFeeReceiver);
log.debug("[分账操作] 配送费由县级代理商接收方代收: receiverNo={}, amount={}", agent2ndReceiver.getReceiver_no(), shoppingFeeInner);
} else { } else {
// 没有县级代理商的时候配送费暂由平台代收 add 2025-10-11 // 没有县级代理商的时候配送费暂由平台代收 add 2025-10-11
V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas(); V3SacsSeparateRecvDatas shippingFeeReceiver = new V3SacsSeparateRecvDatas();
shippingFeeReceiver.setRecvNo(platformReceiver.getReceiver_no()); shippingFeeReceiver.setRecvNo(platformReceiver.getReceiver_no());
shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner)); shippingFeeReceiver.setSeparateValue(Convert.toStr(shoppingFeeInner));
recvDatas.add(shippingFeeReceiver); recvDatas.add(shippingFeeReceiver);
log.debug("[分账操作] 配送费由平台接收方代收: receiverNo={}, amount={}", platformReceiver.getReceiver_no(), shoppingFeeInner);
} }
// 初始化拉卡拉SDK // 初始化拉卡拉SDK
log.debug("[分账操作] 初始化拉卡拉SDK");
initLKLSDK(); initLKLSDK();
// 构建分账请求对象 // 构建分账请求对象
@ -2659,27 +2666,26 @@ public class LakalaApiServiceImpl implements LakalaApiService {
separateRequest.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/sacs/separateNotify"); separateRequest.setNotifyUrl(projectDomain + "/api/mobile/shop/lakala/sacs/separateNotify");
separateRequest.setRecvDatas(recvDatas); separateRequest.setRecvDatas(recvDatas);
log.debug("[分账操作] 分账接收方数量={},请求详细参数: {}", recvDatas.size(), JSONUtil.toJsonStr(separateRequest)); log.info("[分账操作] 准备发送分账请求, orderId={}, merchantNo={}, receiveLogNo={}, 分账接收方数量={}",
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), recvDatas.size());
// 发送分账请求 // 发送分账请求
log.info("[分账操作] 向拉卡拉发送分账请求:订单={}, 商户={}, 分账流水号={}",
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no());
String response = LKLSDK.httpPost(separateRequest); String response = LKLSDK.httpPost(separateRequest);
if (StrUtil.isBlank(response)) { if (StrUtil.isBlank(response)) {
String errorMsg = String.format("[分账操作] 拉卡拉无响应,订单=%s商户=%s分账流水号=%s", String errorMsg = String.format("[分账操作] 拉卡拉无响应, orderId=%s, merchantNo=%s, receiveLogNo=%s",
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no()); orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no());
shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, "");
log.error(errorMsg); log.error(errorMsg);
return Pair.of(false, "拉卡拉无响应"); return Pair.of(false, "拉卡拉无响应");
} }
log.debug("[分账操作] 响应结果: {}", response); log.debug("[分账操作] 拉卡拉分账响应结果: {}", response);
// 解析响应结果 // 解析响应结果
JSONObject respJson = JSONUtil.parseObj(response); JSONObject respJson = JSONUtil.parseObj(response);
if (respJson == null || !lklSacsSuccessCode.equals(respJson.getStr("code")) || respJson.getJSONObject("resp_data") == null) { if (respJson == null || !lklSacsSuccessCode.equals(respJson.getStr("code")) || respJson.getJSONObject("resp_data") == null) {
String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s商户=%s分账流水号=%s响应=%s", String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常, orderId=%s, merchantNo=%s, receiveLogNo=%s, response=%s",
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response); orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response);
shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, ""); shopOrderLklService.updateSeparateStatusByReceiveLogNo(shopOrderLkl.getLkl_receive_log_no(), CommonConstant.Sta_Separate_Fail, "");
log.error(errorMsg); log.error(errorMsg);
@ -2709,12 +2715,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
separateRecord.setTotal_fee_amt(Convert.toStr(lklSeparateDTO.getLklAmount())); separateRecord.setTotal_fee_amt(Convert.toStr(lklSeparateDTO.getLklAmount()));
if (lklOrderSeparateService.addOrUpdateByReceiverNo(separateRecord)) { if (lklOrderSeparateService.addOrUpdateByReceiverNo(separateRecord)) {
log.info("[分账操作] 记录保存成功:订单={}, 分账单号={}, 状态={}, 分账流水号={}", log.info("[分账操作] 分账记录保存成功, orderId={}, separateNo={}, status={}, logNo={}",
orderId, separateRecord.getSeparate_no(), separateRecord.getStatus(), separateRecord.getLog_no()); orderId, separateRecord.getSeparate_no(), separateRecord.getStatus(), separateRecord.getLog_no());
log.info("[分账操作] 结果:订单[{}] 订单分账已提交处理", orderId);
return Pair.of(true, "订单分账已提交处理"); return Pair.of(true, "订单分账已提交处理");
} else { } else {
String errorMsg = String.format("[分账操作] 保存分账记录失败,订单=%s分账单号=%s分账流水号=%s", String errorMsg = String.format("[分账操作] 保存分账记录失败, orderId=%s, separateNo=%s, logNo=%s",
orderId, separateRecord.getSeparate_no(), separateRecord.getLog_no()); orderId, separateRecord.getSeparate_no(), separateRecord.getLog_no());
log.error(errorMsg); log.error(errorMsg);
lklOrderSeparateService.updateRemark(separateRecord.getLog_no(), separateRecord.getSeparate_no(), errorMsg); lklOrderSeparateService.updateRemark(separateRecord.getLog_no(), separateRecord.getSeparate_no(), errorMsg);
@ -2722,7 +2727,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
} catch (Exception e) { } catch (Exception e) {
String errorMsg = String.format("[分账操作] 系统异常,分账对账流水号=%s错误=%s", receiveLogNo, e.getMessage()); String errorMsg = String.format("[分账操作] 系统异常, receiveLogNo=%s, 错误=%s", receiveLogNo, e.getMessage());
log.error(errorMsg, e); log.error(errorMsg, e);
return Pair.of(false, "系统异常,请稍后重试"); return Pair.of(false, "系统异常,请稍后重试");
} }

View File

@ -409,20 +409,19 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
return list; return list;
} }
try { // 获取县级代理商的省级代理商
queryWrapper.clear(); queryWrapper.clear();
queryWrapper.eq("parent_id", agent2nd.getParent_id()) queryWrapper.eq("platform_id", agent2nd.getParent_id())
.eq("status", CommonConstant.Enable) .eq("level", CommonConstant.Agent_Level_1st)
.orderByAsc("id"); .gt("split_ratio", 0)
LklLedgerReceiver agent1st = findOne(queryWrapper); .eq("status", CommonConstant.Enable)
if (agent1st != null) { .orderByAsc("id");
list.add(agent1st); LklLedgerReceiver agent1st = findOne(queryWrapper);
log.debug("[获取平台和代理商信息] 成功获取一级代理信息ID: {}", agent1st.getId()); if (agent1st != null) {
} else { list.add(agent1st);
log.warn("[获取平台和代理商信息] 未找到一级代理商, parent_id: {}, mchId: {}", agent2nd.getParent_id(), mchId); log.debug("[获取平台和代理商信息] 成功获取一级代理信息ID: {}", agent1st.getId());
} } else {
} catch (Exception e) { log.warn("[获取平台和代理商信息] 未找到一级代理商, parent_id: {}, mchId: {}", agent2nd.getParent_id(), mchId);
log.error("[获取平台和代理商信息] 获取一级代理商时发生异常parent_id: {}, mchId: {}", agent2nd.getParent_id(), mchId, e);
} }
log.debug("[获取平台和代理商信息] 查询完成,共获取 {} 条记录", list.size()); log.debug("[获取平台和代理商信息] 查询完成,共获取 {} 条记录", list.size());
@ -466,22 +465,23 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
.eq("status", CommonConstant.Enable) .eq("status", CommonConstant.Enable)
.orderByAsc("id"); .orderByAsc("id");
LklLedgerReceiver result = null;
// 优先使用指定的分销商ID查询否则使用区域信息查询 // 优先使用指定的分销商ID查询否则使用区域信息查询
if (shopMchEntry.getDistributor_id() != null && shopMchEntry.getDistributor_id() > 0) { if (shopMchEntry.getDistributor_id() != null && shopMchEntry.getDistributor_id() > 0) {
queryWrapper.eq("platform_id", shopMchEntry.getDistributor_id()); queryWrapper.eq("platform_id", shopMchEntry.getDistributor_id());
result = findOne(queryWrapper);
log.debug("[获取二级代理] 使用指定分销商ID查询distributorId={}", shopMchEntry.getDistributor_id()); log.debug("[获取二级代理] 使用指定分销商ID查询distributorId={}", shopMchEntry.getDistributor_id());
} else if (StrUtil.isNotBlank(shopMchEntry.getStore_district())) { }
if (result == null && StrUtil.isNotBlank(shopMchEntry.getStore_district())) {
// 运费代理商 // 运费代理商
queryWrapper.eq("license_district_id", shopMchEntry.getStore_district()) queryWrapper.eq("license_district_id", shopMchEntry.getStore_district())
.gt("shipping_fee", 0).ne("supplier_id", "") .gt("shipping_fee", 0).ne("supplier_id", "")
.orderByAsc("id"); .orderByAsc("id");
result = findOne(queryWrapper);
log.debug("[获取二级代理] 使用区域信息查询districtId={}", shopMchEntry.getStore_district()); log.debug("[获取二级代理] 使用区域信息查询districtId={}", shopMchEntry.getStore_district());
} else {
log.warn("[获取二级代理] 未指定分销商ID或区域信息mchId={}", mchId);
return null;
} }
LklLedgerReceiver result = findOne(queryWrapper);
if (result == null) { if (result == null) {
log.info("[获取二级代理] 未找到匹配的二级代理信息mchId={}", mchId); log.info("[获取二级代理] 未找到匹配的二级代理信息mchId={}", mchId);
} else { } else {

View File

@ -2619,11 +2619,11 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
List<Map> items = (List<Map>) cart_data.get("items"); List<Map> items = (List<Map>) cart_data.get("items");
for (Map store_row : items) { for (Map store_row : items) {
// 检查店铺城市和收货地址是否同一城市 // // 检查店铺城市和收货地址是否同一城市
List<Integer> storeDistrictId = Convert.toList(Integer.class, store_row.get("store_district_id")); // List<Integer> storeDistrictId = Convert.toList(Integer.class, store_row.get("store_district_id"));
if (canThrow && uAddress != null && storeDistrictId != null && storeDistrictId.size() > 0 && !CollUtil.contains(storeDistrictId, uAddress.getUd_city_id())) { // if (canThrow && uAddress != null && storeDistrictId != null && storeDistrictId.size() > 0 && !CollUtil.contains(storeDistrictId, uAddress.getUd_city_id())) {
throw new ApiException(I18nUtil._("订单不在同一城市,请检查您下单所在店铺的具体位置!")); // throw new ApiException(I18nUtil._("订单不在同一城市,请检查您下单所在店铺的具体位置!"));
} // }
// 一个店铺的订单 // 一个店铺的订单
Long storeId = Convert.toLong(store_row.get("store_id")); Long storeId = Convert.toLong(store_row.get("store_id"));