From ee653ba1c0484d80cd69282315e838b05ce9059e Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Tue, 5 Aug 2025 20:23:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81=20fix=20bu?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/controller/LoginController.java | 7 + .../service/AccountUserBaseService.java | 13 +- .../impl/AccountUserBaseServiceImpl.java | 85 +++++++-- .../AccountUserBindConnectServiceImpl.java | 2 +- .../impl/AccountUserBindGeTuiServiceImpl.java | 13 +- .../suisung/mall/common/api/ResultCode.java | 13 +- .../mall/common/constant/CommonConstant.java | 3 +- .../modules/account/AccountUserBase.java | 7 + .../mall/common/service/CommonService.java | 34 ---- .../common/service/impl/CommonService.java | 114 +++++++++++ .../service/impl/CommonServiceImpl.java | 86 --------- .../service/impl/LakalaApiServiceImpl.java | 28 +-- .../lakala/service/impl/LklTkServiceImpl.java | 2 +- .../impl/ShopOrderBaseServiceImpl.java | 177 ++++++++++++++++-- .../impl/ShopOrderReturnServiceImpl.java | 8 + .../api/SFExpressApiController.java | 7 +- .../service/SFExpressApiService.java | 15 ++ .../service/impl/SFExpressApiServiceImpl.java | 122 +++++++++++- .../store/service/ShopMchEntryService.java | 10 +- .../service/impl/ShopMchEntryServiceImpl.java | 118 +++++++++--- .../impl/ShopStoreBaseServiceImpl.java | 8 + .../src/main/resources/bootstrap-dev.yml | 1 + .../src/main/resources/bootstrap-local.yml | 1 + .../src/main/resources/bootstrap-prod.yml | 3 +- .../src/main/resources/bootstrap-test.yml | 1 + .../src/main/resources/bootstrap-uat.yml | 1 + .../mapper/order/ShopOrderBaseMapper.xml | 1 + 27 files changed, 652 insertions(+), 228 deletions(-) delete mode 100644 mall-common/src/main/java/com/suisung/mall/common/service/CommonService.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java delete mode 100644 mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonServiceImpl.java diff --git a/mall-account/src/main/java/com/suisung/mall/account/controller/LoginController.java b/mall-account/src/main/java/com/suisung/mall/account/controller/LoginController.java index 4300e777..0fd10c51 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/controller/LoginController.java +++ b/mall-account/src/main/java/com/suisung/mall/account/controller/LoginController.java @@ -7,12 +7,14 @@ import cn.hutool.json.JSONObject; import com.suisung.mall.account.service.AccountUserBaseService; import com.suisung.mall.account.service.AccountUserInfoService; import com.suisung.mall.common.api.CommonResult; +import com.suisung.mall.common.api.ResultCode; import com.suisung.mall.common.constant.AuthConstant; import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.RedisConstant; import com.suisung.mall.common.pojo.req.WxUserInfoReq; import com.suisung.mall.common.service.GeTuiPushService; import com.suisung.mall.common.service.impl.BaseControllerImpl; +import com.suisung.mall.common.service.impl.CommonService; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.common.utils.UserInfoService; @@ -253,6 +255,11 @@ public class LoginController extends BaseControllerImpl { return CommonResult.failed("缺少必要参数!"); } + // 检查输入字符是不是包含 sql 注入特征,如果包含不给以通过 + if (!CommonService.isValidInput(userMobile, randKey, verifyCode)) { + return CommonResult.failed(ResultCode.VALIDATE_INPUTS); + } + String cid = paramJSON.getStr("cid"); String osType = paramJSON.getStr("osType"); diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/AccountUserBaseService.java b/mall-account/src/main/java/com/suisung/mall/account/service/AccountUserBaseService.java index cc0417f6..4b0ea07f 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/AccountUserBaseService.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/AccountUserBaseService.java @@ -87,10 +87,19 @@ public interface AccountUserBaseService extends IBaseService { * @param user_is_admin * @return */ - AccountUserBase getByAccount(String user_account, Integer user_is_admin); + AccountUserBase getByAccountAndType(String user_account, Integer user_is_admin); /** - * 根据账号获取一条记录 + * 根据账号获取一条普通账号记录 + * + * @param user_account + * @return + */ + AccountUserBase getNormalByAccount(String user_account); + + + /** + * 根据账号获取一条账号信息(不限于管理员和普通会员) * * @param user_account * @return diff --git a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java index 803ff064..82566c52 100644 --- a/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java +++ b/mall-account/src/main/java/com/suisung/mall/account/service/impl/AccountUserBaseServiceImpl.java @@ -54,6 +54,7 @@ import com.suisung.mall.common.pojo.dto.SmsDto; import com.suisung.mall.common.pojo.req.WxUserInfoReq; import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.service.MessageService; +import com.suisung.mall.common.service.impl.CommonService; import com.suisung.mall.common.utils.*; import com.suisung.mall.common.utils.constbank.RSAUtil; import com.suisung.mall.common.utils.phone.PhoneNumberUtils; @@ -1195,6 +1196,11 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.eq("bind_id", bind_id).eq("bind_type", BindCode.MOBILE); @@ -2328,6 +2351,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); if (user_is_admin == null) { user_is_admin = CommonConstant.USER_TYPE_NORMAL; @@ -2349,8 +2372,21 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_account", user_account) + .orderByAsc("user_id"); + return findOne(queryWrapper); } /** @@ -2482,7 +2518,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl wrapper = new QueryWrapper() .eq("user_id", accountUserBindGeTui.getUserId()) .eq("os_type", osType) + .eq("user_type", accountUserBindGeTui.getUserType()) .eq("status", CommonConstant.Enable) .orderByDesc("id"); diff --git a/mall-common/src/main/java/com/suisung/mall/common/api/ResultCode.java b/mall-common/src/main/java/com/suisung/mall/common/api/ResultCode.java index 378b50dc..6f468711 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/api/ResultCode.java +++ b/mall-common/src/main/java/com/suisung/mall/common/api/ResultCode.java @@ -9,6 +9,7 @@ public enum ResultCode implements IErrorCode { SUCCESS(0, 200, "操作成功!", "success"), FAILED(0, 250, "操作失败!", "failed"), VALIDATE_FAILED(0, 250, "参数检验失败!", "failed"), + VALIDATE_INPUTS(0, 250, "参数不符合规范!", "failed"), UNAUTHORIZED(30, 250, "暂未登录或token已经过期!", "failed"), FORBIDDEN(0, 250, "没有相关权限!", "failed"), NOT_IS_PLATFORM(0, 250, "非平台管理员账号,没有相关权限!", "failed"), @@ -37,29 +38,29 @@ public enum ResultCode implements IErrorCode { I18nUtil._("远程调用异常!") I18nUtil._("未设置支付密码!") */ - private long code; + private final long code; private long status; - private String message; + private final String message; private String msg; - private ResultCode(long code, String message) { + ResultCode(long code, String message) { this.code = code; this.message = message; } - private ResultCode(long code, long status, String message) { + ResultCode(long code, long status, String message) { this.code = code; this.status = status; this.message = message; } - private ResultCode(long code, String message, String msg) { + ResultCode(long code, String message, String msg) { this.code = code; this.message = message; this.msg = msg; } - private ResultCode(long code, long status, String message, String msg) { + ResultCode(long code, long status, String message, String msg) { this.code = code; this.status = status; this.message = message; 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 a991b935..d322f3ac 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 @@ -76,11 +76,12 @@ public class CommonConstant { * * mchRetrunOrderList-商家退款订单列表 */ public static final String PUSH_MSG_CATE_EC = "mchContract"; - + public static final String PUSH_MSG_CATE_CREATE_SF_SHOP = "createSFExpress"; public static final String PUSH_MSG_CATE_MCH_ORDER_DETAIL = "mchOrderDetail"; public static final String PUSH_MSG_CATE_MCH_ONLINE_ORDER_LIST = "mchOnLineOrderList"; public static final String PUSH_MSG_CATE_MCH_ABNORMAL_ORDER_LIST = "mchAbnormalOrderList"; public static final String PUSH_MSG_CATE_MCH_RETURN_ORDER_LIST = "mchRetrunOrderList"; public static final String CONF_KEY_SAME_CITY_ORDER_EXPIRE_SECONDS = "sameCityOrderExpireSeconds"; + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/account/AccountUserBase.java b/mall-common/src/main/java/com/suisung/mall/common/modules/account/AccountUserBase.java index cc3eb67e..dadeb4b4 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/account/AccountUserBase.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/account/AccountUserBase.java @@ -12,6 +12,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.Date; import java.util.List; /** @@ -85,5 +86,11 @@ public class AccountUserBase implements Serializable { @ApiModelProperty(value = "rid") private Integer rid; + @ApiModelProperty(value = "新建时间") + private Date created_at; + + @ApiModelProperty(value = "更新时间") + private Date updated_at; + } diff --git a/mall-common/src/main/java/com/suisung/mall/common/service/CommonService.java b/mall-common/src/main/java/com/suisung/mall/common/service/CommonService.java deleted file mode 100644 index 1176bd03..00000000 --- a/mall-common/src/main/java/com/suisung/mall/common/service/CommonService.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. - * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. - * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. - * Vestibulum commodo. Ut rhoncus gravida arcu. - */ - -package com.suisung.mall.common.service; - -/** - * 通用服务接口 - */ -public interface CommonService { - - - /** - * 尝试获取分布式锁 - * - * @param lockKey 锁的key - * @param expireSeconds 锁过期时间(秒) - * @return 锁标识(解锁时需用),加锁失败返回null - */ - String tryDistributedLock(String lockKey, long expireSeconds); - - /** - * 释放分布式锁 - * - * @param lockKey 锁的key - * @param lockValue 加锁时返回的value,确保只有持有锁的线程能解锁 - * @return 是否释放成功 - */ - boolean releaseLock(String lockKey, String lockValue); -} diff --git a/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java b/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java new file mode 100644 index 00000000..d6d5f342 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonService.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.service.impl; + +import com.suisung.mall.common.api.StateCode; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.regex.Pattern; + +@Slf4j +@Service +public class CommonService { + + // 预编译SQL注入特征正则(静态初始化,仅加载一次) + private static final Pattern[] INJECTION_PATTERNS; + + static { + // SQL注入核心特征库 + String[] sqlFeatures = { + "\\bselect\\b", "\\binsert\\b", "\\bupdate\\b", "\\bdelete\\b", + "\\bdrop\\b", "\\btruncate\\b", "\\balter\\b", "\\bunion\\b", + "\\bexec\\b", "\\bdeclare\\b", "\\bcall\\b", "\\bcreate\\b", + "\\-\\-", "\\#", "/\\*", "\\*/", "'", "\"", + "\\(\\s*or\\s*\\d+", "\\(\\s*and\\s*\\d+", + "or\\s+\\d+=\\d+", "and\\s+\\d+=\\d+", + "union\\s+select", "union\\+select", + "xp_", "sp_", "db_", + "\\bsleep\\(", "\\bdelay\\(", "\\bwaitfor\\b", + "\\bcast\\(", "\\bconvert\\(", "\\bchar\\(" + }; + + // 初始化正则数组(忽略大小写) + INJECTION_PATTERNS = new Pattern[sqlFeatures.length]; + for (int i = 0; i < sqlFeatures.length; i++) { + INJECTION_PATTERNS[i] = Pattern.compile(sqlFeatures[i], Pattern.CASE_INSENSITIVE); + } + } + + /** + * 判断是否为顺丰同城配送 + * + * @param deliveryTypeId 配送方式ID + * @return 是否为顺丰同城配送 + */ + public static boolean isSFExpress(Integer deliveryTypeId) { + // 当配送方式ID为空时,返回false + if (deliveryTypeId == null) { + return false; + } + + // 判断是否为顺丰同城配送类型 + return deliveryTypeId.equals(StateCode.DELIVERY_TYPE_SAME_CITY); + } + + /** + * 判断配送方式是否为普通配送 + * + * @param deliveryTypeId 配送方式ID + * @return 是否为普通配送 + */ + public static boolean isNormalExpress(Integer deliveryTypeId) { + // 当配送方式ID为空时,返回false + if (deliveryTypeId == null) { + return false; + } + + // 普通配送是指除了同城配送、自提和到店服务之外的配送方式 + return !deliveryTypeId.equals(StateCode.DELIVERY_TYPE_SAME_CITY) + && !deliveryTypeId.equals(StateCode.DELIVERY_TYPE_SELF_PICK_UP) + && !deliveryTypeId.equals(StateCode.DELIVERY_TYPE_IN_STORE_SERVICE); + } + + + /** + * 检测账号是否包含SQL注入特征 + * + * @param inputs 待检测的输入的字符串,可变参数 + * @return true-无注入风险,false-包含注入特征 + */ + public static boolean isValidInput(String... inputs) { + // 如果输入为null,认为无风险 + if (inputs == null) { + return true; + } + + // 检查每个输入参数 + for (String input : inputs) { + // 空值或空白字符串直接跳过验证,认为空字符串不包含SQL注入特征 + if (input == null || input.isEmpty()) { + continue; + } + + // 检测是否匹配任何注入特征 + for (Pattern pattern : INJECTION_PATTERNS) { + if (pattern.matcher(input).find()) { + return false; + } + } + } + + return true; + } + + public static void main(String[] args) { + System.out.println(isValidInput("", "+8618924071446")); + } +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonServiceImpl.java b/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonServiceImpl.java deleted file mode 100644 index c6397880..00000000 --- a/mall-common/src/main/java/com/suisung/mall/common/service/impl/CommonServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit. - * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. - * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. - * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. - * Vestibulum commodo. Ut rhoncus gravida arcu. - */ - -package com.suisung.mall.common.service.impl; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.script.DefaultRedisScript; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Collections; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -@Slf4j -@Service -public class CommonServiceImpl { - - @Lazy - @Resource - private RedisTemplate redisTemplate; - - /** - * 尝试获取分布式锁 - *

