From 5efd10b87a0e79e301c43fbae0496dabb2cc3f27 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Thu, 25 Sep 2025 00:04:34 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=85=A5=E9=A9=BB=E6=BD=9C=E5=9C=A8?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/LakalaApiServiceImpl.java | 104 +++++++------- .../service/impl/ShopMchEntryServiceImpl.java | 127 +++++++++++------- .../impl/ShopStoreBaseServiceImpl.java | 9 +- 3 files changed, 130 insertions(+), 110 deletions(-) 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 2a253ca3..d0a82218 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 @@ -601,7 +601,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 参数校验 if (StringUtils.isBlank(merCupNo)) { log.warn("商户分账业务申请失败:商户号不能为空"); - return Pair.of(false, I18nUtil._("商户号不能为空!")); + return Pair.of(false, "商户号不能为空!"); } // 获取商户入驻记录 @@ -609,7 +609,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo); if (shopMchEntry == null) { log.warn("商户分账业务申请失败:商家入驻信息不存在,商户号: {}", merCupNo); - return Pair.of(false, I18nUtil._("商家入驻信息不存在!")); + return Pair.of(false, "商家入驻信息不存在!"); } // 商户是否已经已申请过分账业务 @@ -627,18 +627,10 @@ public class LakalaApiServiceImpl implements LakalaApiService { if (!Boolean.TRUE.equals(forceReApply)) { log.info("商户{}已申请过分账业务,无需重复申请", merCupNo); - - // 检查绑定关系 - - - return Pair.of(true, I18nUtil._("商家已经申请过了!")); + return Pair.of(true, "商家分账业务已申请过!"); } } - // 检查更新店铺初始化状态 -// log.debug("检查并更新店铺初始化状态,商户ID: {}", shopMchEntry.getId()); -// shopMchEntryService.checkMchEntryStoreStatus(shopMchEntry.getId(), shopMchEntry); - try { // 1. 配置初始化 log.debug("初始化拉卡拉SDK"); @@ -646,24 +638,35 @@ public class LakalaApiServiceImpl implements LakalaApiService { //2. 装配数据 log.debug("装配分账业务申请请求参数"); - String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); //fileUploadResp.getStr("attFileId"); + String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); + if (StringUtils.isBlank(splitEntrustFilePath)) { + log.warn("商户分账业务申请失败:电子合同文件路径为空,商户号: {}", merCupNo); + return Pair.of(false, "电子合同文件路径为空"); + } // 给拉卡拉通知的回调地址 String notifyUrl = projectDomain + "/api/mobile/shop/lakala/ledger/applyLedgerMerNotify"; String orderNo = StringUtils.genLklOrderNo(8); // 14位年月日时(24小时制)分秒+8位的随机数 String merCupNoValue = shopMchEntry.getLkl_mer_cup_no(); // 从进件申请返回的商户号(不要传入内部商户号,传银联商户号才有效) - String contactMobile = shopMchEntry.getLogin_mobile(); // 商户入驻注册的手机号 - String fileName = "商家分账授权委托书.pdf"; + if (StringUtils.isBlank(merCupNoValue)) { + log.warn("商户分账业务申请失败:商户cup号为空,商户号: {}", merCupNo); + return Pair.of(false, "商户cup号为空"); + } + String contactMobile = shopMchEntry.getLogin_mobile(); // 商户入驻注册的手机号 + if (StringUtils.isBlank(contactMobile)) { + log.warn("商户分账业务申请失败:联系人手机号为空,商户号: {}", merCupNo); + return Pair.of(false, "联系人手机号为空"); + } + + String fileName = "商家分账授权委托书.pdf"; JSONObject reqData = new JSONObject(); reqData.put("version", "1.0"); reqData.put("orderNo", orderNo); reqData.put("orgCode", orgCode); - -// reqData.put("merInnerNo", merCupNoValue); reqData.put("merCupNo", merCupNoValue); reqData.put("contactMobile", contactMobile); @@ -680,16 +683,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { reqData.put("splitLowestRatio", splitLowestRatio); // 商家最低分账比例不低于 20% reqData.put("splitRange", "ALL"); reqData.put("settleType", "01"); //01:主动提款 03:交易自动结算 不填默认01 - // paramsJSON.put("splitLaunchMode", "MANUAL"); - // paramsJSON.put("splitRuleSource", "MER"); - // paramsJSON.put("sepFundSource", "TR"); String postUrl = ""; String operationType = ""; // 操作类型,用于日志记录和提示信息 // 确保serverUrl不为null String effectiveServerUrl = serverUrl != null ? serverUrl : ""; - if (!isLklProd) { + if (Boolean.FALSE.equals(isLklProd)) { effectiveServerUrl = effectiveServerUrl + "/sit"; } @@ -712,14 +712,14 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.debug("商户分账业务{}申请请求参数: 请求地址:{}\n {}\n 响应数据:{}", operationType, postUrl, reqData, responseStr); if (StrUtil.isBlank(responseStr)) { log.error("申请拉卡拉分账业务{}无返回值,商户号: {}", operationType, merCupNo); - return Pair.of(false, I18nUtil._("申请拉卡拉分账业务无返回值!")); + return Pair.of(false, "申请拉卡拉分账业务无返回值!"); } // 成功返回示例:{'retCode':'000000','retMsg':'申请已受理,请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}} JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); if (lakalaRespJSON == null) { log.error("申请拉卡拉分账业务{}返回值异常,商户号: {}", operationType, merCupNo); - return Pair.of(false, I18nUtil._("申请拉卡拉分账业务返回值异常!")); + return Pair.of(false, "申请拉卡拉分账业务返回值异常!"); } Object applyId = lakalaRespJSON.getByPath("respData.applyId"); @@ -736,7 +736,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { reqData.set("applyId", applyId); String retMsg = lakalaRespJSON.getStr("retMsg"); reqData.set("remark", retMsg); - reqData.set("auditStatusText", retMsg); // 直接使用retMsg,避免null值 + reqData.set("auditStatusText", retMsg); reqData.set("mchId", shopMchEntry.getId()); // 新增数据 @@ -745,24 +745,24 @@ public class LakalaApiServiceImpl implements LakalaApiService { String snakeCaseJson = StringUtils.convertCamelToSnake(reqData.toString()); if (StringUtils.isBlank(snakeCaseJson)) { log.error("JSON转换为下划线命名格式失败,商户号: {}", merCupNo); - return Pair.of(false, I18nUtil._("数据格式转换失败!")); + return Pair.of(false, "数据格式转换失败!"); } LklLedgerMember lklLedgerMemberNew = JSONUtil.toBean(snakeCaseJson, LklLedgerMember.class); // 根据 mchId 和 商户号更新记录 if (lklLedgerMemberNew == null || !lklLedgerMemberService.addOrUpdateByMerCupNo(lklLedgerMemberNew)) { log.error("新增或更改拉卡拉分账业务申请信息失败,订单号: {}", orderNo); - return Pair.of(false, I18nUtil._("新增或更改拉卡拉分账业务申请信息失败!")); + return Pair.of(false, "新增或更改拉卡拉分账业务申请信息失败!"); } log.info("商户分账业务{}申请提交成功,等待审核,商户号: {},申请ID: {}", operationType, merCupNo, applyId); - return Pair.of(true, I18nUtil._("商户分账业务" + operationType + "申请已提交成功,请耐心等待拉卡拉审核!")); + return Pair.of(true, "商户分账业务" + operationType + "申请已提交成功,请耐心等待拉卡拉审核!"); } catch (SDKException e) { log.error("申请拉卡拉分账业务出错,商户号: {}", merCupNo, e); - return Pair.of(false, I18nUtil._("申请拉卡拉分账业务出错!")); + return Pair.of(false, "申请拉卡拉分账业务出错!"); } catch (Exception e) { log.error("申请拉卡拉分账业务出现未预期异常,商户号: {}", merCupNo, e); - return Pair.of(false, I18nUtil._("申请拉卡拉分账业务出现未预期异常!")); + return Pair.of(false, "申请拉卡拉分账业务出现未预期异常!"); } } @@ -921,7 +921,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { Pair checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath, false); if (!checkResult.getFirst()) { log.warn("商户入网电子合同申请回调验签失败: {}", checkResult.getSecond()); - return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond()); + return JSONUtil.createObj().set("code", "FAIL").set("message", checkResult.getSecond()); } // 2. 初始化响应对象 @@ -1167,7 +1167,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { public CommonResult applyLedgerMer(JSONObject paramsJSON) { // 检查参数 if (ObjectUtil.isEmpty(paramsJSON) || StrUtil.isBlank(paramsJSON.getStr("merCupNo"))) { - return CommonResult.failed("请填写商户号!"); + return CommonResult.failed("缺少商户号 merCupNo!"); } String merCupNo = paramsJSON.getStr("merCupNo"); @@ -1213,7 +1213,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 验签 Pair checkResult = LakalaUtil.chkLklApiNotifySign(request, lklNotifyCerPath, false); if (!checkResult.getFirst()) { - return JSONUtil.createObj().set("code", "FAIL").set("retMsg", checkResult.getSecond()); + return JSONUtil.createObj().set("code", "FAIL").set("message", checkResult.getSecond()); } // 异步通知返回的数据 @@ -1622,11 +1622,11 @@ public class LakalaApiServiceImpl implements LakalaApiService { continue; // 单个失败不影响其他接收方处理 } - Object applyId = respJson.getByPath("respData.applyId"); + String applyId = Convert.toStr(respJson.getByPath("respData.applyId")); log.info("拉卡拉分账接收方绑定申请提交成功,订单号: {},商户号: {},接收方: {},申请ID: {}", orderNo, merCupNo, receiverNo, applyId); - if (ObjectUtil.isEmpty(applyId)) { + if (StrUtil.isBlank(applyId)) { log.error("拉卡拉分账接收方绑定申请提交失败,订单号: {},商户号: {},接收方: {} 申请ID为空", orderNo, merCupNo, receiverNo); continue; } @@ -1638,8 +1638,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { paramsJSON.set("receiver_no", receiverNo); paramsJSON.set("ret_url", retUrl); paramsJSON.set("remark", respJson.getStr("retMsg")); - // 处理可能为null的platform_id - paramsJSON.set("platform_id", receiver.getPlatform_id() != null ? receiver.getPlatform_id().toString() : ""); + paramsJSON.set("platform_id", receiver.getPlatform_id()); paramsJSON.set("mch_id", shopMchEntry.getId()); // 转换JSON键名格式并保存 @@ -1783,29 +1782,24 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 8. 成功后更新商户绑定状态为已绑定 shopMchEntryService.updateMulStatus(mchId, merCupNo, 0, 0, 0, 0, 0, 1, CommonConstant.MCH_APPR_STA_PASS); - try { - // 9. 判断是否可以创建店铺了? - if (shopMchEntryService.canBuildingShopStore(mchId)) { - // 创建店铺,并初始化 - // 新建一个正式的已审核通过的店铺,不要抛异常,使用补偿机制,可以独立初始化店铺 - // 重要:包含了更改 merchEntryInfo 的状态, 使用法人、小微个人的手机号注册商家账号,作为店铺的管理员 - Pair retPair = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); - if (retPair.getFirst() <= 0) { - shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, null, "创建并初始化店铺失败:" + retPair.getSecond()); - log.error("进件成功,但初始化店铺失败: mchId={}, reason={}", mchId, retPair.getSecond()); - } else { - shopMchEntryService.updateMulStatus(mchId, merCupNo, 0, 0, 1, 0, 0, 0, 0); - log.info("进件成功,创建并初始化店铺成功!mchId={}", mchId); - } + // 9. 判断是否可以创建店铺了? + if (shopMchEntryService.canBuildingShopStore(mchId)) { + // 创建店铺,并初始化 + // 新建一个正式的已审核通过的店铺,不要抛异常,使用补偿机制,可以独立初始化店铺 + // 重要:包含了更改 merchEntryInfo 的状态, 使用法人、小微个人的手机号注册商家账号,作为店铺的管理员 + Pair retPair = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); + if (retPair.getFirst() <= 0) { + shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, null, "创建并初始化店铺失败:" + retPair.getSecond()); + log.error("进件成功,但初始化店铺失败: mchId={}, reason={}", mchId, retPair.getSecond()); + } else { + shopMchEntryService.updateMulStatus(mchId, merCupNo, 0, 0, 1, 0, 0, 0, 0); + log.info("进件成功,创建并初始化店铺成功!mchId={}", mchId); } - - // 10. 检查商户绑定状态是否完成, 更改总的审核状态 - shopMchEntryService.checkMerchEntryFinished(mchId); - } catch (Exception e) { - log.error("处理商户店铺创建或状态检查时发生异常,mchId: {}", mchId, e); - // 不中断主流程,继续返回成功 } + // 10. 检查商户绑定状态是否完成, 更改总的审核状态 + shopMchEntryService.checkMerchEntryFinished(mchId); + // 11. 日志记录并返回成功响应 log.info("商家绑定分账接收方异步通知处理完成,mchId:{} merCupNo:{}", mchId, merCupNo); return JSONUtil.createObj().set("code", "SUCCESS").set("message", "分账接收方绑定成功"); 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 f17f74fe..e001f81e 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 @@ -779,6 +779,12 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl 0; } + /** + * 重要(补偿机制),检查修复商户入驻店铺信息(商家账号关联入驻店铺Id,给商家账户创立公司员工账号和权限) + * + * @param mchId 商户入驻ID(必填) + * @return boolean 是否成功修复商户信息 + */ public Boolean checkAndFixMchStoreInfo(Long mchId) { // 1. 参数校验 if (CheckUtil.isEmpty(mchId)) { @@ -787,70 +793,67 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl result = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); if (result != null && result.getFirst() > 0) { - log.warn("商户信息修复成功,入驻ID: {}", mchId); + log.info("商户信息修复成功,入驻ID: {}", mchId); + return true; } else { log.error("商户信息修复失败,入驻ID: {}, 错误信息:{}", mchId, result != null ? result.getSecond() : "未知错误"); return false; @@ -1428,21 +1431,45 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl() - .eq("id", id) - .set("store_id", storeId).set("store_status", CommonConstant.Enable)); + try { + // 2. 构建更新条件 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", mchId) + .set("store_id", storeId) + .set("store_status", CommonConstant.Enable) + .set("updated_at", new Date()); // 更新时间戳 + + // 3. 执行更新操作并返回结果 + boolean result = update(updateWrapper); + + if (result) { + log.info("商户店铺状态更新成功,mchId: {}, storeId: {}", mchId, storeId); + } else { + log.warn("商户店铺状态更新失败,未找到匹配记录,mchId: {}", mchId); + } + + return result; + + } catch (Exception e) { + // 4. 异常处理:记录异常信息 + log.error("更新商户店铺状态时发生异常,mchId: {}, storeId: {}", mchId, storeId, e); + return false; + } } + // /** // * 更新拉卡拉入网电子合同和签署地址 // * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java index fef7d6e7..6250405a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/impl/ShopStoreBaseServiceImpl.java @@ -3185,9 +3185,8 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl