商家入驻,方法优化, fix bug

This commit is contained in:
Jack 2025-06-21 02:16:09 +08:00
parent 11d8c4e934
commit fc07545790
4 changed files with 163 additions and 102 deletions

View File

@ -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;
/**
* 向快递鸟发出查询快递物流信息请求
* <p>
* 参考返回的数据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;
}

View File

@ -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<String, String> 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 商家电子合同签署完毕后收到异步通知触发拉卡拉商家进件重要环节
// 下一步等待拉卡拉系统审核和人工审核收到异步通知之后触发1e签宝的电子合同签署2新增分账接收方
Pair<Boolean, String> 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<String, String> 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 商家电子合同签署完毕后收到异步通知触发拉卡拉商家进件重要环节
// 下一步等待拉卡拉系统审核和人工审核收到异步通知之后触发1e签宝的电子合同签署2新增分账接收方
Pair<Boolean, String> 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", "申请被驳回不做任何操作");
}

View File

@ -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, "提交进件成功,请等待审核!");

View File

@ -1118,36 +1118,47 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
/**
* 更新商家入驻申请的审批状态和审批备注
*
* @param mchId 商家入驻申请 IDmchId和mchMobile至少必填一个
* @param mchMobile 商家注册的手机号 mchId和mchMobile至少必填一个
* @param approvalStatus 入驻商家的审批状态1-已通过2-未通过3-待审核4-未申请过5-已提交拉卡拉审核
* @param merchantId 商家入驻申请 ID merchantMobile 至少必填一个
* @param merchantMobile 商家注册的手机号 merchantId 至少必填一个
* @param approvalStatus 审批状态1-已通过2-未通过3-待审核4-未申请过5-已提交拉卡拉审核
* @param approvalRemark 审批备注
* @return
* @return 更新成功返回 true否则返回 false
*/
@Override
public Boolean updateMerchEntryApprovalByMchId(Long mchId, String mchMobile, Integer approvalStatus, String approvalRemark) {
if (ObjectUtil.isEmpty(mchId) && StrUtil.isBlank(mchMobile)) {
log.error("更新入驻审批状态和备注失败,缺少必要参数");
public Boolean updateMerchEntryApprovalByMchId(Long merchantId, String merchantMobile, Integer approvalStatus, String approvalRemark) {
// 1. 参数校验merchantId merchantMobile 必须至少有一个不为空
if (ObjectUtil.isEmpty(merchantId) && StrUtil.isBlank(merchantMobile)) {
log.error("更新入驻审批状态和备注失败merchantId 和 merchantMobile 至少需要一个");
return false;
}
UpdateWrapper<ShopMchEntry> updateWrapper = new UpdateWrapper<>();
if (ObjectUtil.isNotEmpty(mchId)) {
updateWrapper.eq("id", mchId);
}
if (StrUtil.isNotBlank(mchMobile)) {
updateWrapper.eq("login_mobile", mchMobile);
}
try {
// 2. 创建 UpdateWrapper 对象用于构建更新条件
UpdateWrapper<ShopMchEntry> 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