- * 使用实例: - * String lockKey = "order:123"; - * long expireSeconds = 10; - * String lockValue = commonServiceImpl.tryDistributedLock(lockKey, expireSeconds); - * if (lockValue != null) { - * try { - * // 执行业务逻辑 - * } finally { - * commonServiceImpl.releaseLock(lockKey, lockValue); - * } - * } else { - * // 获取锁失败,做相应处理 - * } - * - * @param lockKey 锁的key - * @param expireSeconds 锁过期时间(秒) - * @return 锁标识(解锁时需用),加锁失败返回null - */ - public String tryDistributedLock(String lockKey, long expireSeconds) { - String lockValue = UUID.randomUUID().toString(); - try { - Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, expireSeconds, TimeUnit.SECONDS); - return Boolean.TRUE.equals(success) ? lockValue : null; - } catch (Exception e) { - // 记录异常日志,实际项目可用Logger - e.printStackTrace(); - return null; - } - } - - /** - * 释放分布式锁 - * - * @param lockKey 锁的key - * @param lockValue 加锁时返回的value,确保只有持有锁的线程能解锁 - * @return 是否释放成功 - */ - public boolean releaseLock(String lockKey, String lockValue) { - String luaScript = - "if redis.call('get', KEYS[1]) == ARGV[1] then " + - " return redis.call('del', KEYS[1]) " + - "else " + - " return 0 " + - "end"; - try { - DefaultRedisScript script = new DefaultRedisScript<>(luaScript, Long.class); - Long result = (Long) redisTemplate.execute(script, Collections.singletonList(lockKey), lockValue); - return result != null && result > 0; - } catch (Exception e) { - log.error("释放分布式锁异常,key={}, error={}", lockKey, e.getMessage(), e); - return false; - } - } -} 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 1af3ad70..005c1ce3 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 @@ -65,11 +65,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { private static final boolean init = false; private static final String lklSuccessCode = "000000"; private static final String lklSacsSuccessCode = "SACS0000"; - // 可选的两个参数,不同的店铺商家,可以数据库里配置不同的商户号和终端号 -// @Value("${lakala.merchant_no}") -// public String merchantNo; // 拉卡拉分配的商户号 -// @Value("${lakala.term_no}") -// public String termNo; // 拉卡拉分配的终端号码 @Value("${lakala.server_url}") private String serverUrl; //服务地址 @@ -104,12 +99,15 @@ public class LakalaApiServiceImpl implements LakalaApiService { @Autowired private ShopService shopService; + @Lazy @Autowired private LklLedgerMemberService lklLedgerMemberService; + @Lazy @Autowired private LklLedgerReceiverService lklLedgerReceiverService; + @Lazy @Autowired private LklLedgerMerReceiverBindService lklLedgerMerReceiverBindService; @@ -125,16 +123,6 @@ public class LakalaApiServiceImpl implements LakalaApiService { @Resource private ShopMessageTemplateService shopMessageTemplateService; -// @Lazy -// @Resource -// private -// EsignContractService esignContractService; -// -// @Lazy -// @Resource -// private EsignContractFillingFileService esignContractFillingFileService; - - @Lazy @Resource private ShopStoreBaseService shopStoreBaseService; @@ -155,6 +143,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { @Resource private PushMessageService pushMessageService; + @Lazy @Resource private OssService ossService; @@ -533,7 +522,7 @@ public class LakalaApiServiceImpl implements LakalaApiService { JSONObject respData = respBody.getJSONObject("resp_data"); if (respData == null) { - errMsg = "申请入网电子合同失败,返回数据有误"; + errMsg = "申请入网电子合同失败,无data返回数据!"; shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, errMsg); return Pair.of(false, errMsg); } @@ -789,13 +778,12 @@ public class LakalaApiServiceImpl implements LakalaApiService { // 更新商家入驻表的合同编号,和签署地址,更改状态 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); + errMsg = resultPair.getSecond(); shopMchEntryService.updateMerchEntryApprovalByMchId(lklLedgerEc.getMch_id(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, errMsg); + log.error(errMsg); throw new ApiException(errMsg); } 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 7e52c789..ab084b2c 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 @@ -504,7 +504,6 @@ public class LklTkServiceImpl { urlPath = "/registration/merchant"; } -// String urlPath = isProd() ? "/registration/merchant" : "/sit/htkregistration/merchant"; try { logger.info("进件请求参数:{}", JSONUtil.toJsonStr(formData)); @@ -541,6 +540,7 @@ public class LklTkServiceImpl { } + shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), "", CommonConstant.MCH_APPR_STA_LKL_NOPASS, "商户进件:提交进件成功,请等待审核!"); return Pair.of(true, "提交进件成功,请等待审核!"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index 95fb168e..3d866405 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -59,12 +59,14 @@ import com.suisung.mall.common.modules.user.*; import com.suisung.mall.common.pojo.dto.StandardAddressDTO; import com.suisung.mall.common.pojo.dto.WxOrderBaseInfoDTO; import com.suisung.mall.common.pojo.req.*; +import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.pojo.to.MsgTO; import com.suisung.mall.common.pojo.to.PayMoneyTO; import com.suisung.mall.common.pojo.to.PayPointTO; import com.suisung.mall.common.pojo.to.UserLevelTO; import com.suisung.mall.common.pojo.vo.ShopStoreOrderProductPrintVO; import com.suisung.mall.common.service.MessageService; +import com.suisung.mall.common.service.impl.CommonService; import com.suisung.mall.common.utils.*; import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.activity.service.*; @@ -92,6 +94,7 @@ import com.suisung.mall.shop.order.vo.OrderReturnInputVo; import com.suisung.mall.shop.order.vo.OrderReturnItemInputVo; import com.suisung.mall.shop.product.pojo.vo.FixOrderVo; import com.suisung.mall.shop.product.service.*; +import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.*; import com.suisung.mall.shop.sync.service.SyncThirdDataService; import com.suisung.mall.shop.user.service.*; @@ -144,6 +147,7 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser; public class ShopOrderBaseServiceImpl extends BaseServiceImpl implements ShopOrderBaseService { private final Logger logger = LoggerFactory.getLogger(ShopOrderBaseServiceImpl.class); + @Lazy @Autowired private ShopOrderBaseMapper shopOrderBaseMapper; @Lazy @@ -152,32 +156,43 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl { // 处理物流轨迹信息(仅限快递配送且已发货/已完成订单) - if (StateCode.DELIVERY_TYPE_SELF_PICK_UP != order.getDelivery_type_id() - && StateCode.DELIVERY_TYPE_SAME_CITY != order.getDelivery_type_id() - && (StateCode.ORDER_STATE_FINISH == order.getOrder_state_id() || StateCode.ORDER_STATE_SHIPPED == order.getOrder_state_id())) { - try { - order.setLogistics_traces(kdApiExpressSearchService.getLogisticsTraces(order.getOrder_id())); - } catch (Exception e) { - logger.error("获取物流轨迹失败,订单ID:{}", order.getOrder_id(), e); + Integer orderStateId = order.getOrder_state_id(); + Integer deliveryTypeId = order.getDelivery_type_id(); + + if (orderStateId != null && deliveryTypeId != null) { + // 处理普通快递物流轨迹 + if (CommonService.isNormalExpress(deliveryTypeId) + && orderStateId >= StateCode.ORDER_STATE_SHIPPED + && orderStateId <= StateCode.ORDER_STATE_FINISH) { + try { + order.setLogistics_traces(kdApiExpressSearchService.getLogisticsTraces(order.getOrder_id())); + } catch (Exception e) { + logger.error("获取物流轨迹失败,订单ID:{}", order.getOrder_id(), e); + } + } + // 处理顺丰同城物流轨迹 + else if (CommonService.isSFExpress(deliveryTypeId) + && orderStateId >= StateCode.ORDER_STATE_SHIPPED + && orderStateId <= StateCode.ORDER_STATE_FINISH + && order.getSf_order_info() != null + && order.getSf_order_info().getFeed() == null) { + // 获取顺丰同城的物流轨迹 + Map params = new HashMap<>(); + params.put("order_id", order.getSf_order_info().getSf_order_id()); + try { + ThirdApiRes feedRes = sfExpressApiService.listOrderFeed(params); + logger.info("获取配送员物流轨迹:{}", feedRes); + if (feedRes != null && feedRes.getError_code() != null && feedRes.getError_code().equals(0)) { + JSONObject result = JSONUtil.parseObj(feedRes.getResult()); + if (result != null && result.get("feed") != null) { + order.getSf_order_info().setFeed(JSONUtil.toJsonStr(result.get("feed"))); + } + } + } catch (Exception e) { + logger.error("获取顺丰同城物流轨迹失败,订单ID:{}", order.getOrder_id(), e); + } } } @@ -8630,21 +8720,74 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl= StateCode.ORDER_STATE_SHIPPED + && orderStateId <= StateCode.ORDER_STATE_FINISH) { + try { + orderDetail.setLogistics_traces(kdApiExpressSearchService.getLogisticsTraces(orderDetail.getOrder_id())); + } catch (Exception e) { + logger.error("获取普通快递物流轨迹失败,订单ID:{}", orderDetail.getOrder_id(), e); + } + } + // 处理顺丰同城物流轨迹 + else if (CommonService.isSFExpress(deliveryTypeId) + && orderStateId >= StateCode.ORDER_STATE_SHIPPED + && orderStateId <= StateCode.ORDER_STATE_FINISH + && orderDetail.getSf_order_info() != null + && orderDetail.getSf_order_info().getFeed() == null) { + // 获取顺丰同城的物流轨迹 + Map params = new HashMap<>(); + params.put("order_id", orderDetail.getSf_order_info().getSf_order_id()); + try { + ThirdApiRes feedRes = sfExpressApiService.listOrderFeed(params); + logger.info("获取顺丰同城配送员物流轨迹:{}", feedRes); + if (feedRes != null && feedRes.getError_code() != null && feedRes.getError_code().equals(0)) { + JSONObject result = JSONUtil.parseObj(feedRes.getResult()); + if (result != null && result.get("feed") != null) { + orderDetail.getSf_order_info().setFeed(JSONUtil.toJsonStr(result.get("feed"))); + } + } + } catch (Exception e) { + logger.error("获取顺丰同城物流轨迹失败,订单ID:{}", orderDetail.getOrder_id(), e); + } + } + } + + // 格式化取货号 + orderDetail.setOrder_pickup_num_str(fmtPickNum(orderDetail.getOrder_pickup_num())); + + return orderDetail; } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java index 736e3835..b214a8d0 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderReturnServiceImpl.java @@ -1779,6 +1779,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl emitters = new CopyOnWriteArrayList<>(); + //private final CopyOnWriteArrayList emitters = new CopyOnWriteArrayList<>(); + @Lazy @Autowired private SFExpressApiService sfExpressApiService; diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java index e7769e42..bda31009 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/SFExpressApiService.java @@ -16,6 +16,21 @@ import java.util.Map; public interface SFExpressApiService { + /** + * 创建顺丰同店铺-连锁店铺 + * + * @param storeId 商家门店ID + * @param shopName 店名 + * @param cityName 城市 + * @param shopAddress 店铺详细地址 + * @param contactName 店铺联系人 + * @param contactPhone 店铺电话 + * @param longitude 经度 + * @param latitude 纬度 + * @return + */ + Pair createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude); + /** * (店铺)创建顺丰同城订单 * diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java index abb88d60..e027402a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java @@ -23,6 +23,7 @@ import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.modules.store.ShopStoreSfOrder; import com.suisung.mall.common.pojo.req.*; import com.suisung.mall.common.pojo.res.ThirdApiRes; +import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CommonUtil; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.JsonUtil; @@ -34,6 +35,7 @@ import com.suisung.mall.shop.sfexpress.service.SFExpressApiService; import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService; import com.suisung.mall.shop.store.service.ShopStoreSfOrderService; import com.suisung.mall.shop.wechat.service.WxOrderShippingService; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -59,16 +61,22 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { private String appKey; @Value("${sf-express.dev_id}") private Integer devId; + @Value("${sf-express.supplier_id}") + private Integer supplierId; + @Lazy @Autowired private ShopStoreSfOrderService shopStoreSfOrderService; + @Lazy @Autowired private ShopOrderBaseService shopOrderBaseService; + @Lazy @Autowired private ShopOrderInfoService shopOrderInfoService; + @Lazy @Autowired private ShopOrderReturnService shopOrderReturnService; @@ -88,6 +96,100 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // @Autowired // private GeTuiPushService geTuiPushService; + /** + * 创建顺丰同店铺-连锁店铺 + * + * @param storeId 商家门店ID + * @param shopName 店名 + * @param cityName 城市 + * @param shopAddress 店铺详细地址 + * @param contactName 店铺联系人 + * @param contactPhone 店铺电话 + * @param longitude 经度 + * @param latitude 纬度 + * @return + */ + @Override + public Pair createSfExpressShop(Integer storeId, String shopName, String cityName, String shopAddress, String contactName, String contactPhone, String longitude, String latitude) { + logger.info("开始创建顺丰同城店铺"); + + if (CheckUtil.isEmpty(storeId) && StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) { + return Pair.of(false, "顺丰同城店铺,缺少必要参数!"); + } + + ShopStoreSameCityTransportBase shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + if (shopStoreSameCityTransportBase == null) { + Pair result = shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId); + if (!result.getFirst()) { + return result; + } + + shopStoreSameCityTransportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId)); + } + + if (CheckUtil.isNotEmpty(shopStoreSameCityTransportBase.getShop_id())) { + return Pair.of(true, "顺丰同城已创建过该店铺!"); + } + + Map params = buildCommonParams(); + params.put("supplier_id", supplierId); + params.put("out_shop_id", storeId); + params.put("shop_name", shopName); //店铺名称不可重复 + params.put("city_name", cityName); + + //1:快餐 2:药品 3:百货 4:脏衣服收 5:干净衣服派 6:生鲜 8:高端饮品 9:现场勘验 10:快递 12:文件 13:蛋糕 14:鲜花 15:数码 16:服装 17: + //汽配 18:珠宝 20:披萨 21:中餐 22:水产 27:专人直送 32:中端饮品 33:便利店 34:面包糕点 35:火锅 36:证照 40:烧烤小龙虾 41:外部落地配 47:烟酒 + //行 48:成人用品 99:其他 + params.put("shop_product_types", "1,3"); // 店铺经营类型(支持多品类,枚举值见下方) + + params.put("shop_type", 1);// 店铺类型:1-普通型 2-平台型 + params.put("shop_address", shopAddress); + params.put("longitude", longitude); + params.put("latitude", latitude); + params.put("shop_contact_name", contactName); + params.put("shop_contact_phone", contactPhone); + + // 请求参数转换 json 字符串参数 + String paramJSON = JsonUtil.toJSONString(params); + // 根据参数生成请求签名 + String send_url = buildUrl("createShop", paramJSON); + + // 向顺丰同城 创建一个顺丰同城配送订单 + String retRespStr = HttpUtil.post(send_url, paramJSON); + if (StrUtil.isEmpty(retRespStr)) { + logger.error("创建顺丰同城店铺异常,无返回值!"); + return Pair.of(false, "创建顺丰同城店铺异常,无返回值!"); + } + + JSONObject sfExpressApiRes = JSONUtil.parseObj(retRespStr); + if (sfExpressApiRes == null) { + logger.error("创建顺丰同城店铺异常,返回值有误!!"); + return Pair.of(false, "创建顺丰同城店铺异常,返回值有误!"); + } + + + if (!sfExpressApiRes.get("error_code").equals(0) || sfExpressApiRes.get("result") == null) { + logger.error("创建顺丰同城店铺失败: {}", sfExpressApiRes.get("error_msg")); + return Pair.of(false, Convert.toStr(sfExpressApiRes.get("error_msg"))); + } + + // TODO 判断状态 + + String sfShopId = sfExpressApiRes.getByPath("result.shop_id").toString(); + + shopStoreSameCityTransportBase.setShop_id(sfShopId); + shopStoreSameCityTransportBaseService.saveOrUpdateShopStoreSameCityTransportBase(shopStoreSameCityTransportBase); + + // 个推推送消息 +// JSONObject payload = new JSONObject(); +// payload.put("category", CommonConstant.PUSH_MSG_CATE_CREATE_SF_SHOP); +// payload.put("sfShopId", sfShopId); +// pushMessageService.sendMessage(null, sfShopId, "您有一笔新的订单", "您有一笔同城订单[" + shopOrderId + "],请及时处理。", payload); +// + + return Pair.of(true, "创建顺丰同城店铺成功!"); + } + @Override public ThirdApiRes createOrder(String shopOrderId) { // 组织请求参数 @@ -583,6 +685,17 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return new ThirdApiRes().fail(-1, "取消订单业务处理失败!"); } + // 获取顺丰同城的物流轨迹 + Map params = new HashMap<>(); + params.put("order_id", sfOrderId); + ThirdApiRes feedRes = listOrderFeed(params); + if (feedRes != null && feedRes.getError_code().equals(0)) { + JSONObject result = JSONUtil.parseObj(feedRes.getResult()); + if (result != null && result.get("feed") != null) { + shopStoreSfOrder.setFeed(JSONUtil.toJsonStr(result.get("feed"))); + } + } + // 个推推送消息 JSONObject payload = new JSONObject(); payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL); @@ -616,11 +729,12 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 更改顺丰同城订单状态 ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData); + String shopOrderId = shopStoreSfOrder.getShop_order_id(); // 获取顺丰同城的物流轨迹 Map params = new HashMap<>(); - String orderId = shopStoreSfOrder.getShop_order_id(); - params.put("order_id", orderId); + String sfOrderId = shopStoreSfOrder.getSf_order_id(); // 顺丰订单Id + params.put("order_id", sfOrderId); ThirdApiRes feedRes = listOrderFeed(params); // logger.debug("获取配送员物流轨迹:{}", feedRes); if (feedRes != null && feedRes.getError_code().equals(0)) { @@ -689,8 +803,8 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { // 消息推送 JSONObject payload = new JSONObject(); payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ORDER_DETAIL); - payload.put("orderId", orderId); - pushMessageService.noticeMerchantEmployeeOrderAction(null, orderId, "", "顺丰同城订单[" + orderId + "]" + pushRemark, payload); + payload.put("orderId", shopOrderId); + pushMessageService.noticeMerchantEmployeeOrderAction(null, shopOrderId, "", "顺丰同城订单[" + shopOrderId + "]" + pushRemark, payload); return new ThirdApiRes().success("success"); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java index b615398b..15f6dc7a 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/store/service/ShopMchEntryService.java @@ -73,13 +73,15 @@ public interface ShopMchEntryService { /** - * 检查手机和营业执照是否已经申请过? + * 检查商家是否申请过入驻(企业或个人的判断条件不一样的,企业判断营业执照号+手机号,个人判断个人身份证号+手机号) * - * @param mobile - * @param bizLicenseNumber + * @param entityType 入驻主体类型,企业或个人:1-企业;2-个人; + * @param contactMobile 联系人手机号 + * @param bizLicenseNumber 企业营业执照,企业必填 + * @param individualIdNumber 个人身份证号码,个人必填 * @return */ - Pair isApplied(String mobile, String bizLicenseNumber); + Pair isApplied(Integer entityType, String contactMobile, String bizLicenseNumber, String individualIdNumber); /** * 通过手机号获取商家入驻审核状态 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 43d399f6..b7ff396c 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 @@ -173,8 +173,22 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl isApplied = isApplied(loginMobile, record.getBiz_license_number()); + if (CheckUtil.isEmpty(record.getEntity_type())) { + return CommonResult.failed("请选择是企业还是个人"); + } + + + // 不管是企业或个人,只要没有填写联系人,就直接把商家手机号码作为联系人手机号码 + if (StrUtil.isBlank(record.getLegal_person_mobile())) { + record.setLegal_person_mobile(loginMobile); + } + + // 检查店铺是否已经申请过入驻(企业和个人判断条件是不一样的) + // * 检查商家是否已经申请过入驻 + // * 根据入驻主体类型(企业或个人)使用不同的判断条件: + // * - 企业:通过营业执照号+联系人手机号判断 + // * - 个人:通过个人身份证号+联系人手机号判断 + Pair isApplied = isApplied(record.getEntity_type(), record.getLegal_person_mobile(), record.getBiz_license_number(), record.getIndividual_id_number()); if (isApplied.getFirst()) { return CommonResult.failed(isApplied.getSecond()); } @@ -185,7 +199,6 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl 第一个值表示是否已申请(true表示已申请),第二个值为提示信息 */ @Override - public Pair isApplied(String mobile, String bizLicenseNumber) { - if (StrUtil.isBlank(mobile) && StrUtil.isBlank(bizLicenseNumber)) { - return Pair.of(false, "缺少必要参数!"); + public Pair isApplied(Integer entityType, String contactMobile, String bizLicenseNumber, String individualIdNumber) { + // 1. 参数校验:入驻主体类型不能为空 + if (CheckUtil.isEmpty(entityType)) { + return Pair.of(Boolean.FALSE, "请选择是企业还是个人"); } - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("status", CommonConstant.Enable); - - boolean isApplied = false; - String msg = ""; - - if (StrUtil.isNotBlank(mobile)) { - queryWrapper.eq("login_mobile", mobile); - isApplied = count(queryWrapper) > 0; - if (isApplied) msg = "手机已申请过入驻!"; - queryWrapper.clear(); - } - - if (StrUtil.isNotBlank(bizLicenseNumber)) { - queryWrapper.eq("biz_license_number", bizLicenseNumber); - boolean licenseApplied = count(queryWrapper) > 0; - if (licenseApplied) { - isApplied = true; - msg = StrUtil.isNotBlank(msg) ? "手机和营业执照已申请过入驻!" : "营业执照已申请过入驻!"; + // 2. 根据不同主体类型校验必要参数 + if (entityType.equals(CommonConstant.MCH_ENTITY_TYPE_QY)) { + // 企业类型:营业执照号和联系人手机号至少提供一个 + if (StrUtil.isBlank(contactMobile) && StrUtil.isBlank(bizLicenseNumber)) { + return Pair.of(Boolean.FALSE, "缺少企业营业执照或联系人手机号!"); } + } else if (entityType.equals(CommonConstant.MCH_ENTITY_TYPE_GR)) { + // 个人类型:身份证号和联系人手机号至少提供一个 + if (StrUtil.isBlank(contactMobile) && StrUtil.isBlank(individualIdNumber)) { + return Pair.of(Boolean.FALSE, "缺少个人身份证号或联系人手机号!"); + } + } else { + // 未知的主体类型 + return Pair.of(Boolean.FALSE, "不支持的入驻主体类型"); } - return Pair.of(isApplied, msg); + try { + // 3. 构建查询条件 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("entity_type", entityType) + .eq("status", CommonConstant.Enable); + + // 必须包含联系人手机号 + if (StrUtil.isBlank(contactMobile)) { + return Pair.of(Boolean.FALSE, "联系人手机号不能为空"); + } + queryWrapper.eq("legal_person_mobile", contactMobile); + + String msg = ""; + // 4. 根据主体类型设置额外查询条件和提示信息 + if (entityType.equals(CommonConstant.MCH_ENTITY_TYPE_QY)) { + // 企业类型:增加营业执照号查询条件 + if (StrUtil.isBlank(bizLicenseNumber)) { + return Pair.of(Boolean.FALSE, "企业营业执照号不能为空"); + } + queryWrapper.eq("biz_license_number", bizLicenseNumber); + msg = "营业执照号已提交过入驻"; + } else { + // 个人类型:增加身份证号查询条件 + if (StrUtil.isBlank(individualIdNumber)) { + return Pair.of(Boolean.FALSE, "个人身份证号不能为空"); + } + queryWrapper.eq("individual_id_number", individualIdNumber); + msg = "个人身份证已提交过入驻"; + } + + // 5. 执行查询并返回结果 + long count = count(queryWrapper); + boolean isApplied = count > 0; + + if (isApplied) { + return Pair.of(Boolean.FALSE, msg); + } + + return Pair.of(Boolean.TRUE, ""); + + } catch (Exception e) { + // 6. 异常处理:记录日志并返回错误信息 + log.error("检查商家入驻申请状态时发生异常: entityType={}, contactMobile={}, bizLicenseNumber={}, individualIdNumber={}", + entityType, contactMobile, bizLicenseNumber, individualIdNumber, e); + return Pair.of(Boolean.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 9e5fad0c..3a613221 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 @@ -1611,6 +1611,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl +