Compare commits

...

36 Commits
dev ... main

Author SHA1 Message Date
8af7ba4748 入驻增加两个字段,收银台图片和银行开户许可证 2025-12-31 21:34:29 +08:00
77afa952d7 控制平台导入权限问题解决 2025-12-31 20:46:14 +08:00
bdc0372f49 控制平台导入权限问题解决 2025-12-31 20:37:31 +08:00
db73ca67e9 店铺详情信息fix bug 2025-12-29 20:50:51 +08:00
a929635bfc 店铺详情信息fix bug 2025-12-29 20:50:28 +08:00
b7b57d04d0 远程调用 fix 修复入参问题,导致反射循环依赖。 2025-12-29 17:28:23 +08:00
e919a934dd 控制平台导入权限 2025-12-29 09:40:15 +08:00
7f0d3e9897 分店注册,增加账号密码参数 2025-12-28 23:00:43 +08:00
d9d9efd233 分店异步通知增加关键日志2 2025-12-27 12:11:49 +08:00
3e3a8a32a3 分店异步通知增加关键日志 2025-12-27 00:04:51 +08:00
50872500b3 同步会员新增user_longin信息 2025-12-26 15:16:39 +08:00
f8ca35d20c 分店逻辑增加,逻辑编写,拉卡拉增终,收到通知,创建分店,分店周边信息、账号、入驻信息等2 2025-12-26 00:07:27 +08:00
2ff93df44b 分店逻辑增加,逻辑编写,拉卡拉增终,收到通知,创建分店,分店周边信息、账号、入驻信息等 2025-12-25 17:28:27 +08:00
1897281b38 分店逻辑增加 2025-12-25 01:24:11 +08:00
43dacf4744 去除多余代码 2025-12-23 15:42:56 +08:00
352f936318 去除多余代码 2025-12-23 15:40:22 +08:00
fc780c3513 修改生成微信推广码 2025-12-23 15:37:20 +08:00
657dc8b4e3 装修商品选择返回商品图片,新增条形码item查询字段 2025-12-23 15:35:20 +08:00
a9532a1d2e 管理端查询分类去除过滤 2025-12-23 11:22:03 +08:00
144cf92c27 更改内部配送费计算方法 2025-12-23 11:09:21 +08:00
52ff9dabe0 更改内部配送费计算方法 2025-12-22 22:31:51 +08:00
9136af8a52 购物车,新增重试 2025-12-22 16:46:33 +08:00
d2746dc5b6 更换 公密钥 2025-12-20 00:10:48 +08:00
7c3e025d76 构造空数组,防止null 2025-12-19 11:02:27 +08:00
2040b57fb6 增加店铺自配送下单保存逻辑 2025-12-19 00:18:37 +08:00
cbc47d14e4 商品条码匹配补全问题修复 2025-12-18 16:24:19 +08:00
59274f9941 解决品牌问题以及商品条码自动上架 2025-12-18 10:48:22 +08:00
1157bf3229 商家app接口,增加店铺自提字段 2025-12-17 18:11:53 +08:00
2d50db41d0 Merge remote-tracking branch 'origin/main' 2025-12-17 16:59:04 +08:00
a23801eb31 店铺配送费设置增加平台商家id字段,平台增加保存 自配送,内部配送费字段 2025-12-17 16:58:46 +08:00
01dd0687de 解决空数据导致的前端不显示问题 2025-12-17 15:23:00 +08:00
1567742f84 能编辑的模板都不是再使用中 2025-12-17 11:53:51 +08:00
0e5a378706 店铺配送费设置增加平台商家id字段 2025-12-16 17:25:36 +08:00
f6bbf99c10 空白模板默认图片,返回创建对象 2025-12-16 16:27:12 +08:00
b31aabc085 测试数据库更改了端口和密码 2025-12-16 10:59:19 +08:00
951a1f3cf7 增加重新派单接口 2025-12-15 20:50:54 +08:00
67 changed files with 2466 additions and 361 deletions

View File

@ -11,6 +11,7 @@ import com.suisung.mall.common.utils.I18nUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -32,6 +33,7 @@ public class AccountBaseUserLevelController {
@Autowired
private AccountBaseUserLevelService accountBaseUserLevelService;
@Lazy
@Autowired
private AccountService accountService;

View File

@ -467,6 +467,11 @@ public class AccountController {
return accountUserBaseService.saveBatchAccountInfo(accountUserInfoList);
}
@RequestMapping(value = "/saveBatchAccountUserLogin", method = RequestMethod.POST)
public ThirdApiRes saveBatchAccountUserLogin(@RequestBody List<AccountUserLogin> accountUserLoginList) {
return accountUserBaseService.saveBatchAccountUserLogin(accountUserLoginList);
}
@RequestMapping(value = "/findOneAccountUserBase", method = RequestMethod.POST)
public AccountUserBase findOneAccountUserBase(@RequestBody AccountUserBase accountUserBase) {

View File

@ -31,6 +31,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -231,5 +232,17 @@ public class AccountUserBaseController extends BaseControllerImpl {
return CommonResult.success(accountUserBaseService.logout());
}
@ApiOperation("注册商家账号,项目之间远程调用")
@RequestMapping(value = "/merchant/inner-register", method = RequestMethod.POST)
public Pair<Boolean, String> merchantInnerRegister(@RequestParam("mobile") String mobile, @RequestParam("regPwd") String regPwd) {
return accountUserBaseService.merchantInnerRegister(mobile, regPwd);
}
@ApiOperation("更改分店商家的手机号(仅限于分店,尽量不要更高总店的手机号),项目之间远程调用")
@RequestMapping(value = "/change/merchant/login-mobile", method = RequestMethod.POST)
public Pair<Boolean, String> changeMerchantLoginMobile(@RequestParam("oldMobile") String oldMobile, @RequestParam("newMobile") String newMobile, @RequestParam("password") String password) {
return accountUserBaseService.changeMerchantLoginMobile(oldMobile, newMobile, password);
}
}

View File

@ -85,5 +85,17 @@ public class AccountUserBindConnectController {
return accountUserBindConnectService.getUserBindConnectUserIdByCondition(bind_id, bind_type, user_type);
}
/**
* 检查手机注册的商家是否存在(仅供内部调用)
*
* @param mobile
* @return
*/
@ApiOperation(value = "检查手机注册的商家是否存在(仅供内部调用)", notes = "检查手机注册的商家是否存在(仅供内部调用)")
@RequestMapping(value = "/is-merchant-exists", method = RequestMethod.POST)
public Integer isMerchantExists(@RequestParam(name = "mobile") String mobile) {
return accountUserBindConnectService.isMerchantExists(mobile);
}
}

View File

@ -4,6 +4,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.account.AccountUserLogin;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.core.web.service.IBaseService;
@ -296,4 +297,30 @@ public interface AccountUserBaseService extends IBaseService<AccountUserBase> {
* @return
*/
ThirdApiRes saveBatchAccountInfo(List<AccountUserInfo> accountUserInfoList);
/**
* 商家内部注册服务之间调用
*
* @param mobile 商家手机号
* @param regPwd 注册密码
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示提示信息
*/
Pair<Boolean, String> merchantInnerRegister(String mobile, String regPwd);
/**
* 更改分店商家的手机号(仅限于分店尽量不要更改总店的手机号)项目之间远程调用
*
* @param oldMobile 老的手机号
* @param newMobile 新的手机号
* @param password 新的登录密码可选
* @return Pair<Boolean, String> 操作结果和提示信息true表示成功false表示失败
*/
Pair<Boolean, String> changeMerchantLoginMobile(String oldMobile, String newMobile, String password);
/**
* 批量保存accountInfo
*
* @return
*/
ThirdApiRes saveBatchAccountUserLogin(List<AccountUserLogin> accountUserLoginList);
}

View File

@ -4,6 +4,7 @@ import cn.hutool.json.JSONObject;
import com.suisung.mall.common.modules.account.AccountUserBindConnect;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.core.web.service.IBaseService;
import java.util.List;
import java.util.Map;
@ -89,9 +90,17 @@ public interface AccountUserBindConnectService extends IBaseService<AccountUserB
*/
AccountUserBindConnect initAccountUserBindConnect(String bindId, Integer bindType, Integer userId, Integer userType);
List<AccountUserBindConnect> getAllBindPage(String bindTmpl,Integer pageNum, Integer pageSize);
List<AccountUserBindConnect> getAllBindPage(String bindTmpl, Integer pageNum, Integer pageSize);
long getAllBindCount(String bindTmpl);
void bindTmplId(JSONObject jsonObject);
/**
* 检查手机注册的商家是否存在
*
* @param mobile
* @return 1-存在2-不存在3-参数有误
*/
Integer isMerchantExists(String mobile);
}

View File

@ -97,7 +97,7 @@ import static com.suisung.mall.common.utils.I18nUtil._;
@Service
public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseMapper, AccountUserBase> implements AccountUserBaseService {
private final String VERIFY_CODE_KEY = "register:verifyCode:";
private final String VERIFY_CODE_KEY = RedisConstant.VERIFY_CODE_KEY; //"register:verifyCode:";
private final Logger logger = LoggerFactory.getLogger(AccountUserBaseServiceImpl.class);
@Autowired
private AuthService authService;
@ -1715,8 +1715,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
// 有手机参数优先手机注册
// if ((StrUtil.isNotBlank(user_mobile))
// || (CheckUtil.isMobile(user_account, user_intl) && StrUtil.equals(user_account, user_mobile))) {
if (StrUtil.isNotBlank(user_mobile) && CheckUtil.isMobile(user_mobile, user_intl)) {
if (StrUtil.isNotBlank(rand_key) && StrUtil.isNotBlank(verifyCode)) {
@ -1801,7 +1799,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
throw new ApiException(_("绑定账号失败"));
}
return user_base_row;
// throw new ApiException(_("用户已经存在,请更换用户名"));
} else {
// 检测到用户尚未注册立即新增用户基本信息和用户附加信息
String user_nickname = Convert.toStr(userInfo.get("user_nickname"), user_account);
@ -1816,7 +1814,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
// 密码加盐加密
user_password = SecureUtil.md5(user_salt + SecureUtil.md5(user_password));
user_base_reg_row.setUser_password(user_password);
// user_base_reg_row.setUser_password((BCrypt.hashpw(user_password)));
user_base_reg_row.setUser_nickname(user_nickname);
user_base_reg_row.setUser_state(user_state);
user_base_reg_row.setUser_key(user_key);
@ -1900,16 +1897,17 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
throw new ApiException(ResultCode.FAILED);
}
// 远程调用异常忽略掉
try {
// User_Resource初始化 用户积分
if (!payService.initUserPoints(user_id)) {
log.error("初始化用户积分失败");
// throw new ApiException(ResultCode.FAILED);
}
// 初始化用户经验表
if (!accountUserInfoService.initUserExperience(user_id)) {
log.error("初始化用户经验表失败");
// throw new ApiException(ResultCode.FAILED);
}
@ -1925,7 +1923,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
addSourceUserId(user_id, user_parent_id);
}
//todo 分享券
// 分享券活动id
Integer activityId = Convert.toInt(getParameter("activity_id"));
if (CheckUtil.isEmpty(activityId) && CheckUtil.isNotEmpty(activity_id)) {
@ -1953,7 +1950,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
// 如果是商家首次注册 恭喜您成功注册了商家账号您的初始密码为${password}密码可登录商家版 APP登录后请尽快修改密码
Map<String, Object> smsArgs = new HashMap<>();
smsArgs.put("password", user_password_src);
sendSmsMessage(PhoneNumberUtils.cleanPhoneNumber(user_mobile), "SMS_496910525", smsArgs); // SMS_496910525
sendSmsMessage(PhoneNumberUtils.cleanPhoneNumber(user_mobile), "SMS_496910525", smsArgs);
}
//初次注册发送消息
@ -3221,6 +3218,20 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
* @return
*/
public CommonResult doMobileBindLogin(String user_mobile, Integer userType, String cid, String osType) {
return doMobileBindLogin(user_mobile, "", userType, cid, osType);
}
/**
* 商家版app入驻商家手机号绑定登录
*
* @param user_mobile
* @param regPwd 注册用途
* @param userType
* @param cid
* @param osType
* @return
*/
public CommonResult doMobileBindLogin(String user_mobile, String regPwd, Integer userType, String cid, String osType) {
if (StrUtil.isBlank(user_mobile) || userType == null) {
return CommonResult.failed("缺少必要参数!");
}
@ -3247,8 +3258,11 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
userInfo.put("user_account", user_mobile);
userInfo.put("user_mobile", user_mobile);
userInfo.put("user_is_admin", userType); // 商家入驻注册
// 随机数明文密码
String user_password = com.suisung.mall.common.utils.StringUtils.random(6, com.suisung.mall.common.utils.StringUtils.RandomType.STRING);
String user_password = regPwd;
if (StrUtil.isBlank(user_password)) {
// 随机数明文密码
user_password = com.suisung.mall.common.utils.StringUtils.random(6, com.suisung.mall.common.utils.StringUtils.RandomType.STRING);
}
userInfo.put("user_password", user_password);
userInfo.put("is_admin", userType); // 商家入驻注册
@ -3267,17 +3281,162 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
params.put("username", accountUserBase.getUser_account());
params.put("password", "");
params.put("user_mobile", user_mobile);
params.put("is_merch", "1"); // 是否为商家入驻 1-其他-
params.put("is_merch", CommonConstant.Enable.toString()); // 是否为商家入驻 1-其他-
if (StrUtil.isNotBlank(cid)) {
params.put("cid", cid); // 个推客户端Id
params.put("os_type", osType);// 个推客系统类别 1-Android2-iOS;3-微信小程序
// logger.info("推送参数2 cid:{} osType{}", cid, osType);
}
return login(params);
}
/**
* 商家内部注册服务之间调用
*
* @param mobile 商家手机号
* @param regPwd 注册明文密码
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示提示信息
*/
@Override
public Pair<Boolean, String> merchantInnerRegister(String mobile, String regPwd) {
log.info("商家内部注册开始,手机号: {}", mobile);
// 1. 参数校验
if (StrUtil.isBlank(mobile)) {
log.warn("商家内部注册失败:手机号为空");
return Pair.of(false, "手机号不能为空");
}
try {
// 2. 转换手机号格式添加国家区号
String convertedMobile = PhoneNumberUtils.convZhPhoneNumber(mobile);
// 3. 检查手机号是否已注册为商家
Integer isExists = accountUserBindConnectService.isMerchantExists(convertedMobile);
if (CommonConstant.Enable.equals(isExists)) {
log.warn("商家内部注册失败:手机号已注册,手机号: {}", convertedMobile);
return Pair.of(false, "该手机号已注册!");
}
// 4. 执行手机号绑定登录注册商家账号
CommonResult result = doMobileBindLogin(convertedMobile, regPwd, CommonConstant.USER_TYPE_MCH, null, null);
// 5. 检查注册结果
if (result == null || result.getCode() != ResultCode.SUCCESS.getCode()) {
String errorMsg = result != null ? result.getMsg() : "注册结果为空";
log.error("商家账号注册失败:{},手机号: {}", errorMsg, convertedMobile);
return Pair.of(false, "商家账号注册失败:" + errorMsg);
}
log.info("商家内部注册成功,手机号: {}", convertedMobile);
return Pair.of(true, "商家注册成功");
} catch (Exception e) {
log.error("商家内部注册异常,手机号: {}", mobile, e);
return Pair.of(false, "商家注册失败:" + e.getMessage());
}
}
/**
* 更改分店商家的手机号(仅限于分店尽量不要更改总店的手机号)项目之间远程调用
*
* @param oldMobile 老的手机号
* @param newMobile 新的手机号
* @param password 新的登录密码可选
* @return Pair<Boolean, String> 操作结果和提示信息true表示成功false表示失败
*/
@Override
public Pair<Boolean, String> changeMerchantLoginMobile(String oldMobile, String newMobile, String password) {
log.debug("开始更改商家登录手机号,老手机号:{},新手机号:{},是否需要设置密码:{}", oldMobile, newMobile, StrUtil.isNotBlank(password));
try {
// 验证输入参数
if (StrUtil.isBlank(oldMobile) || StrUtil.isBlank(newMobile)) {
log.warn("手机号参数为空,老手机号:{},新手机号:{}", oldMobile, newMobile);
return Pair.of(false, "手机号不能为空");
}
// 格式化手机号添加国际区号
String formattedOldMobile = PhoneNumberUtils.convZhPhoneNumber(oldMobile);
String formattedNewMobile = PhoneNumberUtils.convZhPhoneNumber(newMobile);
log.debug("格式化后的手机号:老:{} 新:{}", formattedOldMobile, formattedNewMobile);
// 查询老手机号是否绑定商家账号
AccountUserBindConnect bindConnect = bindConnectService.getBindByBindId(formattedOldMobile, BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (bindConnect == null) {
log.warn("该老手机号未绑定商家账号,手机号:{}", formattedOldMobile);
return Pair.of(false, "该老手机号未绑定商家账号,无法进行更换");
}
// 获取用户信息
Integer userId = bindConnect.getUser_id();
log.debug("绑定记录中的用户ID{}", userId);
AccountUserBase userBase = get(userId);
if (userBase == null) {
log.warn("用户信息不存在用户ID{}", userId);
return Pair.of(false, "用户信息不存在,无法进行更换");
}
// 验证用户确实是商家类型
if (!userBase.getUser_is_admin().equals(CommonConstant.USER_TYPE_MCH)) {
log.warn("该账号不是商家账号用户ID{},用户类型:{}", userId, userBase.getUser_is_admin());
return Pair.of(false, "该账号不是商家账号,无法进行更换");
}
// 检查目标手机号是否已被其他商家账号使用
AccountUserBase existingNewUser = getByAccountAndType(formattedNewMobile, CommonConstant.USER_TYPE_MCH);
if (existingNewUser != null && !existingNewUser.getUser_id().equals(userId)) {
log.warn("目标手机号已被其他商家账号使用,手机号:{}用户ID{}", formattedNewMobile, existingNewUser.getUser_id());
return Pair.of(false, "该手机号已被其他商家账号使用");
}
// 检查新手机号是否已被其他商家绑定
AccountUserBindConnect newBindConnect = bindConnectService.getBindByBindId(formattedNewMobile, BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (newBindConnect != null && !newBindConnect.getUser_id().equals(userId)) {
log.warn("该新手机号已被其他商家账号绑定,手机号:{}用户ID{}", formattedNewMobile, newBindConnect.getUser_id());
return Pair.of(false, "该手机号已被其他商家账号绑定");
}
// 更新用户账号为新手机号
log.debug("开始更新用户账号信息用户ID{},新手机号:{}", userId, formattedNewMobile);
userBase.setUser_account(formattedNewMobile);
// 如果提供了密码则更新密码
if (StrUtil.isNotBlank(password)) {
log.debug("需要更新用户密码");
String user_salt = IdUtil.simpleUUID();
String encryptedPassword = SecureUtil.md5(user_salt + SecureUtil.md5(password));
userBase.setUser_password(encryptedPassword);
userBase.setUser_salt(user_salt);
}
// 更新用户基础信息
boolean updateUserResult = saveOrUpdate(userBase);
if (!updateUserResult) {
log.error("更新用户账号信息失败用户ID{}", userId);
return Pair.of(false, "更新用户账号信息失败");
}
// 更新绑定表中的bind_id为新手机号
log.debug("开始更新绑定信息原绑定ID{}新绑定ID{}", bindConnect.getBind_id(), formattedNewMobile);
bindConnect.setBind_id(formattedNewMobile);
boolean updateBindResult = accountUserBindConnectService.saveOrUpdate(bindConnect);
if (!updateBindResult) {
log.error("更新绑定信息失败绑定ID{}", formattedNewMobile);
return Pair.of(false, "更新绑定信息失败");
}
log.info("更换商家登录手机号成功用户ID{},新手机号:{}", userId, formattedNewMobile);
return Pair.of(true, "更换商家登录手机号成功");
} catch (Exception e) {
log.error("更改商家登录手机号过程中发生异常,老手机号:{},新手机号:{}", oldMobile, newMobile, e);
return Pair.of(false, "系统异常:" + e.getMessage());
}
}
@Override
public Map<String, Object> doAppConnectLogin(String bind_name, String code) {
String id_prefix = "";
@ -3803,6 +3962,23 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
return new ThirdApiRes().fail(250, "保存异常");
}
@Override
public ThirdApiRes saveBatchAccountUserLogin(List<AccountUserLogin> accountUserLoginList) {
boolean result = false;
if (!accountUserLoginList.isEmpty()) {
try {
result = accountUserLoginService.saveBatch(accountUserLoginList, accountUserLoginList.size());
} catch (Exception e) {
throw new RuntimeException("保存AccountUserLogin报错" + e.getMessage());
}
}
if (result) {
return new ThirdApiRes().success("成功");
}
return new ThirdApiRes().fail(250, "保存异常");
}
/**
* 检查并修复商户店铺信息
* 重要补偿机制检查修复商户入驻店铺信息(商家账号关联入驻店铺Id给商家账户创立公司员工账号和权限)

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.account.mapper.AccountUserBindConnectMapper;
@ -19,6 +20,7 @@ import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.account.AccountUserBindConnect;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
@ -367,6 +369,65 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
}
}
/**
* 检查手机注册的商家是否存在
*
* @param mobile
* @return 1-已存在 2-不存在 3-格式错误
*/
@Override
public Integer isMerchantExists(String mobile) {
log.debug("检查商家是否存在,手机号: {}", mobile);
if (StrUtil.isBlank(mobile)) {
log.warn("手机号为空,无法检查商家是否存在");
return 3;
}
try {
String convertedMobile = PhoneNumberUtils.convZhPhoneNumber(mobile);
if (CheckUtil.isEmpty(convertedMobile)) {
log.warn("手机号格式无效: {}", mobile);
return 3;
}
// 使用正确的绑定类型检查手机号
LambdaQueryWrapper<AccountUserBindConnect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AccountUserBindConnect::getBind_id, convertedMobile)
.eq(AccountUserBindConnect::getBind_type, BindCode.MOBILE) // 1-手机号
.eq(AccountUserBindConnect::getUser_type, CommonConstant.USER_TYPE_MCH) // 2-入驻商家
.eq(AccountUserBindConnect::getBind_active, CommonConstant.Enable)
.orderByAsc(AccountUserBindConnect::getBind_time)
.select(AccountUserBindConnect::getUser_id);
log.debug("执行查询,转换后的手机号: {}, 查询条件: {}", convertedMobile, queryWrapper.getSqlSegment());
AccountUserBindConnect accountUserBindConnect = getOne(queryWrapper);
if (accountUserBindConnect == null || CheckUtil.isEmpty(accountUserBindConnect.getUser_id())) {
log.info("未找到手机号绑定的商家记录,手机号: {}", convertedMobile);
return 2;
}
Integer userId = accountUserBindConnect.getUser_id();
log.debug("找到用户ID: {}", userId);
AccountUserBase accountUserBase = accountUserBaseService.get(userId);
if (accountUserBase == null) {
log.warn("用户基础信息不存在用户ID: {}", userId);
return 2;
}
log.info("商家存在用户ID: {}", userId);
return 1;
} catch (Exception e) {
log.error("查询商家绑定信息时发生异常,手机号: {}", mobile, e);
return null;
}
}
/**
* 用户绑定手机号和openid
*
@ -505,24 +566,24 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
}
@Override
public List<AccountUserBindConnect> getAllBindPage(String bindTmpl,Integer pageNum, Integer pageSize) {
public List<AccountUserBindConnect> getAllBindPage(String bindTmpl, Integer pageNum, Integer pageSize) {
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
queryWrapper.select("bind_id,bind_type,user_id,user_type");
queryWrapper.in("bind_type", Arrays.asList(BindCode.MOBILE,BindCode.WEIXIN_XCX))
queryWrapper.in("bind_type", Arrays.asList(BindCode.MOBILE, BindCode.WEIXIN_XCX))
.eq("user_type", CommonConstant.USER_TYPE_NORMAL)
.eq("bind_active", CommonConstant.Enable)
.eq("bind_tmpl",bindTmpl)
.eq("bind_tmpl", bindTmpl)
.orderByAsc("bind_time");
return this.lists(queryWrapper,pageNum,pageSize).getRecords();
return this.lists(queryWrapper, pageNum, pageSize).getRecords();
}
@Override
public long getAllBindCount(String bindTmpl) {
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
queryWrapper.in("bind_type", Arrays.asList(BindCode.MOBILE,BindCode.WEIXIN_XCX))
queryWrapper.in("bind_type", Arrays.asList(BindCode.MOBILE, BindCode.WEIXIN_XCX))
.eq("user_type", CommonConstant.USER_TYPE_NORMAL)
.eq("bind_active", CommonConstant.Enable)
.eq("bind_tmpl",bindTmpl)
.eq("bind_tmpl", bindTmpl)
.orderByAsc("bind_time");
return this.count(queryWrapper);
}
@ -537,42 +598,42 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
// log.info("错误信息--{}",e.getMessage());
// }
log.info("jsonObject:{}", jsonObject);
String openId=jsonObject.getStr("FromUserName");//用户openid
String openId = jsonObject.getStr("FromUserName");//用户openid
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("bind_openid",openId)
queryWrapper.eq("bind_openid", openId)
.eq("user_type", CommonConstant.USER_TYPE_NORMAL)
.in("bind_type",Arrays.asList(1,15))
.in("bind_type", Arrays.asList(1, 15))
.eq("bind_active", CommonConstant.Enable);
List<AccountUserBindConnect> accountUserBindConnectList= list(queryWrapper);
List<AccountUserBindConnect> accountUserBindConnectList = list(queryWrapper);
if (!accountUserBindConnectList.isEmpty()) {
AccountUserBindConnect accountUserBindConnect=accountUserBindConnectList.get(0);
JSONArray jsonArray=null;
JSONObject object= null;
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectList.get(0);
JSONArray jsonArray = null;
JSONObject object = null;
try {
jsonArray= jsonObject.getJSONArray("List");
}catch (RuntimeException runtimeException){
jsonArray = jsonObject.getJSONArray("List");
} catch (RuntimeException runtimeException) {
log.info("单个模板");
object=jsonObject.getJSONObject("List");
object = jsonObject.getJSONObject("List");
}
UpdateWrapper<AccountUserBindConnect> updateWrapper = new UpdateWrapper<>();
if (jsonArray != null) {
object= (JSONObject) jsonArray.get(0);
String templateId= object.getStr("TemplateId");//模板id
String SubscribeStatusString= object.getStr("SubscribeStatusString");//订阅结果accept接收reject拒收参考地址https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html#%E8%AE%A2%E9%98%85%E6%B6%88%E6%81%AF%E8%AF%AD%E9%9F%B3%E6%8F%90%E9%86%92
if(SubscribeStatusString.equals("accept")){
object = (JSONObject) jsonArray.get(0);
String templateId = object.getStr("TemplateId");//模板id
String SubscribeStatusString = object.getStr("SubscribeStatusString");//订阅结果accept接收reject拒收参考地址https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html#%E8%AE%A2%E9%98%85%E6%B6%88%E6%81%AF%E8%AF%AD%E9%9F%B3%E6%8F%90%E9%86%92
if (SubscribeStatusString.equals("accept")) {
accountUserBindConnect.setBind_tmpl(templateId);
getUpdateWrapper(updateWrapper, accountUserBindConnect);
}
}else {
} else {
assert object != null;
String templateId= object.getStr("TemplateId");//模板id
String SubscribeStatusString= object.getStr("SubscribeStatusString");
if(StringUtils.isNotEmpty(SubscribeStatusString)&&SubscribeStatusString.equals("accept")){
String templateId = object.getStr("TemplateId");//模板id
String SubscribeStatusString = object.getStr("SubscribeStatusString");
if (StringUtils.isNotEmpty(SubscribeStatusString) && SubscribeStatusString.equals("accept")) {
accountUserBindConnect.setBind_tmpl(templateId);
getUpdateWrapper(updateWrapper, accountUserBindConnect);
}else {
String ErrorStatus=object.getStr("ErrorStatus");
if(ErrorStatus.equals("success")){
} else {
String ErrorStatus = object.getStr("ErrorStatus");
if (ErrorStatus.equals("success")) {
log.info("消息推送成功给用户,不需要操作");
return;
}
@ -584,16 +645,17 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
/**
* 封装相同参数的调用方法
*
* @param updateWrapper
* @param accountUserBindConnect
*/
private void getUpdateWrapper(UpdateWrapper<AccountUserBindConnect> updateWrapper,
AccountUserBindConnect accountUserBindConnect) {
updateWrapper.set("bind_tmpl",accountUserBindConnect.getBind_tmpl());
updateWrapper.eq("bind_id",accountUserBindConnect.getBind_id());
updateWrapper.eq("bind_type",accountUserBindConnect.getBind_type());
updateWrapper.eq("user_id",accountUserBindConnect.getUser_id());
updateWrapper.eq("user_type",accountUserBindConnect.getUser_type());
updateWrapper.set("bind_tmpl", accountUserBindConnect.getBind_tmpl());
updateWrapper.eq("bind_id", accountUserBindConnect.getBind_id());
updateWrapper.eq("bind_type", accountUserBindConnect.getBind_type());
updateWrapper.eq("user_id", accountUserBindConnect.getUser_id());
updateWrapper.eq("user_type", accountUserBindConnect.getUser_type());
}
}

View File

@ -44,4 +44,6 @@ public class RedisConstant {
// 预约订单任务新增键
public static final String Order_Booking_Task_Key = ConstantRedis.Cache_NameSpace + "new:order:booking:task:";
public static final String VERIFY_CODE_KEY = "register:verifyCode:";
}

View File

@ -7,6 +7,7 @@ import com.suisung.mall.common.pojo.output.TimelineOutput;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
@ -278,6 +279,15 @@ public interface AccountService {
@PostMapping(value = "/admin/account/accountController/saveBatchAccountInfo")
ThirdApiRes saveBatchAccountInfo(@RequestBody List<AccountUserInfo> accountUserInfoList);
/**
* 批量保存accountUserLogin
*
* @return
*/
@PostMapping(value = "/admin/account/accountController/saveBatchAccountUserLogin")
ThirdApiRes saveBatchAccountUserLogin(@RequestBody List<AccountUserLogin> accountUserLoginList);
/**
* 批量保存accountInfo
*
@ -303,4 +313,28 @@ public interface AccountService {
@GetMapping(value = "/admin/account/accountController/getAllBindCount")
long getAllBindCount(@RequestParam(name = "bindTmpl") String bindTmpl);
/**
* 检查手机注册的商家是否存在(仅供内部调用)
*
* @param mobile
* @return
*/
@RequestMapping(value = "/admin/account/account-user-bind-connect/is-merchant-exists", method = RequestMethod.POST)
Integer isMerchantExists(@RequestParam(name = "mobile") String mobile);
/**
* 服务间注册商家账号项目之间远程调用
*/
@RequestMapping(value = "/admin/account/account-user-base/merchant/inner-register", method = RequestMethod.POST)
Pair<Boolean, String> merchantInnerRegister(@RequestParam("mobile") String mobile, @RequestParam("regPwd") String regPwd);
/**
* 服务间注册商家账号项目之间远程调用
*/
@RequestMapping(value = "/admin/account/account-user-base/merchant/inner-register", method = RequestMethod.POST)
Pair<Boolean, String> changeMerchantLoginMobile(@RequestParam("oldMobile") String oldMobile, @RequestParam("newMobile") String newMobile, @RequestParam("password") String password);
}

View File

@ -96,6 +96,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "入驻商家店铺门面环境图片的存储路径", required = true)
private String environment_image;
@ApiModelProperty(value = "收银台照片", required = true)
private String checkstand_image;
@ApiModelProperty(value = "入驻主体类型企业或个人1-企业2-个人;", required = true)
private Integer entity_type;
@ -183,6 +186,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "结算账户⾏号", required = true)
private String openning_bank_code;
@ApiModelProperty(value = "开户许可证(银行对公开户证明)")
private String opening_permit_image;
@ApiModelProperty(value = "结算账户清算⾏号")
private String clearing_bank_code;
@ -258,6 +264,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "是否绑定分账接收方1-是2-否;")
private Integer has_bind_receiver;
@ApiModelProperty(value = "父入驻id总店入驻id")
private Long parent_id;
@ApiModelProperty(value = "该商家入驻记录是否有效0:无效1:有效")
private Integer status;

