diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java index e43e385a..32e9a451 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/esign/service/impl/EsignContractServiceImpl.java @@ -310,7 +310,7 @@ public class EsignContractServiceImpl extends BaseServiceImpl retPair = lakalaApiService.innerApplyLedgerMer(esignContract.getMch_mobile()); + Pair retPair = lakalaApiService.innerApplyLedgerMer("", false); if (!retPair.getFirst()) { log.error("商家申请分账业务异常:{}", retPair.getSecond()); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java index 2a12c219..598e1be4 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LakalaApiService.java @@ -90,10 +90,11 @@ public interface LakalaApiService { /** * 内部调用:商户分账业务开通申请 * - * @param merCupNo + * @param merCupNo 商户号 + * @param forceReApply 如果已申请成功,是否可以重新申请更改? * @return */ - Pair innerApplyLedgerMer(String merCupNo); + Pair innerApplyLedgerMer(String merCupNo, Boolean forceReApply); /** * 发货类交易确认收货通知 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java index 3f63e4cf..f00bd514 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerMerReceiverBindService.java @@ -57,7 +57,7 @@ public interface LklLedgerMerReceiverBindService extends IBaseService向拉卡拉提交商户分账业务开通申请,包括上传分账授权委托书等必要文件。 * - * @param merCupNo 拉卡拉商户号(银联商户号) + * @param merCupNo 拉卡拉商户号(银联商户号) + * @param forceReApply 如果已申请成功,是否可以重新申请更改? * @return Pair对象,第一个元素表示操作是否成功,第二个元素为操作结果信息 */ @Override - public Pair innerApplyLedgerMer(String merCupNo) { + public Pair innerApplyLedgerMer(String merCupNo, Boolean forceReApply) { log.info("开始执行商户分账业务申请流程,商户号: {}", merCupNo); // 参数校验 @@ -606,115 +606,147 @@ public class LakalaApiServiceImpl implements LakalaApiService { return Pair.of(false, I18nUtil._("商家入驻信息不存在!")); } + // 商户是否已经已申请过分账业务 + boolean hasApplyMer = false; + // 判断是否已经申请过? log.debug("检查商户是否已申请过分账业务,商户号: {}", merCupNo); LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByMerCupNo(merCupNo); - if (lklLedgerMember != null && Integer.valueOf(1).equals(lklLedgerMember.getAudit_status())) { - log.info("商户已申请过分账业务,无需重复申请,商户号: {}", merCupNo); - return Pair.of(true, I18nUtil._("商家已经申请过了!")); + if (lklLedgerMember != null + && CommonConstant.Enable.equals(lklLedgerMember.getAudit_status()) + && CommonConstant.Enable.equals(shopMchEntry.getHas_apply_mer())) { + + hasApplyMer = true; // 商户是否已经已申请过分账业务 + log.debug("商户{}已申请过分账业务", merCupNo); + + if (!Boolean.TRUE.equals(forceReApply)) { + log.info("商户{}已申请过分账业务,无需重复申请", merCupNo); + return Pair.of(true, I18nUtil._("商家已经申请过了!")); + } } // 检查更新店铺初始化状态 - log.debug("检查并更新店铺初始化状态,商户ID: {}", shopMchEntry.getId()); - shopMchEntryService.checkMchEntryStoreStatus(shopMchEntry.getId(), shopMchEntry); - - // 1. 配置初始化 - log.debug("初始化拉卡拉SDK"); - initLKLSDK(); - - //2. 装配数据 - log.debug("装配分账业务申请请求参数"); - V2MmsOpenApiLedgerApplyLedgerMerRequest req = new V2MmsOpenApiLedgerApplyLedgerMerRequest(); - req.setVersion("2.0"); - req.setOrderNo(StringUtils.genLklOrderNo(8));// 14位年月日时(24小时制)分秒+8位的随机数 - req.setOrgCode(orgCode); - req.setMerCupNo(shopMchEntry.getLkl_mer_cup_no()); // 从进件申请返回的商户号(不要传入内部商户号,传银联商户号才有效) - req.setContactMobile(shopMchEntry.getLogin_mobile()); // 商户入驻注册的手机号 - // 分账比例默认 94% - req.setSplitLowestRatio(new BigDecimal(splitLowestRatio)); - req.setEleContractNo(shopMchEntry.getLkl_ec_no()); - req.setSplitRange("ALL"); // ALL:全部交易分账 (商户所有交易默认待分账) MARK:标记交易分账(只有带分账标识交易待分账,其余交易正常结算) 默认:MARK - String fileName = "商家分账授权委托书.pdf"; - req.setSplitEntrustFileName(fileName); - - // TODO 分账结算委托书文件上传到拉卡拉服务器 - String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); //fileUploadResp.getStr("attFileId"); - req.setSplitEntrustFilePath(splitEntrustFilePath); //比如:MMS/20250519/165150-39c8bbca513b4cccab1e942999021fd6.pdf; - - String domain = projectDomain; - if (isProdProject()) { - domain += "/api"; - } - // 给拉卡拉通知的回调地址 - String retUrl = domain + "/mobile/shop/lakala/ledger/applyLedgerMerNotify"; - req.setRetUrl(retUrl); - - log.debug("商户分账业务申请请求参数: {}", JSONUtil.toJsonStr(req)); +// log.debug("检查并更新店铺初始化状态,商户ID: {}", shopMchEntry.getId()); +// shopMchEntryService.checkMchEntryStoreStatus(shopMchEntry.getId(), shopMchEntry); try { - //3. 发送请求 - log.info("开始向拉卡拉提交分账业务申请,订单号: {}", req.getOrderNo()); - String responseStr = LKLSDK.httpPost(req); - if (StrUtil.isBlank(responseStr)) { - log.error("申请拉卡拉分账业务无返回值,订单号: {}", req.getOrderNo()); - return Pair.of(false, I18nUtil._("申请拉卡拉分账业务无返回值!")); + // 1. 配置初始化 + log.debug("初始化拉卡拉SDK"); + initLKLSDK(); + + //2. 装配数据 + log.debug("装配分账业务申请请求参数"); + String splitEntrustFilePath = shopMchEntry.getLkl_ec_file_path(); //fileUploadResp.getStr("attFileId"); + + // 给拉卡拉通知的回调地址 + 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"; + + JSONObject paramsJSON = new JSONObject(); + paramsJSON.put("version", "2.0"); + paramsJSON.put("orderNo", orderNo); + paramsJSON.put("orgCode", orgCode); + + paramsJSON.put("merInnerNo", merCupNoValue); + paramsJSON.put("merCupNo", merCupNoValue); + paramsJSON.put("contactMobile", contactMobile); + + // 电子合同号可能为空,需要检查 + String eleContractNo = shopMchEntry.getLkl_ec_no(); + if (StringUtils.isNotBlank(eleContractNo)) { + paramsJSON.put("eleContractNo", eleContractNo); } - log.debug("商户分账业务申请响应数据: {}", responseStr); + paramsJSON.put("splitEntrustFileName", fileName); + paramsJSON.put("splitEntrustFilePath", splitEntrustFilePath); + paramsJSON.put("retUrl", notifyUrl); + + paramsJSON.put("splitLowestRatio", splitLowestRatio); + paramsJSON.put("splitRange", "ALL"); + paramsJSON.put("settleType", "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) { + effectiveServerUrl = effectiveServerUrl + "/sit"; + } + + if (hasApplyMer && Boolean.TRUE.equals(forceReApply)) { + // 商户分账信息变更申请 + postUrl = effectiveServerUrl + "/api/v2/mms/openApi/ledger/modifyLedgerMer"; + operationType = "变更"; + } else { + // 商户分账业务开通申请 + postUrl = effectiveServerUrl + "/api/v2/mms/openApi/ledger/applyLedgerMer"; + operationType = "开通"; + } + + //3. 发送请求 + log.info("开始向拉卡拉提交分账业务{}申请,商户号: {}", operationType, merCupNo); + String responseStr = LKLSDK.httpPost(postUrl, paramsJSON.toString()); + log.debug("商户分账业务{}申请请求参数: 请求地址:{}\n {}\n 响应数据:{}", operationType, postUrl, paramsJSON, responseStr); + if (StrUtil.isBlank(responseStr)) { + log.error("申请拉卡拉分账业务{}无返回值,商户号: {}", operationType, merCupNo); + return Pair.of(false, I18nUtil._("申请拉卡拉分账业务无返回值!")); + } // 成功返回示例:{'retCode':'000000','retMsg':'申请已受理,请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}} JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); if (lakalaRespJSON == null) { - log.error("申请拉卡拉分账业务返回值异常,订单号: {}", req.getOrderNo()); + log.error("申请拉卡拉分账业务{}返回值异常,商户号: {}", operationType, merCupNo); return Pair.of(false, I18nUtil._("申请拉卡拉分账业务返回值异常!")); } Object applyId = lakalaRespJSON.getByPath("respData.applyId"); - if (!lklSuccessCode.equals(lakalaRespJSON.getStr("retCode")) || applyId == null) { + String retCode = lakalaRespJSON.getStr("retCode"); + if (!lklSuccessCode.equals(retCode) || applyId == null) { String retMsg = lakalaRespJSON.getStr("retMsg"); - log.warn("拉卡拉分账业务申请被拒绝,订单号: {},返回码: {},返回信息: {}", - req.getOrderNo(), lakalaRespJSON.getStr("retCode"), retMsg); - return Pair.of(false, retMsg); + log.warn("拉卡拉分账业务{}申请被拒绝,商户号: {},返回码: {},返回信息: {}", + operationType, merCupNo, retCode, retMsg); + // 提供默认错误消息,防止retMsg为null + String errorMsg = StringUtils.isNotBlank(retMsg) ? retMsg : "拉卡拉分账业务申请被拒绝"; + return Pair.of(false, errorMsg); } - JSONObject paramsJSON = new JSONObject(); - paramsJSON.put("orderNo", req.getOrderNo()); - paramsJSON.put("org_code", orgCode); - paramsJSON.put("version", "2.0"); - paramsJSON.put("ret_url", retUrl); - paramsJSON.put("mer_inner_no", shopMchEntry.getLkl_mer_inner_no()); - paramsJSON.put("mer_cup_no", shopMchEntry.getLkl_mer_cup_no()); - paramsJSON.put("contact_mobile", shopMchEntry.getLogin_mobile()); - paramsJSON.put("split_lowest_ratio", req.getSplitLowestRatio()); - paramsJSON.put("split_range", "MARK"); - paramsJSON.put("split_launch_mode", "MANUAL"); - paramsJSON.put("settle_type", "01"); - paramsJSON.put("split_rule_source", "TR"); - paramsJSON.put("ele_contract_no", req.getEleContractNo()); - paramsJSON.put("split_entrust_file_name", req.getSplitEntrustFileName()); - paramsJSON.put("split_entrust_file_path", splitEntrustFilePath); - - paramsJSON.set("apply_id", applyId); - paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg")); - paramsJSON.set("audit_status_text", paramsJSON.get("remark")); - paramsJSON.set("mch_id", shopMchEntry.getId()); + paramsJSON.set("applyId", applyId); + String retMsg = lakalaRespJSON.getStr("retMsg"); + paramsJSON.set("remark", retMsg); + paramsJSON.set("auditStatusText", retMsg); // 直接使用retMsg,避免null值 + paramsJSON.set("mchId", shopMchEntry.getId()); // 新增数据 - // 将 JSON 对象的键名转换为下划线命名 log.debug("准备保存分账业务申请记录"); - LklLedgerMember lklLedgerMemberNew = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class); - if (!lklLedgerMemberService.addOrUpdateByMerCupNo(lklLedgerMemberNew)) { - log.error("新增或更改拉卡拉分账业务申请信息失败,订单号: {}", req.getOrderNo()); + // 将 JSON 对象的键名转换为下划线命名 + String snakeCaseJson = StringUtils.convertCamelToSnake(paramsJSON.toString()); + if (StringUtils.isBlank(snakeCaseJson)) { + log.error("JSON转换为下划线命名格式失败,商户号: {}", merCupNo); + return Pair.of(false, I18nUtil._("数据格式转换失败!")); + } + + LklLedgerMember lklLedgerMemberNew = JSONUtil.toBean(snakeCaseJson, LklLedgerMember.class); + // 根据 mchId 和 商户号更新记录 + if (lklLedgerMemberNew == null || !lklLedgerMemberService.addOrUpdateByMerCupNo(lklLedgerMemberNew)) { + log.error("新增或更改拉卡拉分账业务申请信息失败,订单号: {}", orderNo); return Pair.of(false, I18nUtil._("新增或更改拉卡拉分账业务申请信息失败!")); } - log.info("商户分账业务申请提交成功,等待审核,订单号: {},申请ID: {}", req.getOrderNo(), applyId); - return Pair.of(true, I18nUtil._("商户申请拉卡拉分账业务,提交成功,待审核中!")); + log.info("商户分账业务{}申请提交成功,等待审核,商户号: {},申请ID: {}", operationType, merCupNo, applyId); + return Pair.of(true, I18nUtil._("商户分账业务" + operationType + "申请已提交成功,请耐心等待拉卡拉审核!")); } catch (SDKException e) { - log.error("申请拉卡拉分账业务出错,订单号: {}", req.getOrderNo(), e); + log.error("申请拉卡拉分账业务出错,商户号: {}", merCupNo, e); return Pair.of(false, I18nUtil._("申请拉卡拉分账业务出错!")); } catch (Exception e) { - log.error("申请拉卡拉分账业务出现未预期异常,订单号: {}", req.getOrderNo(), e); + log.error("申请拉卡拉分账业务出现未预期异常,商户号: {}", merCupNo, e); return Pair.of(false, I18nUtil._("申请拉卡拉分账业务出现未预期异常!")); } } @@ -1098,7 +1130,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { } } - Pair resultPair = innerApplyLedgerMer(merCupNo); + Pair resultPair = innerApplyLedgerMer(merCupNo, false); if (!resultPair.getFirst()) { return CommonResult.failed(resultPair.getSecond()); } @@ -1397,7 +1429,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { /** - * 内部调用分账关系绑定申请(优化版) + * 内部调用分账关系绑定申请 * *

参考:https://o.lakala.com/#/home/document/detail?id=386 * 为商户绑定分账接收方,包括平台方和代理商(如有)。 @@ -1463,11 +1495,14 @@ public class LakalaApiServiceImpl implements LakalaApiService { int successCount = 0; int totalCount = receiverList.size(); - // 5. 初始化SDK(建议移至类初始化或统一配置) + // 清理旧绑定数据 + lklLedgerMerReceiverBindService.delByMchIdAndMerCupNo(shopMchEntry.getId(), merCupNo); + + // 4. 初始化SDK(建议移至类初始化或统一配置) log.debug("初始化拉卡拉SDK"); initLKLSDK(); - // 4. 循环处理接收方绑定 + // 5. 循环处理接收方绑定 for (LklLedgerReceiver receiver : receiverList) { try { log.debug("开始处理分账接收方绑定,接收方编号: {}", receiver.getReceiver_no()); @@ -1510,18 +1545,24 @@ public class LakalaApiServiceImpl implements LakalaApiService { continue; // 单个失败不影响其他接收方处理 } + String applyId = (String) respJson.getByPath("respData.applyId"); log.info("拉卡拉分账接收方绑定申请提交成功,订单号: {},申请ID: {}", - orderNo, respJson.getByPath("respData.applyId")); + orderNo, applyId); + + if (StrUtil.isBlank(applyId)) { + log.error("拉卡拉分账接收方绑定申请提交失败,订单号: {},申请ID为空", orderNo); + continue; + } // 9. 更新参数并保存记录 paramsJSON.set("orderNo", orderNo); - paramsJSON.set("apply_id", respJson.getByPath("respData.applyId")); + paramsJSON.set("apply_id", applyId); paramsJSON.set("org_code", orgCode); paramsJSON.set("receiver_no", receiver.getReceiver_no()); paramsJSON.set("ret_url", retUrl); paramsJSON.set("remark", respJson.getStr("retMsg")); paramsJSON.set("platform_id", receiver.getPlatform_id()); - paramsJSON.set("mch_id", lklLedgerMember.getMch_id()); + paramsJSON.set("mch_id", shopMchEntry.getId()); // 转换JSON键名格式并保存 String snakeJson = StringUtils.convertCamelToSnake(paramsJSON.toString()); @@ -1553,7 +1594,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { } return Pair.of(false, "商家绑定分账接收方失败"); } else if (successCount < totalCount) { - String message = "商家绑定分账接收方,部分提交成功(" + successCount + "/" + totalCount + "),待审核通知"; + String message = String.format("商家绑定分账接收方,部分提交成功(%d/%d),待审核通知", successCount, totalCount); log.info(message); return Pair.of(true, message); } else { @@ -1572,7 +1613,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { * @param request HTTP请求对象 * @return 返回处理结果JSON,包含code和message字段 */ -// @Transactional @Override public JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request) { log.debug("商家绑定分账接收方异步通知回调开始"); @@ -1590,9 +1630,10 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.debug("##### 商家绑定接收方回调参数:{} ####", paramsJSON); + // 检查参数是否包含必要的applyId if (paramsJSON == null || StrUtil.isBlank(paramsJSON.getStr("applyId"))) { log.error("商家绑定分账接收方通知数据有误"); - return JSONUtil.createObj().put("code", "FAIL").put("message", "商家绑定分账接收方通知数据有误!"); + return JSONUtil.createObj().set("code", "FAIL").set("message", "商家绑定分账接收方通知数据有误!"); } // 3. 提取核心参数 @@ -1600,28 +1641,30 @@ public class LakalaApiServiceImpl implements LakalaApiService { String applyId = paramsJSON.getStr("applyId"); String auditStatus = paramsJSON.getStr("auditStatus"); - LklLedgerMerReceiverBind lklLedgerMerReceiverBind = lklLedgerMerReceiverBindService.getPlatformByApplyId(applyId); + // 4. 根据申请ID获取绑定记录 + LklLedgerMerReceiverBind lklLedgerMerReceiverBind = lklLedgerMerReceiverBindService.getMerReceiverByApplyId(applyId); if (lklLedgerMerReceiverBind == null || CheckUtil.isEmpty(lklLedgerMerReceiverBind.getMch_id())) { - return JSONUtil.createObj().put("code", "FAIL").put("message", "无法获取到绑定记录!"); + log.warn("无法获取到绑定记录,applyId: {}", applyId); + return JSONUtil.createObj().set("code", "FAIL").set("message", "无法获取到绑定记录!"); } - // 4. 参数校验(防止空值) - if (org.apache.commons.lang3.StringUtils.isAnyBlank(merCupNo, applyId, auditStatus)) { + // 5. 参数校验(防止空值) + if (StrUtil.hasBlank(merCupNo, applyId, auditStatus)) { String errorMsg = String.format("关键参数缺失:merCupNo=%s, applyId=%s, auditStatus=%s", merCupNo, applyId, auditStatus); log.error(errorMsg); - return JSONUtil.createObj().put("code", "FAIL").put("message", "缺失关键参数"); + return JSONUtil.createObj().set("code", "FAIL").set("message", "缺失必要参数"); } - // 5. 审核状态判断,仅处理通过的情况 + // 6. 审核状态判断,仅处理通过的情况 if (!"1".equals(auditStatus)) { - log.warn("商家绑定分账接收方异步通知,申请被驳回不做任何操作,返回状态:{}", auditStatus); + log.warn("商家绑定分账接收方异步通知,申请未通过,不做任何操作,返回状态:{}", auditStatus); shopMchEntryService.updateMerchEntryApprovalByMerCupNo( - merCupNo, CommonConstant.MCH_APPR_STA_NOPASS, "分账接收方绑定被驳回" + merCupNo, CommonConstant.MCH_APPR_STA_NOPASS, "分账接收方绑定申请未通过" ); - return JSONUtil.createObj().put("code", "FAIL").put("message", "分账接收方绑定被驳回!"); + return JSONUtil.createObj().set("code", "FAIL").set("message", "分账接收方绑定申请未通过,不做任何操作!"); } - // 6. 更新绑定记录的状态信息 + // 7. 更新绑定记录的状态信息 Boolean updateSuccess = lklLedgerMerReceiverBindService.updateAuditResult( applyId, paramsJSON.getStr("merInnerNo"), @@ -1634,16 +1677,16 @@ public class LakalaApiServiceImpl implements LakalaApiService { paramsJSON.getStr("remark") ); - if (!updateSuccess) { + if (!Boolean.TRUE.equals(updateSuccess)) { log.error("更新绑定记录失败,applyId:{}", applyId); - return JSONUtil.createObj().put("code", "FAIL").put("message", "更新状态失败"); + return JSONUtil.createObj().set("code", "FAIL").set("message", "更新绑定状态失败"); } Long mchId = lklLedgerMerReceiverBind.getMch_id(); - // 7. 成功后更新商户绑定状态为已绑定 + // 8. 成功后更新商户绑定状态为已绑定 shopMchEntryService.updateMulStatus(mchId, merCupNo, 0, 0, 0, 0, 0, 1, CommonConstant.MCH_APPR_STA_PASS); - // 创建店铺,并初始化 + // 9. 创建店铺,并初始化 // 新建一个正式的已审核通过的店铺,不要抛异常,使用补偿机制,可以独立初始化店铺 // 重要:包含了更改 merchEntryInfo 的状态, 使用法人、小微个人的手机号注册商家账号,作为店铺的管理员 Pair retPair = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); @@ -1652,23 +1695,22 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.error("进件成功,但初始化店铺失败: mchId={}, reason={}", mchId, retPair.getSecond()); } else { shopMchEntryService.updateMulStatus(mchId, merCupNo, 0, 0, 1, 0, 0, 0, 0); - log.debug("进件成功,创建并初始化店铺成功!mchId={}", mchId); + log.info("进件成功,创建并初始化店铺成功!mchId={}", mchId); } - // 8. 检查商户绑定状态是否完成, 更改总的审核状态 + // 10. 检查商户绑定状态是否完成, 更改总的审核状态 shopMchEntryService.checkMerchEntryFinished(mchId); - // 9. 日志记录并返回成功响应 - log.debug("商家绑定分账接收方异步通知处理完成,mchId:{} merCupNo:{}", mchId, merCupNo); - return JSONUtil.createObj().put("code", "SUCCESS").put("message", "分账接收方绑定成功"); + // 11. 日志记录并返回成功响应 + log.info("商家绑定分账接收方异步通知处理完成,mchId:{} merCupNo:{}", mchId, merCupNo); + return JSONUtil.createObj().set("code", "SUCCESS").set("message", "分账接收方绑定成功"); } catch (Exception e) { log.error("商家绑定分账接收方异步通知处理发生异常", e); - return JSONUtil.createObj().put("code", "FAIL").put("message", "系统异常"); + return JSONUtil.createObj().set("code", "FAIL").set("message", "系统异常"); } } - /** * 查询银行卡Bin信息 * 参考:https://o.lakala.com/#/home/document/detail?id=179 diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java index 233acaad..1cb022be 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerMerReceiverBindServiceImpl.java @@ -14,41 +14,77 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.modules.lakala.LklLedgerMerReceiverBind; +import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.lakala.mapper.LklLedgerMerReceiverBindMapper; import com.suisung.mall.shop.lakala.service.LklLedgerMerReceiverBindService; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; +@Slf4j @Service public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl implements LklLedgerMerReceiverBindService { /** - * 根据接收方编号新增或更新记录 + * 根据商户编号和接收方编号新增或更新记录 * - * @param record - * @return + * @param record 分账绑定记录 + * @return 操作结果,成功返回true,失败返回false */ @Override public Boolean addOrUpdateByMerCupNoReceiverNo(LklLedgerMerReceiverBind record) { - if (record == null || StrUtil.isBlank(record.getMer_cup_no()) || StrUtil.isBlank(record.getReceiver_no())) { + // 参数校验 + if (record == null || StrUtil.hasBlank(record.getMer_cup_no(), record.getReceiver_no())) { + log.warn("分账绑定记录参数校验失败: record为空或关键字段缺失, mer_cup_no={}, receiver_no={}", + record != null ? record.getMer_cup_no() : "null", + record != null ? record.getReceiver_no() : "null"); return false; } + // 构造查询条件 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mer_cup_no", record.getMer_cup_no()) .eq("receiver_no", record.getReceiver_no()) - .eq("audit_status", CommonConstant.Enable); - List existsRecordList = list(queryWrapper); - if (!CollectionUtil.isEmpty(existsRecordList) - && existsRecordList.get(0) != null - && existsRecordList.get(0).getId() > 0) { - // update - record.setId(existsRecordList.get(0).getId()); - return updateById(record); + .eq("audit_status", CommonConstant.Enable) + .orderByAsc("id"); + + // 如果商户ID不为空,则增加商户ID查询条件 + if (CheckUtil.isNotEmpty(record.getMch_id())) { + queryWrapper.eq("mch_id", record.getMch_id()); } - return add(record); + // 查询已存在的记录 + LklLedgerMerReceiverBind existsRecord = findOne(queryWrapper); + + // 如果存在有效记录,则更新该记录 + if (existsRecord != null && existsRecord.getId() != null && existsRecord.getId() > 0) { + log.debug("分账绑定记录已存在,执行更新操作: mer_cup_no={}, receiver_no={}, id={}", + record.getMer_cup_no(), record.getReceiver_no(), existsRecord.getId()); + record.setId(existsRecord.getId()); + boolean updateResult = updateById(record); + if (updateResult) { + log.info("分账绑定记录更新成功: mer_cup_no={}, receiver_no={}, id={}", + record.getMer_cup_no(), record.getReceiver_no(), record.getId()); + } else { + log.error("分账绑定记录更新失败: mer_cup_no={}, receiver_no={}, id={}", + record.getMer_cup_no(), record.getReceiver_no(), record.getId()); + } + return updateResult; + } + + // 不存在有效记录,则新增记录 + log.debug("分账绑定记录不存在,执行新增操作: mer_cup_no={}, receiver_no={}", + record.getMer_cup_no(), record.getReceiver_no()); + boolean addResult = add(record); + if (addResult) { + log.info("分账绑定记录新增成功: mer_cup_no={}, receiver_no={}", + record.getMer_cup_no(), record.getReceiver_no()); + } else { + log.error("分账绑定记录新增失败: mer_cup_no={}, receiver_no={}", + record.getMer_cup_no(), record.getReceiver_no()); + } + return addResult; } /** @@ -122,7 +158,7 @@ public class LklLedgerMerReceiverBindServiceImpl extends BaseServiceImpl updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("apply_id", applyId); - if (StrUtil.isNotBlank(merInnerNo)) { - updateWrapper.set("mer_inner_no", merInnerNo); - } - if (StrUtil.isNotBlank(merCupNo)) { - updateWrapper.set("mer_cup_no", merCupNo); - } - if (StrUtil.isNotBlank(receiverNo)) { - updateWrapper.set("receiver_no", receiverNo); - } - if (StrUtil.isNotBlank(entrustFileName)) { - updateWrapper.set("entrust_file_name", entrustFileName); - } - if (StrUtil.isNotBlank(entrustFilePath)) { - updateWrapper.set("entrust_file_path", entrustFilePath); - } - if (StrUtil.isNotBlank(auditStatus)) { - updateWrapper.set("audit_status", auditStatus); - } - if (StrUtil.isNotBlank(auditStatusText)) { - updateWrapper.set("audit_status_text", auditStatusText); - } - if (StrUtil.isNotBlank(remark)) { - updateWrapper.set("remark", remark); - } + + // 只有当参数不为空时才更新对应字段 + updateWrapper.set("mer_inner_no", merInnerNo); + updateWrapper.set("mer_cup_no", merCupNo); + updateWrapper.set("receiver_no", receiverNo); + updateWrapper.set("entrust_file_name", entrustFileName); + updateWrapper.set("entrust_file_path", entrustFilePath); + updateWrapper.set("audit_status", auditStatus); + updateWrapper.set("audit_status_text", auditStatusText); + updateWrapper.set("remark", remark); return update(updateWrapper); } + + /** + * 根据商户编号删除商户分账接收方绑定记录 + * + * @param mchId 商户ID + * @param merCupNo 商户银联编号 + * @return 删除成功返回true,失败返回false + */ + @Override + public Boolean delByMchIdAndMerCupNo(Long mchId, String merCupNo) { + try { + log.debug("开始删除商户分账接收方绑定记录,mchId={}, merCupNo={}", mchId, merCupNo); + + if (CheckUtil.isEmpty(mchId) && StrUtil.isBlank(merCupNo)) { + log.warn("删除商户分账接收方绑定记录参数校验失败,mchId和merCupNo不能同时为空"); + return false; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mer_cup_no", merCupNo) + .eq("mch_id", mchId); + + boolean removeResult = remove(queryWrapper); + + if (removeResult) { + log.info("商户分账接收方绑定记录删除成功,mchId={}, merCupNo={}", mchId, merCupNo); + } else { + log.warn("商户分账接收方绑定记录删除失败或未找到匹配记录,mchId={}, merCupNo={}", mchId, merCupNo); + } + + return removeResult; + } catch (Exception e) { + log.error("删除商户分账接收方绑定记录时发生异常,mchId={}, merCupNo={}", mchId, merCupNo, e); + return false; + } + } + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java index 8633e3a2..0fe18ce6 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerReceiverServiceImpl.java @@ -137,14 +137,14 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl ids = new ArrayList<>(); - if (platformId != null && platformId > 0) { - ids.add(platformId); + if (distributorId != null && distributorId > 0) { + ids.add(distributorId); } // 获取平台记录和代理商记录 List esignPlatformInfoList = esignPlatformInfoService.getDistributorAndPlatformByIds(ids.toArray(new Long[0])); @@ -216,14 +216,14 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl applyRetPair = lakalaApiService.innerApplyLedgerMer(merCupNo); + Pair applyRetPair = lakalaApiService.innerApplyLedgerMer(merCupNo, true); if (!applyRetPair.getFirst()) { String message = "提交分账业务申请异常:" + applyRetPair.getSecond(); shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, null, message); diff --git a/mall-shop/src/main/resources/bootstrap-dev.yml b/mall-shop/src/main/resources/bootstrap-dev.yml index 8ccdb5e1..62749c2f 100644 --- a/mall-shop/src/main/resources/bootstrap-dev.yml +++ b/mall-shop/src/main/resources/bootstrap-dev.yml @@ -168,7 +168,7 @@ lakala: client_id: lsycs client_secret: XPa1HB5d55Ig0qV8 user_no: 29153396 - split_lowest_ratio: 94.00 + split_lowest_ratio: 20.00 activity_id: 687 wx_fee: 0.6 # 微信手续费 6/1000 api_pub_key_path: payKey/lakala/dev/tk_api_public_key.txt diff --git a/mall-shop/src/main/resources/bootstrap-local.yml b/mall-shop/src/main/resources/bootstrap-local.yml index c1c7a819..fc0a322d 100644 --- a/mall-shop/src/main/resources/bootstrap-local.yml +++ b/mall-shop/src/main/resources/bootstrap-local.yml @@ -167,7 +167,7 @@ lakala: client_id: gpff client_secret: uRjvaJkWS1A0VsAv user_no: 22874827 - split_lowest_ratio: 94.00 + split_lowest_ratio: 20.00 activity_id: 208 wx_fee: 0.25 # 微信手续费 千分之2.5 api_pub_key_path: payKey/lakala/prod/tk_api_public_key.txt diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index dd8d906d..263b317d 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -183,7 +183,7 @@ lakala: client_id: gpff client_secret: uRjvaJkWS1A0VsAv user_no: 22874827 - split_lowest_ratio: 94.00 + split_lowest_ratio: 20.00 activity_id: 208 wx_fee: 0.25 # 微信手续费 千分之2.5 api_pub_key_path: payKey/lakala/prod/tk_api_public_key.txt diff --git a/mall-shop/src/main/resources/bootstrap-test.yml b/mall-shop/src/main/resources/bootstrap-test.yml index ae01b836..134a45cd 100644 --- a/mall-shop/src/main/resources/bootstrap-test.yml +++ b/mall-shop/src/main/resources/bootstrap-test.yml @@ -172,7 +172,7 @@ lakala: client_id: lsycs client_secret: XPa1HB5d55Ig0qV8 user_no: 29153396 - split_lowest_ratio: 94.00 + split_lowest_ratio: 20.00 activity_id: 687 wx_fee: 0.6 # 微信手续费 6/1000 api_pub_key_path: payKey/lakala/dev/tk_api_public_key.txt diff --git a/mall-shop/src/main/resources/bootstrap-uat.yml b/mall-shop/src/main/resources/bootstrap-uat.yml index ae01b836..134a45cd 100644 --- a/mall-shop/src/main/resources/bootstrap-uat.yml +++ b/mall-shop/src/main/resources/bootstrap-uat.yml @@ -172,7 +172,7 @@ lakala: client_id: lsycs client_secret: XPa1HB5d55Ig0qV8 user_no: 29153396 - split_lowest_ratio: 94.00 + split_lowest_ratio: 20.00 activity_id: 687 wx_fee: 0.6 # 微信手续费 6/1000 api_pub_key_path: payKey/lakala/dev/tk_api_public_key.txt