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