From f38fbf782b242b724c4eca9aa25a292ee16e6f5a Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 5 Jan 2026 08:38:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=90=8C=E7=AD=BE=E7=BD=B2=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=20=E4=B8=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/RedisConstant.java | 3 + .../lakala/service/LklLedgerEcService.java | 10 + .../service/impl/LakalaApiServiceImpl.java | 34 +++- .../service/impl/LklLedgerEcServiceImpl.java | 28 +++ .../lakala/service/impl/LklTkServiceImpl.java | 179 +++++++++--------- .../service/impl/ShopMchEntryServiceImpl.java | 17 +- 6 files changed, 173 insertions(+), 98 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/RedisConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/RedisConstant.java index 3c7082c4..fab18fd7 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/RedisConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/RedisConstant.java @@ -46,4 +46,7 @@ public class RedisConstant { public static final String VERIFY_CODE_KEY = "register:verifyCode:"; + // 拉卡拉合同是否强制签署 + public static final String LKL_EC_REPEAT_SIGN = "lkl:ec:repeat:sign:"; + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerEcService.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerEcService.java index b6b3954c..03452138 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerEcService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/LklLedgerEcService.java @@ -9,6 +9,7 @@ package com.suisung.mall.shop.lakala.service; import com.suisung.mall.common.modules.lakala.LklLedgerEc; +import com.suisung.mall.common.modules.store.ShopMchEntry; import com.suisung.mall.core.web.service.IBaseService; public interface LklLedgerEcService extends IBaseService { @@ -58,4 +59,13 @@ public interface LklLedgerEcService extends IBaseService { */ String getLklEcResultUrl(Long mchId); + /** + * 是否已签署拉卡拉商户合同 + * + * @param lklLedgerEc + * @param shopMchEntry + * @return + */ + Boolean isSignedLklEc(LklLedgerEc lklLedgerEc, ShopMchEntry shopMchEntry); + } 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 bafd6aef..a2088b47 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 @@ -25,7 +25,9 @@ import com.lkl.laop.sdk.request.model.V3LabsTradeLocationInfo; import com.lkl.laop.sdk.request.model.V3SacsSeparateRecvDatas; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.constant.CommonConstant; +import com.suisung.mall.common.constant.RedisConstant; import com.suisung.mall.common.exception.ApiException; +import com.suisung.mall.common.feignService.AccountService; import com.suisung.mall.common.feignService.ShopService; import com.suisung.mall.common.modules.esign.EsignPlatformInfo; import com.suisung.mall.common.modules.lakala.*; @@ -36,6 +38,7 @@ import com.suisung.mall.common.pojo.dto.LklSeparateWithTotalAmountDTO; import com.suisung.mall.common.service.impl.CommonService; import com.suisung.mall.common.utils.*; import com.suisung.mall.core.web.service.RedisService; +import com.suisung.mall.shop.base.service.impl.AccountBaseConfigServiceImpl; import com.suisung.mall.shop.esign.service.EsignPlatformInfoService; import com.suisung.mall.shop.lakala.service.*; import com.suisung.mall.shop.lakala.utils.LakalaUtil; @@ -48,6 +51,7 @@ import com.suisung.mall.shop.store.service.ShopMchEntryService; import com.suisung.mall.shop.store.service.ShopStoreBaseService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.data.util.Pair; @@ -175,6 +179,10 @@ public class LakalaApiServiceImpl implements LakalaApiService { @Lazy @Resource private OssService ossService; + @Autowired + private AccountService accountService; + @Autowired + private AccountBaseConfigServiceImpl accountBaseConfigService; /** @@ -419,14 +427,35 @@ public class LakalaApiServiceImpl implements LakalaApiService { return Pair.of(false, "缺少商家相关入驻信息!"); } + // 3. 检查是否已存在已完成的电子合同 + LklLedgerEc lklLedgerEc = lklLedgerEcService.getByMchId(mchId, "", CommonConstant.Enable); + + // 如果配置不允许重复签署拉卡拉电子合同,则检查是否已签署拉卡拉电子合同,已签署直接跳过签署合同 + if (ObjectUtil.notEqual("1", accountBaseConfigService.getConfig(RedisConstant.LKL_EC_REPEAT_SIGN))) { + if (lklLedgerEcService.isSignedLklEc(lklLedgerEc, shopMchEntry)) { + log.info("商户:{} 已签署拉卡拉电子合同,直接进行进件处理!", mchId); + + // 13. 触发拉卡拉商家进件流程 + log.info("开始触发拉卡拉商家进件流程,mchId: {}", mchId); + Pair resultPair = lklTkService.registrationMerchant(mchId); + if (!resultPair.getFirst()) { + String errMsg = resultPair.getSecond(); + log.error("拉卡拉商家进件失败: {},mchId: {}", errMsg, mchId); + shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, CommonConstant.MCH_APPR_STA_LKL_NOPASS, errMsg); + throw new ApiException(errMsg); + } + + return Pair.of(true, "已签署合同,等待进件中!"); + } + } + + String contractMobile = shopMchEntry.getLegal_person_mobile(); if (StrUtil.isBlank(contractMobile)) { log.warn("商家申请入网电子合同失败:联系人手机号为空,入驻编号: {}", mchId); return Pair.of(false, "联系人手机号不能为空!"); } - // 3. 检查是否已存在已完成的电子合同 - LklLedgerEc lklLedgerEc = lklLedgerEcService.getByMchId(shopMchEntry.getId(), "", CommonConstant.Enable); if (lklLedgerEc != null && "COMPLETED".equals(lklLedgerEc.getEc_status())) { log.info("商户:{} 电子合同已签署过,重新提交将被覆盖!", mchId); } @@ -1061,6 +1090,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { updRecord.setEc_file(ecCosFileUrl); // 合同本地文件COS URL链接 updRecord.setLkl_file_path(eclklFilePath); updRecord.setEc_status(paramsJSON.getStr("ecStatus")); + updRecord.setResp_notify_body(paramsJSON.toString()); Boolean success = lklLedgerEcService.updateByApplyId(updRecord); if (!success) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerEcServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerEcServiceImpl.java index 8c251d88..d71080ec 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerEcServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklLedgerEcServiceImpl.java @@ -13,6 +13,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.modules.lakala.LklLedgerEc; +import com.suisung.mall.common.modules.store.ShopMchEntry; import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.lakala.mapper.LklLedgerEcMapper; @@ -150,4 +151,31 @@ public class LklLedgerEcServiceImpl extends BaseServiceImpl areaCode = getAreaCode(shopMchEntry.getStore_area(), false); if (ObjectUtil.isNotEmpty(areaCode)) { - reqJsonBody.put("provinceCode", areaCode.get("provinceCode")); - reqJsonBody.put("cityCode", areaCode.get("cityCode")); - reqJsonBody.put("countyCode", areaCode.get("countyCode")); + reqJsonBody.set("provinceCode", areaCode.get("provinceCode")); + reqJsonBody.set("cityCode", areaCode.get("cityCode")); + reqJsonBody.set("countyCode", areaCode.get("countyCode")); } //银行结算信息省市信息 @@ -510,38 +515,38 @@ public class LklTkServiceImpl { String[] bankAreaCodes = shopMchEntry.getBank_district().split("/"); String[] bankAreaNames = shopMchEntry.getBank_area().split("/"); if (bankAreaCodes.length >= 2 && bankAreaNames.length >= 2) { - reqJsonBody.put("settleProvinceCode", bankAreaCodes[0]); - reqJsonBody.put("settleProvinceName", bankAreaCodes[1]); - reqJsonBody.put("settleCityCode", bankAreaNames[0]); - reqJsonBody.put("settleCityName", bankAreaNames[1]); + reqJsonBody.set("settleProvinceCode", bankAreaCodes[0]); + reqJsonBody.set("settleProvinceName", bankAreaCodes[1]); + reqJsonBody.set("settleCityCode", bankAreaNames[0]); + reqJsonBody.set("settleCityName", bankAreaNames[1]); } } else { Map bankAreaCode = getAreaCode(shopMchEntry.getBank_area(), true); if (ObjectUtil.isNotEmpty(bankAreaCode)) { - reqJsonBody.put("settleProvinceCode", bankAreaCode.get("provinceCode")); - reqJsonBody.put("settleCityCode", bankAreaCode.get("cityCode")); + reqJsonBody.set("settleProvinceCode", bankAreaCode.get("provinceCode")); + reqJsonBody.set("settleCityCode", bankAreaCode.get("cityCode")); String[] bankAreaName = shopMchEntry.getBank_area().split("/"); if (bankAreaName.length >= 2) { - reqJsonBody.put("settleProvinceName", bankAreaName[0]); - reqJsonBody.put("settleCityName", bankAreaName[1]); + reqJsonBody.set("settleProvinceName", bankAreaName[0]); + reqJsonBody.set("settleCityName", bankAreaName[1]); } } } // 费率和设备、活动 JSONObject bizContent = new JSONObject(); - bizContent.put("activityId", activityId); - bizContent.put("termNum", "1"); - bizContent.put("mcc", "12015"); // 超市的 MCC code - bizContent.put("fees", new JSONArray() {{ + bizContent.set("activityId", activityId); + bizContent.set("termNum", "1"); + bizContent.set("mcc", "12015"); // 超市的 MCC code + bizContent.set("fees", new JSONArray() {{ put(new JSONObject() { { - put("feeCode", "WECHAT"); - put("feeValue", wxFee); + set("feeCode", "WECHAT"); + set("feeValue", wxFee); } }); }}); - reqJsonBody.put("bizContent", bizContent); + reqJsonBody.set("bizContent", bizContent); // 附件文件相关开始 logger.debug("开始处理商户附件文件,商户ID: {}", mchId); @@ -550,7 +555,7 @@ public class LklTkServiceImpl { // 企业 JSONObject SETTLE_ID_CARD_FRONT = updatePhoto(shopMchEntry.getLegal_person_id_images(), "ID_CARD_FRONT", false); if (SETTLE_ID_CARD_FRONT != null) { - attachments.put(SETTLE_ID_CARD_FRONT); // 法人身份证正面 + attachments.set(SETTLE_ID_CARD_FRONT); // 法人身份证正面 logger.debug("成功添加法人身份证正面图片"); } else { logger.warn("法人身份证正面图片添加失败"); @@ -558,7 +563,7 @@ public class LklTkServiceImpl { JSONObject SETTLE_ID_CARD_BEHIND = updatePhoto(shopMchEntry.getLegal_person_id_images2(), "ID_CARD_BEHIND", false); if (SETTLE_ID_CARD_BEHIND != null) { - attachments.put(SETTLE_ID_CARD_BEHIND); // 法人身份证国徽面 + attachments.set(SETTLE_ID_CARD_BEHIND); // 法人身份证国徽面 logger.debug("成功添加法人身份证国徽面图片"); } else { logger.warn("法人身份证国徽面图片添加失败"); @@ -566,7 +571,7 @@ public class LklTkServiceImpl { JSONObject BUSINESS_LICENCE = updatePhoto(shopMchEntry.getBiz_license_image(), "BUSINESS_LICENCE", false); if (BUSINESS_LICENCE != null) { - attachments.put(BUSINESS_LICENCE); // 营业执照 + attachments.set(BUSINESS_LICENCE); // 营业执照 logger.debug("成功添加营业执照图片"); } else { logger.warn("营业执照图片添加失败"); @@ -575,7 +580,7 @@ public class LklTkServiceImpl { // 银行对公开户正面 JSONObject OPENING_PERMIT = updatePhoto(shopMchEntry.getOpening_permit_image(), "OPENING_PERMIT", false); if (OPENING_PERMIT != null) { - attachments.put(OPENING_PERMIT); // 营业执照 + attachments.set(OPENING_PERMIT); // 营业执照 logger.debug("成功添加开户许可证证明图片"); } else { logger.warn("成功添加开户许可证证明图片添加失败"); @@ -585,7 +590,7 @@ public class LklTkServiceImpl { // 小微个人 JSONObject ID_CARD_FRONT = updatePhoto(shopMchEntry.getIndividual_id_images(), "ID_CARD_FRONT", false); if (ID_CARD_FRONT != null) { - attachments.put(ID_CARD_FRONT); // 身份证正面 + attachments.set(ID_CARD_FRONT); // 身份证正面 logger.debug("成功添加身份证正面图片"); } else { logger.warn("身份证正面图片添加失败"); @@ -593,7 +598,7 @@ public class LklTkServiceImpl { JSONObject ID_CARD_BEHIND = updatePhoto(shopMchEntry.getIndividual_id_images2(), "ID_CARD_BEHIND", false); if (ID_CARD_BEHIND != null) { - attachments.put(ID_CARD_BEHIND); // 身份证国徽面 + attachments.set(ID_CARD_BEHIND); // 身份证国徽面 logger.debug("成功添加身份证国徽面图片"); } else { logger.warn("身份证国徽面图片添加失败"); @@ -602,7 +607,7 @@ public class LklTkServiceImpl { // 对私必传银行卡 JSONObject BANK_CARD = updatePhoto(shopMchEntry.getBank_image(), "BANK_CARD", false); if (BANK_CARD != null) { - attachments.put(BANK_CARD); // 银行卡图片 + attachments.set(BANK_CARD); // 银行卡图片 logger.debug("成功添加银行卡图片"); } else { logger.warn("银行卡图片添加失败"); @@ -611,7 +616,7 @@ public class LklTkServiceImpl { JSONObject SHOP_OUTSIDE_IMG = updatePhoto(shopMchEntry.getFront_facade_image(), "SHOP_OUTSIDE_IMG", false); if (SHOP_OUTSIDE_IMG != null) { - attachments.put(SHOP_OUTSIDE_IMG); // 门店门面图片 + attachments.set(SHOP_OUTSIDE_IMG); // 门店门面图片 logger.debug("成功添加门店门面图片"); } else { logger.warn("门店门面图片添加失败"); @@ -619,7 +624,7 @@ public class LklTkServiceImpl { JSONObject SHOP_INSIDE_IMG = updatePhoto(shopMchEntry.getEnvironment_image(), "SHOP_INSIDE_IMG", false); if (SHOP_INSIDE_IMG != null) { - attachments.put(SHOP_INSIDE_IMG); // 门店内部图片 + attachments.set(SHOP_INSIDE_IMG); // 门店内部图片 logger.debug("成功添加门店内部图片"); } else { logger.warn("门店内部图片添加失败"); @@ -628,13 +633,13 @@ public class LklTkServiceImpl { // 收银台图片 JSONObject CHECKSTAND_IMG = updatePhoto(shopMchEntry.getCheckstand_image(), "CHECKSTAND_IMG", false); if (CHECKSTAND_IMG != null) { - attachments.put(CHECKSTAND_IMG); // 收银台图片 + attachments.set(CHECKSTAND_IMG); // 收银台图片 logger.debug("成功添加收银台图片"); } else { logger.warn("收银台图片添加失败"); } - reqJsonBody.put("attchments", attachments); + reqJsonBody.set("attchments", attachments); logger.debug("商户附件文件处理完成,共添加 {} 个附件", attachments.size()); // 附件文件相关结束 @@ -755,7 +760,7 @@ public class LklTkServiceImpl { ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerInnerNo(merInnerNo); if (shopMchEntry == null) { logger.error("拉卡拉进件异步通知:{}内部商户号入驻信息不存在!", merInnerNo); - return new JSONObject().put("code", "500").put("message", merInnerNo + "内部商户号入驻信息不存在"); + return new JSONObject().set("code", "500").set("message", merInnerNo + "内部商户号入驻信息不存在"); } Long mchId = shopMchEntry.getId(); @@ -872,7 +877,7 @@ public class LklTkServiceImpl { ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo, 0L); if (shopMchEntry == null) { logger.error("拉卡拉商户增终异步通知 - 商户号入驻信息不存在: {}", merCupNo); - return new JSONObject().put("code", "500").put("message", merCupNo + "商户号入驻信息不存在"); + return new JSONObject().set("code", "500").set("message", merCupNo + "商户号入驻信息不存在"); } // 校验审核状态: PREPARE:待提交; PASS:通过; UNPASS:未通过; PASSING:审核中; @@ -1175,7 +1180,7 @@ public class LklTkServiceImpl { } JSONObject header = new JSONObject(); - header.put("Authorization", getLklTkAuthorization()); + header.set("Authorization", getLklTkAuthorization()); String urlPath = "/sit/htkregistration/organization"; if (isLklProd) { @@ -1279,10 +1284,10 @@ public class LklTkServiceImpl { // Base64Utils.encodeToString(file.getBytes()); JSONObject requestBody = new JSONObject(); - requestBody.put("fileBase64", fileBase64); - requestBody.put("imgType", imgType); - requestBody.put("sourcechnl", "0"); // 来源: 0:PC,1:安卓,2:IOS - requestBody.put("isOcr", "true"); + requestBody.set("fileBase64", fileBase64); + requestBody.set("imgType", imgType); + requestBody.set("sourcechnl", "0"); // 来源: 0:PC,1:安卓,2:IOS + requestBody.set("isOcr", "true"); String urlPath = "/sit/htkregistration/file/base/upload"; if (isLklProd) { @@ -1303,7 +1308,7 @@ public class LklTkServiceImpl { return null; } - return new JSONObject().put("id", result.get("url")).put("type", imgType); + return new JSONObject().set("id", result.get("url")).set("type", imgType); } catch (Exception e) { logger.error("上传文件异常:{}", e.getMessage()); return null; @@ -1315,13 +1320,13 @@ public class LklTkServiceImpl { } JSONObject header = new JSONObject(); - header.put("Authorization", getLklTkAuthorization()); + header.set("Authorization", getLklTkAuthorization()); // Base64Utils.encodeToString(file.getBytes()); JSONObject requestBody = new JSONObject(); - requestBody.put("areaCode", areaCode); - requestBody.put("bankName", bankName); + requestBody.set("areaCode", areaCode); + requestBody.set("bankName", bankName); String urlPath = "/sit/registration/bank"; if (isLklProd) { @@ -1342,7 +1347,7 @@ public class LklTkServiceImpl { return null; } - return new JSONObject().put("id", result.get("url")).put("type", ""); + return new JSONObject().set("id", result.get("url")).set("type", ""); } catch (Exception e) { logger.error("上传文件异常:{}", e.getMessage()); return null; 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 2cb75c81..ed7189ce 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 @@ -662,17 +662,17 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl approvalStatusList) { - log.debug("获取商家入驻申请详情开始: recordId={}, mobile={}", recordId, mobile); + public CommonResult shopMerchEntryDetail(Long mchId, String mobile, List approvalStatusList) { + log.debug("获取商家入驻申请详情开始: recordId={}, mobile={}", mchId, mobile); // 参数校验:recordId 和 mobile 至少提供一个 - if (ObjectUtil.isEmpty(recordId) && StrUtil.isBlank(mobile)) { + if (ObjectUtil.isEmpty(mchId) && StrUtil.isBlank(mobile)) { log.warn("获取商家入驻详情失败:缺少必要参数 recordId 或 mobile"); return CommonResult.failed("缺少必要参数!"); } @@ -682,8 +682,8 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); // 根据ID查询 - if (ObjectUtil.isNotEmpty(recordId)) { - queryWrapper.eq("id", recordId); + if (ObjectUtil.isNotEmpty(mchId)) { + queryWrapper.eq("id", mchId); } // 根据手机号查询 @@ -702,7 +702,7 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl