分账逻辑的调整

This commit is contained in:
Jack 2025-09-11 14:24:06 +08:00
parent 1eae2007c3
commit 04042d5a4b
16 changed files with 438 additions and 278 deletions

View File

@ -56,13 +56,15 @@ public class ShopOrderLkl implements Serializable {
private String trade_status; private String trade_status;
private String lkl_trade_no;
private String lkl_log_no; private String lkl_log_no;
private String lkl_log_date; private String lkl_log_date;
private String lkl_sub_log_no; private String lkl_sub_trade_no;
private String lkl_trade_no; private String lkl_sub_log_no;
private String lkl_receive_trade_no; private String lkl_receive_trade_no;

View File

@ -78,6 +78,9 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铺状态(ENUM):0-关闭; 1-运营中, 商品是否可用,需要判断该商品店铺状态") @ApiModelProperty(value = "店铺状态(ENUM):0-关闭; 1-运营中, 商品是否可用,需要判断该商品店铺状态")
private Integer store_is_open; private Integer store_is_open;
@ApiModelProperty(value = "店铃声开关1-开启2-关闭;")
private Integer ringtone_is_enable;
@ApiModelProperty(value = "店铺营业状态1-营业中2-已打烊;") @ApiModelProperty(value = "店铺营业状态1-营业中2-已打烊;")
private Integer store_biz_state; private Integer store_biz_state;

View File

@ -8,7 +8,12 @@
package com.suisung.mall.common.service.impl; package com.suisung.mall.common.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.suisung.mall.common.api.StateCode; import com.suisung.mall.common.api.StateCode;
import com.suisung.mall.common.constant.CommonConstant;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -140,6 +145,116 @@ public class CommonService {
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(isValidInput("", "+8618924071446")); System.out.println(getLklCombineSplitRespInfo("8226330541100GU", "[{\"sub_trade_no\":\"20250911110110000066202050017882\",\"sub_log_no\":\"66202050017882\",\"origin_sub_trade_no\":\"20250911110113130266250044162421\",\"origin_sub_log_no\":\"66250044162421\",\"merchant_no\":\"822584059990FYP\",\"term_no\":\"N5811590\",\"amount\":\"1\"},{\"sub_trade_no\":\"20250911110110000066202050152097\",\"sub_log_no\":\"66202050152097\",\"origin_sub_trade_no\":\"20250911110113130266250044162422\",\"origin_sub_log_no\":\"66250044162422\",\"merchant_no\":\"8226330541100GU\",\"term_no\":\"N5817779\",\"amount\":\"1\"}]", false));
} }
/**
* 从拉卡拉分账响应信息中提取合单运费或商品订单信息
* <p>该方法用于处理合单支付场景从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息</p>
*
* @param merchantNo 商家商户号
* @param outSplitRspInfos 拉卡拉分账响应信息格式为JSON数组字符串
* [
* {
* "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
* "merchant_no":"822584059990FYP", // 商户号
* "amount":"1", // 分账金额
* "settle_type":"0", // 结算类型
* "sub_log_no":"66250034401288", // 子流水号
* "out_sub_trade_no":"DF-DD-20250830-21", // 外部子交易订单号(DF开头为运费订单)
* "term_no":"N5811590" // 终端设备号
* },
* {
* "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
* "merchant_no":"8226330541100GU", // 商户号
* "amount":"1", // 分账金额
* "settle_type":"0", // 结算类型
* "sub_log_no":"66250034401289", // 子流水号
* "out_sub_trade_no":"ORD-DD-20250830-21", // 外部子交易订单号(ORD开头为商品订单)
* "term_no":"N5817779" // 终端设备号
* }
* ]
* @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
* @return JSONObject 返回匹配的子单信息格式如下
* {
* "sub_trade_no":"20250830110113130266250034401288",
* "merchant_no":"822584059990FYP",
* "amount":"1",
* "settle_type":"0",
* "sub_log_no":"66250034401288",
* "out_sub_trade_no":"DF-DD-20250830-21",
* "term_no":"N5811590"
* }
*/
public static JSONObject getLklCombineSplitRespInfo(String merchantNo, String outSplitRspInfos, boolean isDeliveryFee) {
log.debug("[拉卡拉合单数据拆分] 开始获取合单数据: merchantNo={} isDeliveryFee={} outSplitRspInfos长度={}",
merchantNo, isDeliveryFee, outSplitRspInfos != null ? outSplitRspInfos.length() : 0);
// 输入参数校验检查分账信息是否为空
if (StrUtil.isBlank(outSplitRspInfos)) {
log.warn("[拉卡拉合单数据拆分] 合单数据为空");
return null;
}
// 解析JSON数组将字符串转换为JSONArray对象
JSONArray outSplitRspInfoArray;
try {
outSplitRspInfoArray = JSONUtil.parseArray(outSplitRspInfos);
log.debug("[拉卡拉合单数据拆分] JSON解析完成数组大小={}", outSplitRspInfoArray.size());
} catch (Exception e) {
log.error("[拉卡拉合单数据拆分] JSON解析失败{}", outSplitRspInfos, e);
return null;
}
// 检查解析后的数组是否为空
if (outSplitRspInfoArray.isEmpty()) {
log.warn("[拉卡拉合单数据拆分] 拆分合单数据失败:分账信息数组为空");
return null;
}
// 遍历JSON数组查找匹配的子单 (合单订单通常只有两个子单一个运费单一个商品单)
final String deliveryPrefix = CommonConstant.Sep_DeliveryFee_Prefix;
final String goodsPrefix = CommonConstant.Sep_GoodsFee_Prefix;
log.debug("[拉卡拉合单数据拆分] 开始遍历数组查找匹配子单: deliveryPrefix={} goodsPrefix={}", deliveryPrefix, goodsPrefix);
for (int i = 0; i < outSplitRspInfoArray.size(); i++) {
JSONObject item = outSplitRspInfoArray.getJSONObject(i);
if (item == null) {
log.debug("[拉卡拉合单数据拆分] 数组第{}项为空,跳过", i);
continue;
}
// 获取外部子交易订单号字段和商户号
String subMerchantNo = item.getStr("merchant_no");
String outSubTradeNo = item.getStr("out_sub_trade_no");
log.debug("[拉卡拉合单数据拆分] 检查第{}项: outSubTradeNo={} subMerchantNo={}", i, outSubTradeNo, subMerchantNo);
// 根据isDeliveryFee参数和商户号筛选对应的子单信息
if (isDeliveryFee && StrUtil.isNotBlank(merchantNo) && !merchantNo.equals(subMerchantNo)) {
log.debug("[拉卡拉合单数据拆分] 找到运费子单(通过商户号匹配): outSubTradeNo={} subMerchantNo={}", outSubTradeNo, subMerchantNo);
return item;
} else if (!isDeliveryFee && StrUtil.isNotBlank(merchantNo) && merchantNo.equals(subMerchantNo)) {
log.debug("[拉卡拉合单数据拆分] 找到商品子单(通过商户号匹配): outSubTradeNo={} subMerchantNo={}", outSubTradeNo, subMerchantNo);
return item;
} else {
// 如果商户号匹配失败则通过订单号前缀匹配
if (isDeliveryFee && StrUtil.isNotBlank(outSubTradeNo) && outSubTradeNo.startsWith(deliveryPrefix)) {
log.debug("[拉卡拉合单数据拆分] 找到运费子单(通过前缀匹配): outSubTradeNo={}", outSubTradeNo);
return item;
} else if (!isDeliveryFee && StrUtil.isNotBlank(outSubTradeNo) && outSubTradeNo.startsWith(goodsPrefix)) {
log.debug("[拉卡拉合单数据拆分] 找到商品子单(通过前缀匹配): outSubTradeNo={}", outSubTradeNo);
return item;
} else {
log.debug("[拉卡拉合单数据拆分] 第{}项不匹配条件: isDeliveryFee={} merchantNo={} subMerchantNo={} outSubTradeNo={}",
i, isDeliveryFee, merchantNo, subMerchantNo, outSubTradeNo);
}
}
}
// 未找到匹配的子单信息
log.warn("[拉卡拉合单数据拆分] 未找到匹配的子单信息: merchantNo={} isDeliveryFee={}", merchantNo, isDeliveryFee);
return null;
}
} }

View File

@ -1,6 +1,5 @@
package com.suisung.mall.pay.service; package com.suisung.mall.pay.service;
import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.order.ShopOrderReturn; import com.suisung.mall.common.modules.order.ShopOrderReturn;
import com.suisung.mall.common.modules.pay.PayConsumeTrade; import com.suisung.mall.common.modules.pay.PayConsumeTrade;
@ -62,44 +61,4 @@ public interface PayConsumeTradeService extends IBaseService<PayConsumeTrade> {
*/ */
Boolean updateTradeByPrimaryKey(PayConsumeTrade payConsumeTrade); Boolean updateTradeByPrimaryKey(PayConsumeTrade payConsumeTrade);
/**
* 从拉卡拉分账响应信息中提取合单运费或商品订单信息
* <p>该方法用于处理合单支付场景从拉卡拉返回的分账信息中筛选出运费子单或商品子单信息</p>
*
* @param outSplitRspInfos 拉卡拉分账响应信息格式为JSON数组字符串
* [
* {
* "sub_trade_no":"20250830110113130266250034401288", // 子交易流水号
* "merchant_no":"822584059990FYP", // 商户号
* "amount":"1", // 分账金额
* "settle_type":"0", // 结算类型
* "sub_log_no":"66250034401288", // 子流水号
* "out_sub_trade_no":"DF_DD_20250830_21", // 外部子交易订单号(DF开头为运费订单)
* "term_no":"N5811590" // 终端设备号
* },
* {
* "sub_trade_no":"20250830110113130266250034401289", // 子交易流水号
* "merchant_no":"8226330541100GU", // 商户号
* "amount":"1", // 分账金额
* "settle_type":"0", // 结算类型
* "sub_log_no":"66250034401289", // 子流水号
* "out_sub_trade_no":"ORD_DD_20250830_21", // 外部子交易订单号(ORD开头为商品订单)
* "term_no":"N5817779" // 终端设备号
* }
* ]
* @param isDeliveryFee true: 提取运费子单信息, false: 提取商品子单信息
* @return JSONObject 返回匹配的子单信息格式如下
* {
* "sub_trade_no":"20250830110113130266250034401288",
* "merchant_no":"822584059990FYP",
* "amount":"1",
* "settle_type":"0",
* "sub_log_no":"66250034401288",
* "out_sub_trade_no":"DF-DD-20250830-21",
* "term_no":"N5811590"
* }
*/
JSONObject getLklCombineSplitRespInfo(String outSplitRspInfos, boolean isDeliveryFee);
} }

View File

@ -381,7 +381,7 @@ public class LakalaPayServiceImpl implements LakalaPayService {
} }
// 重要约定订单号规则商品订单ORD_订单号,运费订单DF_订单号 // 重要约定订单号规则商品订单ORD_订单号,运费订单DF_订单号
// 单信息 // 商品子单信息
JSONObject goodsSplitInfo = new JSONObject(); JSONObject goodsSplitInfo = new JSONObject();
goodsSplitInfo.put("out_sub_trade_no", CommonConstant.Sep_GoodsFee_Prefix + orderId); // 商品子订单号 goodsSplitInfo.put("out_sub_trade_no", CommonConstant.Sep_GoodsFee_Prefix + orderId); // 商品子订单号
goodsSplitInfo.put("merchant_no", merchantNo); // 分账商户号 goodsSplitInfo.put("merchant_no", merchantNo); // 分账商户号
@ -400,9 +400,10 @@ public class LakalaPayServiceImpl implements LakalaPayService {
int goodsAmountInt = totalAmountInt - agentAmountInt; int goodsAmountInt = totalAmountInt - agentAmountInt;
goodsSplitInfo.put("amount", Convert.toStr(goodsAmountInt)); // 分账金额 goodsSplitInfo.put("amount", Convert.toStr(goodsAmountInt)); // 分账金额
goodsSplitInfo.put("settle_type", "0"); // "0"或者空常规结算方式 goodsSplitInfo.put("settle_type", "1"); // "0"或者空常规结算方式
goodsSplitInfo.put("sub_remark", "商品订单金额"); // 子单备注信息 goodsSplitInfo.put("sub_remark", "商品订单金额"); // 子单备注信息
// 运费子单信息
JSONObject deliverySplitInfo = new JSONObject(); JSONObject deliverySplitInfo = new JSONObject();
deliverySplitInfo.put("out_sub_trade_no", CommonConstant.Sep_DeliveryFee_Prefix + orderId); // 运费子订单号 deliverySplitInfo.put("out_sub_trade_no", CommonConstant.Sep_DeliveryFee_Prefix + orderId); // 运费子订单号
deliverySplitInfo.put("merchant_no", agentMerchantNo); // 分账商户号 deliverySplitInfo.put("merchant_no", agentMerchantNo); // 分账商户号

File diff suppressed because one or more lines are too long

View File

@ -52,6 +52,7 @@ import com.suisung.mall.common.modules.pay.*;
import com.suisung.mall.common.modules.pay.dto.ItemActivityInfoDTO; import com.suisung.mall.common.modules.pay.dto.ItemActivityInfoDTO;
import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.common.service.impl.CommonService;
import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.LogUtil; import com.suisung.mall.common.utils.LogUtil;
@ -1344,59 +1345,69 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
} }
/**
* 处理拉卡拉支付异步通知
* 该方法用于接收并处理来自拉卡拉支付平台的异步通知包括验签解析参数更新订单状态等操作
*
* @param request HTTP请求对象包含拉卡拉支付平台发送的异步通知数据
* @return String 返回处理结果用于响应拉卡拉支付平台
*/
@Override @Override
public String lklNotifyUrl(HttpServletRequest request) { public String lklNotifyUrl(HttpServletRequest request) {
Map<String, String> params; Map<String, String> params;
try { try {
logger.info("[拉卡拉支付通知] 开始处理拉卡拉支付异步通知");
// 初始化拉卡拉SDK
lakalaPayService.initLKLSDK(); lakalaPayService.initLKLSDK();
log.debug("[拉卡拉支付通知] 拉卡拉SDK初始化完成");
// 读取请求体并验签 // 读取请求体并验签
String body = LKLSDK.notificationHandle(request); String body = LKLSDK.notificationHandle(request);
String authorization = request.getHeader("Authorization"); String authorization = request.getHeader("Authorization");
logger.debug("[拉卡拉支付通知] 接收到通知数据body长度={}authorization长度={}",
body != null ? body.length() : 0,
authorization != null ? authorization.length() : 0);
if (StrUtil.isBlank(body)) { if (StrUtil.isBlank(body)) {
log.warn("[拉卡拉支付通知] 验签失败,请求体为空");
return lklNotifyMsg(false, "验签失败!"); return lklNotifyMsg(false, "验签失败!");
} }
// 敏感头信息脱敏打印 // 敏感头信息脱敏打印
logger.info("拉卡拉支付异步通知回调 body:{} \n authorization: {}", body, authorization); logger.info("[拉卡拉支付通知] 拉卡拉支付异步通知回调 body:{} \n authorization: {}",
// 非合单返回的数据异步通知返回的 body json数据{"out_trade_no":"202203151637334864280014","trade_no":"2022031566210203291925","log_no":"66210203291925", body, authorization != null ? "***" : "null");
// "acc_trade_no":"2022031522001483661454130929 ","trade_status":"SUCCESS","trade_state":"SUCCESS","total_amount":"1",
// "payer_amount":"1","acc_settle_amount":"1","trade_time":"20220315163808","user_id1":"app***@163.com",
// "user_id2":"2088432881453660","notify_url":"https://www.baidu.com","account_type":"ALIPAY","card_type":"99"}
// 合单返回的数据异步通知返回的 body json数据{"out_trade_no":"DD-20250830-10","trade_no":"20250830110113130266250034160499","log_no":"66250034160499",
// "acc_trade_no":"4200002826202508306761393882","trade_status":"SUCCESS","trade_state":"SUCCESS","total_amount":"2","payer_amount":"2","acc_settle_amount":"2",
// "acc_mdiscount_amount":"0","acc_discount_amount":"0","trade_time":"20250830180435","user_id1":"oDVKR7T0qxg6O8tqIL9SgY6LXqqQ",
// "user_id2":"oVxsc1QRAqDRv_gAmXuLZwSVSL18","notify_url":"https://mall.gpxscs.cn/mobile/pay/index/lkl_wxPay_notify_url","account_type":"WECHAT",
// "bank_type":"OTHERS","card_type":"02","merchant_no":"8226330541100GU","remark":"","sub_mch_id":"803819329",
// "out_split_rsp_infos":[{"sub_trade_no":"20250830110113130266250034112794","sub_log_no":"66250034112794","out_sub_trade_no":"ORD-DD-20250830-10",
// "merchant_no":"8226330541100GU","term_no":"N5817779","amount":"1","settle_type":"0"},{"sub_trade_no":"20250830110113130266250034160498","sub_log_no":"66250034160498",
// "out_sub_trade_no":"DF-DD-20250830-10","merchant_no":"822584059990FYP","term_no":"N5811590","amount":"1","settle_type":"0"}],"trade_req_date":"20250830","gb_amount":"",
// "qb_amount":""}
// 解析JSON格式响应 // 解析JSON格式响应
cn.hutool.json.JSONObject lklNotifyRespJSON = JSONUtil.parseObj(body); cn.hutool.json.JSONObject lklNotifyRespJSON = JSONUtil.parseObj(body);
logger.debug("[拉卡拉支付通知] 解析JSON完成: keys={}", lklNotifyRespJSON.keySet());
params = Convert.toMap(String.class, String.class, lklNotifyRespJSON); params = Convert.toMap(String.class, String.class, lklNotifyRespJSON);
String orderId = params.getOrDefault("out_trade_no", ""); String orderId = params.getOrDefault("out_trade_no", "");
String accTradeNo = params.getOrDefault("acc_trade_no", ""); // 需要跟拉卡拉确认这个字段是原支付交易对应的微信订单号吗 String tradeStatus = params.getOrDefault("trade_status", "");
String outSplitRspInfos = params.getOrDefault("out_split_rsp_infos", ""); // 拉卡拉合单订单信息 String accTradeNo = params.getOrDefault("acc_trade_no", "");
String outSplitRspInfos = params.getOrDefault("out_split_rsp_infos", "");
logger.info("[拉卡拉支付通知] 核心参数 - 订单号:{} 状态:{} 是否合单:{}",
orderId, tradeStatus, StrUtil.isNotBlank(outSplitRspInfos) ? "" : "");
// 提取授权签名信息 // 提取授权签名信息
Map<String, String> authMap = LakalaUtil.getLakalaAuthorizationMap(authorization); Map<String, String> authMap = LakalaUtil.getLakalaAuthorizationMap(authorization);
if (authMap != null && authMap.containsKey("signature")) { if (authMap != null && authMap.containsKey("signature")) {
params.put("sign", authMap.get("signature")); params.put("sign", authMap.get("signature"));
logger.debug("[拉卡拉支付通知] 签名信息提取成功");
} else { } else {
logger.error("缺少签名信息"); logger.error("[拉卡拉支付通知] 缺少签名信息authMap={}", authMap);
return lklNotifyMsg(false, "缺少签名信息"); return lklNotifyMsg(false, "缺少签名信息");
} }
if (StrUtil.isBlank(orderId)) { if (StrUtil.isBlank(orderId)) {
logger.error("缺少out_trade_no字段"); logger.error("[拉卡拉支付通知] 缺少out_trade_no字段body={}", body);
return lklNotifyMsg(false, "缺少out_trade_no字段"); return lklNotifyMsg(false, "缺少out_trade_no字段");
} }
// 查询交易信息 // 查询交易信息
logger.debug("[拉卡拉支付通知] 查询交易信息: orderId={}", orderId);
QueryWrapper<PayConsumeTrade> tradeQueryWrapper = new QueryWrapper<>(); QueryWrapper<PayConsumeTrade> tradeQueryWrapper = new QueryWrapper<>();
tradeQueryWrapper.eq("order_id", orderId); tradeQueryWrapper.eq("order_id", orderId);
PayConsumeTrade trade_row_tmp = payConsumeTradeService.findOne(tradeQueryWrapper); PayConsumeTrade trade_row_tmp = payConsumeTradeService.findOne(tradeQueryWrapper);
@ -1405,25 +1416,32 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
String orderSubject = trade_row_tmp != null ? trade_row_tmp.getTrade_title() : ""; String orderSubject = trade_row_tmp != null ? trade_row_tmp.getTrade_title() : "";
Integer userId = trade_row_tmp != null ? trade_row_tmp.getBuyer_id() : 0; Integer userId = trade_row_tmp != null ? trade_row_tmp.getBuyer_id() : 0;
logger.debug("[拉卡拉支付通知] 交易信息查询完成: storeId={} userId={}", payment_store_id, userId);
// 更新交易记录的 原支付交易对应的微信订单号 transaction_id // 更新交易记录的 原支付交易对应的微信订单号 transaction_id
if (trade_row_tmp != null && StrUtil.isNotBlank(accTradeNo)) { if (trade_row_tmp != null && StrUtil.isNotBlank(accTradeNo)) {
logger.debug("[拉卡拉支付通知] 更新交易记录的微信订单号: tradeId={} accTradeNo={}",
trade_row_tmp.getConsume_trade_id(), accTradeNo);
PayConsumeTrade payConsumeTradeUpd = new PayConsumeTrade(); PayConsumeTrade payConsumeTradeUpd = new PayConsumeTrade();
payConsumeTradeUpd.setConsume_trade_id(trade_row_tmp.getConsume_trade_id()).setTransaction_id(accTradeNo); payConsumeTradeUpd.setConsume_trade_id(trade_row_tmp.getConsume_trade_id()).setTransaction_id(accTradeNo);
payConsumeTradeService.updateTradeByPrimaryKey(payConsumeTradeUpd); payConsumeTradeService.updateTradeByPrimaryKey(payConsumeTradeUpd);
} }
// 查询支付渠道 // 查询支付渠道
logger.debug("[拉卡拉支付通知] 查询支付渠道: channelCode=lakala");
QueryWrapper<PayPaymentChannel> channelQueryWrapper = new QueryWrapper<>(); QueryWrapper<PayPaymentChannel> channelQueryWrapper = new QueryWrapper<>();
channelQueryWrapper.eq("payment_channel_code", "lakala"); channelQueryWrapper.eq("payment_channel_code", "lakala");
PayPaymentChannel payPaymentChannel = payPaymentChannelService.findOne(channelQueryWrapper); PayPaymentChannel payPaymentChannel = payPaymentChannelService.findOne(channelQueryWrapper);
if (payPaymentChannel == null) { if (payPaymentChannel == null) {
logger.error("支付渠道不存在"); logger.error("[拉卡拉支付通知] 支付渠道不存在: channelCode=lakala");
return lklNotifyMsg(false, "支付渠道不存在"); return lklNotifyMsg(false, "支付渠道不存在");
} }
Integer payment_channel_id = payPaymentChannel.getPayment_channel_id(); Integer payment_channel_id = payPaymentChannel.getPayment_channel_id();
logger.debug("[拉卡拉支付通知] 支付渠道查询完成: channelId={}", payment_channel_id);
// 插入充值记录 // 插入充值记录
logger.debug("[拉卡拉支付通知] 创建充值记录");
PayConsumeDeposit payConsumeDeposit = createNotify(params, payPaymentChannel); PayConsumeDeposit payConsumeDeposit = createNotify(params, payPaymentChannel);
payConsumeDeposit.setOrder_id(orderId); payConsumeDeposit.setOrder_id(orderId);
payConsumeDeposit.setStore_id(payment_store_id); // 所属店铺 payConsumeDeposit.setStore_id(payment_store_id); // 所属店铺
@ -1433,11 +1451,22 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
payConsumeDeposit.setDeposit_body(orderSubject); payConsumeDeposit.setDeposit_body(orderSubject);
payConsumeDeposit.setUser_id(userId); payConsumeDeposit.setUser_id(userId);
// 设置拉卡拉相关参数
String merchantNo = lklNotifyRespJSON.getStr("merchant_no");
lklNotifyRespJSON.set("out_separate_no", orderId);// 默认非合单主单订单号 lklNotifyRespJSON.set("out_separate_no", orderId);// 默认非合单主单订单号
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("log_no")); // 默认非合单主单的流水号 lklNotifyRespJSON.set("lkl_sub_trade_no", lklNotifyRespJSON.getStr("trade_no"));// 默认非合单主单交易号
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("log_no")); // 默认非合单主单的对账流水号
lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("total_amount")); // 默认非合单主单支付金额 lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("total_amount")); // 默认非合单主单支付金额
logger.debug("[拉卡拉支付通知] 基础参数设置完成: out_separate_no={} lkl_sub_trade_no={} lkl_sub_log_no={} split_amt={}",
lklNotifyRespJSON.getStr("out_separate_no"),
lklNotifyRespJSON.getStr("lkl_sub_trade_no"),
lklNotifyRespJSON.getStr("lkl_sub_log_no"),
lklNotifyRespJSON.getStr("split_amt"));
// 拉卡拉订单合单信息 // 拉卡拉订单合单信息
if (StrUtil.isNotBlank(outSplitRspInfos)) { if (StrUtil.isNotBlank(outSplitRspInfos)) {
logger.debug("[拉卡拉支付通知] 处理合单信息");
// [{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"},{"sub_trade_no":"20250830110113130266250034401289","merchant_no":"8226330541100GU","amount":"1","settle_type":"0","sub_log_no":"66250034401289","out_sub_trade_no":"ORD-DD-20250830-21","term_no":"N5817779"}] // [{"sub_trade_no":"20250830110113130266250034401288","merchant_no":"822584059990FYP","amount":"1","settle_type":"0","sub_log_no":"66250034401288","out_sub_trade_no":"DF-DD-20250830-21","term_no":"N5811590"},{"sub_trade_no":"20250830110113130266250034401289","merchant_no":"8226330541100GU","amount":"1","settle_type":"0","sub_log_no":"66250034401289","out_sub_trade_no":"ORD-DD-20250830-21","term_no":"N5817779"}]
payConsumeDeposit.setLkl_combine_params(outSplitRspInfos); payConsumeDeposit.setLkl_combine_params(outSplitRspInfos);
@ -1447,46 +1476,64 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
payConsumeDeposit.setOrd_sub_trade_no(subTradeNos.getFirst()); payConsumeDeposit.setOrd_sub_trade_no(subTradeNos.getFirst());
// 商品运费子订单号 // 商品运费子订单号
payConsumeDeposit.setDf_sub_trade_no(subTradeNos.getSecond()); payConsumeDeposit.setDf_sub_trade_no(subTradeNos.getSecond());
logger.debug("[拉卡拉支付通知] 子订单号解析完成: ord={} df={}",
subTradeNos.getFirst(), subTradeNos.getSecond());
} }
// 获取拉卡拉订单合单商品信息 // 获取拉卡拉合单商品子订单信息
cn.hutool.json.JSONObject goodsOrderInfo = payConsumeTradeService.getLklCombineSplitRespInfo(outSplitRspInfos, false); cn.hutool.json.JSONObject goodsOrderInfo = CommonService.getLklCombineSplitRespInfo(merchantNo, outSplitRspInfos, false);
if (goodsOrderInfo != null) { if (goodsOrderInfo != null) {
lklNotifyRespJSON.set("out_separate_no", goodsOrderInfo.getStr("out_sub_trade_no"));// 合单子订单号 lklNotifyRespJSON.set("out_separate_no", goodsOrderInfo.getStr("out_sub_trade_no"));// 合单商品子订单号
lklNotifyRespJSON.set("lkl_sub_log_no", lklNotifyRespJSON.getStr("sub_log_no")); // 合单子商品订单的流水号 lklNotifyRespJSON.set("lkl_sub_trade_no", goodsOrderInfo.getStr("sub_trade_no")); // 合单商品子订单的流水号
lklNotifyRespJSON.set("split_amt", lklNotifyRespJSON.getStr("amount")); // 合单子商品订单支付金额 lklNotifyRespJSON.set("lkl_sub_log_no", goodsOrderInfo.getStr("sub_log_no")); // 合单商品子订单的流水号
lklNotifyRespJSON.set("split_amt", goodsOrderInfo.getStr("amount")); // 合单子商品订单支付金额
logger.debug("[拉卡拉支付通知] 合单信息更新完成: out_separate_no={} lkl_sub_trade_no={} lkl_sub_log_no={} split_amt={}",
lklNotifyRespJSON.getStr("out_separate_no"),
lklNotifyRespJSON.getStr("lkl_sub_trade_no"),
lklNotifyRespJSON.getStr("lkl_sub_log_no"),
lklNotifyRespJSON.getStr("split_amt"));
} }
} }
// 判断是否联合支付 // 判断是否联合支付
logger.debug("[拉卡拉支付通知] 查询联合支付信息: orderId={}", orderId);
PayConsumeTradeCombine tradeCombine = payConsumeTradeCombineService.get(orderId); PayConsumeTradeCombine tradeCombine = payConsumeTradeCombineService.get(orderId);
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
try { try {
logger.debug("[拉卡拉支付通知] 开始事务处理");
// 修改 拉卡拉的订单记录 shop_order_lkl // 修改 拉卡拉的订单记录 shop_order_lkl
logger.debug("[拉卡拉支付通知] 调用shopService更新拉卡拉订单记录");
shopService.lklPayNotifyUpdateShopOrderLkl(lklNotifyRespJSON); shopService.lklPayNotifyUpdateShopOrderLkl(lklNotifyRespJSON);
log.debug("[拉卡拉支付通知] 拉卡拉订单记录更新完成");
if (tradeCombine != null && StrUtil.isNotBlank(tradeCombine.getOrder_ids())) { if (tradeCombine != null && StrUtil.isNotBlank(tradeCombine.getOrder_ids())) {
logger.debug("[拉卡拉支付通知] 处理联合支付: combinedOrderIds={}", tradeCombine.getOrder_ids());
payConsumeDeposit.setOrder_id(tradeCombine.getOrder_ids()); payConsumeDeposit.setOrder_id(tradeCombine.getOrder_ids());
} }
// 重要支付完成接口调用 // 重要支付完成接口调用
log.debug("[拉卡拉支付通知] 调用支付完成处理接口");
if (!payConsumeDepositService.processDeposit(payConsumeDeposit, BigDecimal.ZERO, BigDecimal.ZERO, if (!payConsumeDepositService.processDeposit(payConsumeDeposit, BigDecimal.ZERO, BigDecimal.ZERO,
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)) { BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO)) {
log.error("[processDeposit]处理订单数据失败!"); logger.error("[拉卡拉支付通知][processDeposit]处理订单数据失败!");
return lklNotifyMsg(false, "支付失败!"); return lklNotifyMsg(false, "支付失败!");
} }
log.debug("[拉卡拉支付通知] 支付完成处理接口调用成功");
transactionManager.commit(transactionStatus); transactionManager.commit(transactionStatus);
logger.info("[拉卡拉支付通知] 事务提交成功,支付处理完成: orderId={}", orderId);
} catch (Exception e) { } catch (Exception e) {
transactionManager.rollback(transactionStatus); transactionManager.rollback(transactionStatus);
log.error("接收拉卡拉支付异步通知出错:{}", e); logger.error("[拉卡拉支付通知] 事务处理出错,已回滚: orderId={}", orderId, e);
throw new ApiException(e.getMessage()); throw new ApiException(e.getMessage());
} }
return lklNotifyMsg(true, "执行成功"); return lklNotifyMsg(true, "执行成功");
} catch (Exception e) { } catch (Exception e) {
logger.error("通知处理发生异常{}", e.getMessage(), e); logger.error("[拉卡拉支付通知] 通知处理发生异常", e);
return lklNotifyMsg(false, "通知处理发生异常!"); return lklNotifyMsg(false, "通知处理发生异常!");
} }
} }

View File

@ -28,7 +28,7 @@ public interface LklOrderSeparateService extends IBaseService<LklOrderSeparate>
* @param outSeparateNo * @param outSeparateNo
* @return * @return
*/ */
LklOrderSeparate getByOutTradeNo(String logNo, String outSeparateNo); LklOrderSeparate getByLogNoAndOutTradeNo(String logNo, String outSeparateNo);
/** /**
* 根据商户号和平台订单号查询记录 * 根据商户号和平台订单号查询记录

View File

@ -30,6 +30,7 @@ import com.suisung.mall.common.modules.lakala.*;
import com.suisung.mall.common.modules.order.ShopOrderLkl; import com.suisung.mall.common.modules.order.ShopOrderLkl;
import com.suisung.mall.common.modules.store.ShopMchEntry; import com.suisung.mall.common.modules.store.ShopMchEntry;
import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.service.impl.CommonService;
import com.suisung.mall.common.utils.*; import com.suisung.mall.common.utils.*;
import com.suisung.mall.shop.lakala.service.*; import com.suisung.mall.shop.lakala.service.*;
import com.suisung.mall.shop.lakala.utils.LakalaUtil; import com.suisung.mall.shop.lakala.utils.LakalaUtil;
@ -604,10 +605,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
req.setOrgCode(orgCode); req.setOrgCode(orgCode);
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%分账给平台 // 分账比例默认 94%
req.setSplitLowestRatio(new BigDecimal(splitLowestRatio)); req.setSplitLowestRatio(new BigDecimal(splitLowestRatio));
req.setEleContractNo(shopMchEntry.getLkl_ec_no()); req.setEleContractNo(shopMchEntry.getLkl_ec_no());
String fileName = "商家分账授权委托书.pdf";//paramsJSON.getStr("splitEntrustFileName"); req.setSplitRange("ALL"); // ALL全部交易分账 (商户所有交易默认待分账) MARK标记交易分账(只有带分账标识交易待分账其余交易正常结算) 默认MARK
String fileName = "商家分账授权委托书.pdf";
req.setSplitEntrustFileName(fileName); req.setSplitEntrustFileName(fileName);
// TODO 分账结算委托书文件上传到拉卡拉服务器 // TODO 分账结算委托书文件上传到拉卡拉服务器
@ -714,15 +716,52 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return JSONUtil.createObj().set("code", "FAIL").set("message", "返回数据转换异常!"); return JSONUtil.createObj().set("code", "FAIL").set("message", "返回数据转换异常!");
} }
String logNo = paramsJSON.getStr("log_no"); // 订单是否为合单
String tradeState = paramsJSON.getStr("trade_state"); boolean isCombine = paramsJSON.containsKey("out_split_rsp_infos");
log.debug("[确认收货通知] 检查是否为合单订单: isCombine={}", isCombine);
String merchantNo = paramsJSON.getStr("merchant_no"); String merchantNo = paramsJSON.getStr("merchant_no");
log.debug("[确认收货通知] 获取商户号: merchantNo={}", merchantNo);
// 分账用途
String logNo = paramsJSON.getStr("log_no");
String tradeNo = paramsJSON.getStr("trade_no");
log.debug("[确认收货通知] 获取基础交易信息: logNo={} tradeNo={}", logNo, tradeNo);
// 查询用途
String originTradeNo = paramsJSON.getStr("origin_trade_no"); String originTradeNo = paramsJSON.getStr("origin_trade_no");
String originLogNo = paramsJSON.getStr("origin_log_no"); String originLogNo = paramsJSON.getStr("origin_log_no");
log.debug("[确认收货通知] 获取原始交易信息: originTradeNo={} originLogNo={}", originTradeNo, originLogNo);
String tradeState = paramsJSON.getStr("trade_state");
log.debug("[确认收货通知] 获取交易状态: tradeState={}", tradeState);
log.info("[确认收货通知] 接收到通知参数: logNo={}, tradeState={}, merchantNo={}, originTradeNo={}, originLogNo={}", log.info("[确认收货通知] 接收到通知参数: logNo={}, tradeState={}, merchantNo={}, originTradeNo={}, originLogNo={}",
logNo, tradeState, merchantNo, originTradeNo, originLogNo); logNo, tradeState, merchantNo, originTradeNo, originLogNo);
if (isCombine) {
log.debug("[确认收货通知] 处理合单订单,开始获取子单信息");
// 合单的时候获取子单信息
JSONObject goodsOrderInfo = CommonService.getLklCombineSplitRespInfo(merchantNo, paramsJSON.getStr("out_split_rsp_infos"), false);
if (goodsOrderInfo != null) {
log.debug("[确认收货通知] 成功获取商品子单信息: {}", goodsOrderInfo);
// 分账用途
tradeNo = goodsOrderInfo.getStr("sub_trade_no");
logNo = goodsOrderInfo.getStr("sub_log_no");
log.debug("[确认收货通知] 从子单信息中获取交易号: tradeNo={} logNo={}", tradeNo, logNo);
// 查询用途
originTradeNo = goodsOrderInfo.getStr("origin_sub_trade_no");
originLogNo = goodsOrderInfo.getStr("origin_sub_log_no");
log.debug("[确认收货通知] 从子单信息中获取原始交易号: originTradeNo={} originLogNo={}", originTradeNo, originLogNo);
} else {
log.warn("[确认收货通知] 未能获取到商品子单信息,使用原始参数进行处理");
}
} else {
log.debug("[确认收货通知] 非合单订单,使用原始参数进行处理");
}
if (StrUtil.isBlank(tradeState) || !"SUCCESS".equals(tradeState)) { if (StrUtil.isBlank(tradeState) || !"SUCCESS".equals(tradeState)) {
log.warn("[确认收货通知] 交易状态未成功,不做任何处理: tradeState={}", tradeState); log.warn("[确认收货通知] 交易状态未成功,不做任何处理: tradeState={}", tradeState);
return JSONUtil.createObj().set("code", "FAIL").set("message", "交易状态未成功,不做任何处理!"); return JSONUtil.createObj().set("code", "FAIL").set("message", "交易状态未成功,不做任何处理!");
@ -734,7 +773,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return JSONUtil.createObj().set("code", "FAIL").set("message", "关键编号返回空值!"); return JSONUtil.createObj().set("code", "FAIL").set("message", "关键编号返回空值!");
} }
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndTradeNoAndSubLogNo(merchantNo, originTradeNo, originLogNo); ShopOrderLkl shopOrderLkl = shopOrderLklService.getByLklMchNoAndSubTradeNoAndSubLogNo(merchantNo, originTradeNo, originLogNo);
if (shopOrderLkl == null) { if (shopOrderLkl == null) {
log.warn("[确认收货通知] 订单不存在: merchantNo={}, originTradeNo={}, originLogNo={}", log.warn("[确认收货通知] 订单不存在: merchantNo={}, originTradeNo={}, originLogNo={}",
merchantNo, originTradeNo, originLogNo); merchantNo, originTradeNo, originLogNo);
@ -744,7 +783,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
try { try {
// 更新订单信息 // 更新订单信息
shopOrderLkl.setLkl_receive_log_no(logNo); shopOrderLkl.setLkl_receive_log_no(logNo);
shopOrderLkl.setLkl_receive_trade_no(paramsJSON.getStr("trade_no")); shopOrderLkl.setLkl_receive_trade_no(tradeNo);
shopOrderLkl.setLkl_receive_notify_resp(checkResult.getSecond()); shopOrderLkl.setLkl_receive_notify_resp(checkResult.getSecond());
shopOrderLkl.setReceive_status(CommonConstant.Enable); shopOrderLkl.setReceive_status(CommonConstant.Enable);
@ -759,7 +798,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 发起分账指令 // 发起分账指令
log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}", log.info("[确认收货通知] 开始发起分账指令: merchantNo={}, receiveTradeNo={}, logNo={}",
merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo); merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo);
Pair<Boolean, String> separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), logNo); Pair<Boolean, String> separateResult = innerDoOrderSeparateByMerchantAndLogNo(merchantNo, shopOrderLkl.getLkl_receive_trade_no(), shopOrderLkl.getLkl_receive_log_no());
if (!separateResult.getFirst()) { if (!separateResult.getFirst()) {
log.error("[确认收货通知] 发起分账指令失败: orderId={}, reason={}", shopOrderLkl.getOrder_id(), separateResult.getSecond()); log.error("[确认收货通知] 发起分账指令失败: orderId={}, reason={}", shopOrderLkl.getOrder_id(), separateResult.getSecond());
return JSONUtil.createObj().set("code", "FAIL").set("message", "发起分账指令失败:" + separateResult.getSecond()); return JSONUtil.createObj().set("code", "FAIL").set("message", "发起分账指令失败:" + separateResult.getSecond());
@ -1740,7 +1779,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
// 5. 检查分账状态避免重复处理 // 5. 检查分账状态避免重复处理
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_sub_log_no(), orderId); LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByLogNoAndOutTradeNo(shopOrderLkl.getLkl_sub_log_no(), orderId);
if (existingSeparateRecord != null) { if (existingSeparateRecord != null) {
String status = existingSeparateRecord.getStatus(); String status = existingSeparateRecord.getStatus();
if ("SUCCESS".equals(status)) { if ("SUCCESS".equals(status)) {
@ -2005,7 +2044,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
} }
// 4. 检查分账状态避免重复处理 // 4. 检查分账状态避免重复处理
LklOrderSeparate existingSeparateRecord = lklOrderSeparateService.getByOutTradeNo(shopOrderLkl.getLkl_sub_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)) { if ("SUCCESS".equals(status)) {
@ -2120,9 +2159,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 17. 构建分账请求对象 // 17. 构建分账请求对象
V3SacsSeparateRequest separateRequest = new V3SacsSeparateRequest(); V3SacsSeparateRequest separateRequest = new V3SacsSeparateRequest();
separateRequest.setMerchantNo(merchantNo); separateRequest.setMerchantNo(merchantNo);
separateRequest.setOutSeparateNo(shopOrderLkl.getOut_separate_no());
separateRequest.setLogNo(shopOrderLkl.getLkl_receive_log_no()); // 使用收货流水号作为分账流水号 separateRequest.setLogNo(shopOrderLkl.getLkl_receive_log_no()); // 使用收货流水号作为分账流水号
separateRequest.setLogDate(shopOrderLkl.getLkl_log_date()); separateRequest.setLogDate(shopOrderLkl.getLkl_log_date());
separateRequest.setOutSeparateNo(shopOrderLkl.getOut_separate_no());
separateRequest.setTotalAmt(splitAmount.toString()); separateRequest.setTotalAmt(splitAmount.toString());
separateRequest.setLklOrgNo(orgCode); separateRequest.setLklOrgNo(orgCode);
separateRequest.setCalType("0"); // 0- 按照指定金额1- 按照指定比例默认 0 separateRequest.setCalType("0"); // 0- 按照指定金额1- 按照指定比例默认 0
@ -2154,7 +2193,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s商户=%s分账流水号=%s响应=%srespJson=%s", String errorMsg = String.format("[分账操作] 拉卡拉返回格式异常,订单=%s商户=%s分账流水号=%s响应=%srespJson=%s",
orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response, respJson); orderId, merchantNo, shopOrderLkl.getLkl_receive_log_no(), response, respJson);
log.error(errorMsg); log.error(errorMsg);
return Pair.of(false, "拉卡拉返回格式异常"); return Pair.of(false, "拉卡拉分账异常:[" + respJson.getStr("code") + "]" + respJson.getStr("msg"));
} }
// 21. 保存分账记录 // 21. 保存分账记录
@ -2271,7 +2310,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
.put("message", errorMsg); .put("message", errorMsg);
} }
LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByOutTradeNo(logNo, outSeparateNo); LklOrderSeparate lklOrderSeparateExist = lklOrderSeparateService.getByLogNoAndOutTradeNo(logNo, outSeparateNo);
if (lklOrderSeparateExist == null) { if (lklOrderSeparateExist == null) {
String errorMsg = "未找到对应的分账记录"; String errorMsg = "未找到对应的分账记录";
log.error(errorMsg + ", 外部分账单号={}, 分账单号={}, 参数详情: {}", outSeparateNo, separateNo, paramsJson); log.error(errorMsg + ", 外部分账单号={}, 分账单号={}, 参数详情: {}", outSeparateNo, separateNo, paramsJson);
@ -2288,6 +2327,14 @@ public class LakalaApiServiceImpl implements LakalaApiService {
.put("message", "分账已处理成功,请不要重复通知"); .put("message", "分账已处理成功,请不要重复通知");
} }
if (!"FAIL".equals(lklOrderSeparateExist.getFinal_status())) {
String errorMsg = "已受理或处理中,成功后再通知";
log.warn(errorMsg + ", 订单号={}, 外部分账单号={}, 参数详情: {}", logNo, outSeparateNo, paramsJson);
return JSONUtil.createObj()
.put("code", "FAIL")
.put("message", "已受理或处理中,成功后再通知");
}
// 4. 记录关键参数信息便于问题排查 // 4. 记录关键参数信息便于问题排查
log.info("接收到分账通知,分账单号={}, 外部分账单号={}, 状态={}, 最终状态={}", log.info("接收到分账通知,分账单号={}, 外部分账单号={}, 状态={}, 最终状态={}",
separateNo, outSeparateNo, status, finalStatus); separateNo, outSeparateNo, status, finalStatus);
@ -2302,6 +2349,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
lklOrderSeparate.setCal_type(paramsJson.getStr("cal_type")); lklOrderSeparate.setCal_type(paramsJson.getStr("cal_type"));
lklOrderSeparate.setSeparate_type(paramsJson.getStr("separate_type")); lklOrderSeparate.setSeparate_type(paramsJson.getStr("separate_type"));
lklOrderSeparate.setSeparate_date(paramsJson.getStr("separate_date")); lklOrderSeparate.setSeparate_date(paramsJson.getStr("separate_date"));
lklOrderSeparate.setTotal_separate_value(paramsJson.getInt("total_amt"));
lklOrderSeparate.setRemark("分账已完成");
lklOrderSeparate.setFinish_date(paramsJson.getStr("finish_date"));
// 处理detail_datas避免空指针 // 处理detail_datas避免空指针
JSONArray detailDatas = paramsJson.getJSONArray("detail_datas"); JSONArray detailDatas = paramsJson.getJSONArray("detail_datas");

View File

@ -54,30 +54,30 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl<LklOrderSeparat
/** /**
* 根据拉卡拉对账单流水号和平台订单号查询记录 * 根据拉卡拉对账单流水号和平台订单号查询记录
* *
* @param splitLogNo * @param logNo 分账对账流水号
* @param outSeparateNo * @param outSeparateNo 分账商家的订单号
* @return * @return
*/ */
@Override @Override
public LklOrderSeparate getByOutTradeNo(String splitLogNo, String outSeparateNo) { public LklOrderSeparate getByLogNoAndOutTradeNo(String logNo, String outSeparateNo) {
try { try {
if (StrUtil.isBlank(splitLogNo) || StrUtil.isBlank(outSeparateNo)) { if (StrUtil.isBlank(logNo) || StrUtil.isBlank(outSeparateNo)) {
log.warn("查询参数为空logNo={}, outSeparateNo={}", splitLogNo, outSeparateNo); log.warn("查询参数为空logNo={}, outSeparateNo={}", logNo, outSeparateNo);
return null; return null;
} }
List<LklOrderSeparate> list = list(new QueryWrapper<LklOrderSeparate>() List<LklOrderSeparate> list = list(new QueryWrapper<LklOrderSeparate>()
.eq("log_no", splitLogNo) .eq("log_no", logNo)
.eq("out_separate_no", outSeparateNo)); .eq("out_separate_no", outSeparateNo));
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
log.info("未找到记录logNo={}, outSeparateNo={}", splitLogNo, outSeparateNo); log.info("未找到记录logNo={}, outSeparateNo={}", logNo, outSeparateNo);
return null; return null;
} }
return list.get(0); return list.get(0);
} catch (Exception e) { } catch (Exception e) {
log.error("查询记录时发生异常logNo={}, outSeparateNo={}, 异常信息={}", splitLogNo, outSeparateNo, e.getMessage(), e); log.error("查询记录时发生异常logNo={}, outSeparateNo={}, 异常信息={}", logNo, outSeparateNo, e.getMessage(), e);
return null; return null;
} }
} }

View File

@ -82,7 +82,7 @@ public interface ShopOrderLklService extends IBaseService<ShopOrderLkl> {
* @param lklSubLogNo * @param lklSubLogNo
* @return * @return
*/ */
ShopOrderLkl getByLklMchNoAndTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo); ShopOrderLkl getByLklMchNoAndSubTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo);
/** /**

View File

@ -763,9 +763,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
// update 2025-09-10 增加KLK支付信息 // update 2025-09-10 增加KLK支付信息
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(shopOrderInfo.getStore_id(), order_id); ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(shopOrderInfo.getStore_id(), order_id);
if (shopOrderLkl != null) { if (shopOrderLkl != null) {
base_row.put("lkl_trade_no", shopOrderLkl.getLkl_trade_no());
base_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no()); base_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
base_row.put("lkl_sub_log_no", shopOrderLkl.getLkl_sub_log_no()); base_row.put("lkl_trade_no", shopOrderLkl.getLkl_sub_trade_no());
base_row.put("lkl_log_no", shopOrderLkl.getLkl_sub_log_no());
} }
// 是否为虚拟商品 // 是否为虚拟商品
@ -8091,9 +8091,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
// update 2025-09-10 增加KLK支付信息 // update 2025-09-10 增加KLK支付信息
ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(store_id, order_id); ShopOrderLkl shopOrderLkl = shopOrderLklService.getByStoreIdAndOrderId(store_id, order_id);
if (shopOrderLkl != null) { if (shopOrderLkl != null) {
order_info_row.put("lkl_trade_no", shopOrderLkl.getLkl_trade_no());
order_info_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no()); order_info_row.put("lkl_merchant_no", shopOrderLkl.getLkl_merchant_no());
order_info_row.put("lkl_sub_log_no", shopOrderLkl.getLkl_sub_log_no()); order_info_row.put("lkl_trade_no", shopOrderLkl.getLkl_sub_trade_no());
order_info_row.put("lkl_log_no", shopOrderLkl.getLkl_sub_log_no());
} }
Optional<Map> store_row_Opl = store_rows.stream().filter(s -> ObjectUtil.equal(store_id, Convert.toInt(s.get("store_id")))).findFirst(); Optional<Map> store_row_Opl = store_rows.stream().filter(s -> ObjectUtil.equal(store_id, Convert.toInt(s.get("store_id")))).findFirst();

View File

@ -123,100 +123,149 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
* "merchantNo": "8226330599900LN" * "merchantNo": "8226330599900LN"
* } * }
* } * }
* @return * @return Boolean 是否保存或更新成功
*/ */
@Override @Override
public Boolean addOrUpdateByLklPayDataJson(JSONObject lklPayReqAndRespJson) { public Boolean addOrUpdateByLklPayDataJson(JSONObject lklPayReqAndRespJson) {
if (lklPayReqAndRespJson == null) { if (lklPayReqAndRespJson == null) {
log.warn("参数为空,无法保存拉卡拉订单记录"); log.warn("[拉卡拉订单保存] 参数为空,无法保存拉卡拉订单记录");
return false; return false;
} }
log.debug("拉卡拉支付请求和响应数据 body:{}", lklPayReqAndRespJson); log.debug("[拉卡拉订单保存] 开始处理拉卡拉支付请求和响应数据: {}", lklPayReqAndRespJson);
try { try {
// 获取请求体和响应体 // 获取请求体和响应体
JSONObject reqDataJson = lklPayReqAndRespJson.getJSONObject("req");// 驼峰命名 JSONObject reqDataJson = lklPayReqAndRespJson.getJSONObject("req");// 驼峰命名
JSONObject respDataJson = JSONUtil.parseObj(lklPayReqAndRespJson.getByPath("resp.resp_data"));// 下划线命名 JSONObject respDataJson = JSONUtil.parseObj(lklPayReqAndRespJson.getByPath("resp.resp_data"));// 下划线命名
if (reqDataJson == null || respDataJson == null) { if (reqDataJson == null || respDataJson == null) {
log.error("请求或响应数据中的 req_data / resp_data 为空"); log.error("[拉卡拉订单保存] 请求或响应数据中的 req_data / resp_data 为空");
return false; return false;
} }
log.debug("[拉卡拉订单保存] 解析请求和响应数据完成");
// 提取订单号并校验 // 提取订单号并校验
String orderId = JsonUtil.getJsonValueSmart(respDataJson, "out_trade_no"); String orderId = JsonUtil.getJsonValueSmart(respDataJson, "out_trade_no");
if (StringUtils.isBlank(orderId)) { if (StringUtils.isBlank(orderId)) {
log.error("订单ID为空无法保存拉卡拉支付记录"); log.error("[拉卡拉订单保存] 订单ID为空无法保存拉卡拉支付记录");
return false; return false;
} }
log.debug("[拉卡拉订单保存] 解析订单ID: {}", orderId);
ShopOrderBase shopOrderBase = shopOrderBaseService.get(orderId); ShopOrderBase shopOrderBase = shopOrderBaseService.get(orderId);
if (shopOrderBase == null) { if (shopOrderBase == null) {
log.error("订单不存在,无法保存拉卡拉支付记录"); log.error("[拉卡拉订单保存] 订单不存在,无法保存拉卡拉支付记录: orderId={}", orderId);
return false; return false;
} }
log.debug("[拉卡拉订单保存] 获取订单基础信息完成: storeId={}", shopOrderBase.getStore_id());
ShopOrderLkl record = new ShopOrderLkl(); ShopOrderLkl record = new ShopOrderLkl();
record.setOrder_id(orderId); record.setOrder_id(orderId);
record.setOut_separate_no(JsonUtil.getJsonValueSmart(reqDataJson, "outTradeNo")); String outSeparateNo = JsonUtil.getJsonValueSmart(reqDataJson, "outTradeNo");
record.setOut_separate_no(outSeparateNo);
log.debug("[拉卡拉订单保存] 设置订单ID和分离订单号: orderId={} outSeparateNo={}", orderId, outSeparateNo);
// 设置请求内容 // 设置请求内容
// 订单金额安全处理 // 订单金额安全处理
Integer amount = JsonUtil.getJsonValueSmart(reqDataJson, "totalAmount", Integer.class); Integer amount = JsonUtil.getJsonValueSmart(reqDataJson, "totalAmount", Integer.class);
if (amount == null) { if (amount == null) {
log.error("订单{}金额无效: {}", orderId, amount); log.error("[拉卡拉订单保存] 订单{}金额无效: amount={}", orderId, amount);
return false; return false;
} }
record.setTotal_amt(amount); // 应支付总金额 record.setTotal_amt(amount); // 应支付总金额
log.debug("[拉卡拉订单保存] 设置订单金额: amount={}分", amount);
// 关键数据获取店铺ID分账比例用到 // 关键数据获取店铺ID分账比例用到
Integer storeId = shopOrderBase.getStore_id(); Integer storeId = shopOrderBase.getStore_id();
record.setStore_id(Convert.toStr(storeId)); record.setStore_id(Convert.toStr(storeId));
log.debug("[拉卡拉订单保存] 设置店铺ID: storeId={}", storeId);
// 运费和商家分账比例 // 运费和商家分账比例
BigDecimal shipperFee = shopOrderDataService.getOrderShippingFee(orderId); // 运费获取 BigDecimal shipperFee = shopOrderDataService.getOrderShippingFee(orderId); // 运费获取
record.setShopping_fee(shipperFee.multiply(BigDecimal.valueOf(100)).intValue()); // 运费单位 if (shipperFee != null) {
record.setSplit_ratio(shopStoreBaseService.getStoreSplitRatio(storeId, false)); // 商家分账比例计算 int shipperFeeInCents = shipperFee.multiply(BigDecimal.valueOf(100)).intValue(); // 运费单位
record.setShopping_fee(shipperFeeInCents);
log.debug("[拉卡拉订单保存] 设置运费: 元={} 分={}", shipperFee, shipperFeeInCents);
} else {
log.debug("[拉卡拉订单保存] 未获取到运费信息");
}
record.setAccount_type(JsonUtil.getJsonValueSmart(reqDataJson, "accountType")); BigDecimal splitRatio = shopStoreBaseService.getStoreSplitRatio(storeId, false); // 商家分账比例计算
record.setTrans_type(JsonUtil.getJsonValueSmart(reqDataJson, "transType")); record.setSplit_ratio(splitRatio);
record.setNotify_url(JsonUtil.getJsonValueSmart(reqDataJson, "notifyUrl")); log.debug("[拉卡拉订单保存] 设置分账比例: ratio={}", splitRatio);
record.setReceive_notify_url(JsonUtil.getJsonValueSmart(reqDataJson, "complete_notify_url"));
record.setLkl_merchant_no(JsonUtil.getJsonValueSmart(reqDataJson, "merchantNo")); // 设置其他请求字段
record.setLkl_term_no(JsonUtil.getJsonValueSmart(reqDataJson, "termNo")); String accountType = JsonUtil.getJsonValueSmart(reqDataJson, "accountType");
record.setLkl_req(JSONUtil.toJsonStr(reqDataJson)); String transType = JsonUtil.getJsonValueSmart(reqDataJson, "transType");
String notifyUrl = JsonUtil.getJsonValueSmart(reqDataJson, "notifyUrl");
String receiveNotifyUrl = JsonUtil.getJsonValueSmart(reqDataJson, "complete_notify_url");
String merchantNo = JsonUtil.getJsonValueSmart(reqDataJson, "merchantNo");
String termNo = JsonUtil.getJsonValueSmart(reqDataJson, "termNo");
record.setAccount_type(accountType);
record.setTrans_type(transType);
record.setNotify_url(notifyUrl);
record.setReceive_notify_url(receiveNotifyUrl);
record.setLkl_merchant_no(merchantNo);
record.setLkl_term_no(termNo);
log.debug("[拉卡拉订单保存] 设置请求字段: accountType={} transType={} merchantNo={} termNo={}",
accountType, transType, merchantNo, termNo);
String reqJsonStr = JSONUtil.toJsonStr(reqDataJson);
record.setLkl_req(reqJsonStr);
log.debug("[拉卡拉订单保存] 设置请求JSON长度={}", reqJsonStr != null ? reqJsonStr.length() : 0);
// 设置响应内容 // 设置响应内容
String logNo = JsonUtil.getJsonValueSmart(respDataJson, "log_no"); String logNo = JsonUtil.getJsonValueSmart(respDataJson, "log_no");
record.setLkl_log_no(logNo); record.setLkl_log_no(logNo);
log.debug("[拉卡拉订单保存] 设置流水号: logNo={}", logNo);
record.setLkl_trade_no(JsonUtil.getJsonValueSmart(respDataJson, "trade_no")); String tradeNo = JsonUtil.getJsonValueSmart(respDataJson, "trade_no");
record.setLkl_resp(JSONUtil.toJsonStr(respDataJson)); record.setLkl_trade_no(tradeNo);
log.debug("[拉卡拉订单保存] 设置交易号: tradeNo={}", tradeNo);
return addOrUpdateByStoreOrder(record); String respJsonStr = JSONUtil.toJsonStr(respDataJson);
record.setLkl_resp(respJsonStr);
log.debug("[拉卡拉订单保存] 设置响应JSON长度={}", respJsonStr != null ? respJsonStr.length() : 0);
log.debug("[拉卡拉订单保存] 调用addOrUpdateByStoreOrder方法保存记录: orderId={}", orderId);
Boolean result = addOrUpdateByStoreOrder(record);
if (result) {
log.info("[拉卡拉订单保存] 拉卡拉订单记录保存成功: orderId={}", orderId);
} else {
log.error("[拉卡拉订单保存] 拉卡拉订单记录保存失败: orderId={}", orderId);
}
return result;
} catch (Exception e) { } catch (Exception e) {
log.error("新增拉卡拉支付记录出错", e); log.error("[拉卡拉订单保存] 新增拉卡拉支付记录出错", e);
return false; return false;
} }
} }
/**
* 根据拉卡拉支付通知数据保存或更新拉卡拉订单记录
* 该方法用于处理拉卡拉支付平台发送的支付通知将通知中的数据保存到shop_order_lkl表中
*
* @param lklPayNotifyDataJson 拉卡拉支付通知的JSON数据
* @return Boolean 是否保存或更新成功
*/
@Override @Override
public Boolean addOrUpdateByLklPayNotifyDataJson(JSONObject lklPayNotifyDataJson) { public Boolean addOrUpdateByLklPayNotifyDataJson(JSONObject lklPayNotifyDataJson) {
if (lklPayNotifyDataJson == null) { if (lklPayNotifyDataJson == null) {
log.warn("参数为空,无法保存拉卡拉支付通知记录"); log.warn("[拉卡拉订单更新] 参数为空,无法保存拉卡拉支付通知记录");
return false; return false;
} }
log.debug("拉卡拉支付通知回调 body:{}", lklPayNotifyDataJson); log.debug("[拉卡拉订单更新] 开始处理拉卡拉支付通知回调: {}", lklPayNotifyDataJson);
try { try {
// 获取订单ID
String orderId = lklPayNotifyDataJson.getStr("out_trade_no"); String orderId = lklPayNotifyDataJson.getStr("out_trade_no");
if (StringUtils.isBlank(orderId)) { if (StringUtils.isBlank(orderId)) {
log.warn("订单ID为空无法保存拉卡拉支付通知记录"); log.warn("[拉卡拉订单更新] 订单ID为空无法保存拉卡拉支付通知记录");
return false; return false;
} }
log.debug("[拉卡拉订单更新] 解析订单ID: {}", orderId);
ShopOrderLkl record = new ShopOrderLkl(); ShopOrderLkl record = new ShopOrderLkl();
record.setOrder_id(orderId); record.setOrder_id(orderId);
@ -224,40 +273,67 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
// 设置必填字段并校验 // 设置必填字段并校验
String logNo = lklPayNotifyDataJson.getStr("log_no"); String logNo = lklPayNotifyDataJson.getStr("log_no");
if (StringUtils.isBlank(logNo)) { if (StringUtils.isBlank(logNo)) {
log.warn("log_no 为空,无法保存拉卡拉支付通知记录"); log.warn("[拉卡拉订单更新] log_no为空无法保存拉卡拉支付通知记录: orderId={}", orderId);
return false; return false;
} }
record.setLkl_log_no(logNo); record.setLkl_log_no(logNo);
log.debug("[拉卡拉订单更新] 设置流水号: {}", logNo);
// 设置日期字段 // 设置日期字段
record.setLkl_log_date(DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyyMMdd")); String logDate = DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyyMMdd");
record.setLkl_log_date(logDate);
log.debug("[拉卡拉订单更新] 设置日期字段: {}", logDate);
// 设置可选字段 // 设置可选字段
record.setLkl_trade_no(lklPayNotifyDataJson.getStr("trade_no")); String tradeNo = lklPayNotifyDataJson.getStr("trade_no");
record.setTrade_status(lklPayNotifyDataJson.getStr("trade_status")); String tradeStatus = lklPayNotifyDataJson.getStr("trade_status");
record.setLkl_trade_no(tradeNo);
record.setTrade_status(tradeStatus);
log.debug("[拉卡拉订单更新] 设置可选字段: tradeNo={} tradeStatus={}", tradeNo, tradeStatus);
// 新增的订单字段,lkl_sub_log_no,out_separate_no,split_amt 三字段无值就给主单的值 // 新增的订单字段,lkl_sub_log_no,out_separate_no,split_amt 四个字段无值就给主单的值
record.setLkl_sub_log_no(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_log_no")); String outSeparateNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "out_separate_no");
if (CheckUtil.isEmpty(record.getLkl_sub_log_no())) { if (CheckUtil.isEmpty(outSeparateNo)) {
record.setLkl_sub_log_no(logNo); outSeparateNo = orderId;
} }
record.setOut_separate_no(outSeparateNo);
record.setOut_separate_no(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "out_separate_no")); String lklSubTradeNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "lkl_sub_trade_no");
if (CheckUtil.isEmpty(record.getOut_separate_no())) { if (CheckUtil.isEmpty(lklSubTradeNo)) {
record.setOut_separate_no(orderId); lklSubTradeNo = tradeNo;
} }
record.setLkl_sub_trade_no(lklSubTradeNo);
record.setSplit_amt(JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_amt", Integer.class)); String lklSubLogNo = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "lkl_sub_log_no");
if (CheckUtil.isEmpty(record.getSplit_amt())) { if (CheckUtil.isEmpty(lklSubLogNo)) {
record.setSplit_amt(record.getTotal_amt()); lklSubLogNo = logNo;
} }
record.setLkl_sub_log_no(lklSubLogNo);
Integer splitAmt = JsonUtil.getJsonValueSmart(lklPayNotifyDataJson, "split_amt", Integer.class);
if (CheckUtil.isEmpty(splitAmt)) {
splitAmt = record.getTotal_amt();
}
record.setSplit_amt(splitAmt);
log.debug("[拉卡拉订单更新] 设置订单字段: outSeparateNo={} lklSubTradeNo={} lklSubLogNo={} splitAmt={}",
outSeparateNo, lklSubTradeNo, lklSubLogNo, splitAmt);
// 安全地设置响应内容 // 安全地设置响应内容
record.setLkl_notify_resp(JSONUtil.toJsonStr(lklPayNotifyDataJson)); String notifyResp = JSONUtil.toJsonStr(lklPayNotifyDataJson);
record.setLkl_notify_resp(notifyResp);
log.debug("[拉卡拉订单更新] 设置通知响应内容,长度={}", notifyResp != null ? notifyResp.length() : 0);
return addOrUpdateByStoreOrder(record); log.debug("[拉卡拉订单更新] 调用addOrUpdateByStoreOrder方法保存记录: orderId={}", orderId);
Boolean result = addOrUpdateByStoreOrder(record);
if (result) {
log.info("[拉卡拉订单更新] 拉卡拉订单记录保存成功: orderId={}", orderId);
} else {
log.error("[拉卡拉订单更新] 拉卡拉订单记录保存失败: orderId={}", orderId);
}
return result;
} catch (Exception e) { } catch (Exception e) {
log.error("修改拉卡拉支付通知记录出错", e); log.error("[拉卡拉订单更新] 修改拉卡拉支付通知记录出错", e);
return false; return false;
} }
} }
@ -323,24 +399,24 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
} }
/** /**
* 根据商户号交易流水号对账单流水号查询一条记录 * 根据商户号子单交易流水号子单对账单流水号查询一条记录
* *
* @param lklMerchantNo 拉卡拉商户号 * @param lklMerchantNo 拉卡拉商户号
* @param lklTradeNo 原拉卡拉交易流水号 * @param lklSubTradeNo 原拉卡拉交易流水号
* @param lklSubLogNo 原拉卡拉对账单流水号 * @param lklSubLogNo 原拉卡拉对账单流水号
* @return ShopOrderLkl 拉卡拉订单记录 * @return ShopOrderLkl 拉卡拉订单记录
*/ */
@Override @Override
public ShopOrderLkl getByLklMchNoAndTradeNoAndSubLogNo(String lklMerchantNo, String lklTradeNo, String lklSubLogNo) { public ShopOrderLkl getByLklMchNoAndSubTradeNoAndSubLogNo(String lklMerchantNo, String lklSubTradeNo, String lklSubLogNo) {
// 检查参数是否全部为空 // 检查参数是否全部为空
if (StringUtils.isAllBlank(lklMerchantNo, lklTradeNo, lklSubLogNo)) { if (StringUtils.isAllBlank(lklMerchantNo, lklSubTradeNo, lklSubLogNo)) {
log.warn("[拉卡拉订单查询] 参数校验失败:所有查询条件均为空"); log.warn("[拉卡拉订单查询] 参数校验失败:所有查询条件均为空");
return null; return null;
} }
try { try {
log.debug("[拉卡拉订单查询] 开始查询, 商户号={}, 交易号={}, 子订单流水号={}", log.debug("[拉卡拉订单查询] 开始查询, 商户号={}, 子订单交易号={}, 子订单对账流水号={}",
lklMerchantNo, lklTradeNo, lklSubLogNo); lklMerchantNo, lklSubTradeNo, lklSubLogNo);
QueryWrapper<ShopOrderLkl> queryWrapper = new QueryWrapper<>(); QueryWrapper<ShopOrderLkl> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("id"); queryWrapper.orderByAsc("id");
@ -351,25 +427,25 @@ public class ShopOrderLklServiceImpl extends BaseServiceImpl<ShopOrderLklMapper,
log.debug("[拉卡拉订单查询] 添加商户号查询条件: {}", lklMerchantNo); log.debug("[拉卡拉订单查询] 添加商户号查询条件: {}", lklMerchantNo);
} }
if (StrUtil.isNotBlank(lklTradeNo)) { if (StrUtil.isNotBlank(lklSubTradeNo)) {
queryWrapper.eq("lkl_trade_no", lklTradeNo); queryWrapper.eq("lkl_sub_trade_no", lklSubTradeNo);
log.debug("[拉卡拉订单查询] 添加交易号查询条件: {}", lklTradeNo); log.debug("[拉卡拉订单查询] 添加子订单交易号查询条件: {}", lklSubTradeNo);
} }
if (StrUtil.isNotBlank(lklSubLogNo)) { if (StrUtil.isNotBlank(lklSubLogNo)) {
queryWrapper.eq("lkl_sub_log_no", lklSubLogNo); queryWrapper.eq("lkl_sub_log_no", lklSubLogNo);
log.debug("[拉卡拉订单查询] 添加子订单流水号查询条件: {}", lklSubLogNo); log.debug("[拉卡拉订单查询] 添加子订单对账流水号查询条件: {}", lklSubLogNo);
} }
ShopOrderLkl result = findOne(queryWrapper); ShopOrderLkl result = findOne(queryWrapper);
log.debug("[拉卡拉订单查询] 查询完成, 商户号={}, 交易号={}, 子订单流水号={}, 查询结果={}", log.debug("[拉卡拉订单查询] 查询完成, 商户号={}, 子订单交易号={}, 子订单对账流水号={}, 查询结果={}",
lklMerchantNo, lklTradeNo, lklSubLogNo, result != null); lklMerchantNo, lklSubTradeNo, lklSubLogNo, result != null);
return result; return result;
} catch (Exception e) { } catch (Exception e) {
log.error("[拉卡拉订单查询] 系统异常, 商户号={}, 交易号={}, 子订单流水号={}", log.error("[拉卡拉订单查询] 系统异常, 子订单商户号={}, 交易号={}, 子订单对账流水号={}",
lklMerchantNo, lklTradeNo, lklSubLogNo, e); lklMerchantNo, lklSubTradeNo, lklSubLogNo, e);
return null; return null;
} }
} }

View File

@ -73,7 +73,7 @@ public class StoreController extends BaseControllerImpl {
@RequestMapping(value = "/lists", method = RequestMethod.GET) @RequestMapping(value = "/lists", method = RequestMethod.GET)
public CommonResult lists(@RequestParam(name = "page", defaultValue = "1") Integer page, public CommonResult lists(@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "rows", defaultValue = "10") Integer rows) { @RequestParam(name = "rows", defaultValue = "10") Integer rows) {
return CommonResult.success(shopStoreBaseService.getStoreList(page, rows,new HashMap<>())); return CommonResult.success(shopStoreBaseService.getStoreList(page, rows, new HashMap<>()));
} }
@ApiOperation(value = "列出店铺分类", notes = "列出店铺分类") @ApiOperation(value = "列出店铺分类", notes = "列出店铺分类")
@ -314,26 +314,4 @@ public class StoreController extends BaseControllerImpl {
} }
} }
// /**
// * 列表查询
// * @return
// */
// @ApiOperation(value = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询", notes = "店铺分类表-分类强调区别, 类型强调共性-分页列表查询")
// @RequestMapping(value = "/categoryTree", method = RequestMethod.GET)
// public CommonResult categoryTree(ShopBaseStoreCategory category) {
// QueryWrapper<ShopBaseStoreCategory> queryWrapper = new QueryWrapper<>();
// if (category.getStore_category_parent_id() != null)
// queryWrapper.eq("store_category_parent_id", category.getStore_category_parent_id());
//
// return CommonResult.success(shopBaseStoreCategoryService.getMobileCategoryTree(queryWrapper));
// }
// @ApiOperation(value = "根据分类查询店铺", notes = "列表数据")
// @RequestMapping(value = "/listStores", method = RequestMethod.GET)
// public Page<ShopStoreBase> listStores(@RequestParam(name = "page", defaultValue = "1") Integer page,
// @RequestParam(name = "rows", defaultValue = "10") Integer rows) {
// return shopStoreBaseService.getMobileStoreList(page, rows);
// }
} }

View File

@ -2383,6 +2383,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
} }
base.setPacking_fee(packingFee); base.setPacking_fee(packingFee);
Integer ringtoneIsEnable = Convert.toInt(getParameter("ringtone_is_enable"));
if (ringtoneIsEnable == null || ringtoneIsEnable <= 0) {
base.setRingtone_is_enable(CommonConstant.Enable);
}
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换 // 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换
base = bd09ToGcj02Gps(base); base = bd09ToGcj02Gps(base);
@ -2541,6 +2546,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
base.setPacking_fee(BigDecimal.ZERO); base.setPacking_fee(BigDecimal.ZERO);
} }
Integer ringtoneIsEnable = Convert.toInt(getParameter("ringtone_is_enable"));
if (ringtoneIsEnable == null || ringtoneIsEnable <= 0) {
base.setRingtone_is_enable(CommonConstant.Enable);
}
if (packingFee.compareTo(new BigDecimal("10")) > 0) { if (packingFee.compareTo(new BigDecimal("10")) > 0) {
return CommonResult.failed("打包费请控制在0到10元范围"); return CommonResult.failed("打包费请控制在0到10元范围");
} }
@ -2734,6 +2744,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
if (CheckUtil.isNotEmpty(store_id)) { if (CheckUtil.isNotEmpty(store_id)) {
ShopStoreBase shopStoreBase = get(store_id); ShopStoreBase shopStoreBase = get(store_id);
if (shopStoreBase == null) {
throw new ApiException("无法找到店铺信息!");
}
if (CheckUtil.isEmpty(shopStoreBase.getRingtone_is_enable())) {
shopStoreBase.setRingtone_is_enable(CommonConstant.Enable);
}
row = Convert.toMap(Object.class, Object.class, shopStoreBase); row = Convert.toMap(Object.class, Object.class, shopStoreBase);
ShopStoreInfo shopStoreInfo = shopStoreInfoService.get(store_id); ShopStoreInfo shopStoreInfo = shopStoreInfoService.get(store_id);
if (shopStoreInfo != null) { if (shopStoreInfo != null) {

View File

@ -5,7 +5,8 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
store_id store_id
, user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id, , user_id, store_name, store_grade_id, store_logo, store_slogan, store_domain, store_area, store_district_id,
store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state, shop_parent_id, store_address, store_latitude, store_longitude, store_is_selfsupport, store_type, store_is_open, store_biz_state,
ringtone_is_enable, shop_parent_id,
store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags, store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags,
store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode, store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode,
split_ratio, packing_fee, created_at, updated_at split_ratio, packing_fee, created_at, updated_at