From fc0754579073737541774fca7bf1e5d4eb11f436 Mon Sep 17 00:00:00 2001
From: Jack <46790855@qq.com>
Date: Sat, 21 Jun 2025 02:16:09 +0800
Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=AE=B6=E5=85=A5=E9=A9=BB=EF=BC=8C?=
=?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BC=98=E5=8C=96=EF=BC=8C=20fix=20bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../impl/KdApiExpressSearchServiceImpl.java | 32 +++-
.../service/impl/LakalaApiServiceImpl.java | 176 ++++++++++--------
.../lakala/service/impl/LklTkServiceImpl.java | 4 +-
.../service/impl/ShopMchEntryServiceImpl.java | 53 +++---
4 files changed, 163 insertions(+), 102 deletions(-)
diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/KdApiExpressSearchServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/KdApiExpressSearchServiceImpl.java
index 6cf1035b..eb26e14d 100644
--- a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/KdApiExpressSearchServiceImpl.java
+++ b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/KdApiExpressSearchServiceImpl.java
@@ -24,11 +24,14 @@ import com.suisung.mall.shop.base.service.ShopBaseExpressService;
import com.suisung.mall.shop.order.service.ShopOrderDeliveryAddressService;
import com.suisung.mall.shop.order.service.ShopOrderLogisticsService;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
+import com.suisung.mall.shop.wechat.service.WxOrderShippingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
@@ -73,6 +76,9 @@ public class KdApiExpressSearchServiceImpl implements KdApiExpressSearchService
}
private final String request_url = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
+ @Lazy
+ @Resource
+ private WxOrderShippingService wxOrderShippingService;
@Autowired
private ShopOrderLogisticsService shopOrderLogisticsService;
@Autowired
@@ -84,6 +90,16 @@ public class KdApiExpressSearchServiceImpl implements KdApiExpressSearchService
@Autowired
private ShopOrderReturnService shopOrderReturnService;
+ /**
+ * 向快递鸟发出查询快递物流信息请求
+ *
+ * 参考返回的数据:https://www.yuque.com/kdnjishuzhichi/dfcrg1/yv7zgv
+ *
+ * @param order_tracking_number
+ * @param shipperCode
+ * @param CustomerName
+ * @return
+ */
public String orderOnlineByJson(String order_tracking_number, String shipperCode, String CustomerName) {
//组装应用级参数
String RequestData = "{" +
@@ -104,6 +120,7 @@ public class KdApiExpressSearchServiceImpl implements KdApiExpressSearchService
String dataSign = encrypt(RequestData, appKey, "UTF-8");
params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
+ // 重要:发送请求获取物流轨迹
String result = HttpUtil.post(request_url, params);
return result;
@@ -270,11 +287,24 @@ public class KdApiExpressSearchServiceImpl implements KdApiExpressSearchService
resultMap.put("shipperCode", logistics_info.get("ShipperCode"));
resultMap.put("logisticCode", logistics_info.get("LogisticCode"));
- resultMap.put("state", logistics_info.get("State"));
+// state 状态:
+// 暂无轨迹信息 0 货物暂无轨迹信息
+// 已揽收 1 快递员已上门揽收快递
+// 在途中 2 货物在途中运输
+// 已签收 3 快件被签收
+// 问题件 4 货物运输途中存在异常(若中途存在问题件,则后续轨迹将一直保持问题件状态)
+// 转寄 5 快递被转寄到新地址
+
+ resultMap.put("state", state);
resultMap.put("stateEx", StateEx);
resultMap.put("express_state", stateMap.get(StateEx));
resultMap.put("traces", logistics_info.get("Traces"));
+ if (state.equals(3)) {
+ // 发送数据给微信提醒用户,尽快确认收货
+ wxOrderShippingService.notifyConfirmReceive(orderId);
+ }
+
return resultMap;
}
diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java
index f6db974e..c1b31324 100644
--- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java
+++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LakalaApiServiceImpl.java
@@ -694,87 +694,90 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (!checkResult.getFirst()) {
return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond());
}
- JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
+
String errMsg = "入网电子合同申请回调:";
-
JSONObject respData = new JSONObject();
- respData.put("code", "FAIL");
- respData.put("message", "处理失败!");
+ respData.set("code", "FAIL").set("message", "处理失败!");
- if (paramsJSON != null) {
- Long ecApplyId = paramsJSON.getLong("ecApplyId");
- String ecNo = paramsJSON.getStr("ecNo");
- String ecStatus = paramsJSON.getStr("ecStatus"); // COMPLETED
- if (ecStatus == null || !ecStatus.equals("COMPLETED")) {
- log.debug("入网电子合同申请未签署完成!");
- respData.put("message", "商户入网电子合同尚未签署,请稍候!");
- return respData;
- }
-
- if (ecApplyId == null || StrUtil.isBlank(ecNo)) {
- log.error("入网电子合同申请回调:ecApplyId 为空");
- respData.put("message", "ecApplyId 返回空值!");
- return respData;
- }
-
- LklLedgerEc lklLedgerEc = lklLedgerEcService.getByApplyId(ecApplyId, "", CommonConstant.Enable);
- if (lklLedgerEc == null) {
- log.error("入网电子合同申请回调:找不到对应入网lklLedgerEc电子合同记录");
- respData.put("message", "找不到对应入网电子合同记录!");
- return respData;
- }
-
- if ("COMPLETED".equals(lklLedgerEc.getEc_status())) {
- respData.put("code", "SUCCESS");
- respData.put("message", "操作成功!");
- log.info("商户入网电子合同申请回调:已处理成功,不需再重新处理");
- return respData;
- }
-
- // 把 base64 合同文件,上传到 cos 服务器,返回 url 地址
- Pair ecFilePair = ledgerMerEcDownload(ecApplyId);
- String ecCosFileUrl = "";
- String eclklFilePath = "";
- if (ecFilePair != null) {
- ecCosFileUrl = ecFilePair.getFirst();
- eclklFilePath = ecFilePair.getSecond();
- }
-
- // 更改本地记录状态数据
- LklLedgerEc updRecord = new LklLedgerEc();
- updRecord.setEc_apply_id(ecApplyId);
- updRecord.setEc_no(ecNo);
- updRecord.setEc_name(paramsJSON.getStr("ecName"));
- updRecord.setEc_file(ecCosFileUrl); // 合同本地文件COS URL链接
- updRecord.setLkl_file_path(eclklFilePath);
- updRecord.setEc_status(paramsJSON.getStr("ecStatus"));
- // 更新本地数据状态和合同编号、合同名字
- Boolean success = lklLedgerEcService.updateByApplyId(updRecord);
- if (success) {
- // 更新商家入驻表的合同编号,和签署地址,更改状态
- shopMchEntryService.updateMerchantLklElectronicContractInfo(lklLedgerEc.getMch_id(), ecNo, paramsJSON.getStr("ecName"), lklLedgerEc.getResult_url(), ecCosFileUrl, eclklFilePath);
-
- // TODO 商家电子合同签署完毕后,收到异步通知,触发拉卡拉商家进件(重要环节)
- // 下一步,等待拉卡拉系统审核,和人工审核,收到异步通知之后,触发1、e签宝的电子合同签署,2、新增分账接收方
- Pair resultPair = lklTkService.registrationMerchant(lklLedgerEc.getMch_mobile(), "");
- if (!resultPair.getFirst()) {
- errMsg += resultPair.getSecond();
- log.error(errMsg);
- shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, errMsg);
- throw new ApiException(errMsg);
- }
-
- shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_PADDING, "已提交进件申请,请等待机构审核!");
-
- respData.put("code", "SUCCESS");
- respData.put("message", "操作成功!");
- log.info("商户入网电子合同申请回调:处理成功");
- return respData;
- }
+ JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
+ if (paramsJSON == null) {
+ return respData;
}
- throw new ApiException("商户入网电子合同申请回调:处理失败!");
+ Long ecApplyId = paramsJSON.getLong("ecApplyId");
+ String ecNo = paramsJSON.getStr("ecNo");
+ String ecStatus = paramsJSON.getStr("ecStatus"); // COMPLETED
+ if (ecStatus == null || !ecStatus.equals("COMPLETED")) {
+ log.debug("入网电子合同申请未签署完成!");
+ respData.put("message", "商户入网电子合同尚未签署,请稍候!");
+ return respData;
+ }
+
+ if (ecApplyId == null || StrUtil.isBlank(ecNo)) {
+ log.error("入网电子合同申请回调:ecApplyId 为空");
+ respData.put("message", "ecApplyId 返回空值!");
+ return respData;
+ }
+
+ LklLedgerEc lklLedgerEc = lklLedgerEcService.getByApplyId(ecApplyId, "", CommonConstant.Enable);
+ if (lklLedgerEc == null) {
+ log.error("入网电子合同申请回调:找不到对应入网lklLedgerEc电子合同记录");
+ respData.put("message", "找不到对应入网电子合同记录!");
+ return respData;
+ }
+
+ if ("COMPLETED".equals(lklLedgerEc.getEc_status())) {
+ respData.put("code", "SUCCESS");
+ respData.put("message", "操作成功!");
+ log.info("商户入网电子合同申请回调:已处理成功,不需再重新处理");
+ return respData;
+ }
+
+ // 把 base64 合同文件,上传到 cos 服务器,返回 url 地址
+ Pair ecFilePair = ledgerMerEcDownload(ecApplyId);
+ String ecCosFileUrl = "";
+ String eclklFilePath = "";
+ if (ecFilePair != null) {
+ ecCosFileUrl = ecFilePair.getFirst();
+ eclklFilePath = ecFilePair.getSecond();
+ }
+
+ // 更改本地记录状态数据
+ LklLedgerEc updRecord = new LklLedgerEc();
+ updRecord.setEc_apply_id(ecApplyId);
+ updRecord.setEc_no(ecNo);
+ updRecord.setEc_name(paramsJSON.getStr("ecName"));
+ updRecord.setEc_file(ecCosFileUrl); // 合同本地文件COS URL链接
+ updRecord.setLkl_file_path(eclklFilePath);
+ updRecord.setEc_status(paramsJSON.getStr("ecStatus"));
+ // 更新本地数据状态和合同编号、合同名字
+ Boolean success = lklLedgerEcService.updateByApplyId(updRecord);
+ if (!success) {
+ shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, "更新电子合同失败!");
+ respData.set("code", "FAIL").set("message", "更新电子合同失败!");
+ return respData;
+ }
+
+ // 更新商家入驻表的合同编号,和签署地址,更改状态
+ shopMchEntryService.updateMerchantLklElectronicContractInfo(lklLedgerEc.getMch_id(), ecNo, paramsJSON.getStr("ecName"), lklLedgerEc.getResult_url(), ecCosFileUrl, eclklFilePath);
+
+ // TODO 商家电子合同签署完毕后,收到异步通知,触发拉卡拉商家进件(重要环节)
+ // 下一步,等待拉卡拉系统审核,和人工审核,收到异步通知之后,触发1、e签宝的电子合同签署,2、新增分账接收方
+ Pair resultPair = lklTkService.registrationMerchant(lklLedgerEc.getMch_mobile(), "");
+ if (!resultPair.getFirst()) {
+ errMsg += resultPair.getSecond();
+ log.error(errMsg);
+ shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, errMsg);
+ throw new ApiException(errMsg);
+ }
+
+ shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_PADDING, "已提交进件申请,请等待机构审核!");
+
+ respData.put("code", "SUCCESS");
+ respData.put("message", "操作成功!");
+ log.info("商户入网电子合同申请回调:处理成功");
+ return respData;
}
/**
@@ -933,8 +936,10 @@ public class LakalaApiServiceImpl implements LakalaApiService {
if (!checkResult.getFirst()) {
return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond());
}
+
+ // 异步通知返回的数据
JSONObject paramsJSON = JSONUtil.parseObj(checkResult.getSecond());
-// JSONObject paramsJSON = JSONUtil.parseObj(LakalaUtil.getBody(request));
+ log.info("商户分账业务申请回调:paramsJSON={}", paramsJSON);
if (paramsJSON == null) {
log.error("商户分账业务申请回调:请求参数为空");
@@ -944,6 +949,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String applyId = paramsJSON.getStr("applyId");
String auditStatus = paramsJSON.getStr("auditStatus");
String merCupNo = paramsJSON.getStr("merCupNo");
+ String auditStatusText = paramsJSON.getStr("auditStatusText");
if (StrUtil.isBlank(applyId) || StrUtil.isBlank(auditStatus) || StrUtil.isBlank(merCupNo)) {
String errMsg = "商户分账业务申请回调:缺少必要参数(applyId/auditStatus/merCupNo)";
@@ -951,12 +957,19 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return JSONUtil.createObj().put("code", "FAIL").put("message", errMsg);
}
+ LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByApplyId(applyId, CommonConstant.Enable);
+
+ // 1:通过,2拒绝
if (!auditStatus.equals("1")) {
log.warn("商户分账业务申请回调:审核未通过,状态={}", auditStatus);
+ if (lklLedgerMember != null) {
+ shopMchEntryService.updateMerchEntryApprovalByMchId(
+ lklLedgerMember.getMch_id(), "", CommonConstant.MCH_APPR_STA_NOPASS, "分账业务申请被驳回:" + auditStatusText
+ );
+ }
return JSONUtil.createObj().put("code", "FAIL").put("message", "商户分账申请被驳回!");
}
- LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByApplyId(applyId, CommonConstant.Enable);
if (lklLedgerMember != null && lklLedgerMerReceiverBindService.hasBindReceiver(merCupNo)) {
log.debug("商户分账业务申请回调:已处理成功,applyId={}", applyId);
return JSONUtil.createObj().put("code", "SUCCESS").put("message", "商户分账申请已处理成功!");
@@ -965,7 +978,6 @@ public class LakalaApiServiceImpl implements LakalaApiService {
String merInnerNo = paramsJSON.getStr("merInnerNo");
String entrustFileName = paramsJSON.getStr("entrustFileName");
String entrustFilePath = paramsJSON.getStr("entrustFilePath");
- String auditStatusText = paramsJSON.getStr("auditStatusText");
String remark = paramsJSON.getStr("remark");
try {
@@ -998,6 +1010,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
}
} catch (Exception e) {
log.error("商户分账业务申请回调:", e);
+ if (lklLedgerMember != null) { // 防御性判断(理论上此时应为null,但保留安全检查)
+ shopMchEntryService.updateMerchEntryApprovalByMchId(
+ lklLedgerMember.getMch_id(), "", CommonConstant.MCH_APPR_STA_NOPASS, "商户分账业务绑定或状态更新失败"
+ );
+ }
return JSONUtil.createObj().put("code", "FAIL").put("message", "商户分账业务绑定或状态更新失败");
}
@@ -1343,6 +1360,9 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 5. 审核状态判断,仅处理通过的情况
if (!"1".equals(auditStatus)) {
log.warn("商家绑定分账接收方异步通知,申请被驳回不做任何操作,返回状态:{}", auditStatus);
+// shopMchEntryService.updateMerchEntryApprovalByMchId(
+// 1L, "", CommonConstant.MCH_APPR_STA_NOPASS, "商家绑定分账接收被驳回"
+// );
return JSONUtil.createObj().put("code", "FAIL").put("message", "申请被驳回不做任何操作");
}
diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java
index cf5c10ed..2bb682fa 100644
--- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java
+++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklTkServiceImpl.java
@@ -528,15 +528,15 @@ public class LklTkServiceImpl {
if (!success) {
shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件成功,但更新商户号失败!");
-
return Pair.of(false, "请求进件成功,但更新商户号失败!");
}
} catch (Exception e) {
+
logger.error("拉卡拉进件异常:{}", e.getMessage());
shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件失败:" + e.getMessage());
-
return Pair.of(false, "进件失败:" + e.getMessage());
+
}
return Pair.of(true, "提交进件成功,请等待审核!");
diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java
index 240edb8a..6aa81af5 100644
--- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java
+++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopMchEntryServiceImpl.java
@@ -1118,36 +1118,47 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl updateWrapper = new UpdateWrapper<>();
- if (ObjectUtil.isNotEmpty(mchId)) {
- updateWrapper.eq("id", mchId);
- }
- if (StrUtil.isNotBlank(mchMobile)) {
- updateWrapper.eq("login_mobile", mchMobile);
- }
+ try {
+ // 2. 创建 UpdateWrapper 对象,用于构建更新条件
+ UpdateWrapper updateWrapper = new UpdateWrapper<>();
- if (ObjectUtil.isNotEmpty(approvalStatus)) {
- updateWrapper.set("approval_status", approvalStatus);
- }
+ // 3. 设置更新条件:优先使用 merchantId,如果为空则使用 merchantMobile
+ if (ObjectUtil.isNotEmpty(merchantId)) {
+ updateWrapper.eq("id", merchantId);
+ } else {
+ updateWrapper.eq("login_mobile", merchantMobile);
+ }
- if (StrUtil.isNotBlank(approvalRemark)) {
- updateWrapper.set("approval_remark", approvalRemark);
- }
+ // 4. 设置更新字段:审批状态和审批备注
+ if (ObjectUtil.isNotEmpty(approvalStatus)) {
+ updateWrapper.set("approval_status", approvalStatus);
+ }
+ if (StrUtil.isNotBlank(approvalRemark)) {
+ updateWrapper.set("approval_remark", approvalRemark);
+ }
- return update(updateWrapper);
+ // 5. 执行更新操作并返回结果
+ return update(updateWrapper);
+
+ } catch (Exception e) {
+ // 6. 异常处理:记录异常信息,避免程序中断
+ log.error("更新商家入驻审批状态和备注时发生异常", e);
+ return false; // 发生异常时返回 false
+ }
}
@Override