View File

@ -0,0 +1,61 @@
/*
* 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.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_mch_entry_branch")
@ApiModel(value = "shop_mch_entry_branch 实体", description = "商家分店拉卡拉商户申请数据")
public class ShopMchEntryBranch implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "自增ID")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty(value = "拉卡拉外部(银联)商户号", required = true)
private String lkl_mer_cup_no;
@ApiModelProperty(value = "拉卡拉终端号")
private String lkl_term_no;
@ApiModelProperty(value = "审核关联号", required = true)
private String review_related_id;
@ApiModelProperty(value = "请求拉卡拉参数")
private String lkl_req;
@ApiModelProperty(value = "拉卡拉响应数据")
private String lkl_reps;
@ApiModelProperty(value = "拉卡拉通知响应数据")
private String lkl_notify_reps;
@ApiModelProperty(value = "该商家入驻记录是否有效0:无效1:有效")
private Integer status;
@ApiModelProperty(value = "商家入驻记录的创建时间")
private Date created_at;
@ApiModelProperty(value = "商家入驻记录的更新时间")
private Date updated_at;
}

View File

@ -141,6 +141,9 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铺统一的打包费, 0-10元范围")
private BigDecimal packing_fee;
@ApiModelProperty(value = "分店所属总店 Id一般分店有值总店为0")
private Integer parent_id;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "新增时间")

View File

@ -126,6 +126,9 @@ public class ShopStoreInfo implements Serializable {
@ApiModelProperty(value = "店铺内部运费单位0-使用平台的内部运费;>0 使用店铺的内部运费")
private Integer shopping_fee_inner;
@ApiModelProperty(value = "是否自配送1-是2-否;")
private Integer is_delivery_self;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "新增时间")

View File

@ -52,6 +52,9 @@ public class ShopStoreSameCityTransportBase implements Serializable {
@ApiModelProperty(value = "顺丰同城第三方店铺ID")
private String shop_id;
@ApiModelProperty(value = "顺丰平台商家Id (用于县级代理商创建店铺的)")
private String supplier_id;
@ApiModelProperty(value = "店铺主营商品分类ID")
private Integer business_type;

View File

@ -0,0 +1,72 @@
package com.suisung.mall.common.pojo.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 新增主店的分店的请求DTO实体类
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "新增主店的分店的请求DTO实体类", description = "新增主店的分店的请求DTO实体类")
public class MainStoreBranchReqDTO implements java.io.Serializable {
private static final long serialVersionUID = 1L;
/**
* 主店店铺 ID
*/
private Integer parent_store_id;
/**
* 登录手机号
*/
private String login_mobile;
/**
* 登录密码
*/
private String password;
/**
* 分店名称
*/
private String store_name;
/**
* 分店联系人
*/
private String contact_name;
/**
* 分店联系人手机号
*/
private String email;
/**
* 门头图片
*/
private String front_facade_image;
/**
* 环境图片
*/
private String environment_image;
/**
* 分店地址
*/
private String store_address;
/**
* 分店经度
*/
private String store_longitude;
/**
* 分店纬度
*/
private String store_latitude;
}

View File

@ -11,6 +11,7 @@ package com.suisung.mall.common.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.suisung.mall.common.exception.ApiException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
@ -250,6 +251,44 @@ public class RestTemplateHttpUtil {
}
}
/**
* 发送拉卡拉的POST请求并处理异常原样返回
*
* @param url 请求URL
* @param headers 请求头
* @param requestBody 请求体
* @param responseType 响应类型
* @param <T> 泛型类型
* @return ResponseEntity<T>
*/
public static <T> JSONObject sendLklPostSrc(String url, JSONObject headers, JSONObject requestBody, Class<T> responseType) {
// 使用 APPLICATION_JSON 作为默认 content-type
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
// 安全添加 headers
if (headers != null) {
headers.forEach((key, value) -> {
if (value != null) {
httpHeaders.add(key, value.toString());
}
});
}
HttpEntity<Object> entity = new HttpEntity<>(requestBody, httpHeaders);
try {
ResponseEntity<T> response = restTemplate.postForEntity(url, entity, responseType);
Object body = response.getBody();
return (body instanceof JSONObject) ? (JSONObject) body : JSONUtil.parseObj(body);
} catch (Exception e) {
log.error("Unexpected error occurred while calling LKL API: {}", e.getMessage(), e);
new ApiException("Unexpected error occurred while calling LKL API");
}
return null;
}
/**
* 在JSONObject中查找第一个非空值
*

View File

@ -57,9 +57,11 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser;
@Service
public class ShopActivityGroupbookingServiceImpl extends BaseServiceImpl<ShopActivityGroupbookingMapper, ShopActivityGroupbooking> implements ShopActivityGroupbookingService {
@Lazy
@Autowired
private ShopActivityGroupbookingHistoryService shopActivityGroupbookingHistoryService;
@Lazy
@Autowired
private ShopActivityGroupbookingService shopActivityGroupbookingService;
@ -67,9 +69,11 @@ public class ShopActivityGroupbookingServiceImpl extends BaseServiceImpl<ShopAct
@Autowired
private ShopStoreActivityBaseService shopStoreActivityBaseService;
@Lazy
@Autowired
private AccountService accountService;
@Lazy
@Autowired
private ShopOrderInfoService shopOrderInfoService;
@ -77,6 +81,7 @@ public class ShopActivityGroupbookingServiceImpl extends BaseServiceImpl<ShopAct
@Autowired
private ShopUserVoucherService shopUserVoucherService;
@Lazy
@Autowired
private ShopOrderReturnService shopOrderReturnService;
@ -84,6 +89,7 @@ public class ShopActivityGroupbookingServiceImpl extends BaseServiceImpl<ShopAct
@Autowired
private ShopOrderBaseService shopOrderBaseService;
@Lazy
@Autowired
private ShopOrderDataService shopOrderDataService;
@ -91,9 +97,11 @@ public class ShopActivityGroupbookingServiceImpl extends BaseServiceImpl<ShopAct
@Autowired
private ShopStoreBaseService shopStoreBaseService;
@Lazy
@Autowired
private ShopOrderItemService shopOrderItemService;
@Lazy
@Autowired
private ShopProductItemService shopProductItemService;

View File

@ -63,7 +63,7 @@ public class ShopBaseProductCategoryController {
public CommonResult getList(ShopBaseProductCategory category) {
QueryWrapper<ShopBaseProductCategory> queryWrapper = new QueryWrapper<>();
new FilterUtils<ShopBaseProductCategory>().applyStoreFilter(queryWrapper);
queryWrapper.eq("category_is_enable", 1);
//queryWrapper.eq("category_is_enable", 1);
Integer category_parent_id = category.getCategory_parent_id();
if (category_parent_id == null) category_parent_id = 0;
return CommonResult.success(shopBaseProductCategoryService.getCategoryTree(queryWrapper, category_parent_id));

View File

@ -54,6 +54,8 @@ public class AccountBaseConfigServiceImpl extends BaseServiceImpl<AccountBaseCon
public static Map<String, AccountBaseConfig> configMap;
public static Long version = 0L;
@Lazy
@Autowired
private AccountService accountService;

View File

@ -14,6 +14,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.lakala.service.LklLedgerEcService;
import com.suisung.mall.shop.lakala.service.impl.LklTkServiceImpl;
import com.suisung.mall.shop.library.service.LibraryProductService;
import com.suisung.mall.shop.message.service.MqMessageService;
import com.suisung.mall.shop.message.service.PushMessageService;
@ -80,9 +81,13 @@ public class LakalaController extends BaseControllerImpl {
@Resource
private ShopStorePrinterService shopStorePrinterService;
@Lazy
@Resource
private LklLedgerEcService lklLedgerEcService;
@Resource
private LklTkServiceImpl lklTkService;
@ApiOperation(value = "测试案例", notes = "测试案例")
@RequestMapping(value = "/testcase", method = RequestMethod.POST)
@ -94,7 +99,8 @@ public class LakalaController extends BaseControllerImpl {
// return lakalaApiService.tradeQuery(paramsJSON.getInt("storeId"), paramsJSON.getStr("orderId"));
return shopStorePrinterService.printShopStoreReturnOrder(paramsJSON.getStr("returnId"));
return lklTkService.openMerchantAddTerm("8226330541100J8");
}
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")

View File

@ -100,7 +100,7 @@ public class LklTkController extends BaseControllerImpl {
return CommonResult.failed(resp.getSecond());
}
// https://mall.gpxscs.cn/api/mobile/shop/lakala/ledger/applyLedgerMerReceiverBindNotify
// https://mall.gpxscs.cn/api/mobile/shop/lakala/tk/registrationMerchantNotify
@ApiOperation(value = "拉卡拉进件申请异步回调通知", notes = "拉卡拉进件申请异步回调通知")
@RequestMapping(value = "/registrationMerchantNotify", method = {RequestMethod.POST})
public ResponseEntity<JSONObject> registrationMerchantNotify(HttpServletRequest request) {
@ -112,6 +112,18 @@ public class LklTkController extends BaseControllerImpl {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resp);
}
// https://mall.gpxscs.cn/api/mobile/shop/lakala/tk/updateMerchantNotify
@ApiOperation(value = "商户改件异步回调通知", notes = "商户改件异步回调通知")
@RequestMapping(value = "/updateMerchantNotify", method = {RequestMethod.POST})
public ResponseEntity<JSONObject> updateMerchantNotify(HttpServletRequest request) {
JSONObject resp = lklTkService.updateMerchantNotify(request);
if (resp != null && resp.get("code").equals("200")) {
return ResponseEntity.ok(resp);
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resp);
}
@ApiOperation(value = "上传文件", notes = "上传文件")
@RequestMapping(value = "/uploadOcrImg", method = RequestMethod.POST)
public CommonResult uploadOcrImg(@RequestParam(name = "upfile") MultipartFile file,

View File

@ -9,6 +9,7 @@
package com.suisung.mall.shop.lakala.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
@ -29,6 +30,7 @@ import com.suisung.mall.shop.lakala.service.LklBanksService;
import com.suisung.mall.shop.lakala.service.LklLedgerReceiverService;
import com.suisung.mall.shop.lakala.utils.LakalaUtil;
import com.suisung.mall.shop.page.service.impl.OssServiceImpl;
import com.suisung.mall.shop.store.service.ShopMchEntryBranchService;
import com.suisung.mall.shop.store.service.ShopMchEntryService;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import org.slf4j.Logger;
@ -69,6 +71,12 @@ public class LklTkServiceImpl {
@Value("${lakala.tk.notify_pub_key_path}")
private String notifyPubKeyPath;
@Value("${lakala.tk.api_pub_key_path}")
private String apiPubKeyPath;
@Value("${lakala.tk.api_pri_key_path}")
private String apiPriKeyPath;
@Value("${lakala.tk.activity_id}")
private Integer activityId;
@ -89,13 +97,13 @@ public class LklTkServiceImpl {
@Resource
private LklLedgerReceiverService lklLedgerReceiverService;
// @Lazy
// @Lazy
// @Resource
// private EsignContractService esignContractService;
//
// @Lazy
// @Resource
// private EsignContractFillingFileService esignContractFillingFileService;
@Lazy
@Resource
private ShopMchEntryBranchService shopMchEntryBranchService;
@Lazy
@Resource
@ -353,7 +361,6 @@ public class LklTkServiceImpl {
urlPath = "/auth/oauth/token";
}
String response = RestTemplateHttpUtil.sendPostFormData(buildLklTkUrl(urlPath), null, formData, String.class);
if (ObjectUtil.isEmpty(response)) {
return "";
@ -540,7 +547,8 @@ public class LklTkServiceImpl {
logger.debug("开始处理商户附件文件商户ID: {}", mchId);
JSONArray attachments = new JSONArray();
if (Boolean.TRUE.equals(isQy)) {
JSONObject SETTLE_ID_CARD_FRONT = updatePhoto(shopMchEntry.getLegal_person_id_images(), "FR_ID_CARD_FRONT", false);
// 企业
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); // 法人身份证正面
logger.debug("成功添加法人身份证正面图片");
@ -548,7 +556,7 @@ public class LklTkServiceImpl {
logger.warn("法人身份证正面图片添加失败");
}
JSONObject SETTLE_ID_CARD_BEHIND = updatePhoto(shopMchEntry.getLegal_person_id_images2(), "FR_ID_CARD_BEHIND", false);
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); // 法人身份证国徽面
logger.debug("成功添加法人身份证国徽面图片");
@ -564,7 +572,17 @@ public class LklTkServiceImpl {
logger.warn("营业执照图片添加失败");
}
// 银行对公开户正面
JSONObject OPENING_PERMIT = updatePhoto(shopMchEntry.getOpening_permit_image(), "OPENING_PERMIT", false);
if (OPENING_PERMIT != null) {
attachments.put(OPENING_PERMIT); // 营业执照
logger.debug("成功添加开户许可证证明图片");
} else {
logger.warn("成功添加开户许可证证明图片添加失败");
}
} else {
// 小微个人
JSONObject ID_CARD_FRONT = updatePhoto(shopMchEntry.getIndividual_id_images(), "ID_CARD_FRONT", false);
if (ID_CARD_FRONT != null) {
attachments.put(ID_CARD_FRONT); // 身份证正面
@ -580,6 +598,15 @@ public class LklTkServiceImpl {
} else {
logger.warn("身份证国徽面图片添加失败");
}
// 对私必传银行卡
JSONObject BANK_CARD = updatePhoto(shopMchEntry.getBank_image(), "BANK_CARD", false);
if (BANK_CARD != null) {
attachments.put(BANK_CARD); // 银行卡图片
logger.debug("成功添加银行卡图片");
} else {
logger.warn("银行卡图片添加失败");
}
}
JSONObject SHOP_OUTSIDE_IMG = updatePhoto(shopMchEntry.getFront_facade_image(), "SHOP_OUTSIDE_IMG", false);
@ -598,13 +625,15 @@ public class LklTkServiceImpl {
logger.warn("门店内部图片添加失败");
}
JSONObject BANK_CARD = updatePhoto(shopMchEntry.getBank_image(), "BANK_CARD", false);
if (BANK_CARD != null) {
attachments.put(BANK_CARD); // 银行卡图片
logger.debug("成功添加银行卡图片");
// 收银台图片
JSONObject CHECKSTAND_IMG = updatePhoto(shopMchEntry.getCheckstand_image(), "CHECKSTAND_IMG", false);
if (CHECKSTAND_IMG != null) {
attachments.put(CHECKSTAND_IMG); // 收银台图片
logger.debug("成功添加收银台图片");
} else {
logger.warn("银行卡图片添加失败");
logger.warn("收银台图片添加失败");
}
reqJsonBody.put("attchments", attachments);
logger.debug("商户附件文件处理完成,共添加 {} 个附件", attachments.size());
// 附件文件相关结束
@ -774,6 +803,310 @@ public class LklTkServiceImpl {
}
}
/**
* 商户改件异步回调通知
*
* @param request
* @return
*/
public JSONObject updateMerchantNotify(HttpServletRequest request) {
try {
// 解密请求参数
String requestBody = LakalaUtil.getBody(request);
logger.info("拉卡拉商户增终异步通知 - 接收原始数据: {}", requestBody);
if (StrUtil.isBlank(requestBody)) {
logger.warn("拉卡拉商户增终异步通知 - 请求参数为空");
return new JSONObject().set("code", "400").set("message", "返回参数为空");
}
JSONObject reqBodyJSON = JSONUtil.parseObj(requestBody);
if (reqBodyJSON.isEmpty() || reqBodyJSON.get("data") == null) {
logger.warn("拉卡拉商户增终异步通知 - 参数格式有误,无法解析: {}", requestBody);
return new JSONObject().set("code", "400").set("message", "参数格式有误,无法解析");
}
String srcData = reqBodyJSON.getStr("data");
if (StrUtil.isBlank(srcData)) {
logger.warn("拉卡拉商户增终异步通知 - 关键参数为空值");
return new JSONObject().set("code", "400").set("message", "关键参数为空值");
}
// 公钥解密出来的数据
String notifyPubKey = LakalaUtil.getResourceFile(notifyPubKeyPath, false, false);
String lklNotifyResp = LakalaUtil.decryptNotifyData(notifyPubKey, srcData);
if (StrUtil.isBlank(lklNotifyResp)) {
logger.error("拉卡拉商户增终异步通知 - 数据解密失败,加密数据: {}", srcData);
return new JSONObject().set("code", "400").set("message", "数据解密出错!");
}
logger.info("拉卡拉商户增终异步通知 - 解密后数据: {}", lklNotifyResp);
// 逻辑处理
JSONObject dataJSON = JSONUtil.parseObj(lklNotifyResp);
String reviewPass = dataJSON.getStr("reviewPass");
String merCupNo = dataJSON.getStr("externalCustomerNo"); //拉卡拉外部商户号
String termNo = dataJSON.getStr("termNo"); //拉卡拉分配的业务终端号
String reviewRelatedId = dataJSON.getStr("reviewRelatedId"); //拉卡拉分配的业务终端号
logger.info("拉卡拉商户增终异步通知 - 解析数据完成 - 审核状态: {}, 外部商户号: {}, 终端号: {}, 审核关联ID: {}",
reviewPass, merCupNo, termNo, reviewRelatedId);
// 合并参数校验
if (dataJSON.isEmpty() ||
StrUtil.isBlank(reviewPass) ||
StrUtil.isBlank(reviewRelatedId) ||
StrUtil.isBlank(termNo)) {
logger.warn("拉卡拉商户增终异步通知 - 参数解析出错,解密数据: {}", lklNotifyResp);
return new JSONObject().set("code", "500").set("message", "返回参数缺少关键数据");
}
// 更新商户分店入驻表
// status 状态1-已成功2-审核未通过3-未处理4-待审核
Integer status = "PASS".equals(reviewPass) ? CommonConstant.Enable :
"UNPASS".equals(reviewPass) ? CommonConstant.Disable2 :
"PASSING".equals(reviewPass) ? 3 : 4;
logger.info("拉卡拉商户增终异步通知 - 更新分店入驻表审核关联ID: {}, 状态: {}, 通知响应: {}", reviewRelatedId, status, lklNotifyResp);
shopMchEntryBranchService.updateByReviewRelatedId(reviewRelatedId, status, lklNotifyResp);
// 给商家总店入驻表增加拉卡拉的商户号和拉卡拉返回的数据
ShopMchEntry shopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(merCupNo, 0L);
if (shopMchEntry == null) {
logger.error("拉卡拉商户增终异步通知 - 商户号入驻信息不存在: {}", merCupNo);
return new JSONObject().put("code", "500").put("message", merCupNo + "商户号入驻信息不存在");
}
// 校验审核状态: PREPARE:待提交; PASS:通过; UNPASS:未通过; PASSING:审核中;
if (!"PASS".equals(reviewPass)) {
logger.info("拉卡拉商户增终异步通知 - 审核未通过,状态: {}, 结果: {}", reviewPass, dataJSON.getStr("reviewResult"));
return new JSONObject().set("code", "500").set("message", "忽略处理,因审核未通过:" + dataJSON.getStr("reviewResult"));
}
logger.info("拉卡拉商户增终异步通知 - 审核通过开始创建分店入驻记录审核关联ID: {}, 终端号: {}", reviewRelatedId, termNo);
// RMK 拉卡拉增终成功, 创建分店入驻记录创建商家账号创建店铺和周边信息
shopMchEntryBranchService.createMchEntryBranchStore(reviewRelatedId, termNo, lklNotifyResp);
logger.info("拉卡拉商户增终异步通知 - 处理完成审核关联ID: {}", reviewRelatedId);
return new JSONObject().set("code", "200").set("message", "处理成功");
} catch (Exception e) {
logger.error("处理拉卡拉增终异步通知异常", e);
return new JSONObject().set("code", "500").set("message", "处理异常:" + e.getMessage());
}
}
/**
* 向拉卡拉申请增加终端
*
* @param externalCustomerNo 拉卡拉外部商户号
* @return 拉卡拉响应数据
*/
public JSONObject openMerchantAddTerm(String externalCustomerNo) {
logger.debug("开始向拉卡拉申请增加终端externalCustomerNo={}", externalCustomerNo);
try {
// 参数校验
if (StrUtil.isBlank(externalCustomerNo)) {
logger.warn("拉卡拉外部商户号不能为空");
return null;
}
// 构造请求参数并加密
JSONObject requestParams = new JSONObject();
requestParams.set("externalCustomerNo", externalCustomerNo);
requestParams.set("bzPos", "WECHAT_PAY");
requestParams.set("termNum", 1);
Long shopId = getLklShopId(externalCustomerNo, null);
if (shopId == null) {
logger.error("拉卡拉商户ID不存在externalCustomerNo={}", externalCustomerNo);
return null;
}
requestParams.set("shopId", shopId);
JSONObject feeInfoDto = new JSONObject();
feeInfoDto.set("topFee", Convert.toDouble(wxFee));
feeInfoDto.set("fee", Convert.toDouble(wxFee));
feeInfoDto.set("feeType", "WECHAT");
requestParams.set("fees", feeInfoDto);
String privateKey = LakalaUtil.getResourceFile(apiPriKeyPath, false, false);
if (StrUtil.isBlank(privateKey)) {
logger.error("获取拉卡拉私钥失败apiPriKeyPath={}", apiPriKeyPath);
return null;
}
String encryptedParams = LakalaUtil.encryptByPrivateKey(requestParams.toString(), privateKey);
logger.debug("请求参数加密完成");
// 获取认证信息
String authorization = getLklTkAuthorization();
if (StrUtil.isBlank(authorization)) {
logger.error("获取拉卡拉token失败");
return null;
}
// 构造请求头和请求体
JSONObject header = new JSONObject().set("Authorization", authorization);
JSONObject requestBody = new JSONObject().set("data", encryptedParams);
// 发送请求
String urlPath = "/htkmerchants/open/merchant/addTerm";
JSONObject response = RestTemplateHttpUtil.sendLklPostSrc(
buildLklTkUrl(urlPath), header, requestBody, JSONObject.class);
// 检查响应结果
if (response == null || !"000000".equals(response.getStr("code")) || response.get("data") == null) {
logger.error("向拉卡拉申请增加终端失败response={}", response);
return null;
}
// 解密响应数据
String publicKey = LakalaUtil.getResourceFile(apiPubKeyPath, false, false);
if (StrUtil.isBlank(publicKey)) {
logger.error("向拉卡拉申请增加终端获取公钥失败apiPubKeyPath={}", apiPubKeyPath);
return null;
}
String responseData = LakalaUtil.decryptByPublicKey(response.getStr("data"), publicKey);
logger.debug("响应数据解密完成");
return JSONUtil.parseObj(responseData);
} catch (Exception e) {
logger.error("向拉卡拉申请增加终端异常externalCustomerNo={}", externalCustomerNo, e);
return null;
}
}
/**
* 商家进件成功拉卡拉商户号获取商户信息(需加密)
*
* @param externalCustomerNo 外部商户号优先使用
* @param customerNo 内部商户号备选
* @return 商户信息JSONObject获取失败返回null
*/
public JSONObject openMerchantInfo(String externalCustomerNo, String customerNo) {
try {
// 构造请求参数并加密至少需要一个参数
JSONObject requestParams = new JSONObject();
if (StrUtil.isNotBlank(externalCustomerNo)) {
requestParams.set("externalCustomerNo", externalCustomerNo);
}
if (StrUtil.isNotBlank(customerNo)) {
requestParams.set("customerNo", customerNo);
}
// 检查参数是否有效
if (requestParams.isEmpty()) {
logger.warn("拉卡拉商户信息查询参数为空");
return null;
}
String privateKey = LakalaUtil.getResourceFile(apiPriKeyPath, false, false);
if (StrUtil.isBlank(privateKey)) {
logger.error("获取拉卡拉私钥失败apiPriKeyPath={}", apiPriKeyPath);
return null;
}
String encryptedParams = LakalaUtil.encryptByPrivateKey(requestParams.toString(), privateKey);
// 获取认证信息
String authorization = getLklTkAuthorization();
if (StrUtil.isBlank(authorization)) {
logger.error("获取拉卡拉token失败");
return null;
}
// 构造请求头和请求体
String urlPath = buildLklTkUrl("/htkmerchants/open/merchant/info");
JSONObject header = new JSONObject().set("Authorization", authorization);
JSONObject requestBody = new JSONObject().set("data", encryptedParams);
// 发送请求
JSONObject response = RestTemplateHttpUtil.sendLklPostSrc(urlPath, header, requestBody, JSONObject.class);
// 检查响应结果
if (response == null || !"000000".equals(response.getStr("code")) || response.get("data") == null) {
logger.warn("拉卡拉商户信息获取失败response={}", response);
return null;
}
// 解密响应数据
String publicKey = LakalaUtil.getResourceFile(apiPubKeyPath, false, false);
if (StrUtil.isBlank(publicKey)) {
logger.error("获取拉卡拉公钥失败apiPubKeyPath={}", apiPubKeyPath);
return null;
}
String responseData = LakalaUtil.decryptByPublicKey(response.getStr("data"), publicKey);
return JSONUtil.parseObj(responseData);
} catch (Exception e) {
logger.error("获取拉卡拉商户信息异常externalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo, e);
return null;
}
}
/**
* 获取拉卡拉商户的 shopId
*
* @param externalCustomerNo 外部商户号优先使用
* @param customerNo 内部商户号备选
* @return 拉卡拉商户的shopId获取失败返回null
*/
public Long getLklShopId(String externalCustomerNo, String customerNo) {
logger.debug("开始获取拉卡拉商户shopIdexternalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo);
try {
JSONObject response = openMerchantInfo(externalCustomerNo, customerNo);
if (response == null) {
logger.warn("获取拉卡拉商户信息失败externalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo);
return null;
}
// 检查响应中的code字段是否表示成功
// if (!"000000".equals(response.getStr("code"))) {
// logger.warn("拉卡拉商户信息获取失败code={}response={}", response.getStr("code"), response);
// return null;
// }
logger.info("拉卡拉商户信息:{}", response);
// 检查shopInfoList是否存在且不为空
JSONArray shopInfoList = response.getJSONArray("shopInfoList");
if (CollUtil.isEmpty(shopInfoList)) {
logger.warn("拉卡拉商户信息中shopInfoList为空或不存在response={}", response);
return null;
}
// 获取第一个shopInfo中的shopId
JSONObject firstShopInfo = shopInfoList.getJSONObject(0);
if (firstShopInfo == null) {
logger.warn("拉卡拉商户信息中第一个shopInfo为空shopInfoList={}", shopInfoList);
return null;
}
Long shopId = firstShopInfo.getLong("shopId");
if (shopId == null) {
logger.warn("拉卡拉商户信息中shopId为空firstShopInfo={}", firstShopInfo);
return null;
}
logger.debug("成功获取拉卡拉商户shopId: {}", shopId);
return shopId;
} catch (Exception e) {
logger.error("获取拉卡拉商户shopId异常externalCustomerNo={}, customerNo={}", externalCustomerNo, customerNo, e);
return null;
}
}
/**
* 进件审核通过之后要下一步流程操作申请分账业务创建分账接收方
*

View File

@ -44,6 +44,38 @@ import java.util.regex.Pattern;
@Slf4j
public class LakalaUtil {
public static final String KEY_ALGORITHM = "RSA";
/**
* RSA最大加密密文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
public static void main(String[] args) {
try {
String publicK = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp5aV3ZiXG2R8Yd8Nxocv+cF7VAUHBc0TF4MNne7mI8wM2yEP2QgI+rK1qDf6G7ZFPhutpIHKQchpolbSuC0vgaHpSjO9OUs1fpnK/JjZq9o8DatUsA0n4Fccec9NBbV5dy5yrwro7xmDpsevp1/IeiIssi1+iD+nBWqqVFx7GVQIDAQAB";
String privateK = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKnlpXdmJcbZHxh3w3Ghy/5wXtUBQcFzRMXgw2d7uYjzAzbIQ/ZCAj6srWoN/obtkU+G62kgcpByGmiVtK4LS+BoelKM705SzV+mcr8mNmr2jwNq1SwDSfgVxx5z00FtXl3LnKvCujvGYOmx6+nX8h6IiyyLX6IP6cFaqpUXHsZVAgMBAAECgYA4NpeM7etJ48T6H4Y3LsWEJkH6UDQlgbIblsaQkstMmLtTgOebrzN28UNfd8njcu9FVOrHGclOKbK7L+1cOLiduWsZKc/c/gAy9wAR4EhoLvlerH9EEPiPWFxdEDbMxPqlkpqLOo+PxHrhTn4vU4CaPdJtL2ujKn7nmsUdUDWo8QJBANS1TlM6nhPt2XlzN5kGfsJ4kBYNjuLXNA2YdNuC2ttYvEXHJ9T70FN/GnRBBIZu47uHH3Ie5nfep+qMk6a8RP8CQQDMecIyI0z1kVt+tOfWKw2ZFLsi74708qTaeR4W1ABtkngj1+bxoWWXr3KqhjqJkWxnhioSfXqu7CScNzjdM1CrAkAQd+ESjI1EmbumrYb2cAxMXi05p98SLPs4uj8B58WuCda5yEuLL9vXOxX/PjFtfxRepn2GxmGtki2J+UxNMnJdAkAFoORjlO0tZU7rcfdfwdeh+xwbnhSFUZiQGv1lC3jnizybX/oPdK3jOwUhBIjf+IzPXLYTxDh4UC/BzRNXo235AkEAhgYBk6H7RU2iIuvwz1c6CtE1gJ8DvEp1F0KOMWMFB0KCpDXUToix0dlMz962FozYENi4X4zYQo6nFwlXeS3Pfw==";
byte[] privateKey = Base64.decodeBase64(privateK);
byte[] publicKey = Base64.decodeBase64(publicK);
String aaa = "中文怎么样";
String bytes = encryptByPrivateKey(aaa, privateK);
System.out.println(bytes);
String bytes1 = decryptByPublicKey(bytes, publicK);
System.out.println("result:" + bytes1);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化 拉卡拉 SDK全局只需设置一次
*
@ -496,6 +528,109 @@ public class LakalaUtil {
return Pair.of(true, requestBody);
}
/**
* 拉卡拉拓客 第三方接口 加密
*
* @param data 待加密的数据明文字符串
* @param priKey Base64编码的私钥字符串
* @return Base64编码的加密数据
*/
public static String encryptByPrivateKey(String data, String priKey) {
log.debug("开始使用私钥进行数据加密,数据长度: {}", data.length());
try {
// 将Base64编码的私钥转换为字节数组
byte[] keyBytes = Base64.decodeBase64(priKey);
// 将明文数据转换为字节数组
byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
int inputLen = dataBytes.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(dataBytes, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
// 将加密后的字节数组转换为Base64编码字符串
String result = Base64.encodeBase64String(encryptedData);
log.debug("数据加密完成,加密后数据长度: {}", result.length());
return result;
} catch (Exception e) {
log.error("使用私钥加密数据时发生异常", e);
throw new RuntimeException("私钥加密失败", e);
}
}
/**
* 拉卡拉拓客 第三方接口 解密
*
* @param data 待解密的数据Base64编码的加密字符串
* @param pubKey Base64编码的公钥字符串
* @return 解密后的明文数据
*/
public static String decryptByPublicKey(String data, String pubKey) {
log.debug("开始使用公钥进行数据解密,数据长度: {}", data.length());
try {
// 将Base64编码的公钥和数据转换为字节数组
byte[] keyBytes = Base64.decodeBase64(pubKey);
byte[] dataBytes = Base64.decodeBase64(data);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
int inputLen = dataBytes.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(dataBytes, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(dataBytes, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
// 将解密后的字节数组转换为明文字符串
String result = new String(decryptedData, StandardCharsets.UTF_8);
log.debug("数据解密完成,解密后数据长度: {}", result.length());
return result;
} catch (Exception e) {
log.error("使用公钥解密数据时发生异常", e);
throw new RuntimeException("公钥解密失败", e);
}
}
/**
* 构建拉卡拉接口公共参数
* <p>

View File

@ -69,7 +69,7 @@ public class OrderPayedListener {
String dataStr = new String(data, StandardCharsets.UTF_8);
listener(dataStr, channel, message);
}
public void listener(String data, Channel channel, Message message) throws IOException, InterruptedException {
// String messageId = message.getMessageProperties().getMessageId();
if (StrUtil.isBlank(data)) {
@ -154,7 +154,7 @@ public class OrderPayedListener {
&& !isBookingOrder) {
// 如果是立即下单将触发顺丰同城下单否则预约下单 redis+cron 定时触发顺丰同城下单
Pair<Boolean, String> pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum);
Pair<Boolean, String> pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum, false);
if (pairCreateSfOrder == null) {
logger.error("[订单支付监听] 顺丰同城下单失败,无返回值 订单ID: {}", orderId);
continue;

View File

@ -1422,6 +1422,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Map checkoutRow = new HashMap();
// 配送方式5-门店自提10-普通快递16-同城配送
Integer deliveryTypeId = getParameter("delivery_type_id", StateCode.DELIVERY_TYPE_SAME_CITY);
logger.debug("提交订单时,配送方式 delivery_type_id:{}", deliveryTypeId);
if (getParameter("checkout_row") == null) {
@ -1488,7 +1489,8 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
}
cartRow.put("user_id", userId);
cartRow.put("store_id", productRow.getStore_id());
Integer storeId = productRow.getStore_id();
cartRow.put("store_id", storeId);
cartRow.put("item_id", itemId);
cartRow.put("cart_quantity", cartQuantity);
cartRow.put("single_activity", shopUserCartService.ifSingleActivity());
@ -6342,7 +6344,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (address_row == null) {
// 默认配送地址
QueryWrapper<ShopUserDeliveryAddress> addressQueryWrapper = new QueryWrapper<>();
addressQueryWrapper.eq("ud_is_default", 1).eq("user_id", buyer_user_id);
addressQueryWrapper.eq("ud_is_default", CommonConstant.Enable).eq("user_id", buyer_user_id);
ShopUserDeliveryAddress deliveryAddress = userDeliveryAddressService.findOne(addressQueryWrapper);
cart_data.put("address_row", Convert.toMap(String.class, Object.class, deliveryAddress));
}
@ -6594,8 +6596,13 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
BigDecimal order_money_select_items = Convert.toBigDecimal(store_item.get("order_money_select_items"));
BigDecimal freight = Convert.toBigDecimal(store_item.get("freight"));
// TODO 配送方式5-到店自提10-普通快递16-同城配送
Integer delivery_type_id = Convert.toInt(checkout_row.get("delivery_type_id")); //StateCode.DELIVERY_TYPE_SAME_CITY;
// TODO 配送方式5-到店自提10-普通快递16-同城配送15-商家自配送
Integer delivery_type_id = Convert.toInt(checkout_row.get("delivery_type_id"));
// 判断这家店是不是自己配送
if (shopStoreInfoService.isDeliverySelf(_store_id)) {
delivery_type_id = StateCode.DELIVERY_TYPE_IN_STORE_SERVICE;
}
// 店铺统一设置的打包费(formatCartRows 方法里计算好的)
BigDecimal packingFee = Convert.toBigDecimal(store_item.get("packing_fee"));

View File

@ -99,8 +99,10 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
private ShopStoreInfoService shopStoreInfoService;
@Autowired
private ShopDistributionUserCommissionService shopDistributionUserCommissionService;
@Lazy
@Autowired
private AccountBaseConfigService accountBaseConfigService;
@Lazy
@Autowired
private AccountService accountService;
@Autowired
@ -907,7 +909,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
}
// 调用顺丰接口创建订单
Pair<Boolean, String> sfResult = sfExpressApiService.innerCreateSfExpressOrder(orderId, 0L);
Pair<Boolean, String> sfResult = sfExpressApiService.innerCreateSfExpressOrder(orderId, 0L, false);
if (sfResult == null) {
logger.error("[预约订单顺丰下单] 调用顺丰接口无返回值, orderId={}", orderId);
throw new RuntimeException("预约订单顺丰下单失败,接口无响应");

View File

@ -253,9 +253,17 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
public List<Map<String, Object>> statisticCount(Date end, int days) {
Integer store_id = Convert.toInt(getCurrentUser().getStore_id());
if (ObjectUtil.isNotNull(store_id)) {
return shopOrderReturnMapper.statisticCountSeller(end, days, store_id);
List<Map<String, Object>> mapList= shopOrderReturnMapper.statisticCountSeller(end, days, store_id);
if(null==mapList){
mapList=new ArrayList<>();
}
return mapList;
}
return shopOrderReturnMapper.statisticCount(end, days);
List<Map<String, Object>> statisticList=shopOrderReturnMapper.statisticCount(end, days);
if(null==statisticList){
statisticList=new ArrayList<>();
}
return statisticList;
}
/**

View File

@ -540,6 +540,7 @@ public class ShopPageAppController extends BaseControllerImpl {
editShopPageApp.setApp_market_images(shopPageApp.getApp_market_images());
editShopPageApp.setTpl_image(shopPageApp.getTpl_image());
editShopPageApp.setApp_industry(shopPageApp.getApp_industry());
editShopPageApp.setApp_is_use(0);
shopPageAppService.edit(editShopPageApp);
return CommonResult.success();
}

View File

@ -1124,6 +1124,7 @@ public class ShopPageAppServiceImpl extends BaseServiceImpl<ShopPageAppMapper, S
shopPageApp.setApp_code("[]");
shopPageApp.setTpl_id(107);
shopPageApp.setTpl_image("");
shopPageApp.setTpl_image("https://media-mall-prod-1259811287.cos.ap-guangzhou.myqcloud.com/media/media/store/1002812/20251216/37ef9e9b7b5943e7aa26a5d82c20f09a.png");
shopPageApp.setStore_id(Integer.valueOf(userDto.getStore_id()));
shopPageApp.setUser_id(userDto.getId());
shopPageApp.setSubsite_id(0);
@ -1133,7 +1134,7 @@ public class ShopPageAppServiceImpl extends BaseServiceImpl<ShopPageAppMapper, S
shopPageApp.setApp_member_center("");
shopPageApp.setApp_industry(appIndustry);
shopPageAppService.save(shopPageApp);
return CommonResult.success();
return CommonResult.success(shopPageApp);
}

View File

@ -1133,6 +1133,12 @@ public class ShopProductItemServiceImpl extends BaseServiceImpl<ShopProductItemM
param.put("product_state_id", product_state_id);
}
//商品货号
String item_number = getParameter("item_number");
if (CheckUtil.isNotEmpty(item_number)) {
param.put("item_number", item_number);
}
// 不查询edu 数据
if (!accountBaseConfigService.getConfig("edu_enable", false)) {
param.put("edu_enable", false);

View File

@ -44,7 +44,7 @@ public class SFExpressAdminController {
}
@ApiOperation(value = "创建顺丰同城店铺", notes = "创建顺丰同城店铺")
@ApiOperation(value = "【测试补偿】创建顺丰同城店铺", notes = "创建顺丰同城店铺")
@RequestMapping(value = "/create-shop-inner", method = RequestMethod.POST)
public CommonResult createSfExpressShopNotify(@RequestBody JSONObject requestBody) {
Pair<Boolean, String> result = sfExpressApiService.createSfExpressShopInner(
@ -64,4 +64,12 @@ public class SFExpressAdminController {
}
return CommonResult.failed(result.getSecond());
}
@ApiOperation(value = "重新创建顺丰订单(重新派发)", notes = "重新创建顺丰订单(重新派发)")
@RequestMapping(value = "/recreate-order", method = RequestMethod.POST)
public CommonResult recreateOrder(@RequestBody JSONObject requestBody) {
return sfExpressApiService.recreateOrder(
requestBody.getStr("order_id")
);
}
}

View File

@ -70,8 +70,23 @@ public interface SFExpressApiService {
ThirdApiRes createSfExpressShopNotify(String jsonData, String sign);
/**
* 创建顺丰同城订单
*
* @param shopOrderId
* @return
*/
ThirdApiRes createOrder(String shopOrderId);
/**
* 重新创建顺丰同城订单
*
* @param shopOrderId
* @return
*/
CommonResult recreateOrder(String shopOrderId);
/**
* 获取顺丰同城店铺信息
*
@ -85,9 +100,10 @@ public interface SFExpressApiService {
*
* @param orderId
* @param orderPickupNum
* @param ignoreExists 是否忽略已存在本地订单
* @return
*/
Pair<Boolean, String> innerCreateSfExpressOrder(String orderId, Long orderPickupNum);
Pair<Boolean, String> innerCreateSfExpressOrder(String orderId, Long orderPickupNum, Boolean ignoreExists);
/**
* 取消订单当商家处发生异常需要取消配送时可调用此接口对订单进行取消操作同步返回结果

View File

@ -105,7 +105,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
@Autowired
private ShopMchEntryService shopMchEntryService;
@Lazy
@Autowired
private PushMessageService pushMessageService;
@ -354,6 +353,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return Pair.of(false, "创建顺丰店铺失败返回的店铺ID为空");
}
transportBase.setSupplier_id(sfSupplierId);
transportBase.setShop_id(sfShopId);
transportBase.setShop_state(CommonConstant.Enable); // 顺丰同城快递商品特惠
transportBase.setDelivery_brand(CommonConstant.DELIVERY_BRAND_SF);
@ -553,6 +553,60 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return JsonUtil.json2object(retRespStr, ThirdApiRes.class);
}
/**
* 重新创建顺丰同城订单
* 1先获取顺丰同城订单的当前状态如果没有取消的订单则取消该订单
* 2取消成功则重新创建顺丰同城订单取消失败则返回错误信息
* 3重新创建订单成功更新订单轨迹
*
* @param shopOrderId 商城订单ID
* @return CommonResult 操作结果
*/
@Override
public CommonResult recreateOrder(String shopOrderId) {
logger.info("[顺丰] 开始重新创建订单: shopOrderId={}", shopOrderId);
// 参数校验
if (StrUtil.isBlank(shopOrderId)) {
logger.warn("[顺丰] 重新创建订单失败: 订单ID为空");
return CommonResult.failed("订单ID不能为空");
}
// 获取顺丰订单ID
String sfOrderId = shopStoreSfOrderService.getSfOrderIdByShopOrderId(shopOrderId);
if (StrUtil.isBlank(sfOrderId)) {
logger.warn("[顺丰] 重新创建订单失败: 未找到对应的顺丰订单, shopOrderId={}", shopOrderId);
return CommonResult.failed("未找到对应的顺丰订单");
}
try {
// 取消原订单
Map<String, Object> params = new HashMap<>();
params.put("order_id", sfOrderId);
ThirdApiRes cancelOrderRes = cancelOrder(params);
if (cancelOrderRes != null && !ObjectUtil.equal(cancelOrderRes.getError_code(), 0)) {
logger.error("[顺丰] 取消原订单失败: errorCode={}, errorMsg={}",
cancelOrderRes.getError_code(), cancelOrderRes.getError_msg());
return CommonResult.failed(cancelOrderRes.getError_msg());
}
// 重新创建订单传递默认取货号1
Pair<Boolean, String> createOrderRes = innerCreateSfExpressOrder(shopOrderId, 0L, true);
if (createOrderRes.getFirst()) {
logger.info("[顺丰] 重新创建订单成功: shopOrderId={}", shopOrderId);
return CommonResult.success();
}
logger.error("[顺丰] 重新创建订单失败: {}", createOrderRes.getSecond());
return CommonResult.failed(createOrderRes.getSecond());
} catch (Exception e) {
logger.error("[顺丰] 重新创建订单过程中发生异常: shopOrderId={}", shopOrderId, e);
return CommonResult.failed("系统异常: " + e.getMessage());
}
}
/**
* 获取顺丰同城店铺信息
*
@ -592,18 +646,19 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
*
* @param shopOrderId
* @param orderPickupNum
* @param ignoreExists
* @return
*/
@Transactional
@Override
public Pair<Boolean, String> innerCreateSfExpressOrder(String shopOrderId, Long orderPickupNum) {
public Pair<Boolean, String> innerCreateSfExpressOrder(String shopOrderId, Long orderPickupNum, Boolean ignoreExists) {
logger.info("开始顺丰同城下单");
if (StrUtil.isBlank(shopOrderId) || orderPickupNum == null) {
if (StrUtil.isBlank(shopOrderId) || CheckUtil.isEmpty(orderPickupNum)) {
return Pair.of(false, "顺丰同城下单时,缺少必要参数!");
}
// 检查 shop_store_sf_order 订单是否已存在
if (shopStoreSfOrderService.exists(devId, shopOrderId)) {
if (!ignoreExists && shopStoreSfOrderService.exists(devId, shopOrderId)) {
return Pair.of(true, "顺丰同城已下单过!");
}
@ -645,7 +700,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
shopStoreSfOrder.setStatus_desc("已创建顺丰同城订单");
// 下单成功保存顺丰同城订单记录到 shop_store_sf_order 表里
Boolean success = shopStoreSfOrderService.insertShopStoreSfOrder(shopStoreSfOrder);
Boolean success = shopStoreSfOrderService.saveShopStoreSfOrder(shopStoreSfOrder);
if (!success) {
logger.error("顺丰下单返回的结果:{}", sfExpressApiRes.get("result").toString());
return Pair.of(false, "保存顺丰同城下单失败!");
@ -1367,14 +1422,17 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
if (!shopOrderBase.getOperate_flag().equals("0")) {
return CommonResult.failed("该状态不允许发货操作");
}
Pair<Boolean, String> pair = wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderBase.getOrder_id());
if (pair.getFirst()) {
Integer orderStatus = StateCode.ORDER_STATE_SHIPPED;//已发货
Integer orderIsOutStatus = StateCode.ORDER_PICKING_STATE_YES; // 已出库
shopOrderInfoService.changeOrderStatus(orderId, orderStatus, orderIsOutStatus, 0);
//完成订单后修改订单异常操作流程进入完成订单环节
shopOrderBase.setOperate_flag("1");
shopOrderBaseService.updateById(shopOrderBase);
//出库扣减思迅库存star
// RMK 第三方数据同步相关redis 给这个商品减去对应的库存
QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>();
@ -1383,6 +1441,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
if (picking(order_item_rows)) {
logger.info("自行发货商品扣减库存成功");
}
if (!order_item_rows.isEmpty()) {
for (ShopOrderItem shopOrderItem : order_item_rows) {
Map<String, Integer> stockDeltaMap = new HashMap<>();

View File

@ -0,0 +1,67 @@
/*
* 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.shop.store.controller.admin;
import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.pojo.dto.MainStoreBranchReqDTO;
import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.store.service.ShopMchEntryBranchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Slf4j
@Api(tags = "商家入驻业务控制器")
@RestController
@RequestMapping("/admin/shop/merch/branch")
public class ShopMchEntryBranchAdminController extends BaseControllerImpl {
@Resource
private ShopMchEntryBranchService shopMchEntryBranchService;
/**
* 申请总店的分店
*
* @param mainStoreBranchReqJSON
* @return
*/
@ApiOperation(value = "后台-申请总店的分店", notes = "向拉卡拉申请总店的分店")
@RequestMapping(value = "/apply/store", method = RequestMethod.POST)
public CommonResult shopMerchEntryList(@RequestBody JSONObject mainStoreBranchReqJSON) {
try {
// 参数校验
if (mainStoreBranchReqJSON == null) {
return CommonResult.failed("请求参数不能为空");
}
MainStoreBranchReqDTO mainStoreBranchReq = mainStoreBranchReqJSON.toBean(MainStoreBranchReqDTO.class);
Pair<Boolean, String> result = shopMchEntryBranchService.applyMchEntryBranchStore(mainStoreBranchReq);
if (result.getFirst()) {
return CommonResult.success();
}
return CommonResult.failed(result.getSecond());
} catch (Exception e) {
log.error("申请总店分店异常", e);
return CommonResult.failed("系统异常,请稍后重试");
}
}
}

View File

@ -34,7 +34,7 @@ public class ShopStorePrinterController {
@ApiOperation(value = "内部测试案例", notes = "内部测试案例")
@RequestMapping(value = "/testcase", method = {RequestMethod.GET})
public CommonResult TestCase() {
Object data = shopStoreSameCityTransportBaseService.computeSameCityTransportFee(3L, "110.078141", "23.375037", 100, BigDecimal.valueOf(19), BigDecimal.valueOf(5.5), BigDecimal.valueOf(5.5), true);
Object data = shopStoreSameCityTransportBaseService.computeSameCityTransportFee(3L, "110.078141", "23.375037", 100, BigDecimal.valueOf(19), BigDecimal.valueOf(5.5), BigDecimal.valueOf(5.5), false, true);
// Double distanceD = PositionUtil.getDistance4(110.084376,23.394216,110.11752034714767,23.31704849881646);
// BigDecimal s = new BigDecimal(2.50).setScale(2, RoundingMode.HALF_UP);

View File

@ -62,7 +62,7 @@ public class ShopMchEntryController extends BaseControllerImpl {
@ApiOperation(value = "获取商家入驻资料详情", notes = "获取商家入驻资料详情")
@RequestMapping(value = "/detail", method = RequestMethod.POST)
public CommonResult shopMerchEntryDetail(@RequestBody JSONObject jsonParam) {
return shopMchEntryService.shopMerchEntryDetail(null, jsonParam.getStr("mobile"), null);
return shopMchEntryService.shopMerchEntryDetail(jsonParam.getLong("mch_id"), jsonParam.getStr("mobile"), null);
}
@ApiOperation(value = "通过手机号mobile获取商家入驻审核状态", notes = "通过手机号获取商家入驻审核状态,远程调用用途")

View File

@ -0,0 +1,17 @@
/*
* 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.shop.store.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.store.ShopMchEntryBranch;
import org.springframework.stereotype.Component;
@Component
public interface ShopMchEntryBranchMapper extends BaseMapper<ShopMchEntryBranch> {
}

View File

@ -0,0 +1,62 @@
/*
* 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.shop.store.service;
import com.suisung.mall.common.modules.store.ShopMchEntryBranch;
import com.suisung.mall.common.pojo.dto.MainStoreBranchReqDTO;
import org.springframework.data.util.Pair;
public interface ShopMchEntryBranchService {
/**
* 保存或更新商户终端入驻申请信息
*
* @param shopMchEntryBranch 商户入驻申请信息
* @return 保存结果
*/
Boolean saveShopMchEntryBranch(ShopMchEntryBranch shopMchEntryBranch);
/**
* 更新商户终端入驻申请信息
*
* @param reviewRelatedId 商户终端入驻申请ID
* @param status 商户终端入驻申请状态
* @param notifyResp 商户终端入驻申请通知响应数据
* @return 更新结果
*/
Boolean updateByReviewRelatedId(String reviewRelatedId, Integer status, String notifyResp);
/**
* 根据商户终端入驻申请ID查询商户终端入驻申请信息
*
* @param reviewRelatedId 商户终端入驻申请ID
* @return 商户入驻申请信息
*/
ShopMchEntryBranch getByReviewRelatedId(String reviewRelatedId);
/**
* 重要创建主店铺的分店账号店铺信息店铺员工信息店铺权限信息入驻信息
*
* @param mainStoreBranchReq 商户终端入驻申请门店信息
* @return 创建结果
*/
Pair<Boolean, String> applyMchEntryBranchStore(MainStoreBranchReqDTO mainStoreBranchReq);
/**
* 重要创建商户终端入驻申请门店信息创建商户终端入驻申请门店员工信息创建商户终端入驻申请门店权限信息创建商户终端入驻申请门店入驻信息
*
* @param reviewRelatedId 商户终端入驻申请ID
* @param termNo 终端号
* @param lklNotifyResp 拉卡拉通知响应数据
* @return 创建结果
*/
Pair<Boolean, String> createMchEntryBranchStore(String reviewRelatedId, String termNo, String lklNotifyResp);
}

View File

@ -9,6 +9,7 @@
package com.suisung.mall.shop.store.service;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.store.ShopMchEntry;
import org.springframework.data.util.Pair;
@ -18,6 +19,14 @@ import java.util.List;
public interface ShopMchEntryService {
/**
* 新增或修改商家入驻申请信息
*
* @param shopMchEntry
* @return
*/
Boolean saveOrUpdateShopMchEntry(ShopMchEntry shopMchEntry);
/**
* 获取店铺的经营类目列表
*
@ -129,6 +138,15 @@ public interface ShopMchEntryService {
ShopMchEntry getShopMerchEntryByCondition(String loginMobile, String bizLicenseNumber, Integer... approvalStatusList);
/**
* 根据拉卡拉商户号获取有效的商家入驻申请记录
*
* @param merCupNo
* @param parentId
* @return
*/
ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo, Long parentId);
/**
* 根据拉卡拉外部商户号获取有效的商家入驻申请记录
*
@ -375,4 +393,14 @@ public interface ShopMchEntryService {
* @return
*/
ShopMchEntry getLklContractStatusUrl(Integer storeId);
ShopMchEntry findOneByLambdaQueryWrapper(LambdaQueryWrapper<ShopMchEntry> query);
/**
* 根据商户入驻Id删除商户入驻记录
*
* @param mchId 商户入驻Id
* @return 删除结果true为成功false为失败
*/
Boolean removeByMchId(Long mchId);
}

View File

@ -166,6 +166,17 @@ public interface ShopStoreBaseService extends IBaseService<ShopStoreBase> {
*/
Pair<Integer, String> covMerchEntryInfo2StoreInfo(Long mchId, Boolean allowThrown);
/**
* (重要入驻审批通过并且合同盖章完结之后把商家入驻信息转换成店铺信息正式生成店铺所需的数据
*
* @param mchId 入驻编号
* @param parentStoreId 总店店铺Id
* @param allowThrown 是否允许抛出异常
* @return
*/
Pair<Integer, String> covMerchEntryInfo2StoreInfo(Long mchId, Integer parentStoreId, Boolean allowThrown);
/**
* 根据店铺名称判断店铺是否存在
*

View File

@ -47,4 +47,12 @@ public interface ShopStoreInfoService extends IBaseService<ShopStoreInfo> {
* @return
*/
Integer getStoreShippingFeeInner(Integer storeId);
/**
* 获取店铺的配送方式是否 自配送
*
* @param storeId
* @return
*/
Boolean isDeliverySelf(Integer storeId);
}

View File

@ -94,10 +94,11 @@ public interface ShopStoreSameCityTransportBaseService {
* @param orderProductAmount 订单商品原价金额
* @param orderDiscountAmount 订单商品折扣金额订单原价减去每个商品折扣费
* @param orderPayAmount 订单实际支付金额折扣金额-优惠券-积分扣-人工干预扣费不包含运费
* @param isPlatform 是否平台 1-2-
* @param canThrow 能否抛出异常
* @return
*/
SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean canThrow);
SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean isPlatform, Boolean canThrow);
/**
* 平台计算同城订单的内部配送费仅仅作用于平台内部配送费计算商家配送费忽略此方法只对下单成功的订单起效果

View File

@ -31,12 +31,12 @@ public interface ShopStoreSfOrderService extends IBaseService<ShopStoreSfOrder>
String getSfOrderIdByShopOrderId(String shopOrderId);
/**
* 新增一个顺丰同城订单记录
* 保存新增或更新一个顺丰同城订单记录
*
* @param record
* @return
*/
Boolean insertShopStoreSfOrder(ShopStoreSfOrder record);
Boolean saveShopStoreSfOrder(ShopStoreSfOrder record);
/**

View File

@ -0,0 +1,470 @@
package com.suisung.mall.shop.store.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.feignService.AccountService;
import com.suisung.mall.common.modules.store.ShopMchEntry;
import com.suisung.mall.common.modules.store.ShopMchEntryBranch;
import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.pojo.dto.MainStoreBranchReqDTO;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.lakala.service.impl.LklTkServiceImpl;
import com.suisung.mall.shop.store.mapper.ShopMchEntryBranchMapper;
import com.suisung.mall.shop.store.mapper.ShopMchEntryMapper;
import com.suisung.mall.shop.store.service.ShopMchEntryBranchService;
import com.suisung.mall.shop.store.service.ShopMchEntryService;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.Objects;
@Slf4j
@Service
public class ShopMchEntryBranchServiceImpl extends BaseServiceImpl<ShopMchEntryBranchMapper, ShopMchEntryBranch> implements ShopMchEntryBranchService {
@Lazy
@Autowired
private ShopStoreBaseService shopStoreBaseService;
@Lazy
@Autowired
private ShopMchEntryService shopMchEntryService;
@Lazy
@Autowired
private AccountService accountService;
@Lazy
@Autowired
private ShopMchEntryMapper shopMchEntryMapper;
@Lazy
@Autowired
private LklTkServiceImpl lklTkService;
/**
* 保存或更新商户终端入驻申请信息
* <p>
* 根据 reviewRelatedId 确定新增或更改记录
*
* @param shopMchEntryBranch 商户入驻申请信息
* @return 保存结果
*/
@Override
public Boolean saveShopMchEntryBranch(ShopMchEntryBranch shopMchEntryBranch) {
try {
if (shopMchEntryBranch == null) {
log.error("商户终端入驻申请信息不能为空");
return false;
}
// 验证必要字段
if (StrUtil.isBlank(shopMchEntryBranch.getReview_related_id())) {
log.error("审核关联号不能为空");
return false;
}
String reviewRelatedId = shopMchEntryBranch.getReview_related_id();
// 查询是否已存在记录
ShopMchEntryBranch existingRecord = getByReviewRelatedId(reviewRelatedId);
boolean result;
if (existingRecord != null) {
// 更新现有记录
shopMchEntryBranch.setId(existingRecord.getId());
result = updateById(shopMchEntryBranch);
log.info("更新商户终端入驻申请信息成功,审核关联号: {}", reviewRelatedId);
} else {
// 新增记录
result = save(shopMchEntryBranch);
log.info("新增商户终端入驻申请信息成功,审核关联号: {}", reviewRelatedId);
}
return result;
} catch (Exception e) {
log.error("保存或更新商户终端入驻申请信息失败,审核关联号: {}",
shopMchEntryBranch != null ? shopMchEntryBranch.getReview_related_id() : "null", e);
return false;
}
}
@Override
public Boolean updateByReviewRelatedId(String reviewRelatedId, Integer status, String notifyResp) {
try {
// 参数校验
if (StrUtil.isBlank(reviewRelatedId)) {
log.warn("审核关联号不能为空,无法执行更新操作");
return false;
}
LambdaUpdateWrapper<ShopMchEntryBranch> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ShopMchEntryBranch::getReview_related_id, reviewRelatedId).set(ShopMchEntryBranch::getUpdated_at, new Date());
// 只有当状态值有效时才更新状态字段
if (CheckUtil.isNotEmpty(status)) {
updateWrapper.set(ShopMchEntryBranch::getStatus, status);
log.debug("更新状态字段为: {}", status);
}
// 更新通知响应内容
if (StrUtil.isNotBlank(notifyResp)) { // 允许空字符串但不能为null
updateWrapper.set(ShopMchEntryBranch::getLkl_notify_reps, notifyResp);
}
boolean result = update(updateWrapper);
if (result) {
log.info("成功更新分店入驻申请记录,审核关联号: {}", reviewRelatedId);
} else {
log.warn("更新分店入驻申请记录失败,审核关联号: {}", reviewRelatedId);
}
return result;
} catch (Exception e) {
log.error("更新分店入驻申请记录时发生异常,审核关联号: {}", reviewRelatedId, e);
return false;
}
}
/**
* 根据商户终端入驻申请ID查询商户终端入驻申请信息
*
* @param reviewRelatedId 商户终端入驻申请ID
* @return 商户入驻申请信息
*/
@Override
public ShopMchEntryBranch getByReviewRelatedId(String reviewRelatedId) {
try {
if (StrUtil.isBlank(reviewRelatedId)) {
log.warn("审核关联号为空,无法查询商户终端入驻申请信息");
return null;
}
LambdaQueryWrapper<ShopMchEntryBranch> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopMchEntryBranch::getReview_related_id, reviewRelatedId);
ShopMchEntryBranch result = findOne(queryWrapper);
if (result != null) {
log.debug("查询商户终端入驻申请信息成功,审核关联号: {}", reviewRelatedId);
} else {
log.info("未找到对应的商户终端入驻申请信息,审核关联号: {}", reviewRelatedId);
}
return result;
} catch (Exception e) {
log.error("查询商户终端入驻申请信息失败,审核关联号: {}", reviewRelatedId, e);
return null;
}
}
/**
* 检测分店信息并向拉卡拉申请创建分店商户入驻申请
*
* @param mainStoreBranchReq 分店入驻请求DTO
* @return Pair<Boolean, String> - 执行结果和提示信息
*/
@Override
public Pair<Boolean, String> applyMchEntryBranchStore(MainStoreBranchReqDTO mainStoreBranchReq) {
log.info("开始创建分店商户入驻申请,请求参数: {}", JSONUtil.toJsonStr(mainStoreBranchReq));
try {
// 1. 参数校验
if (mainStoreBranchReq == null) {
log.warn("分店入驻信息不能为空");
return Pair.of(false, "分店入驻信息不能为空");
}
// 必填参数校验
if (mainStoreBranchReq.getParent_store_id() == null) {
return Pair.of(false, "主店ID不能为空");
}
if (StrUtil.isBlank(mainStoreBranchReq.getLogin_mobile())) {
return Pair.of(false, "登录手机号不能为空");
}
if (StrUtil.isBlank(mainStoreBranchReq.getStore_name())) {
return Pair.of(false, "分店名称不能为空");
}
if (StrUtil.isBlank(mainStoreBranchReq.getStore_address())) {
return Pair.of(false, "分店地址不能为空");
}
if (StrUtil.isBlank(mainStoreBranchReq.getStore_longitude())) {
return Pair.of(false, "分店经度不能为空");
}
if (StrUtil.isBlank(mainStoreBranchReq.getStore_latitude())) {
return Pair.of(false, "分店纬度不能为空");
}
// 2. 检查主店信息是否存在及入驻状态
LambdaQueryWrapper<ShopMchEntry> entryQueryWrapper = new LambdaQueryWrapper<>();
entryQueryWrapper.eq(ShopMchEntry::getStore_id, mainStoreBranchReq.getParent_store_id())
.eq(ShopMchEntry::getApproval_status, CommonConstant.MCH_APPR_STA_PASS)
.eq(ShopMchEntry::getParent_id, 0L); // 总店记录
ShopMchEntry mchEntry = shopMchEntryService.findOneByLambdaQueryWrapper(entryQueryWrapper);
if (mchEntry == null) {
return Pair.of(false, "主店商户入驻信息不存在");
}
if (!Objects.equals(mchEntry.getLkl_tk_audit_status(), CommonConstant.Enable)) {
return Pair.of(false, "主店入驻状态未完成,无法创建分店");
}
// 3. 检查店铺名称是否已经存在
LambdaQueryWrapper<ShopStoreBase> nameQueryWrapper = new LambdaQueryWrapper<>();
nameQueryWrapper.eq(ShopStoreBase::getStore_name, mainStoreBranchReq.getStore_name());
if (shopStoreBaseService.getOne(nameQueryWrapper) != null) {
return Pair.of(false, "店铺名称已存在");
}
// 4. 检查分店登录手机号是否已经注册过商户
Integer status = accountService.isMerchantExists(mainStoreBranchReq.getLogin_mobile());
if (CheckUtil.isEmpty(status)) {
return Pair.of(false, "检查商户信息失败!");
}
if (CommonConstant.Enable.equals(status)) {
return Pair.of(false, "手机号已被其他商家注册");
}
// 5. 检查分店终端号是否已经申请或申请中
LambdaQueryWrapper<ShopMchEntryBranch> branchQueryWrapper = new LambdaQueryWrapper<>();
branchQueryWrapper.eq(ShopMchEntryBranch::getLkl_mer_cup_no, mchEntry.getLkl_mer_inner_no())
.in(ShopMchEntryBranch::getStatus, Arrays.asList(1, 3)); // 1-申请中3-可能的其他状态
if (count(branchQueryWrapper) > 0) {
return Pair.of(false, "分店终端号已申请或申请中,请等待审核");
}
// 6. 调用拉卡拉接口创建商户终端
JSONObject lklResp = lklTkService.openMerchantAddTerm(mchEntry.getLkl_mer_cup_no());
if (lklResp == null || StrUtil.isBlank(lklResp.getStr("reviewRelatedId"))) {
log.error("调用拉卡拉接口创建商户终端失败,主店拉卡拉商户号: {}", mchEntry.getLkl_mer_cup_no());
return Pair.of(false, "分店提交申请失败");
}
// 7. 保存商户入驻申请信息
ShopMchEntryBranch shopMchEntryBranch = new ShopMchEntryBranch();
shopMchEntryBranch.setLkl_mer_cup_no(mchEntry.getLkl_mer_cup_no());
shopMchEntryBranch.setReview_related_id(lklResp.getStr("reviewRelatedId"));
shopMchEntryBranch.setLkl_req(JSONUtil.toJsonStr(mainStoreBranchReq));
shopMchEntryBranch.setLkl_reps(JSONUtil.toJsonStr(lklResp));
if (!saveShopMchEntryBranch(shopMchEntryBranch)) {
return Pair.of(false, "分店提交申请失败");
}
log.info("分店商户入驻申请创建成功,审核关联号: {}", lklResp.getStr("reviewRelatedId"));
return Pair.of(true, "分店提交申请成功");
} catch (Exception e) {
log.error("创建分店商户入驻申请时发生异常,请求参数: {}", JSONUtil.toJsonStr(mainStoreBranchReq), e);
return Pair.of(false, "分店提交申请失败:" + e.getMessage());
}
}
/**
* 重要创建商户终端入驻申请门店信息创建商户终端入驻申请门店员工信息创建商户终端入驻申请门店权限信息创建商户终端入驻申请门店入驻信息
*
* @param reviewRelatedId 商户终端入驻申请ID
* @param termNo 商户终端编号
* @param lklNotifyResp 拉卡拉通知响应数据
* @return 创建结果
*/
@GlobalTransactional
@Override
public Pair<Boolean, String> createMchEntryBranchStore(String reviewRelatedId, String termNo, String lklNotifyResp) {
log.info("开始处理分店商户入驻,审核关联号: {}, 终端号: {}", reviewRelatedId, termNo);
// 1. 参数校验
if (StrUtil.isBlank(reviewRelatedId) || StrUtil.isBlank(termNo)) {
return Pair.of(false, "参数不能为空");
}
try {
// 2. 查询分店入驻申请记录
ShopMchEntryBranch shopMchEntryBranch = getByReviewRelatedId(reviewRelatedId);
if (shopMchEntryBranch == null) {
return Pair.of(false, "分店商户入驻申请不存在");
}
// 3. 更新分店入驻申请记录
shopMchEntryBranch.setLkl_term_no(termNo);
shopMchEntryBranch.setStatus(CommonConstant.Enable);
shopMchEntryBranch.setLkl_notify_reps(lklNotifyResp);
if (!updateById(shopMchEntryBranch)) {
throw new ApiException("更新分店入驻申请记录失败");
}
// 4. 解析分店入驻请求数据
MainStoreBranchReqDTO mainStoreBranchReq = JSONUtil.toBean(shopMchEntryBranch.getLkl_req(), MainStoreBranchReqDTO.class);
if (mainStoreBranchReq == null) {
throw new ApiException("解析分店入驻请求数据失败");
}
// 5. 获取总店入驻信息
ShopMchEntry parentShopMchEntry = shopMchEntryService.getShopMerchEntryByMerCupNo(shopMchEntryBranch.getLkl_mer_cup_no(), 0L);
if (parentShopMchEntry == null) {
throw new ApiException("主店入驻信息不存在");
}
// 6. 构建分店入驻信息
ShopMchEntry shopMchEntry = new ShopMchEntry();
cn.hutool.core.bean.BeanUtil.copyProperties(parentShopMchEntry, shopMchEntry, "id");
shopMchEntry.setId(null); // ID设置为null以便插入新记录
shopMchEntry.setLkl_term_no(termNo);
shopMchEntry.setLogin_mobile(mainStoreBranchReq.getLogin_mobile());
shopMchEntry.setParent_id(parentShopMchEntry.getId()); // 设置主店入驻ID为父ID
shopMchEntry.setStore_name(mainStoreBranchReq.getStore_name());
shopMchEntry.setStore_address(mainStoreBranchReq.getStore_address());
shopMchEntry.setStore_longitude(mainStoreBranchReq.getStore_longitude());
shopMchEntry.setStore_latitude(mainStoreBranchReq.getStore_latitude());
shopMchEntry.setStatus(CommonConstant.Enable);
if (StrUtil.isNotBlank(mainStoreBranchReq.getContact_name())) {
shopMchEntry.setContact_name(mainStoreBranchReq.getContact_name());
}
if (StrUtil.isNotBlank(mainStoreBranchReq.getFront_facade_image())) {
shopMchEntry.setFront_facade_image(mainStoreBranchReq.getFront_facade_image());
}
if (StrUtil.isNotBlank(mainStoreBranchReq.getEnvironment_image())) {
shopMchEntry.setEnvironment_image(mainStoreBranchReq.getEnvironment_image());
}
shopMchEntry.setEmail(StrUtil.isBlank(mainStoreBranchReq.getEmail()) ? parentShopMchEntry.getLogin_mobile() + "@qq.com" : mainStoreBranchReq.getEmail());
// 7. 保存分店入驻记录
if (!shopMchEntryService.saveOrUpdateShopMchEntry(shopMchEntry)) {
throw new ApiException("保存分店入驻记录失败:" + shopMchEntry.getStore_name());
}
// 8. 创建分店店铺商家登录账号
Pair<Boolean, String> registerResult = accountService.merchantInnerRegister(mainStoreBranchReq.getLogin_mobile(), mainStoreBranchReq.getPassword());
if (!registerResult.getFirst()) {
throw new ApiException("分店商户注册账号失败:" + registerResult.getSecond());
}
// 9. 创建分店店铺信息
Pair<Integer, String> storeResult = shopStoreBaseService.covMerchEntryInfo2StoreInfo(shopMchEntry.getId(), Convert.toInt(parentShopMchEntry.getStore_id(), 0), true);
if (storeResult == null || storeResult.getFirst() <= 0) {
throw new ApiException("创建分店店铺信息失败: " + (storeResult != null ? storeResult.getSecond() : "未知错误"));
}
log.info("分店商户入驻处理成功分店入驻ID: {}, 店铺ID: {}", shopMchEntry.getId(), storeResult.getFirst());
return Pair.of(true, "分店商户入驻处理成功");
} catch (Exception e) {
log.error("处理分店商户入驻时发生异常,审核关联号: {}, 终端号: {}", reviewRelatedId, termNo, e);
throw new ApiException("处理分店商户入驻时发生异常,审核关联号: " + reviewRelatedId + ", 终端号: " + termNo);
}
}
/**
* 清理分店商户入驻信息
*
* @param lklMerCupNo 拉卡拉商户号
* @param lklTermNo 拉卡拉终端号
* @return 清理结果
*/
@GlobalTransactional
public Pair<Boolean, String> cleanMchEntryBranchStore(String lklMerCupNo, String lklTermNo) {
log.info("开始清理分店商户入驻信息,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo);
// 1. 参数校验
if (StrUtil.isBlank(lklMerCupNo) || StrUtil.isBlank(lklTermNo)) {
log.warn("清理分店商户入驻参数校验失败lklMerCupNo: {}, lklTermNo: {}", lklMerCupNo, lklTermNo);
return Pair.of(false, "参数不能为空");
}
try {
log.debug("步骤1 - 查询分店入驻记录,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo);
// 2. 查询分店入驻记录
LambdaQueryWrapper<ShopMchEntry> entryQueryWrapper = new LambdaQueryWrapper<>();
entryQueryWrapper.eq(ShopMchEntry::getLkl_mer_cup_no, lklMerCupNo)
.eq(ShopMchEntry::getLkl_term_no, lklTermNo);
ShopMchEntry shopMchEntry = shopMchEntryService.findOneByLambdaQueryWrapper(entryQueryWrapper);
if (shopMchEntry == null) {
log.warn("未找到对应的分店入驻记录,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo);
return Pair.of(false, "未找到对应的分店入驻记录");
}
log.debug("步骤1 - 找到分店入驻记录分店ID: {}, 店铺名称: {}", shopMchEntry.getId(), shopMchEntry.getStore_name());
log.debug("步骤2 - 查询分店店铺信息分店入驻ID: {}", shopMchEntry.getId());
// 3. 查询分店店铺信息
LambdaQueryWrapper<ShopStoreBase> storeQueryWrapper = new LambdaQueryWrapper<>();
storeQueryWrapper.eq(ShopStoreBase::getStore_id, shopMchEntry.getStore_id());
ShopStoreBase shopStore = shopStoreBaseService.getOne(storeQueryWrapper);
if (shopStore == null) {
log.warn("未找到对应的分店店铺信息分店入驻ID: {}", shopMchEntry.getId());
} else {
log.debug("步骤2 - 找到分店店铺信息店铺ID: {}, 店铺名称: {}", shopStore.getStore_id(), shopStore.getStore_name());
}
log.debug("步骤3 - 删除分店店铺信息店铺ID: {}", shopStore != null ? shopStore.getStore_id() : "null");
// 4. 删除分店店铺信息
if (shopStore != null) {
boolean deleteStoreResult = shopStoreBaseService.removeById(shopStore.getStore_id());
if (!deleteStoreResult) {
log.error("删除分店店铺信息失败店铺ID: {}", shopStore.getStore_id());
throw new ApiException("删除分店店铺信息失败");
}
log.debug("步骤3 - 删除分店店铺信息成功店铺ID: {}", shopStore.getStore_id());
}
log.debug("步骤4 - 删除分店入驻记录分店ID: {}", shopMchEntry.getId());
// 5. 删除分店入驻记录
boolean deleteEntryResult = shopMchEntryService.removeByMchId(shopMchEntry.getId());
if (!deleteEntryResult) {
log.error("删除分店入驻记录失败分店ID: {}", shopMchEntry.getId());
throw new ApiException("删除分店入驻记录失败");
}
log.debug("步骤4 - 删除分店入驻记录成功分店ID: {}", shopMchEntry.getId());
log.debug("步骤5 - 查询分店入驻申请记录,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo);
// 6. 查询分店入驻申请记录
LambdaQueryWrapper<ShopMchEntryBranch> branchQueryWrapper = new LambdaQueryWrapper<>();
branchQueryWrapper.eq(ShopMchEntryBranch::getLkl_mer_cup_no, lklMerCupNo)
.eq(ShopMchEntryBranch::getLkl_term_no, lklTermNo);
ShopMchEntryBranch shopMchEntryBranch = getOne(branchQueryWrapper);
if (shopMchEntryBranch != null) {
log.debug("步骤5 - 找到分店入驻申请记录审核关联ID: {}", shopMchEntryBranch.getReview_related_id());
log.debug("步骤6 - 删除分店入驻申请记录审核关联ID: {}", shopMchEntryBranch.getReview_related_id());
// 7. 删除分店入驻申请记录
boolean deleteBranchResult = removeById(shopMchEntryBranch.getId());
if (!deleteBranchResult) {
log.error("删除分店入驻申请记录失败审核关联ID: {}", shopMchEntryBranch.getReview_related_id());
throw new ApiException("删除分店入驻申请记录失败");
}
log.debug("步骤6 - 删除分店入驻申请记录成功审核关联ID: {}", shopMchEntryBranch.getReview_related_id());
}
log.info("分店商户入驻信息清理完成,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo);
return Pair.of(true, "分店商户入驻信息清理成功");
} catch (Exception e) {
log.error("清理分店商户入驻信息时发生异常,拉卡拉商户号: {}, 终端号: {}", lklMerCupNo, lklTermNo, e);
throw new ApiException("清理分店商户入驻信息时发生异常,拉卡拉商户号: " + lklMerCupNo + ", 终端号: " + lklTermNo);
}
}
}

View File

@ -30,6 +30,7 @@ import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.lakala.LklLedgerEc;
import com.suisung.mall.common.modules.store.ShopMchEntry;
import com.suisung.mall.common.modules.store.ShopStoreEmployee;
import com.suisung.mall.common.modules.store.ShopStoreInfo;
import com.suisung.mall.common.pojo.to.AddressParseResultTO;
import com.suisung.mall.common.utils.*;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
@ -45,6 +46,7 @@ import com.suisung.mall.shop.store.mapper.ShopMchEntryMapper;
import com.suisung.mall.shop.store.service.ShopMchEntryService;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import com.suisung.mall.shop.store.service.ShopStoreEmployeeService;
import com.suisung.mall.shop.store.service.ShopStoreInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.util.Pair;
@ -97,6 +99,61 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
@Resource
private ShopBaseDistrictService shopBaseDistrictService;
@Lazy
@Resource
private ShopStoreInfoService shopStoreInfoService;
/**
* 新增或修改商家入驻申请信息
*
* @param shopMchEntry 商家入驻申请信息实体对象不能为空
* @return Boolean 操作结果true表示成功false表示失败
*/
@Override
public Boolean saveOrUpdateShopMchEntry(ShopMchEntry shopMchEntry) {
// 1. 参数校验
if (shopMchEntry == null) {
log.warn("商家入驻申请信息不能为空");
return false;
}
try {
// 2. 记录操作日志
Long mchId = shopMchEntry.getId();
String storeName = shopMchEntry.getStore_name();
String loginMobile = shopMchEntry.getLogin_mobile();
if (mchId != null && mchId > 0) {
log.info("开始更新商家入驻申请信息ID: {}, 店铺名称: {}, 手机号: {}", mchId, storeName, loginMobile);
} else {
log.info("开始新增商家入驻申请信息,店铺名称: {}, 手机号: {}", storeName, loginMobile);
}
// 3. 执行保存或更新操作
boolean result = saveOrUpdate(shopMchEntry);
// 4. 记录操作结果
if (result) {
if (mchId != null && mchId > 0) {
log.info("商家入驻申请信息更新成功ID: {}", mchId);
} else {
log.info("商家入驻申请信息新增成功新ID: {}", shopMchEntry.getId());
}
} else {
log.error("商家入驻申请信息保存或更新失败ID: {}, 店铺名称: {}, 手机号: {}",
mchId, storeName, loginMobile);
}
return result;
} catch (Exception e) {
log.error("商家入驻申请信息保存或更新异常,店铺名称: {}, 手机号: {}",
shopMchEntry.getStore_name(), shopMchEntry.getLogin_mobile(), e);
return false;
}
}
/**
* 获取店铺的经营类目列表
*
@ -189,6 +246,11 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return CommonResult.failed("请选择是企业还是个人");
}
if (StrUtil.isBlank(record.getCheckstand_image())) {
log.warn("未上传店铺门头照片,手机号: {}", loginMobile);
return CommonResult.failed("请上传店铺收银台照片");
}
// 不管是企业或个人只要没有填写联系人就直接把商家手机号码作为联系人手机号码
if (StrUtil.isBlank(record.getLegal_person_mobile())) {
record.setLegal_person_mobile(loginMobile);
@ -265,6 +327,12 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return CommonResult.failed("缺少法人身份证信息!");
}
// TODO 银行开户许可证明开户账号图片 必填项
if (StrUtil.isBlank(record.getOpening_permit_image())) {
log.warn("缺少银行开户许可证明图片,手机号: {}", loginMobile);
return CommonResult.failed("缺少银行开户许可证明图片!");
}
if (!StringUtils.validateIDCard(record.getLegal_person_id_number())) {
log.warn("法人身份证号码格式错误,号码: {},手机号: {}", record.getLegal_person_id_number(), loginMobile);
return CommonResult.failed("法人身份证号码有误!");
@ -594,48 +662,79 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
/**
* 通过 mobile 申请手机号或自增 ID 获取商家入驻申请详情
*
* @param recordId
* @param mobile
* @param approvalStatusList
* @return
* @param recordId 商家入驻记录ID可选
* @param mobile 商家登录手机号可选
* @param approvalStatusList 审批状态列表过滤条件可选
* @return CommonResult 包含商家入驻申请详情的响应结果
*/
@Override
public CommonResult shopMerchEntryDetail(Long recordId, String mobile, List<Integer> approvalStatusList) {
// 检查登录用户是否有管理权限或者是用户自己
log.debug("获取商家入驻申请详情开始: recordId={}, mobile={}", recordId, mobile);
// approvalStatus 入驻商家的审批状态1-已通过2-未通过3-待审核
// 参数校验recordId mobile 至少提供一个
if (ObjectUtil.isEmpty(recordId) && StrUtil.isBlank(mobile)) {
log.warn("获取商家入驻详情失败:缺少必要参数 recordId 或 mobile");
return CommonResult.failed("缺少必要参数!");
}
QueryWrapper<ShopMchEntry> queryWrapper = new QueryWrapper<>();
if (ObjectUtil.isNotEmpty(recordId)) {
queryWrapper.eq("id", recordId);
}
try {
// 构建查询条件
QueryWrapper<ShopMchEntry> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotBlank(mobile)) {
queryWrapper.eq("login_mobile", mobile);
}
// 根据ID查询
if (ObjectUtil.isNotEmpty(recordId)) {
queryWrapper.eq("id", recordId);
}
if (CollectionUtil.isNotEmpty(approvalStatusList)) {
queryWrapper.in("approval_status", approvalStatusList);
}
queryWrapper.orderByDesc("id");
List<ShopMchEntry> recordList = list(queryWrapper);
if (CollectionUtil.isEmpty(recordList)) {
return CommonResult.success(new JSONObject().set("approval_status", CommonConstant.MCH_APPR_STA_NONE), "请求成功!");
}
// 根据手机号查询
if (StrUtil.isNotBlank(mobile)) {
queryWrapper.eq("login_mobile", mobile);
}
ShopMchEntry record = recordList.get(0);
// 审核意见空值返回"[]"
if (StrUtil.isBlank(record.getApproval_invalid_col())) {
record.setApproval_invalid_col("[]");
// 状态过滤条件
if (CollectionUtil.isNotEmpty(approvalStatusList)) {
queryWrapper.in("approval_status", approvalStatusList);
}
// 按ID倒序排列获取最新一条记录
queryWrapper.orderByDesc("id");
ShopMchEntry record = getOne(queryWrapper);
// 如果没有找到记录返回默认的成功结果
if (ObjectUtil.isEmpty(record)) {
log.debug("未找到商家入驻记录: recordId={}, mobile={}", recordId, mobile);
return CommonResult.success(
new JSONObject().set("approval_status", CommonConstant.MCH_APPR_STA_NONE),
"请求成功!"
);
}
// 处理审核意见空值情况
if (StrUtil.isBlank(record.getApproval_invalid_col())) {
record.setApproval_invalid_col("[]");
}
// 尝试更新入驻表的合同下载地址和合同签署状态
updateMerchEntrySignedStatusAndContractDownloadUrl(record);
if (StrUtil.isNotBlank(record.getStore_id())) {
// 转换为JSONObject并添加额外属性
JSONObject retObj = JSONUtil.parseObj(record);
// 获取店铺信息
ShopStoreInfo storeInfo = shopStoreInfoService.getById(record.getStore_id());
if (storeInfo != null && retObj != null) {
retObj.set("is_delivery_self", storeInfo.getIs_delivery_self());
return CommonResult.success(record);
}
}
return CommonResult.success(record);
} catch (Exception e) {
log.error("获取商家入驻申请详情异常: recordId={}, mobile={}", recordId, mobile, e);
return CommonResult.failed("系统异常,请稍后重试");
}
// 试试更新入驻表的合同下载地址和合同签署状态
updateMerchEntrySignedStatusAndContractDownloadUrl(record);
return CommonResult.success(record);
}
@ -1231,19 +1330,32 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
* @return
*/
@Override
public ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo) {
public ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo, Long parentId) {
if (StrUtil.isBlank(merCupNo)) {
return null;
}
QueryWrapper<ShopMchEntry> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("lkl_mer_cup_no", merCupNo).eq("status", CommonConstant.Enable).orderByAsc("id");
List<ShopMchEntry> recordList = list(queryWrapper);
if (CollectionUtil.isEmpty(recordList)) {
LambdaQueryWrapper<ShopMchEntry> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopMchEntry::getLkl_mer_cup_no, merCupNo)
.eq(ShopMchEntry::getStatus, CommonConstant.Enable)
.orderByAsc(ShopMchEntry::getId);
if (parentId != null && parentId >= 0) {
queryWrapper.eq(ShopMchEntry::getParent_id, parentId);
}
ShopMchEntry record = findOne(queryWrapper);
if (ObjectUtil.isEmpty(record)) {
return null;
}
return recordList.get(0);
return record;
}
@Override
public ShopMchEntry getShopMerchEntryByMerCupNo(String merCupNo) {
return getShopMerchEntryByMerCupNo(merCupNo, null);
}
@Override
@ -1252,14 +1364,14 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return null;
}
QueryWrapper<ShopMchEntry> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("lkl_mer_inner_no", merInnerNo).eq("status", CommonConstant.Enable).orderByAsc("id");
List<ShopMchEntry> recordList = list(queryWrapper);
if (CollectionUtil.isEmpty(recordList)) {
LambdaQueryWrapper<ShopMchEntry> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopMchEntry::getLkl_mer_inner_no, merInnerNo).eq(ShopMchEntry::getStatus, CommonConstant.Enable).orderByAsc(ShopMchEntry::getId);
ShopMchEntry record = findOne(queryWrapper);
if (ObjectUtil.isEmpty(record)) {
return null;
}
return recordList.get(0);
return record;
}
/**
@ -2542,6 +2654,40 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
}
}
/**
* 根据Lambda查询条件获取单个商户入驻记录
*
* @param query Lambda查询条件不能为空
* @return 商户入驻记录未找到时返回null
*/
@Override
public ShopMchEntry findOneByLambdaQueryWrapper(LambdaQueryWrapper<ShopMchEntry> query) {
// 参数校验
if (query == null) {
log.warn("查询条件为空,无法执行查询");
return null;
}
try {
// 执行查询
return findOne(query);
} catch (Exception e) {
log.error("执行商户入驻查询时发生异常", e);
return null;
}
}
/**
* 根据商户入驻Id删除商户入驻记录
*
* @param mchId 商户入驻Id
* @return 删除结果true为成功false为失败
*/
@Override
public Boolean removeByMchId(Long mchId) {
return remove(mchId);
}
}

View File

@ -74,6 +74,7 @@ import com.suisung.mall.shop.wechat.service.WxQrCodeService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -2473,12 +2474,8 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
// 打包费
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"));
if (packingFee == null || packingFee.compareTo(BigDecimal.ZERO) <= 0) {
packingFee = BigDecimal.ZERO;
}
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"), BigDecimal.ZERO);
if (packingFee.compareTo(new BigDecimal("10")) >= 0) {
logger.warn("打包费超出范围: {}", packingFee);
return CommonResult.failed("打包费请控制在0到10元范围");
}
@ -2503,6 +2500,10 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
}
// 店铺内部配送费
info.setShopping_fee_inner(Convert.toInt(getParameter("shopping_fee_inner", 0)));
info.setIs_delivery_self(Convert.toInt(getParameter("is_delivery_self", 0)));
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换
base = bd09ToGcj02Gps(base);
@ -2664,12 +2665,8 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
// 打包费
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"));
if (packingFee == null || packingFee.compareTo(BigDecimal.ZERO) <= 0) {
packingFee = BigDecimal.ZERO;
}
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
BigDecimal packingFee = Convert.toBigDecimal(getParameter("packing_fee"), BigDecimal.ZERO);
if (packingFee.compareTo(new BigDecimal("10")) >= 0) {
logger.warn("打包费超出范围: {}", packingFee);
return CommonResult.failed("打包费请控制在0到10元范围");
}
@ -3254,6 +3251,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
@Override
public Pair<Integer, String> covMerchEntryInfo2StoreInfo(Long mchId, Boolean allowThrown) {
return covMerchEntryInfo2StoreInfo(mchId, 0, allowThrown);
}
@Override
public Pair<Integer, String> covMerchEntryInfo2StoreInfo(Long mchId, Integer parentStoreId, Boolean allowThrown) {
// 参数校验
if (ObjectUtil.isEmpty(mchId)) {
logger.error("生成店铺入驻商家自增Id不能为空");
@ -3285,9 +3287,10 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
// 检查店铺名称
ShopStoreBase shopStoreBase = findOneByStoreName(shopMchEntry.getStore_name());
if (shopStoreBase != null
&& StrUtil.isNotBlank(shopStoreBase.getLkl_merchant_no())
&& StrUtil.isNotBlank(shopMchEntry.getLkl_mer_cup_no())
&& !shopStoreBase.getLkl_merchant_no().equals(shopMchEntry.getLkl_mer_cup_no())) {
&& StringUtils.isAnyBlank(shopStoreBase.getLkl_merchant_no(), shopStoreBase.getLkl_term_no(), shopMchEntry.getLkl_mer_cup_no(), shopMchEntry.getLkl_term_no())
&& !shopStoreBase.getLkl_merchant_no().equals(shopMchEntry.getLkl_mer_cup_no())
&& !shopStoreBase.getLkl_term_no().equals(shopMchEntry.getLkl_term_no())
) {
logger.error("生成店铺:店铺名称已存在");
return Pair.of(0, "店铺名称已存在,请使用另一名称");
}
@ -3301,6 +3304,12 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreBase.setUser_id(userId);
shopStoreBase.setStore_name(shopMchEntry.getStore_name());
if (CheckUtil.isNotEmpty(parentStoreId)) {
shopStoreBase.setParent_id(parentStoreId);
} else {
shopStoreBase.setParent_id(0);
}
// 店铺二级分类
if (CheckUtil.isEmpty(shopStoreBase.getStore_category_id())) {
shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category());
@ -3323,6 +3332,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
if (CheckUtil.isEmpty(shopStoreBase.getSplit_ratio())) {
shopStoreBase.setSplit_ratio(splitRatio);
}
if (CheckUtil.isEmpty(shopStoreBase.getPacking_fee())) {
shopStoreBase.setPacking_fee(BigDecimal.ZERO);
}
@ -3535,13 +3545,8 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
// 创建顺丰店铺
// if (storeArea != null) {
// String[] areaNames = storeArea.split("/");
// String cityName = areaNames.length > 0 ? areaNames[areaNames.length - 1] : storeArea.replace("/", "");
sfExpressApiService.createSfExpressShop(mchId, storeId, shopMchEntry.getContact_name(),
contact_mobile, shopMchEntry.getStore_longitude(), shopMchEntry.getStore_latitude());
// }
return Pair.of(storeId, "新增成功");
} catch (Exception e) {

View File

@ -50,6 +50,7 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser;
@Service
public class ShopStoreEmployeeServiceImpl extends BaseServiceImpl<ShopStoreEmployeeMapper, ShopStoreEmployee> implements ShopStoreEmployeeService {
@Lazy
@Autowired
private AccountService accountService;

View File

@ -2,8 +2,10 @@ package com.suisung.mall.shop.store.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.feignService.AccountService;
import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.store.ShopStoreAnalytics;
@ -160,4 +162,38 @@ public class ShopStoreInfoServiceImpl extends BaseServiceImpl<ShopStoreInfoMappe
}
}
/**
* 获取店铺的配送方式是否自配送
*
* @param storeId 店铺ID
* @return true表示自配送false表示非自配送或店铺不存在
*/
@Override
public Boolean isDeliverySelf(Integer storeId) {
// 参数校验
if (storeId == null) {
log.warn("店铺ID为空无法判断配送方式");
return false;
}
try {
LambdaQueryWrapper<ShopStoreInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopStoreInfo::getStore_id, storeId)
.select(ShopStoreInfo::getIs_delivery_self);
ShopStoreInfo shopStoreInfo = findOne(queryWrapper);
// 店铺不存在或配送方式字段为空时返回false
if (shopStoreInfo == null || shopStoreInfo.getIs_delivery_self() == null) {
log.debug("店铺信息不存在或配送方式未设置storeId: {}", storeId);
return false;
}
return CommonConstant.Enable.equals(shopStoreInfo.getIs_delivery_self());
} catch (Exception e) {
log.error("查询店铺配送方式异常storeId: {}", storeId, e);
return false;
}
}
}

View File

@ -43,6 +43,7 @@ import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import org.springframework.stereotype.Service;
@ -62,6 +63,10 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser;
public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<ShopStoreSameCityTransportBaseMapper, ShopStoreSameCityTransportBase> implements ShopStoreSameCityTransportBaseService {
private static final Logger logger = LoggerFactory.getLogger(ShopStoreSameCityTransportBaseServiceImpl.class);
@Value("${sf-express.supplier_id}")
private String supplierId;
@Autowired
private ShopStoreSameCityTransportService shopStoreSameCityTransportService;
@Autowired
@ -71,7 +76,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
@Autowired
private ShopOrderInfoService shopOrderInfoService;
@Resource
private AccountBaseConfigService accountBaseConfigService;
@ -325,6 +329,7 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
transportBase.setStore_id(storeId);
transportBase.setIs_platform(isPlatform);
// 设置默认值
transportBase.setArea_type(1);
transportBase.setBasis(1);
@ -351,6 +356,11 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
}
}
// 顺丰同城平台商家Id
if (StrUtil.isBlank(transportBase.getSupplier_id())) {
transportBase.setSupplier_id(supplierId);
}
// 构造返回DTO
ShopStoreSameCityTransportBaseDTO shopStoreSameCityTransportBaseDTO = new ShopStoreSameCityTransportBaseDTO();
shopStoreSameCityTransportBaseDTO.setTransportBase(transportBase);
@ -438,6 +448,10 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
transportBase.setWeight_increase_fee(BigDecimal.ZERO);
}
if (StrUtil.isBlank(transportBase.getSupplier_id())) {
transportBase.setSupplier_id(supplierId);
}
// 构建查询条件确保同一店铺同一平台标识下只有一条启用记录
QueryWrapper<ShopStoreSameCityTransportBase> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("store_id", transportBase.getStore_id());
@ -455,7 +469,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
transportBase.setCreated_at(now);
transportBase.setUpdated_at(now);
transportBase.setStatus(CommonConstant.Enable); // 确保状态为启用
if (add(transportBase)) {
// 确保获取到ID
Long transportBaseId = transportBase.getTransport_base_id();
@ -479,7 +492,6 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
transportBase.setTransport_base_id(exist.getTransport_base_id());
transportBase.setUpdated_at(now);
transportBase.setStatus(CommonConstant.Enable); // 确保状态为启用
if (updateById(transportBase)) {
log.info("更新同城配送基础信息成功, transportBaseId={}, storeId={}", transportBase.getTransport_base_id(), transportBase.getStore_id());
return Pair.of(transportBase.getTransport_base_id(), "更新成功!");
@ -589,11 +601,12 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
* @param orderProductAmount 订单商品原价金额
* @param orderDiscountAmount 订单商品折扣金额订单原价减去每个商品折扣费
* @param orderPayAmount 订单实际支付金额折扣金额-优惠券-积分扣-人工干预扣费不包含运费
* @param isPlatform 是否平台 1-2-
* @param canThrow 不能配送是否抛出异常
* @return
*/
@Override
public SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean canThrow) {
public SameCityDeliveryFeeRespDTO computeSameCityTransportFee(Long storeId, String orderLongitude, String orderLatitude, Integer weightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount, Boolean isPlatform, Boolean canThrow) {
// 计算订单同城配送费该函数的流程说明
// 1.先获取订单的经纬度计算配送距离获取配送范围确定是否能配送如果能计算基础运费
// 2.如果能配送再订单总重量订单原价金额订单折后金额订单实付金额
@ -627,8 +640,7 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
return new SameCityDeliveryFeeRespDTO(false, false, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, "无法获取" + storeName + "的具体位置,请联系商家。");
}
// 获取店铺商家的基础运费设置记录
ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(storeId, CommonConstant.Disable2);
ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(storeId, isPlatform ? CommonConstant.Enable : CommonConstant.Disable2);
if (transportBase == null) {
logger.error("{}同城配送费计算:无法获取基础运费设置记录。", storeName);
if (canThrow) {
@ -755,8 +767,8 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
}
// logger.debug(storeName + "下单时,根据商家运费设置规则减免{}元运费", reduceDeliveryFee);
// logger.debug(storeName + "下单时,不符合规则的:\n {}\n符合规则的:{}", JSONUtil.toJsonStr(noPassed), JSONUtil.toJsonStr(passed));
logger.debug(storeName + "下单时,根据商家运费设置规则减免{}元运费", reduceDeliveryFee);
logger.debug(storeName + "下单时,不符合规则的:\n {}\n符合规则的:{}", JSONUtil.toJsonStr(noPassed), JSONUtil.toJsonStr(passed));
boolean canDelivery = true;
if (passed.size() == 0 && noPassed.size() > 0) {
// 没有一个满足起送距离和起送金额的规则订单
@ -877,162 +889,171 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
*/
@Override
public Integer computeSameCityInnerDeliveryFee(Integer storeId, String orderLongitude, String orderLatitude, Integer orderWeightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount) {
// 参数校验
if (storeId == null || orderLongitude == null || orderLatitude == null || storeId <= 0) {
logger.warn("同城配送缺少必要参数,无法计算配送费。");
SameCityDeliveryFeeRespDTO sameCityDeliveryFeeRespDTO = computeSameCityTransportFee(Convert.toLong(storeId), orderLongitude, orderLatitude, orderWeightGram, orderProductAmount, orderDiscountAmount, orderPayAmount, true, false);
if (sameCityDeliveryFeeRespDTO == null
|| sameCityDeliveryFeeRespDTO.getDeliveryFee() == null
|| sameCityDeliveryFeeRespDTO.getDeliveryFee().compareTo(BigDecimal.ZERO) <= 0) {
return 0;
}
// 获取店铺基本信息
ShopStoreBase storeBase = shopStoreBaseService.get(storeId);
if (storeBase == null) {
logger.warn("同城配送缺少店铺基本信息,无法计算配送费。");
return 0;
}
return sameCityDeliveryFeeRespDTO.getDeliveryFee().multiply(new BigDecimal(100)).intValue();
String storeName = storeBase.getStore_name();
String storeLng = storeBase.getStore_longitude();
String storeLat = storeBase.getStore_latitude();
if (StrUtil.isBlank(storeLng) || StrUtil.isBlank(storeLat)) {
logger.warn("无法获取{}的具体位置,请联系商家。", storeName);
return 0;
}
// 获取平台的基础运费设置记录
ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(Convert.toLong(storeId), CommonConstant.Enable);
if (transportBase == null) {
logger.warn("商家{}尚未完成同城配送设置,无法计算配送费。", storeName);
return 0;
}
// 设置默认值
if (transportBase.getDistance_base() == null) {
transportBase.setDistance_base(0);
}
if (transportBase.getWeight_base() == null) {
transportBase.setWeight_base(0);
}
if (transportBase.getDelivery_base_fee() == null) {
transportBase.setDelivery_base_fee(BigDecimal.ZERO);
}
// 计算两点的距离(单位米)
Double distanceD = PositionUtil.getDistance1(Convert.toDouble(storeLng), Convert.toDouble(storeLat), Convert.toDouble(orderLongitude), Convert.toDouble(orderLatitude));
Integer distance = (distanceD != null) ? distanceD.intValue() : 0;
// 基础配送费计算
BigDecimal deliveryBaseFee = Convert.toBigDecimal(transportBase.getDelivery_base_fee(), BigDecimal.ZERO);
// 获取运费配送范围信息
List<ShopStoreSameCityTransport> transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId));
if (CollUtil.isEmpty(transportList)) {
// 没有配送范围规则的时候直接以基础配送费来配送
return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
}
// 判断配送范围和起送金额条件
String canNotDeliveryReason = "";
boolean canDelivery = false;
// 优先处理距离和金额都满足的规则
for (ShopStoreSameCityTransport transport : transportList) {
// 判断订单距离是否在配送范围内
if (transport.getMax_delivery_radius() >= distance) {
// 距离在配送范围内判断金额是否符合起配金额额度
boolean moneyPassed = false;
if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0;
} else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0;
} else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0;
}
// 距离和金额都满足条件
if (moneyPassed) {
canDelivery = true;
break;
}
}
}
// 如果没有找到完全满足条件的规则再详细检查找出失败原因
if (!canDelivery) {
for (ShopStoreSameCityTransport transport : transportList) {
// 判断订单距离是否在配送范围内
if (transport.getMax_delivery_radius() < distance) {
// 记录距离不满足的原因
canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。";
} else {
// 距离在配送范围内判断金额是否符合起配金额额度
if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount);
canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
} else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount);
canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
} else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount);
canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
}
}
}
}
// 如果仍然不能配送记录日志并返回0
if (!canDelivery) {
logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason);
return 0;
}
// 额外配送费计算
// 每增加一个距离累加运费
if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) {
// 实际配送距离超出基础距离单位km
BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000)));
// 倍数
BigDecimal times = BigDecimal.ZERO;
if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) {
// 末尾非零进位比如2.1将是3 2.0将是22.001将是3
times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP);
}
// 超过基础运费距离后累加上运费
deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times));
}
// 每增加一个重量累加运费重量暂时忽略,配置的时候设置0
if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) {
// 实际配送重量超出基础重量单位kg
BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000)));
// 倍数
BigDecimal times = BigDecimal.ZERO;
if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) {
// 末尾非零进位比如2.1将是3 2.0将是22.001将是3
times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); // 修正应该除以weight_increase_kg而不是distance_increase_km
}
deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times));
}
// 返回单位为分的配送费
return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
// 参数校验
// if (storeId == null || orderLongitude == null || orderLatitude == null || storeId <= 0) {
// logger.warn("同城配送缺少必要参数,无法计算配送费。");
// return 0;
// }
//
// // 获取店铺基本信息
// ShopStoreBase storeBase = shopStoreBaseService.get(storeId);
// if (storeBase == null) {
// logger.warn("同城配送缺少店铺基本信息,无法计算配送费。");
// return 0;
// }
//
// String storeName = storeBase.getStore_name();
// String storeLng = storeBase.getStore_longitude();
// String storeLat = storeBase.getStore_latitude();
// if (StrUtil.isBlank(storeLng) || StrUtil.isBlank(storeLat)) {
// logger.warn("无法获取{}的具体位置,请联系商家。", storeName);
// return 0;
// }
//
// // 获取平台的基础运费设置记录
// ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(Convert.toLong(storeId), CommonConstant.Enable);
// if (transportBase == null) {
// logger.warn("商家{}尚未完成同城配送设置,无法计算配送费。", storeName);
// return 0;
// }
//
// // 设置默认值
// if (transportBase.getDistance_base() == null) {
// transportBase.setDistance_base(0);
// }
// if (transportBase.getWeight_base() == null) {
// transportBase.setWeight_base(0);
// }
// if (transportBase.getDelivery_base_fee() == null) {
// transportBase.setDelivery_base_fee(BigDecimal.ZERO);
// }
//
// // 计算两点的距离(单位米)
// Double distanceD = PositionUtil.getDistance1(Convert.toDouble(storeLng), Convert.toDouble(storeLat), Convert.toDouble(orderLongitude), Convert.toDouble(orderLatitude));
// Integer distance = (distanceD != null) ? distanceD.intValue() : 0;
//
// // 基础配送费计算
// BigDecimal deliveryBaseFee = Convert.toBigDecimal(transportBase.getDelivery_base_fee(), BigDecimal.ZERO);
//
// // 获取运费配送范围信息
// List<ShopStoreSameCityTransport> transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId));
//
// if (CollUtil.isEmpty(transportList)) {
// // 没有配送范围规则的时候直接以基础配送费来配送
// return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
// }
//
// // 判断配送范围和起送金额条件
// String canNotDeliveryReason = "";
// boolean canDelivery = false;
//
// // 优先处理距离和金额都满足的规则
// for (ShopStoreSameCityTransport transport : transportList) {
// // 判断订单距离是否在配送范围内
// if (transport.getMax_delivery_radius() >= distance) {
// // 距离在配送范围内判断金额是否符合起配金额额度
// boolean moneyPassed = false;
// if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0;
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0;
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0;
// }
//
// // 距离和金额都满足条件
// if (moneyPassed) {
// canDelivery = true;
// break;
// }
// }
// }
//
// // 如果没有找到完全满足条件的规则再详细检查找出失败原因
// if (!canDelivery) {
// for (ShopStoreSameCityTransport transport : transportList) {
// // 判断订单距离是否在配送范围内
// if (transport.getMax_delivery_radius() < distance) {
// // 记录距离不满足的原因
// canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。";
// } else {
// // 距离在配送范围内判断金额是否符合起配金额额度
// if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
// if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount);
// canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
// if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount);
// canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
// if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount);
// canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// }
// }
// }
// }
//
// // 如果仍然不能配送记录日志并返回0
// if (!canDelivery) {
// logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason);
// return 0;
// }
//
// // 额外配送费计算
// // 每增加一个距离累加运费
// if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) {
// // 实际配送距离超出基础距离单位km
// BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000)));
// // 倍数
// BigDecimal times = BigDecimal.ZERO;
// if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) {
// // 末尾非零进位比如2.1将是3 2.0将是22.001将是3
// times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP);
// }
//
// // 超过基础运费距离后累加上运费
// deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times));
// }
//
// // 每增加一个重量累加运费重量暂时忽略,配置的时候设置0
// if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) {
// // 实际配送重量超出基础重量单位kg
// BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000)));
// // 倍数
// BigDecimal times = BigDecimal.ZERO;
// if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) {
// // 末尾非零进位比如2.1将是3 2.0将是22.001将是3
// times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP);
// }
//
// deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times));
// }
//
// // 返回单位为分的配送费
// return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
}

View File

@ -10,6 +10,7 @@ package com.suisung.mall.shop.store.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.common.api.CommonResult;
@ -45,13 +46,16 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
public CommonResult deleteShopStoreSameCityTransport(Long transportId) {
// 判断有没有权限
UserDto user = getCurrentUser();
if (user == null || !user.isStore()) {
if (user == null || !user.isStore() || !user.isPlatform()) {
return CommonResult.failed("无权限操作!");
}
Long storeId = Convert.toLong(user.getStore_id());
Long storeId = 0L;
if (user.isPlatform()) {
storeId = Convert.toLong(user.getStore_id());
}
if (transportId == null || transportId <= 0 || storeId == null || storeId <= 0) {
if (transportId == null || transportId <= 0) {
return CommonResult.failed("缺少必要参数");
}
@ -208,14 +212,16 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
*/
@Override
public Boolean deleteShopStoreSameCityTransport(Long transportId, Long storeId) {
if (transportId == null || transportId == null || transportId <= 0 || storeId == null || storeId <= 0) {
logger.error("缺少 transportId 或 storeId 必要参数!");
if (transportId == null || transportId == null || transportId <= 0) {
logger.error("缺少 transportId 必要参数!");
return false;
}
QueryWrapper<ShopStoreSameCityTransport> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("transport_id", transportId);
queryWrapper.eq("store_id", storeId);
LambdaQueryWrapper<ShopStoreSameCityTransport> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopStoreSameCityTransport::getTransport_id, transportId);
if (storeId != null && storeId > 0) {
queryWrapper.eq(ShopStoreSameCityTransport::getStore_id, storeId);
}
ShopStoreSameCityTransport record = getOne(queryWrapper);
if (record == null) {

View File

@ -92,7 +92,7 @@ public class ShopStoreSfOrderServiceImpl extends BaseServiceImpl<ShopStoreSfOrde
* @return
*/
@Override
public Boolean insertShopStoreSfOrder(ShopStoreSfOrder record) {
public Boolean saveShopStoreSfOrder(ShopStoreSfOrder record) {
if (record == null) {
logger.info("参数空值,保存失败!");
return false;
@ -103,6 +103,13 @@ public class ShopStoreSfOrderServiceImpl extends BaseServiceImpl<ShopStoreSfOrde
return false;
}
ShopStoreSfOrder shopStoreSfOrder = getByShopOrderId(record.getShop_order_id());
if (shopStoreSfOrder != null) {
logger.warn("该商家订单已存在,进行更新操作:{}", record);
record.setId(shopStoreSfOrder.getId());
return updateById(record);
}
return save(record);
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.shop.sync.controller;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.sync.service.ShopSyncImportService;
import io.swagger.annotations.ApiOperation;
@ -79,6 +80,9 @@ public class ShopSyncImportController extends BaseControllerImpl {
@ApiOperation(value = "商品数据导入", notes = "分类数据导入")
@RequestMapping(value = "/shopImportData", method = RequestMethod.POST)
public CommonResult shopImportData(@RequestParam("file") MultipartFile file,@RequestParam("storeId")String storeId) {
if(!shopSyncImportService.checkIsPlate()){
throw new ApiException("用户无权限");
}
shopSyncImportService.importShopsData(file,storeId);
return CommonResult.success("服务器正则处理文件,稍后查看商品列表");
}

View File

@ -38,7 +38,7 @@ public class SxCategoryModelExcel {
@ExcelProperty(value = "第二级分类", index =2)
private String second_category_name;
@ApiModelProperty(value = "品牌名称")
@ExcelProperty(value = "品牌名称", index =3)
private String brandName;
// @ApiModelProperty(value = "品牌名称")
// @ExcelProperty(value = "品牌名称", index =3)
// private String brandName;
}

View File

@ -27,4 +27,6 @@ public interface ShopSyncImportService{
// 导入商品Excel数据
void importShopsData(MultipartFile file,String storeId);
boolean checkIsPlate();
}

View File

@ -6,11 +6,13 @@ import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.gson.Gson;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.enums.DicEnum;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.base.ShopBaseProductBrand;
import com.suisung.mall.common.modules.base.ShopBaseProductCategory;
import com.suisung.mall.common.modules.sync.StoreDbConfig;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.shop.base.service.ShopBaseProductBrandService;
import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService;
import com.suisung.mall.shop.number.service.ShopNumberSeqService;
@ -110,6 +112,9 @@ public class ShopSyncImportServiceImpl implements ShopSyncImportService {
@Override
public CommonResult importBrandData(MultipartFile file,String storeId) {
if(!checkIsPlate()){
throw new ApiException("用户无权限");
}
String fileName = storeUploadedFile(file);
try {
List<BrandModelExcel> excelList = readBrandExcelData(fileName);
@ -133,6 +138,9 @@ public class ShopSyncImportServiceImpl implements ShopSyncImportService {
@Override
public CommonResult importCategoryData(MultipartFile file,String storeId) {
if(!checkIsPlate()){
throw new ApiException("用户无权限");
}
String fileName = storeUploadedFile(file);
try {
List<SxCategoryModelExcel> excelList = readCategoryExcelData(fileName);
@ -244,6 +252,16 @@ public class ShopSyncImportServiceImpl implements ShopSyncImportService {
private void initData(String storeId){
shopBaseProductCategoryService.getCategoryListByStoreId(storeId);
}
/**
* 判断是否平台
* @return
*/
public boolean checkIsPlate(){
UserDto userDto= ContextUtil.getCurrentUser();
assert userDto != null;
return 9 == userDto.getRole_id();
}
}

View File

@ -22,6 +22,7 @@ import com.suisung.mall.common.feignService.AccountService;
import com.suisung.mall.common.feignService.PayService;
import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.account.AccountUserLogin;
import com.suisung.mall.common.modules.base.ShopBaseProductBrand;
import com.suisung.mall.common.modules.base.ShopBaseProductCategory;
import com.suisung.mall.common.modules.base.ShopBaseProductSpec;
@ -41,6 +42,8 @@ import com.suisung.mall.common.utils.DateTimeUtils;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
import com.suisung.mall.core.consts.ConstantRedis;
import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.shop.base.service.ShopBaseProductBrandService;
import com.suisung.mall.shop.base.service.ShopBaseProductCategoryService;
import com.suisung.mall.shop.base.service.ShopBaseProductSpecService;
@ -102,9 +105,12 @@ public abstract class SyncBaseThirdSxAbstract{
@Autowired
private LibraryProductService libraryProductService;
@Autowired
private RedisService redisService;
@Autowired
public static final Set<String> FORBID_CATEGORY= Collections.unmodifiableSet(new HashSet<>(
Arrays.asList("香烟类","香烟","烟类", "")
Arrays.asList("香烟类","香烟","烟类", "","烟草")
));
/**
@ -141,6 +147,16 @@ public abstract class SyncBaseThirdSxAbstract{
}
List<ShopBaseProductType> productTypeList = new ArrayList<>();
Map<String,String> productTypeListMap=new HashMap<>();
//JSONObject o = (JSONObject) categoryListJSON.get(0);
// String brandName=o.getStr("brandName","其它品牌");
QueryWrapper<ShopBaseProductBrand> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("store_id",Integer.valueOf(storeId));
//queryWrapper.in("brand_name",Arrays.asList(brandName.split(",")));
// queryWrapper.eq("brand_name",brandName);
List<ShopBaseProductBrand> shopBaseProductBrands=productBrandService.list(queryWrapper);
String brandIds=shopBaseProductBrands.stream()
.map(shopBaseProductBrand -> String.valueOf(shopBaseProductBrand.getBrand_id()))
.collect(Collectors.joining(","));
for (int i = 0; i < list.size(); i++) {
String categoryName=list.get(i).getCategory_name();
if(StringUtils.isNotEmpty(getForbidCategory(categoryName))){
@ -155,15 +171,7 @@ public abstract class SyncBaseThirdSxAbstract{
ShopBaseProductType productType=new ShopBaseProductType();
productType.setType_is_draft(1);//发布
productType.setStore_id(Integer.valueOf(storeId));
String brandName=o.getStr("brandName","其它品牌");
QueryWrapper<ShopBaseProductBrand> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("store_id",Integer.valueOf(storeId));
queryWrapper.in("brand_name",Arrays.asList(brandName.split(",")));
// queryWrapper.eq("brand_name",brandName);
List<ShopBaseProductBrand> shopBaseProductBrands=productBrandService.list(queryWrapper);
String brandIds=shopBaseProductBrands.stream()
.map(shopBaseProductBrand -> String.valueOf(shopBaseProductBrand.getBrand_id()))
.collect(Collectors.joining(","));
if (o != null) {
// 重要分类类型处理强调共性
Integer typeId = 1001;
@ -601,6 +609,8 @@ public abstract class SyncBaseThirdSxAbstract{
List<AccountUserBase> addAccountUserBases=new ArrayList<>();
List<AccountUserInfo> addAcountUserInfo=new ArrayList<>();
List<PayUserResource> addPayUserResource=new ArrayList<>();
List<AccountUserLogin> accountUserLogins=new ArrayList<>();
Date today=new Date();
for (int i = 0; i < accountBaseIds.size(); i++) {
// account_user_base
SyncThirdMemberReq syncThirdMemberReq=addMemberList.get(i);
@ -641,6 +651,14 @@ public abstract class SyncBaseThirdSxAbstract{
accountUserInfo.setUser_birthday(DateTimeUtils.parseDate(syncThirdMemberReq.getUser_birthday(), "yyyy-MM-dd"));
}
addAcountUserInfo.add(accountUserInfo);
//account
AccountUserLogin accountUserLogin = new AccountUserLogin();
accountUserLogin.setUser_id(userId);
accountUserLogin.setUser_active_time(today);
accountUserLogin.setUser_reg_date(today);
accountUserLogin.setUser_reg_time(today.getTime());
accountUserLogins.add(accountUserLogin);
if (syncThirdMemberReq.getUser_money() != null || syncThirdMemberReq.getUser_points() != null) {
// pay_user_resource 用户支付资源积分余额
PayUserResource payUserResource = new PayUserResource();
@ -666,13 +684,18 @@ public abstract class SyncBaseThirdSxAbstract{
throw new ApiException(ResultCode.FAILED,"addAcountUserInfo保存异常");
}
}
if(!addPayUserResource.isEmpty()){
ThirdApiRes thirdApiRes= payService.saveBatchPayUserResources(addPayUserResource);
if(thirdApiRes.getError_code()!=0){
throw new ApiException(ResultCode.FAILED);
}
}
if(!accountUserLogins.isEmpty()){
ThirdApiRes thirdApiRes= accountService.saveBatchAccountUserLogin(accountUserLogins);
if(thirdApiRes.getError_code()!=0){
throw new ApiException(ResultCode.FAILED,"accountUserLogin保存异常");
}
}
return count;
}
@ -877,7 +900,6 @@ public abstract class SyncBaseThirdSxAbstract{
shopProductIndex.setProduct_sale_time(currentDate.getTime());
shopProductIndex.setStore_category_ids(""); // 店铺分类编号(DOT)
shopProductIndex.setProduct_tags("");// 商品标签(DOT)
shopProductIndex.setBrand_id(0);
shopProductIndex.setProduct_name(productName); // 产品名称:店铺平台先在对用表中检索后通过id检索,检索使用
shopProductIndex.setProduct_name_index(productName); // 名称索引关键字(DOT)
shopProductIndex.setCategory_id(categoryId); // 商品分类
@ -1098,7 +1120,7 @@ public abstract class SyncBaseThirdSxAbstract{
}
// spec_id++;
}
List<String> shopBaseProductTypeReidisKeyList=new ArrayList<>();
if(!insertShopBaseProductSpecList.isEmpty()){
List<Integer> specIdList=shopNumberSeqService.getBatchSpecId(insertShopBaseProductSpecList.size());
for(int i=0;i<specIdList.size();i++){
@ -1108,6 +1130,7 @@ public abstract class SyncBaseThirdSxAbstract{
if((shopBaseProductType.getType_name()+"规格").equals(insertShopBaseProductSpecList.get(finalI).getSpec_name())){
shopBaseProductType.setType_spec_ids(String.valueOf(finalSpec_id));
}
shopBaseProductTypeReidisKeyList.add(ConstantRedis.Cache_NameSpace + "shop_base_product_type:" +shopBaseProductType.getType_id());
});
insertShopBaseProductSpecList.get(i).setSpec_id(finalSpec_id);
}
@ -1122,6 +1145,9 @@ public abstract class SyncBaseThirdSxAbstract{
if(CollectionUtil.isNotEmpty(shopBaseProductTypes)){
productTypeService.updateBatchById(shopBaseProductTypes,shopBaseProductTypes.size());
}
if(!shopBaseProductTypeReidisKeyList.isEmpty()){//删除缓存
redisService.del(shopBaseProductTypeReidisKeyList);
}
productCategoryService.clearCategoryCache(storeId);
}

View File

@ -140,7 +140,7 @@ public class SyncShopImageServiceImpl implements SyncShopImageService {
while (index<3){
try {
List<ImageMappingDto> imageMappingDtos=CovertToShopProductImage(list);//调用es排除异常重新连接
syncBatchShopImage(imageMappingDtos);
syncBatchShopImage(imageMappingDtos,StateCode.PRODUCT_STATE_OFF_THE_SHELF);
success.getAndIncrement();
message= "成功" + finalI;
break;
@ -163,7 +163,7 @@ public class SyncShopImageServiceImpl implements SyncShopImageService {
final int finalI = i;
futures.add(executor.submit(() -> {
try {
syncBatchShopImage(imageMappingDtos);
syncBatchShopImage(imageMappingDtos,StateCode.PRODUCT_STATE_NORMAL);
success.getAndIncrement();
return "图库匹配成功" + finalI;
} catch (Exception e) {
@ -192,7 +192,7 @@ public class SyncShopImageServiceImpl implements SyncShopImageService {
* 把匹配的数据更新到商品的图库表
* @param imageMappingDtos
*/
private void syncBatchShopImage(List<ImageMappingDto> imageMappingDtos){
private void syncBatchShopImage(List<ImageMappingDto> imageMappingDtos,int product_state_id){
if(CollectionUtil.isEmpty(imageMappingDtos)){
log.info("没有匹配到图库");
return;
@ -223,14 +223,14 @@ public class SyncShopImageServiceImpl implements SyncShopImageService {
shopProductImageList.add(shopProductImage);
shopProductBase.setProduct_id(imageMappingDto.getProductId());
shopProductBase.setProduct_image(thumb);
shopProductBase.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);
shopProductBase.setProduct_state_id(product_state_id);
shopProductBaseList.add(shopProductBase);
shopProductItem.setProduct_id(imageMappingDto.getProductId());
shopProductItem.setItem_enable(StateCode.PRODUCT_STATE_NORMAL);
shopProductItemList.add(shopProductItem);
ShopProductIndex shopProductIndex=new ShopProductIndex();
shopProductIndex.setProduct_id(imageMappingDto.getProductId());
shopProductIndex.setProduct_state_id(StateCode.PRODUCT_STATE_OFF_THE_SHELF);
shopProductIndex.setProduct_state_id(product_state_id);
shopProductIndexList.add(shopProductIndex);
}
synchronized (this){

View File

@ -38,6 +38,7 @@ import com.suisung.mall.common.service.MessageService;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.base.service.AccountBaseConfigService;
import com.suisung.mall.shop.base.service.ShopBaseStateCodeService;
@ -157,6 +158,12 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
@Autowired
private ShopStoreSameCityTransportBaseService shopStoreSameCityTransportBaseService;
@Autowired
private RedisService redisService;
// @Autowired
// private ShopStoreMemberService shopStoreMemberService;
@Override
@Transactional
public Map getLists(Integer store_id, Integer chain_id, Integer page, Integer rows) {
@ -270,9 +277,18 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
if (ObjectUtil.equal(cart.getUser_id(), user_id)) {
cart.setCart_quantity(cart_quantity);
if (!edit(cart)) {
throw new ApiException(ResultCode.FAILED);
int i = 0;
while (i < 3) {
boolean result = edit(cart);
if (!result) {
i++;
if (i == 3) {
throw new ApiException(ResultCode.FAILED);
}
} else {
logger.info("重试成功,跳出");
break;
}
}
QueryWrapper<ShopUserCart> userCartQueryWrapper = new QueryWrapper<>();
@ -403,6 +419,10 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
throw new ApiException(ResultCode.NEED_LOGIN);
}
//购物车控制活动的商品数量 todo
// if(null!=activity_id&&0!=activity_id){
// checkActivity(activity_id,user_id);
// }
data.put("item_id", item_id);
data.put("cart_quantity", cart_quantity >= 0 ? Math.max(1, cart_quantity) : Math.min(-1, cart_quantity)); // 购买商品数量
data.put("cart_type", cart_type);
@ -2647,7 +2667,7 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
BigDecimal orderPaymentAmount = Convert.toBigDecimal(store_row.get("order_money_select_items"));
// 同城配送运费检查和计算(只返回数据不能配送不抛异常)
SameCityDeliveryFeeRespDTO sameCityDeliveryFeeResp = shopStoreSameCityTransportBaseService.computeSameCityTransportFee(storeId, orderLng, orderLat, 0, productMoneyOriginGoods, orderSelDiscountAmount, orderPaymentAmount, canThrow);
SameCityDeliveryFeeRespDTO sameCityDeliveryFeeResp = shopStoreSameCityTransportBaseService.computeSameCityTransportFee(storeId, orderLng, orderLat, 0, productMoneyOriginGoods, orderSelDiscountAmount, orderPaymentAmount, false, canThrow);
// 是否能配送在配送范围内
Boolean canDelivery = sameCityDeliveryFeeResp.getCanDelivery();
@ -3134,20 +3154,26 @@ public class ShopUserCartServiceImpl extends BaseServiceImpl<ShopUserCartMapper,
// logger.info("店铺ID为{},同城配送,收取打包费{}元", storeId, packingFee);
// 如果打包费为空或小于等于0直接返回0
if (packingFee == null || packingFee.compareTo(BigDecimal.ZERO) <= 0) {
if (CheckUtil.isEmpty(packingFee)) {
return BigDecimal.ZERO;
}
deliveryTypeId = deliveryTypeId == null ? StateCode.DELIVERY_TYPE_SAME_CITY : deliveryTypeId;
// deliveryTypeId = deliveryTypeId == null ? StateCode.DELIVERY_TYPE_SAME_CITY : deliveryTypeId;
// 只有同城配送才收取打包费
if (Boolean.FALSE.equals(isVirtualOrder)
&& deliveryTypeId != null && deliveryTypeId.intValue() == StateCode.DELIVERY_TYPE_SAME_CITY) {
// if (Boolean.FALSE.equals(isVirtualOrder)
// && deliveryTypeId != null && (deliveryTypeId.intValue() == StateCode.DELIVERY_TYPE_SAME_CITY)
// || deliveryTypeId.intValue() == StateCode.DELIVERY_TYPE_IN_STORE_SERVICE) {
// logger.debug("店铺ID同城配送符合收取打包费{}元", storeId, packingFee);
// return packingFee;
// }
if (Boolean.FALSE.equals(isVirtualOrder)) {
logger.debug("店铺ID同城配送符合收取打包费{}元", storeId, packingFee);
return packingFee;
}
// 非同城配送不收取打包费
// 虚拟商品不收取打包费
return BigDecimal.ZERO;
}

View File

@ -52,7 +52,7 @@ public class WxURLSchemeServiceImpl implements WxURLSchemeService {
public CommonResult generateCommonWxUrlScheme() {
// 常量定义
final String REDIS_KEY = "rdsCommonWxUrlScheme";
final long EXPIRE_DAYS = 30;
final long EXPIRE_DAYS = 365;
// === 第一阶段尝试从Redis获取缓存 ===
Object cachedScheme = redisService.get(REDIS_KEY);
@ -85,7 +85,7 @@ public class WxURLSchemeServiceImpl implements WxURLSchemeService {
requestBody.put("jump_wxa", jumpWxa);
requestBody.put("is_expire", true);
requestBody.put("expire_type", 0);
long expireSeconds = TimeUnit.DAYS.toSeconds(EXPIRE_DAYS); // 30天有效期
long expireSeconds = TimeUnit.DAYS.toSeconds(EXPIRE_DAYS);
requestBody.put("expire_time", System.currentTimeMillis() / 1000 + expireSeconds);
// === 第三阶段调用微信API ===

View File

@ -42,13 +42,14 @@
from
(
SELECT
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
ROW_NUMBER() over(partition by t.product_number order by t.id) rn,t.*
from
(
SELECT
spi.product_image_id,
spi.product_id,
spi.product_name,
spi.product_number,
spi.store_id,
lpi. merged_image_url,
lp.thumb,
@ -74,11 +75,12 @@
lp.id = lpi.product_id
WHERE
spi.product_from = '1005'
AND spi.store_id=#{storeId}
AND spi.item_image_default = '1'
<![CDATA[ AND lp.barcode <> '' ]]>)t
)temp
where
temp.rn = 1 and temp.store_id=#{storeId}
temp.rn = 1
)tt
</select>
@ -93,13 +95,14 @@
from
(
SELECT
ROW_NUMBER() over(partition by t.product_name order by t.id) rn,t.*
ROW_NUMBER() over(partition by t.product_number order by t.id) rn,t.*
from
(
SELECT
spi.product_image_id,
spi.product_id,
spi.product_name,
spi.product_number,
spi.store_id,
lpi. merged_image_url,
lp.thumb,
@ -125,11 +128,12 @@
lp.id = lpi.product_id
WHERE
spi.product_from = '1005'
AND spi.store_id=#{storeId}
AND spi.item_image_default = '1'
<![CDATA[ AND lp.barcode <> '' ]]>)t
)temp
where
temp.rn = 1 and temp.store_id=#{storeId} limit #{offset},#{limit}
temp.rn = 1 limit #{offset},#{limit}
</sql>
<select id="mappingByProductShortNameCount" resultType="java.lang.Integer">

View File

@ -66,6 +66,9 @@
AND b.product_state_id = #{param.product_state_id}
AND i.item_enable = #{param.product_state_id}
</if>
<if test="param.item_number != null and param.item_number !=''">
AND i.item_number = #{param.item_number}
</if>
</where>
<choose>
<when test="param.sidx != null and param.sord != null">

View File

@ -9,7 +9,7 @@
store_biz_state, store_biz_opening_date, ringtone_is_enable, shop_parent_id, store_2nd_category_id,
store_category_id, store_state_id, store_time, store_end_time, product_category_ids, store_o2o_tags,
store_o2o_flag, store_o2o_merchant_id, store_circle, subsite_id, lkl_merchant_no, lkl_term_no, wx_qrcode,
split_ratio, packing_fee, created_at, updated_at
split_ratio, packing_fee,parent_id,created_at, updated_at
</sql>
<select id="statisticState" resultType="java.util.Map">

View File

@ -1 +1 @@
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKnlpXdmJcbZHxh3w3Ghy/5wXtUBQcFzRMXgw2d7uYjzAzbIQ/ZCAj6srWoN/obtkU+G62kgcpByGmiVtK4LS+BoelKM705SzV+mcr8mNmr2jwNq1SwDSfgVxx5z00FtXl3LnKvCujvGYOmx6+nX8h6IiyyLX6IP6cFaqpUXHsZVAgMBAAECgYA4NpeM7etJ48T6H4Y3LsWEJkH6UDQlgbIblsaQkstMmLtTgOebrzN28UNfd8njcu9FVOrHGclOKbK7L+1cOLiduWsZKc/c/gAy9wAR4EhoLvlerH9EEPiPWFxdEDbMxPqlkpqLOo+PxHrhTn4vU4CaPdJtL2ujKn7nmsUdUDWo8QJBANS1TlM6nhPt2XlzN5kGfsJ4kBYNjuLXNA2YdNuC2ttYvEXHJ9T70FN/GnRBBIZu47uHH3Ie5nfep+qMk6a8RP8CQQDMecIyI0z1kVt+tOfWKw2ZFLsi74708qTaeR4W1ABtkngj1+bxoWWXr3KqhjqJkWxnhioSfXqu7CScNzjdM1CrAkAQd+ESjI1EmbumrYb2cAxMXi05p98SLPs4uj8B58WuCda5yEuLL9vXOxX/PjFtfxRepn2GxmGtki2J+UxNMnJdAkAFoORjlO0tZU7rcfdfwdeh+xwbnhSFUZiQGv1lC3jnizybX/oPdK3jOwUhBIjf+IzPXLYTxDh4UC/BzRNXo235AkEAhgYBk6H7RU2iIuvwz1c6CtE1gJ8DvEp1F0KOMWMFB0KCpDXUToix0dlMz962FozYENi4X4zYQo6nFwlXeS3Pfw==
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI4dPEw5wEGxH9aN+5WwFazEDvhomT/FWX0yHQRMdL0CTi8dy0hIN1sdNEbBmcOKc6dw2XHQCVQS3hfFFvpmnUqLJi32RbMhzxYz8Li9zN45eNKhiUfm/LupucHeTm3axGfOT3dfi0uhgq9LHk7ku12Pe+JIYdDu8RMCNeLJ7/AJAgMBAAECgYBAJSgLS+HghN9XC50sMl+GLLSJIUVSyHQdE1qPjyb+DSVXFP6lcJsz0BnBei86WKrdQA2V1o3vWdjPJ9G4UkraJ3hz2elzEeYok+MpLiPRicUd9RNHTVp9YqTzFyAsuranMxwt07tQaZBGc0T6hiGEsSHShwA+FfLGmz0TacR7hQJBAMOjlnP6zEzjUiW0BoZDnLHR6B5EpVVwhN7gS1B0HZtkGOjuoMz8z/GBbKLniGUtoRTDqFE4MJe7iA7237DZvscCQQC59gcIU4ezoonbDvMPbr4GMCgjP2eVrXUD02qGLJlQ45Wla6FpFZvQH5Wno5qRjdU9+Kjwms4lTTLVPHHfh0qvAkEAj2O9CDCPwOLz+JJkHdA8btBskpK5o0+e80Ptr4ALmzLYVxFfZh79wgKcPyH4BEBXScLGARFv/CYE6QLknNhbTQJAZ+F5+DrBOaX4oHhvaxWP7WEFavtGYCSvk12MyjsrwjYAKJJBbrR1gAPE1Arek6TJlH7N0OqJcej4FopXimjHXQJBAIS5nqeJPd3J7ath+uge+itkQUJnrTDHe4Feinmenuh6YLcwVJwuGqtUqxUUW/6TCrxdlMdiFmBjBjr7lkhlnuc=

View File

@ -1 +1 @@
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp5aV3ZiXG2R8Yd8Nxocv+cF7VAUHBc0TF4MNne7mI8wM2yEP2QgI+rK1qDf6G7ZFPhutpIHKQchpolbSuC0vgaHpSjO9OUs1fpnK/JjZq9o8DatUsA0n4Fccec9NBbV5dy5yrwro7xmDpsevp1/IeiIssi1+iD+nBWqqVFx7GVQIDAQAB
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOHTxMOcBBsR/WjfuVsBWsxA74aJk/xVl9Mh0ETHS9Ak4vHctISDdbHTRGwZnDinOncNlx0AlUEt4XxRb6Zp1KiyYt9kWzIc8WM/C4vczeOXjSoYlH5vy7qbnB3k5t2sRnzk93X4tLoYKvSx5O5Ltdj3viSGHQ7vETAjXiye/wCQIDAQAB

View File

@ -18047,7 +18047,7 @@
}) : $[_x41903[2030]][_x41903[4089]](__(_x41903[4558]))) : 3 == l[_x41903[4522]] || 4 == l[_x41903[4522]] || 6 == l[_x41903[4522]] || 7 == l[_x41903[4522]] || 14 == l[_x41903[4522]] || 17 == l[_x41903[4522]] ? ($[_x41903[39]](l[_x41903[4520]], function(e, t) {
t[_x41903[124]] == l[_x41903[4500]] && (t[_x41903[4559]] = s[_x41903[124]],
t[_x41903[184]] = s[_x41903[184]], t[_x41903[4560]] = s[_x41903[4560]],
l.listType==1?t[_x41903[2345]] = s[_x41903[2345]]: "",
(l.listType==1||l.listType==12||l.listType==13||l.listType==14||l.listType==15)?t[_x41903[2345]] = s[_x41903[2345]]: "",
t[_x41903[4561]] = s[_x41903[4561]],
t[_x41903[4562]] = s[_x41903[4562]], t[_x41903[4563]] = s[_x41903[4563]],
t[_x41903[4554]] = s[_x41903[4554]], t[_x41903[4557]] = s[_x41903[4557]],
@ -18070,7 +18070,7 @@
l[_x41903[4519]][_x41903[4560]] = s[_x41903[4560]],
//console.log("listType"+l.listType),
//l[_x41903[4519]][_x41903[2345]] = s[_x41903[2345]],
l.listType==1? l[_x41903[4519]][_x41903[2345]] = s[_x41903[2345]]: "",
(l.listType==1||l.listType==12||l.listType==13||l.listType==14||l.listType==15)? l[_x41903[4519]][_x41903[2345]] = s[_x41903[2345]]: "",
l[_x41903[4519]][_x41903[4561]] = s[_x41903[4561]],
l[_x41903[4519]][_x41903[4562]] = s[_x41903[4562]],
l[_x41903[4519]][_x41903[4563]] = s[_x41903[4563]],
@ -18081,14 +18081,14 @@
publicFun[_x41903[3948]](l[_x41903[820]], l[_x41903[4500]], l[_x41903[4519]])) : 16 == l[_x41903[4522]] ? ($[_x41903[39]](l[_x41903[4520]], function(e, t) {
t[_x41903[124]] == l[_x41903[4500]] && (t[_x41903[4559]] = s[_x41903[124]],
t[_x41903[184]] = s[_x41903[184]], t[_x41903[4560]] = s[_x41903[4560]],
l.listType==1?t[_x41903[2345]] = s[_x41903[2345]]: "", t[_x41903[4567]] = s[_x41903[4567]],
(l.listType==1||l.listType==12||l.listType==13||l.listType==14||l.listType==15)?t[_x41903[2345]] = s[_x41903[2345]]: "", t[_x41903[4567]] = s[_x41903[4567]],
t[_x41903[4568]] = s[_x41903[4568]], t[_x41903[4569]] = s[_x41903[4569]],
t[_x41903[4570]] = s[_x41903[4570]], t[_x41903[4571]] = s[_x41903[4571]],
t[_x41903[4572]] = s[_x41903[4572]]);
}), publicFun[_x41903[3948]](l[_x41903[820]], l[_x41903[4500]], l[_x41903[4520]])) : (l[_x41903[4519]][_x41903[4559]] = s[_x41903[124]],
l[_x41903[4519]][_x41903[184]] = s[_x41903[184]],
l[_x41903[4519]][_x41903[4560]] = s[_x41903[4560]],
l.listType==1? l[_x41903[4519]][_x41903[2345]] = s[_x41903[2345]]: "",
(l.listType==1||l.listType==12||l.listType==13||l.listType==14||l.listType==15)? l[_x41903[4519]][_x41903[2345]] = s[_x41903[2345]]: "",
l[_x41903[4519]][_x41903[4561]] = s[_x41903[4561]],
l[_x41903[4519]][_x41903[4562]] = s[_x41903[4562]],
l[_x41903[4519]][_x41903[4563]] = s[_x41903[184]],

12
pom.xml
View File

@ -324,10 +324,10 @@
<sentinel.transport.dashboard>114.132.210.208:8718</sentinel.transport.dashboard>
<!-- mysql配置 -->
<mysql.host>114.132.210.208</mysql.host>
<mysql.port>3306</mysql.port>
<mysql.port>13307</mysql.port>
<mysql.db>mall_dev</mysql.db>
<mysql.user>web_dev</mysql.user>
<mysql.pwd>Abc654321$^</mysql.pwd>
<mysql.pwd>bbWHo1th]g25</mysql.pwd>
<mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>
<!-- <mysql.host>127.0.0.1</mysql.host>-->
<!-- <mysql.port>3306</mysql.port>-->
@ -383,10 +383,10 @@
<sentinel.transport.dashboard>114.132.210.208:8718</sentinel.transport.dashboard>
<!-- mysql配置 -->
<mysql.host>114.132.210.208</mysql.host>
<mysql.port>3306</mysql.port>
<mysql.port>13307</mysql.port>
<mysql.db>mall_dev</mysql.db>
<mysql.user>web_dev</mysql.user>
<mysql.pwd>Abc654321$^</mysql.pwd>
<mysql.pwd>bbWHo1th]g25</mysql.pwd>
<mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>
<!-- redis配置 -->
<redis.host>114.132.210.208</redis.host>
@ -436,10 +436,10 @@
<sentinel.transport.dashboard>10.1.8.3:8718</sentinel.transport.dashboard>
<!-- mysql配置 -->
<mysql.host>114.132.210.208</mysql.host>
<mysql.port>3306</mysql.port>
<mysql.port>13307</mysql.port>
<mysql.db>mall_dev</mysql.db>
<mysql.user>web_dev</mysql.user>
<mysql.pwd>Abc654321$^</mysql.pwd>
<mysql.pwd>bbWHo1th]g25</mysql.pwd>
<mysql.driver>com.mysql.cj.jdbc.Driver</mysql.driver>
<!-- redis配置 -->
<redis.host>10.1.8.3</redis.host>