From 0cde19efd75fac3e2fdb9c89a0d46160bf9f8462 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 3 Sep 2025 01:40:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BF=9B=E4=BB=B6=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 2 + .../ShopBaseStoreCategoryAdminController.java | 14 +++ .../impl/EsignContractServiceImpl.java | 2 +- .../service/impl/LakalaApiServiceImpl.java | 46 ++++---- .../lakala/service/impl/LklTkServiceImpl.java | 109 ++++++++---------- 5 files changed, 87 insertions(+), 86 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index 0e123214..b4f6a8ef 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -92,4 +92,6 @@ public class CommonConstant { public static final String CONF_KEY_SAME_CITY_ORDER_EXPIRE_SECONDS = "sameCityOrderExpireSeconds"; + public static final String SPLIT_ = "diffCityOrderExpireSeconds"; + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java index 3663ee43..20b91987 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/controller/admin/ShopBaseStoreCategoryAdminController.java @@ -14,6 +14,8 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; + /** *

* 店铺分类表 前端控制器 @@ -85,6 +87,18 @@ public class ShopBaseStoreCategoryAdminController { @ApiOperation(value = "店铺分类表-编辑", notes = "店铺分类表-编辑") @RequestMapping(value = "/edit", method = RequestMethod.POST) public CommonResult edit(ShopBaseStoreCategory shopBaseStoreCategory) { + if (shopBaseStoreCategory.getSplit_ratio() == null) { + shopBaseStoreCategory.setSplit_ratio(new BigDecimal("94")); + } + + if (shopBaseStoreCategory.getSplit_ratio().compareTo(new BigDecimal("94")) < 0) { + return CommonResult.failed(I18nUtil._("分成比例不能小于94")); + } + + if (shopBaseStoreCategory.getSplit_ratio().compareTo(new BigDecimal("100")) > 0) { + return CommonResult.failed(I18nUtil._("分成比例不能大于100")); + } + return CommonResult.success(shopBaseStoreCategoryService.saveOrUpdate(shopBaseStoreCategory)); } 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 d5b5db6a..cf9204d9 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 @@ -312,7 +312,7 @@ public class EsignContractServiceImpl extends BaseServiceImpl retPair = lakalaApiService.innerApplyLedgerMer(esignContract.getMch_mobile()); if (!retPair.getFirst()) { - log.error("商家申请分账功能失败:{}", retPair.getSecond()); + log.error("商家申请分账业务异常:{}", retPair.getSecond()); } // 更新商家的hasEsigned状态=1 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 ad87592e..95a380da 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 @@ -10,6 +10,7 @@ package com.suisung.mall.shop.lakala.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; @@ -449,7 +450,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { ecParams.put("A109", today.getDayOfMonth()); ecParams.put("B1", today.getYear()); ecParams.put("B3", "是"); -// ecParams.put("B4", "是"); ecParams.put("B2", today.getMonthValue()); ecParams.put("B8", isQy ? shopMchEntry.getBiz_license_company() : shopMchEntry.getAccount_holder_name()); ecParams.put("B9", StrUtil.sub(shopMchEntry.getSales_info(), 0, 22)); @@ -477,12 +477,18 @@ public class LakalaApiServiceImpl implements LakalaApiService { ecParams.put("D9", signDate); ecParams.put("D11", signDate); ecParams.put("D12", signDate); - ecParams.put("E1", platformName + "和代理商"); - ecParams.put("E2", "小发同城平台商户合作协议"); + + Boolean hasAgent = false; // 有无分账代理商? + if (hasAgent) { + ecParams.put("E1", platformName + "和代理商"); + ecParams.put("E2", "《平台商户入驻服务框架协议》和《小发同城服务费结算》"); + } else { + ecParams.put("E1", platformName); + ecParams.put("E2", "平台商户入驻服务框架协议"); + } + ecParams.put("E3", "1"); - ecParams.put("E4", splitLowestRatio); -// ecParams.put("E5", platformName); -// ecParams.put("E6", splitLowestRatio); + ecParams.put("E4", NumberUtil.toStr(shopMchEntry.getSplit_ratio(), splitLowestRatio)); ecParams.put("E7", signDate); ecParams.put("E8", shopMchEntry.getAccount_holder_name()); @@ -617,7 +623,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { //3. 发送请求 String responseStr = LKLSDK.httpPost(req); if (StrUtil.isBlank(responseStr)) { - return Pair.of(false, I18nUtil._("无返回值,申请开通分账失败!")); + return Pair.of(false, I18nUtil._("申请拉卡拉分账业务无返回值!")); } log.debug("商户分账业务申请响应数据:{}", responseStr); @@ -625,7 +631,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 成功返回示例:{'retCode':'000000','retMsg':'申请已受理,请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}} JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); if (lakalaRespJSON == null) { - return Pair.of(false, I18nUtil._("无返回值,申请开通分账失败!")); + return Pair.of(false, I18nUtil._("申请拉卡拉分账业务返回值异常!")); } Object applyId = lakalaRespJSON.getByPath("respData.applyId"); @@ -659,14 +665,13 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 将 JSON 对象的键名转换为下划线命名 LklLedgerMember lklLedgerMemberNew = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class); if (!lklLedgerMemberService.addOrUpdateByMerCupNo(lklLedgerMemberNew)) { - return Pair.of(false, I18nUtil._("商户分账业务材料新增失败,待审核中!")); + return Pair.of(false, I18nUtil._("新增或更改拉卡拉分账业务申请信息失败!")); } - return Pair.of(true, I18nUtil._("商户分账业务申请提交成功,待审核中!")); + return Pair.of(true, I18nUtil._("商户申请拉卡拉分账业务,提交成功,待审核中!")); } catch (SDKException e) { - log.error("申请开通分账出错:", e); - return Pair.of(false, I18nUtil._("商家申请开通分账出错!")); -// throw new ApiException(I18nUtil._("商家申请开通分账出错!"), e); + log.error("申请拉卡拉分账业务出错:", e); + return Pair.of(false, I18nUtil._("申请拉卡拉分账业务出错!")); } } @@ -1373,13 +1378,8 @@ public class LakalaApiServiceImpl implements LakalaApiService { log.debug("##### 商家绑定接收方回调参数:{} ####", paramsJSON); if (paramsJSON == null || StrUtil.isBlank(paramsJSON.getStr("applyId"))) { - // https://o.lakala.com/#/home/document/detail?id=386 返回的数据结果有歧义,需处理 - paramsJSON = paramsJSON.getJSONObject("respData"); - - if (paramsJSON == null || StrUtil.isBlank(paramsJSON.getStr("applyId"))) { - log.error("商家绑定分账接收方异步通知参数转化失败"); - return JSONUtil.createObj().put("code", "FAIL").put("message", "参数转换失败"); - } + log.error("商家绑定分账接收方通知数据有误"); + return JSONUtil.createObj().put("code", "FAIL").put("message", "商家绑定分账接收方通知数据有误!"); } // 3. 提取核心参数 @@ -1423,16 +1423,10 @@ public class LakalaApiServiceImpl implements LakalaApiService { LklLedgerMerReceiverBind lklLedgerMerReceiverBind = lklLedgerMerReceiverBindService.getPlatformByApplyId(applyId); if (lklLedgerMerReceiverBind != null) { -// shopMchEntryService.updateMerchEntryApprovalByMchId( -// lklLedgerMerReceiverBind.getMch_id(), CommonConstant.MCH_APPR_STA_PASS, "商家绑定分账接收方成功" -// ); - // 7. 成功后更新商户绑定状态为已绑定 shopMchEntryService.updateMulStatus(lklLedgerMerReceiverBind.getMch_id(), "", merCupNo, 0, 0, 0, 0, 0, 1, CommonConstant.MCH_APPR_STA_PASS); - } - // 8. 检查商户绑定状态是否完成, 更改总的审核状态 shopMchEntryService.checkMerchEntryFinished("", merCupNo); 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 92d6dde7..c2ad05a5 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 @@ -345,6 +345,11 @@ public class LklTkServiceImpl { return Pair.of(false, "商家入驻信息不存在"); } + if (!CommonConstant.Enable.equals(shopMchEntry.getHas_ec_signed()) + || StrUtil.isBlank(shopMchEntry.getContract_download_url())) { + return Pair.of(false, "商家先签署合同,再来进件!"); + } + JSONObject reqJsonBody = new JSONObject(); reqJsonBody.put("userNo", userNo); reqJsonBody.put("busiCode", "WECHAT_PAY");// WECHAT_PAY:专业化扫码;B2B_SYT:B2B收银台; @@ -448,7 +453,7 @@ public class LklTkServiceImpl { JSONObject bizContent = new JSONObject(); bizContent.put("activityId", activityId); bizContent.put("termNum", "1"); - bizContent.put("mcc", "12015"); // 超市的 code + bizContent.put("mcc", "12015"); // 超市的 MCC code bizContent.put("fees", new JSONArray() {{ put(new JSONObject() { { @@ -522,34 +527,30 @@ public class LklTkServiceImpl { || response.get("retCode") == null || !"000000".equals(response.getStr("retCode"))) { - String errMsg = response.getStr("retMsg") == null ? "拉卡拉发生未知错误" : response.getStr("retMsg"); - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件失败:" + errMsg); - return Pair.of(false, "提交进件失败:" + errMsg); + String errMsg = response.getStr("retMsg") == null ? "提交拉卡拉进件,出现未知错误" : response.getStr("retMsg"); + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "提交拉卡拉进件失败:" + errMsg); + return Pair.of(false, "提交拉卡拉进件失败:" + errMsg); } // {"merchantNo": "100132349","status": "WAIT_AUDI","state": "1"} - JSONObject rawData = response.getJSONObject("rawData"); // 进件这个接口比较特殊,不安装常规返回数据 + JSONObject rawData = response.getJSONObject("rawData"); // 进件这个接口比较特殊,不按照常规返回数据 String lklMerInnerNo = rawData.getStr("merchantNo"); //拉卡拉内部商户号 // 表中的内部外部商户号暂时都传同一个内部商户号,以便异步通知更改记录 Boolean success = shopMchEntryService.updateMerchEntryLklMerCupNo(mchId, CommonConstant.Disable2, lklMerInnerNo, lklMerInnerNo, reqJsonBody.toString(), rawData.toString()); 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(false, "提交拉卡拉进件失败:" + e.getMessage()); } - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_PADDING, "商户进件:提交进件成功,请等待审核!"); - return Pair.of(true, "提交进件成功,请等待审核!"); + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_PADDING, "提交拉卡拉进件成功,正进一步审核!"); + return Pair.of(true, "提交拉卡拉进件成功,正进一步审核!"); } /** @@ -596,7 +597,7 @@ public class LklTkServiceImpl { String merInnerNo = dataJSON.getStr("customerNo"); //拉卡拉内部商户号 String termNos = dataJSON.getStr("termNos"); //拉卡拉分配的业务终端号 - // 合并参数校验,减少嵌套 + // 合并参数校验 if (dataJSON.isEmpty() || StrUtil.isBlank(auditStatus) || StrUtil.isBlank(merCupNo) || @@ -611,11 +612,13 @@ public class LklTkServiceImpl { return new JSONObject().put("code", "500").put("message", merInnerNo + "内部商户号入驻信息不存在"); } + Long mchId = shopMchEntry.getId(); + // 校验审核状态 if (!"SUCCESS".equals(auditStatus) && !"REVIEW_PASS".equals(auditStatus)) { logger.debug("返回的审核状态:{}", auditStatus); - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件失败:" + dataJSON.getStr("remark")); + shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件失败:" + dataJSON.getStr("remark")); return new JSONObject().set("code", "FAIL").set("message", "返回审核状态有误"); } @@ -626,10 +629,12 @@ public class LklTkServiceImpl { merInnerNo, merCupNo, termNos, CommonConstant.Enable, null, data); if (!success) { - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件时更新商户号失败"); + shopMchEntryService.updateMerchEntryApprovalByMchId(mchId, CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件时更新商户号失败"); return new JSONObject().set("code", "500").set("message", "更新商户号失败"); } + logger.info("商家进件已成功,下一步申请拉卡拉分账业务,再创建分账接收方!"); + // 备注:RMK 采用拉卡拉的入网电子合同签署流程,暂停e签宝的电子合同生成流程 // logger.debug("###开始异步执行生成电子合同模版和填充模版数据,并生该商家和平台方签署的未盖章合同文件###"); // // 生成电子合同模版和填充模版数据,并生该商家和平台方签署的未盖章合同文件 @@ -644,53 +649,39 @@ public class LklTkServiceImpl { // logger.error("###商家发起电子签名失败:{}###", resPair.getSecond()); // } - // 给商家申请分账功能使用;务必检查是否申请过?申请过忽略 - if (success && StrUtil.isNotBlank(shopMchEntry.getContract_download_url())) { - // TODO 新建一个正式的已审核通过的店铺, 新建之前判断是否已经新建过了? - ShopMchEntry shopEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo); - if (shopEntry != null && !CommonConstant.Enable.equals(shopEntry.getStore_status())) { - Long mchId = shopEntry.getId(); - - // 新建一个正式的已审核通过的店铺,不要抛异常,使用补偿机制,可以独立初始化店铺 - // 重要:包含了更改 merchEntryInfo 的状态 TODO 用法人、小微个人的手机号注册商家账号,作为店铺的管理员 - Pair retPair = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); - if (retPair.getFirst() <= 0) { - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, "进件时初始化店铺失败"); - logger.error("初始化店铺失败: mchId={}, reason={}", mchId, retPair.getSecond()); - } - - logger.info("初始化店铺成功!mchId={}", mchId); - } - - // 1、(电子合同)给商家申请分账业务;务必检查是否申请过?申请过忽略 - Pair retPair = lakalaApiService.innerApplyLedgerMer(merCupNo); - - // 2:新增一个接收方记录,起码要一个平台方,代理商根据入驻信息新增 - Boolean genSuccess = lklLedgerReceiverService.innerApplyLedgerReceiver(shopMchEntry.getId(), merCupNo, shopMchEntry.getDistributor_id()); - - // 统一处理分账申请结果 - if (retPair.getFirst() && genSuccess) { - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_PADDING, "已向拉卡拉提交分账业务申请"); - return new JSONObject().put("code", "200").put("message", "处理成功"); - } - - if (!retPair.getFirst()) { - String message = "商家申请分账功能失败:" + retPair.getSecond(); - logger.error(message); - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, message); - return new JSONObject().set("code", "500").set("message", message); - } - - if (!genSuccess) { - logger.error("申请分账接收方失败"); - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, "申请分账接收方失败"); - return new JSONObject().set("code", "500").set("message", "申请分账接收方失败"); - } + // 新建一个正式的已审核通过的店铺,不要抛异常,使用补偿机制,可以独立初始化店铺 + // 重要:包含了更改 merchEntryInfo 的状态, 使用法人、小微个人的手机号注册商家账号,作为店铺的管理员 + Pair retPair = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false); + if (retPair.getFirst() <= 0) { + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, "创建并初始化店铺失败"); + logger.error("初始化店铺失败: mchId={}, reason={}", mchId, retPair.getSecond()); + } else { + logger.debug("初始化店铺成功!mchId={}", mchId); } - shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件回调处理失败"); - return new JSONObject().set("code", "500").set("message", "进件回调处理失败"); + + // 重要:给商家申请分账业务;务必检查是否申请过?申请过忽略 + Pair applyRetPair = lakalaApiService.innerApplyLedgerMer(merCupNo); + if (!applyRetPair.getFirst()) { + String message = "商家申请分账业务异常:" + applyRetPair.getSecond(); + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, message); + logger.error(message); + return new JSONObject().set("code", "500").set("message", message); + } + + logger.info("申请分账业务已成功,等待拉卡拉审核,准备创建分账接收方!"); + + // 2:新增一个接收方记录,起码要一个平台方,代理商根据入驻信息新增 + Boolean genSuccess = lklLedgerReceiverService.innerApplyLedgerReceiver(shopMchEntry.getId(), merCupNo, shopMchEntry.getDistributor_id()); + if (!genSuccess) { + logger.error("申请分账业务已成功,等待拉卡拉审核,但创建分账接收方失败了"); + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, "申请分账业务已成功,等待拉卡拉审核,但创建分账接收方失败了"); + return new JSONObject().set("code", "500").set("message", "创建分账接收方失败"); + } + + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_PADDING, "申请分账业务、创建分账接收方均已成功,等待拉卡拉审核开通分账业务"); + return new JSONObject().put("code", "200").put("message", "处理成功"); } /**