Merge branch 'main' into dev

This commit is contained in:
liyj 2025-09-26 11:18:58 +08:00
commit 7253649412
14 changed files with 1405 additions and 725 deletions

View File

@ -63,8 +63,8 @@ public class GlobalExceptionHandler {
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining("; "));
logError(req, "约束违反异常", e);
return CommonResult.validateFailed("系统数据异常,请联系管理员");
logError(req, "数据库约束违反异常", e);
return CommonResult.validateFailed("记录是否已存在,请检查");
}
/**

View File

@ -27,38 +27,78 @@ import java.util.regex.Pattern;
@Slf4j
public class CheckUtil {
// private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy年MM月dd日",
// "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
// "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyyMMdd"};
/**
* 校验数据 不为null和0
*
* @param param
* @return
* @param param 待校验的Integer值
* @return boolean 不为null且不为0返回true否则返回false
*/
public static boolean isNotEmpty(Integer param) {
return param != null && param != 0;
}
/**
* 校验数据 不为null和0
*
* @param param 待校验的Long值
* @return boolean 不为null且不为0返回true否则返回false
*/
public static boolean isNotEmpty(Long param) {
return param != null && param != 0;
return param != null && param != 0L;
}
/**
* 校验数据 不为null和0
*
* @param param 待校验的BigDecimal值
* @return boolean 不为null且不为0返回true否则返回false
*/
public static boolean isNotEmpty(BigDecimal param) {
return param != null && param.floatValue() != 0;
return param != null && param.compareTo(BigDecimal.ZERO) != 0;
}
/**
* 校验数据 不为null和0
*
* @param param 待校验的Float值
* @return boolean 不为null且不为0返回true否则返回false
*/
public static boolean isNotEmpty(Float param) {
return param != null && param != 0;
return param != null && param != 0f && !param.isNaN();
}
/**
* 校验数据 不为null和0
*
* @param param 待校验的Double值
* @return boolean 不为null且不为0返回true否则返回false
*/
public static boolean isNotEmpty(Double param) {
return param != null && param != 0;
return param != null && param != 0d && !param.isNaN();
}
/**
* 校验字符串不为null空字符串空白字符及特殊值
*
* @param param 待校验的字符串
* @return boolean 不为空返回true否则返回false
*/
public static boolean isNotEmpty(String param) {
return param != null && param != "";
// 检查null值和空字符串
if (param == null || param.isEmpty()) {
return false;
}
// 去除首尾空格后检查是否为空
String trimmed = param.trim();
if (trimmed.isEmpty()) {
return false;
}
// 检查特殊值undefinednullnone不区分大小写
return !"undefined".equalsIgnoreCase(trimmed) &&
!"null".equalsIgnoreCase(trimmed) &&
!"none".equalsIgnoreCase(trimmed);
}
public static boolean isEmpty(Integer param) {

View File

@ -58,19 +58,15 @@ public class QuartzServiceImpl implements QuartzService {
throw new ApiException(I18nUtil._("任务实现类名称不能为空!"));
}
try {
// 2. 加载任务类
Class<Job> clazz;
try {
String fullClassName = PATH_PREFIX + cName;
logger.debug("[Quartz] 尝试加载任务类: {}", fullClassName);
clazz = (Class<Job>) Class.forName(fullClassName);
logger.debug("[Quartz] 成功加载任务类: {}", fullClassName);
} catch (ClassNotFoundException e) {
logger.error("[Quartz] 定时任务脚本不存在!类名: {}{}", PATH_PREFIX, cName, e);
throw new ApiException(I18nUtil._("定时任务脚本不存在!类名: " + PATH_PREFIX + cName), e);
}
try {
// 3. 构建任务详情和触发器
JobKey jobKey = new JobKey(jName, jGroup);
JobDetail jobDetail = JobBuilder.newJob(clazz)
@ -86,6 +82,9 @@ public class QuartzServiceImpl implements QuartzService {
logger.debug("[Quartz] 构建任务详情和触发器完成: jobKey={}, triggerKey={}", jobKey, triggerKey);
// 打印最终执行的 cron 表达式
logger.info("[Quartz] 定时任务最终执行表达式: {}", trigger.getCronExpression());
// 4. 检查任务是否已存在
if (scheduler.checkExists(jobKey)) {
logger.info("[Quartz] 任务已存在,先删除旧任务: jobKey={}", jobKey);
@ -110,6 +109,9 @@ public class QuartzServiceImpl implements QuartzService {
logger.error("[Quartz] 添加定时任务失败!任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}",
jName, jGroup, tName, tGroup, e);
throw new ApiException(I18nUtil._("添加定时任务失败!"), e);
} catch (ClassNotFoundException e) {
logger.error("[Quartz] 定时任务脚本不存在!类名: {}{}", PATH_PREFIX, cName, e);
throw new ApiException(I18nUtil._("定时任务脚本不存在!类名: " + PATH_PREFIX + cName), e);
} catch (Exception e) {
logger.error("[Quartz] 添加定时任务时发生未知异常!任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}",
jName, jGroup, tName, tGroup, e);

View File

@ -116,7 +116,9 @@ public class LakalaController extends BaseControllerImpl {
// return sfExpressApiService.createSfExpressShop(66, "能辉超市", "桂平市", "广西壮族自治区贵港市桂平市广佰汇超市(桂平店)", "谢能坤", "17777525395", "110.07165452271", "23.369069486251");
return lakalaApiService.sacsQuery("8226330541100GU", "20250918770188017227140800").toString();
// return lakalaApiService.sacsQuery("8226330541100GU", "20250918770188017227140800").toString();
return lakalaApiService.queryLedgerMer("8226330541100HA");
}
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")

View File

@ -10,6 +10,7 @@ package com.suisung.mall.shop.lakala.service;
import cn.hutool.json.JSONObject;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.store.ShopMchEntry;
import org.springframework.data.util.Pair;
import javax.servlet.http.HttpServletRequest;
@ -268,6 +269,18 @@ public interface LakalaApiService {
*/
JSONObject sacsQuery(String merchantNo, String separateNo);
/**
* 商户分账业务信息查询
* 参考https://o.lakala.com/#/home/document/detail?id=381
*
* @param merCupNo 银联商户号
* @return 分账业务信息查询失败时返回null
* <p>
* 返回{"merInnerNo":"4002025092404043540","merCupNo":"8226330541100HA","splitLowestRatio":20.0,"orgId":"980688","orgName":"桂平发发","splitStatus":"VALID","splitStatusText":"启用","splitRange":"ALL","sepFundSource":"TR","bindRelations":[{"merInnerNo":"4002025092404043540","merCupNo":"8226330541100HA","receiverNo":"SR2024000129789","receiverName":"桂平发发网络有限公司"}],"platformId":null,"splitLaunchMode":"MANUAL","splitRuleSource":null,"eleContractNo":"QY20250924613672961"}
*/
JSONObject queryLedgerMer(String merCupNo);
/**
* 订单分账撤销
* 参考https://o.lakala.com/#/home/document/detail?id=390
@ -288,4 +301,13 @@ public interface LakalaApiService {
*/
Integer fixedUnSuccessSeparateStatusJob();
/**
* 检测修复补全商户的商户分账业务信息及分账接收方绑定关系分账业务申请异步通知的补偿机制
*
* @param shopMchEntry 商户入驻信息实例
* @return
*/
Boolean checkAndFixLedgerMerApplyAndBindRelations(ShopMchEntry shopMchEntry);
}

View File

@ -50,8 +50,9 @@ public interface LklLedgerMemberService extends IBaseService<LklLedgerMember> {
* @param auditStatus
* @param auditStatusText
* @param remark
* @param notifyResp
* @return
*/
Boolean updateAuditResult(String applyId, String merInnerNo, String merCupNo, String entrustFileName, String entrustFilePath, String auditStatus, String auditStatusText, String remark);
Boolean updateAuditResult(String applyId, String merInnerNo, String merCupNo, String entrustFileName, String entrustFilePath, String auditStatus, String auditStatusText, String remark, String notifyResp);
}

View File

@ -101,10 +101,11 @@ public class LklLedgerMemberServiceImpl extends BaseServiceImpl<LklLedgerMemberM
* @param auditStatus
* @param auditStatusText
* @param remark
* @param notifyResp
* @return
*/
@Override
public Boolean updateAuditResult(String applyId, String merInnerNo, String merCupNo, String entrustFileName, String entrustFilePath, String auditStatus, String auditStatusText, String remark) {
public Boolean updateAuditResult(String applyId, String merInnerNo, String merCupNo, String entrustFileName, String entrustFilePath, String auditStatus, String auditStatusText, String remark, String notifyResp) {
if (StrUtil.isBlank(applyId) || StrUtil.isBlank(merCupNo) || StrUtil.isBlank(auditStatus)) {
log.error("缺少参数applyId={}, merCupNo={}, auditStatus={}", applyId, merCupNo, auditStatus);
return false;
@ -119,6 +120,7 @@ public class LklLedgerMemberServiceImpl extends BaseServiceImpl<LklLedgerMemberM
updateWrapper.set("audit_status", auditStatus);
updateWrapper.set("audit_status_text", auditStatusText);
updateWrapper.set("remark", remark);
updateWrapper.set("audit_resp", notifyResp);
return update(updateWrapper);
}

View File

@ -42,9 +42,10 @@ public interface PushMessageService {
*
* @param userId
* @param payload
* @param isFinishNotice 是签署完成通知
* @return
*/
CompletableFuture<Boolean> noticeMerchantSignEcContract(Integer userId, JSONObject payload);
CompletableFuture<Boolean> noticeMerchantSignEcContract(Integer userId, JSONObject payload, Boolean isFinishNotice);
/**

View File

@ -109,7 +109,7 @@ public class PushMessageServiceImpl implements PushMessageService {
@Async
@Override
public CompletableFuture<Boolean> noticeMerchantSignEcContract(Integer userId, JSONObject payload) {
public CompletableFuture<Boolean> noticeMerchantSignEcContract(Integer userId, JSONObject payload, Boolean isFinishNotice) {
try {
// 获取商家的 cid 列表确保用户 ID 有效
if (userId == null || userId <= 0) {
@ -137,9 +137,12 @@ public class PushMessageServiceImpl implements PushMessageService {
return CompletableFuture.completedFuture(false); // 无有效 cid 无需推送
}
String title = isFinishNotice ? "通知您合同已签署完毕" : "邀请您签署入驻合同";
String content = isFinishNotice ? "您的开店入驻合同已签署完成!" : "恭喜您!您的开店入驻申请已初步审核通过!请尽快登录小发商家 APP 平台签署电子合同签署链接24小时内有效逾期需重新提交申请。如有疑问请联系客服感谢您的支持";
Pair<Boolean, String> result = uniCloudPushService.sendPushMessageBatch(cidList,
appName + "邀请您签署入驻合同",
"恭喜您的开店入驻申请已审核通过!请尽快登录小发商家 APP 平台签署电子合同签署链接24小时内有效逾期需重新提交申请。如有疑问请联系客服感谢您的支持",
appName + title,
content,
payload);
if (!result.getFirst()) {

View File

@ -72,8 +72,8 @@ public class SFExpressController {
@ApiOperation(value = "查询顺丰同城订单状态流", notes = "查询顺丰同城订单状态流")
@RequestMapping(value = "/list-order-feed", method = RequestMethod.POST)
public ThirdApiRes listOrderFeed(@RequestParam(name = "order_id", defaultValue = "") String orderId) {
if (StrUtil.isBlank(orderId) || orderId == "undefined" || orderId == "null") {
return new ThirdApiRes().fail(1003, "请求参数有误!");
if (StrUtil.isBlank(orderId) || "undefined".equals(orderId) || "null".equals(orderId) || "none".equals(orderId)) {
return new ThirdApiRes().fail(1003, "缺少参数或参数有误!");
}
Map<String, Object> params = new HashMap<>();

View File

@ -293,6 +293,15 @@ public interface ShopMchEntryService {
*/
Boolean checkMerchEntryFinished(Long mchId);
/**
* 检查商户入驻流程当前是否可以创建店铺了
*
* @param mchId 商户入驻ID
* @return boolean 可以创建店铺返回true否则返回false
*/
Boolean canBuildingShopStore(Long mchId);
/**
* 检查更新商户入驻店铺初始化状态
*

View File

@ -173,7 +173,6 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return CommonResult.failed("请指定店铺或银行的省市区!");
}
if (!PhoneNumberUtils.checkPhoneNumber(loginMobile)) {
log.warn("申请人手机号码格式错误,手机号: {}", loginMobile);
return CommonResult.failed("申请人手机号码有误!");
@ -780,6 +779,12 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return fixCount > 0;
}
/**
* 重要补偿机制检查修复商户入驻店铺信息(商家账号关联入驻店铺Id给商家账户创立公司员工账号和权限)
*
* @param mchId 商户入驻ID必填
* @return boolean 是否成功修复商户信息
*/
public Boolean checkAndFixMchStoreInfo(Long mchId) {
// 1. 参数校验
if (CheckUtil.isEmpty(mchId)) {
@ -788,76 +793,86 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
}
try {
// 2. 获取当前商户用户信息
// 6. 获取当前商户用户信息
UserDto currentUser = getCurrentUser();
if (currentUser == null || !currentUser.isMerchant()) {
log.warn("当前用户非商户账号");
if (currentUser == null || CheckUtil.isEmpty(currentUser.getId())) {
log.warn("当前用户未登录入驻ID: {}", mchId);
return false;
}
// 4.3 获取用户基础信息
// 7. 获取用户基础信息
AccountUserBase userBase = accountService.getUserBase(currentUser.getId());
if (userBase == null) {
log.warn("商户用户基础信息不存在用户ID: {}", currentUser.getId());
return false;
}
// 3. 查询商户入驻记录
// 2. 查询商户入驻记录
ShopMchEntry shopMchEntry = get(mchId);
if (shopMchEntry == null) {
log.debug("未找到商户入驻记录 mchId {}", mchId);
return false;
}
// 4.2 检查入驻状态
// 3. 检测修复补全商户的商户分账业务信息及分账接收方绑定关系分账业务申请异步通知的补偿机制
lakalaApiService.checkAndFixLedgerMerApplyAndBindRelations(shopMchEntry);
// 5. 检查入驻状态
boolean isValidStatus = CommonConstant.Enable.equals(shopMchEntry.getHas_ec_signed())
&& CommonConstant.Enable.equals(shopMchEntry.getHas_apply_mer())
&& CommonConstant.Enable.equals(shopMchEntry.getHas_apply_split())
&& CommonConstant.Enable.equals(shopMchEntry.getHas_apply_receiver())
&& CommonConstant.Enable.equals(shopMchEntry.getHas_bind_receiver());
if (isValidStatus) {
log.debug("入驻记录状态都通过了审核进一步验证修复条件入驻ID: {}", mchId);
} else {
log.debug("入驻记录状态个别未通过审核接着检查验证修复条件入驻ID: {}", mchId);
if (!isValidStatus) {
log.debug("入驻记录状态未全部通过审核不能创建店铺入驻ID: {}", mchId);
return false;
}
// 4.4 获取店铺员工信息
// 8. 检查店铺关联关系
boolean hasStoreRelation = false;
if (StrUtil.isNotBlank(shopMchEntry.getStore_id()) && StrUtil.isNotBlank(userBase.getStore_ids())) {
hasStoreRelation = userBase.getStore_ids().contains(shopMchEntry.getStore_id());
}
// 9. 获取店铺员工信息
ShopStoreEmployee storeEmployee = null;
if (StrUtil.isNotBlank(shopMchEntry.getStore_id())) {
Integer storeId = Convert.toInt(shopMchEntry.getStore_id());
if (CheckUtil.isNotEmpty(storeId)) {
storeEmployee = shopStoreEmployeeService.getStoreEmployeeByUserId(
Convert.toInt(shopMchEntry.getStore_id()),
storeId,
currentUser.getId()
);
}
}
// 4.5 检查店铺关联关系
boolean hasStoreRelation = StrUtil.isNotBlank(userBase.getStore_ids()) &&
userBase.getStore_ids().contains(shopMchEntry.getStore_id());
// 10. 检查权限组信息
boolean hasRoles = storeEmployee != null && StrUtil.isNotBlank(storeEmployee.getRights_group_id());
// 4.6 检查权限组信息
boolean hasRoles = storeEmployee != null &&
StrUtil.isNotBlank(storeEmployee.getRights_group_id());
// 11. 当满足创建店铺条件且存在信息缺失时需要进行修复
if (storeEmployee == null || !hasRoles || !hasStoreRelation) {
log.info("开始修复商户信息入驻ID: {}, storeEmployee为空: {}, 缺少角色: {}, 缺少店铺关联: {}",
mchId, storeEmployee == null, !hasRoles, !hasStoreRelation);
// 4.7 当以下任一条件满足时需要进行修复
// - 无店铺员工信息
// - 无权限组信息
// - 无店铺关联
if (storeEmployee == null ||
!hasRoles ||
!hasStoreRelation) {
// 4.8 补偿创建初始化店铺部分赋值
// 补偿创建初始化店铺部分赋值
Pair<Integer, String> result = shopStoreBaseService.covMerchEntryInfo2StoreInfo(mchId, false);
if (result != null && result.getFirst() > 0) {
log.warn("商户信息修复成功入驻ID: {}", mchId);
log.info("商户信息修复成功入驻ID: {}", mchId);
// 修复成功后检查商户绑定状态是否完成更改总的审核状态
checkMerchEntryFinished(mchId);
return true;
} else {
log.error("商户信息修复失败入驻ID: {}, 错误信息:{}", mchId, result != null ? result.getSecond() : "未知错误");
return false;
}
}
// 12. 如果信息完整检查商户绑定状态是否完成更改总的审核状态
log.debug("商户信息完整检查是否需要更新审核状态入驻ID: {}", mchId);
checkMerchEntryFinished(mchId);
return true;
} catch (Exception e) {
log.error("商户信息修复异常mchId: {}", mchId, e);
@ -1042,7 +1057,7 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
if (StrUtil.isBlank(contactMobile)) {
return Pair.of(false, "联系人手机号不能为空");
}
queryWrapper.eq("legal_person_mobile", contactMobile);
queryWrapper.eq("legal_person_mobile", contactMobile); // 企业和个人公用该字段联系人手机号
String msg = "";
// 4. 根据主体类型设置额外查询条件和提示信息
@ -1067,7 +1082,6 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
return Pair.of(false, msg);
}
log.info("可以申请入驻,准备申请入驻");
return Pair.of(true, "可以申请入驻,准备下一个流程");
@ -1430,21 +1444,45 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
/**
* 更新商家入驻申请的店铺 ID
*
* @param id
* @param storeId
* @return
* @param mchId 商户ID
* @param storeId 店铺ID
* @return 更新成功返回 true否则返回 false
*/
@Override
public Boolean updateMerchEntryStoreStatus(Long id, Integer storeId) {
if (ObjectUtil.isEmpty(id) && ObjectUtil.isEmpty(storeId)) {
public Boolean updateMerchEntryStoreStatus(Long mchId, Integer storeId) {
// 1. 参数校验mchId 不能为空
if (CheckUtil.isEmpty(mchId) || CheckUtil.isEmpty(storeId)) {
log.warn("更新商户店铺状态失败商户ID不能为空");
return false;
}
return update(new UpdateWrapper<ShopMchEntry>()
.eq("id", id)
.set("store_id", storeId).set("store_status", CommonConstant.Enable));
try {
// 2. 构建更新条件
UpdateWrapper<ShopMchEntry> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", mchId)
.set("store_id", storeId)
.set("store_status", CommonConstant.Enable)
.set("updated_at", new Date()); // 更新时间戳
// 3. 执行更新操作并返回结果
boolean result = update(updateWrapper);
if (result) {
log.info("商户店铺状态更新成功mchId: {}, storeId: {}", mchId, storeId);
} else {
log.warn("商户店铺状态更新失败未找到匹配记录mchId: {}", mchId);
}
return result;
} catch (Exception e) {
// 4. 异常处理记录异常信息
log.error("更新商户店铺状态时发生异常mchId: {}, storeId: {}", mchId, storeId, e);
return false;
}
}
// /**
// * 更新拉卡拉入网电子合同和签署地址
// *
@ -1738,6 +1776,7 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
log.error("更新商户入驻信息状态失败, mchId={}", mchId);
return false;
}
return true; // 返回 true表示入驻流程已全部完成
} catch (Exception e) {
@ -1747,6 +1786,51 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
}
}
/**
* 检查商户入驻流程当前是否可以创建店铺了
*
* @param mchId 商户入驻ID
* @return boolean 可以创建店铺返回true否则返回false
*/
@Override
public Boolean canBuildingShopStore(Long mchId) {
// 1. 参数校验
if (ObjectUtil.isEmpty(mchId)) {
log.error("检查商户是否可以创建店铺失败商户入驻ID为空");
return false;
}
try {
// 2. 根据商户ID获取商户入驻信息
ShopMchEntry merchantEntry = shopMerchEntryById(mchId);
if (merchantEntry == null) {
log.error("检查商户是否可以创建店铺失败:商户不存在, mchId={}", mchId);
return false;
}
// 3. 检查各项前置状态是否已完成
boolean isFinished = CommonConstant.Enable.equals(merchantEntry.getHas_ec_signed())
&& CommonConstant.Enable.equals(merchantEntry.getHas_apply_mer())
&& CommonConstant.Enable.equals(merchantEntry.getHas_apply_split())
&& CommonConstant.Enable.equals(merchantEntry.getHas_apply_receiver())
&& CommonConstant.Enable.equals(merchantEntry.getHas_bind_receiver());
// 4. 返回检查结果
if (isFinished) {
log.debug("商户满足创建店铺条件, mchId={}", mchId);
return true;
} else {
log.debug("商户不满足创建店铺条件, mchId={}", mchId);
return false;
}
} catch (Exception e) {
// 5. 异常处理记录异常信息避免程序中断
log.error("检查商户是否可以创建店铺时发生异常, mchId={}", mchId, e);
return false;
}
}
/**
* 根据商户号或商家手机号修改商户入驻信息多个状态

View File

@ -2261,18 +2261,25 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
/**
* 店铺信息设置
*
* @return
* @return CommonResult 操作结果
*/
@Override
@Transactional
public CommonResult storeSetUp() {
UserDto user = getCurrentUser();
ShopStoreBase base = new ShopStoreBase();
if (user == null) {
logger.warn("用户未登录,无法设置店铺信息");
return CommonResult.failed("用户未登录");
}
ShopStoreBase base = new ShopStoreBase();
if (user.isPlatform()) {
// 平台方
Integer store_id = getParameter("store_id", Integer.class);
if (store_id == null) {
logger.warn("平台方设置店铺信息缺少必要参数 store_id");
return CommonResult.failed("缺少必要参数 store_id");
}
base.setStore_id(store_id);
ShopStoreInfo info = new ShopStoreInfo();
@ -2330,7 +2337,6 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
base.setStore_circle(store_circle);
}
String store_area = getParameter("store_area");
if (StrUtil.isNotBlank(store_area)) {
base.setStore_area(store_area);
@ -2379,17 +2385,29 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
logger.warn("打包费超出范围: {}", packingFee);
return CommonResult.failed("打包费请控制在0到10元范围");
}
base.setPacking_fee(packingFee);
// 铃声开关
Integer ringtoneIsEnable = Convert.toInt(getParameter("ringtone_is_enable"));
if (ringtoneIsEnable == null || ringtoneIsEnable <= 0) {
ringtoneIsEnable = CommonConstant.Enable;
}
base.setRingtone_is_enable(ringtoneIsEnable);
// 商家分账比例
BigDecimal splitRatio = Convert.toBigDecimal(getParameter("split_ratio"));
if (CheckUtil.isNotEmpty(splitRatio)) {
if (splitRatio.compareTo(BigDecimal.valueOf(70)) >= 0
&& splitRatio.compareTo(BigDecimal.valueOf(99)) <= 0) {
base.setSplit_ratio(splitRatio);
} else {
logger.warn("分账比例超出范围: {}", splitRatio);
return CommonResult.failed("分账比例超出[70.00,99.00]范围,请修正");
}
}
// 百度坐标系BD09经纬度 转出 火星坐标系GCJ02经纬度 因为数据库保存的经纬度统一是GCJ02经纬度所以需要转换
base = bd09ToGcj02Gps(base);
@ -2397,10 +2415,20 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
AccountUserBase userInfo = new AccountUserBase();
userInfo.setUser_id(getParameter("user_id", Integer.class));
userInfo.setUser_password(getParameter("user_password"));
saveInfo(base, info, userInfo, null);
boolean result = saveInfo(base, info, userInfo, null);
if (!result) {
logger.error("平台方保存店铺信息失败店铺ID: {}", store_id);
return CommonResult.failed("保存店铺信息失败");
}
} else if (user.isStore()) {
// 店铺
Integer store_id = Convert.toInt(user.getStore_id());
if (store_id == null) {
logger.warn("商户用户无关联店铺用户ID: {}", user.getId());
return CommonResult.failed("用户无关联店铺");
}
ShopStoreInfo info = new ShopStoreInfo();
String store_slogan = getParameter("store_slogan");
@ -2457,15 +2485,6 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
if (StrUtil.isNotBlank(store_o2o_tags)) {
base.setStore_o2o_tags(store_o2o_tags);
}
//兼容不同终端 已经无推荐地址情况
// todo if (empty($data['base']['store_longitude']) || $data['base']['store_latitude'] )
// {
// $address_str = sprintf('%s %s', $data['base']['store_area'] , $data['base']['store_address']);
// $coord = Zero_Utils_Ip::getLatAndLngByAddress($address_str);
//
// $data['base']['store_longitude'] = $coord['lng']; // 经度
// $data['base']['store_latitude'] = $coord['lat']; // 纬读
// }
String store_banner = getParameter("store_banner");
if (StrUtil.isNotBlank(store_banner)) {
@ -2538,6 +2557,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreConfig.setStore_id(store_id);
shopStoreConfig.setSc_is_enabled_invoice(Convert.toInt(sc_is_enabled_invoice));
if (!shopStoreConfigService.edit(shopStoreConfig)) {
logger.error("保存店铺参数失败店铺ID: {}", store_id);
throw new ApiException(I18nUtil._("保存店铺参数失败"));
}
}
@ -2549,6 +2569,7 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
if (packingFee.compareTo(new BigDecimal("10")) > 0) {
logger.warn("打包费超出范围: {}", packingFee);
return CommonResult.failed("打包费请控制在0到10元范围");
}
base.setPacking_fee(packingFee);
@ -2564,14 +2585,19 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
base = bd09ToGcj02Gps(base);
if (!saveInfo(base, info, null, company)) {
logger.error("商户保存店铺信息失败店铺ID: {}", store_id);
throw new ApiException(I18nUtil._("保存店铺信息失败"));
}
} else {
logger.warn("用户无操作权限用户ID: {}", user.getId());
return CommonResult.failed("无操作权限");
}
return CommonResult.success();
}
public Integer getSubsiteId(String store_district_id) {
int[] area = StrUtil.splitToInt(store_district_id, "/");
String city = Convert.toStr(area[1]);
@ -3125,138 +3151,144 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
return covMerchEntryInfo2StoreInfo(mchId, allowThrown);
}
/**
* 重要入驻审批通过并且合同盖章完结之后把商家入驻信息转换成店铺信息正式生成店铺所需的数据
*
* @param mchId
* @param allowThrown 是否允许抛出异常
* @return
*/
@Override
public Pair<Integer, String> covMerchEntryInfo2StoreInfo(Long mchId, Boolean allowThrown) {
// TODO 用法人小微个人的手机号注册商家账号作为店铺的管理员
// 参数校验
if (ObjectUtil.isEmpty(mchId)) {
logger.error("生成店铺入驻商家自增Id不能为空");
return Pair.of(0, "入驻商家自增Id不能为空");
}
try {
// 获取入驻信息
ShopMchEntry shopMchEntry = shopMchEntryService.shopMerchEntryById(mchId);
if (shopMchEntry == null) {
logger.error("生成店铺:入驻信息不能为空");
return Pair.of(0, "入驻信息不能为空");
}
// 如果 还没有签署入网电子合同且没有进件成功则提示前置条件未满足
// 前置条件检查
if (!CommonConstant.Enable.equals(shopMchEntry.getHas_ec_signed())
&& !CommonConstant.Enable.equals(shopMchEntry.getHas_apply_mer())) {
return Pair.of(0, "请先签署电子合同和商家进件,再创建店铺。");
}
// TODO 判断要不要给入驻的企业法人手机小微联系人手机注册一个账号
// 从绑定关系中获取入驻商家注册账号信息
Integer userId = accountService.getUserBindConnectUserIdByCondition(shopMchEntry.getLogin_mobile(), BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
// 获取用户ID
Integer userId = accountService.getUserBindConnectUserIdByCondition(
shopMchEntry.getLogin_mobile(), BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (userId == null) {
logger.error("生成店铺:{}手机未注册商家账号", shopMchEntry.getLogin_mobile());
return Pair.of(0, "手机未注册商家账号!");
}
// 入驻时已经检查店铺名称此处忽略
// 检查店铺名称
ShopStoreBase shopStoreBase = findOneByStoreName(shopMchEntry.getStore_name());
if (shopStoreBase != null
&& StrUtil.isNotBlank(shopStoreBase.getLkl_merchant_no())
&& StrUtil.isNotBlank(shopStoreBase.getLkl_term_no())
&& !shopStoreBase.getStore_id().toString().equals(shopMchEntry.getStore_id())) {
// 如果店铺名称已存在且店铺已经进件且不等于当前入驻商家的店铺Id提示店铺名称已存在
&& StrUtil.isNotBlank(shopMchEntry.getLkl_mer_cup_no())
&& !shopStoreBase.getLkl_merchant_no().equals(shopMchEntry.getLkl_mer_cup_no())) {
logger.error("生成店铺:店铺名称已存在");
return Pair.of(0, "店铺名称已存在,请使用另一名称");
}
// 新增 shop_store_baseshop_store_infoshop_store_company, shop_store_employee 待补充
// shop_store_base
// 创建或更新店铺基础信息
if (shopStoreBase == null) {
shopStoreBase = new ShopStoreBase();
}
shopStoreBase.setUser_id(userId); // 店铺管理员用户Id
// 设置店铺基础信息添加null检查
shopStoreBase.setUser_id(userId);
shopStoreBase.setStore_name(shopMchEntry.getStore_name());
shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category()); // 重要店铺分类id对应 shop_base_store_category 表的分类
shopStoreBase.setStore_2nd_category_id(shopMchEntry.getBiz_second_category());
shopStoreBase.setStore_category_id(shopMchEntry.getBiz_category());
shopStoreBase.setStore_2nd_category_id(
shopMchEntry.getBiz_second_category() != null ? shopMchEntry.getBiz_second_category() : 0);
// 分账比例最终提交给拉卡拉的分账比例是 20%
BigDecimal splitRatio = shopMchEntryService.getMchEntryRatioOrDefault(shopMchEntry.getBiz_category(), shopMchEntry.getBiz_second_category(), shopMchEntry.getSplit_ratio(), new BigDecimal(94));
// 计算分账比例
BigDecimal splitRatio = shopMchEntryService.getMchEntryRatioOrDefault(
shopMchEntry.getBiz_category(),
shopMchEntry.getBiz_second_category(),
shopMchEntry.getSplit_ratio(),
new BigDecimal(94));
shopStoreBase.setSplit_ratio(splitRatio);
shopStoreBase.setPacking_fee(BigDecimal.ZERO);
shopStoreBase.setSplit_ratio(splitRatio); // 分账比例
shopStoreBase.setPacking_fee(BigDecimal.ZERO);// 默认0元打包费
// 处理图片信息
String storeFacadeImage = shopMchEntry.getFront_facade_image();
String storeLogoImage = shopMchEntry.getStore_logo();
if (StrUtil.isBlank(storeLogoImage)) {
storeLogoImage = storeFacadeImage;
}
shopStoreBase.setStore_logo(storeLogoImage); // 临时使用门面照片做logo
shopStoreBase.setStore_logo(storeLogoImage);
// 处理地址信息添加null检查
String storeDistrict = shopMchEntry.getStore_district();
if (storeDistrict != null) {
shopStoreBase.setStore_district_id(storeDistrict);
}
String storeArea = shopMchEntry.getStore_area();
if (storeArea != null) {
shopStoreBase.setStore_area(storeArea);
}
// 省市区记录有序列表
shopStoreBase.setStore_district_id(shopMchEntry.getStore_district());
shopStoreBase.setStore_area(shopMchEntry.getStore_area());
shopStoreBase.setStore_address(shopMchEntry.getStore_address());
shopStoreBase.setStore_longitude(shopMchEntry.getStore_longitude());
shopStoreBase.setStore_latitude(shopMchEntry.getStore_latitude());
shopStoreBase.setStore_grade_id(1001); // 店铺等级默认为普通店铺
shopStoreBase.setStore_type(1);//店铺类型(ENUM): 1-卖家店铺; 2-供应商店铺
shopStoreBase.setStore_grade_id(1001);
shopStoreBase.setStore_type(1);
shopStoreBase.setStore_is_open(1);
shopStoreBase.setStore_is_selfsupport(0);
shopStoreBase.setStore_o2o_flag(0);
shopStoreBase.setSubsite_id(0);
// 拉卡拉外部商户号
// 设置拉卡拉信息
shopStoreBase.setLkl_merchant_no(shopMchEntry.getLkl_mer_cup_no());
// 拉卡拉分配的终端号
shopStoreBase.setLkl_term_no(shopMchEntry.getLkl_term_no());
shopStoreBase.setStore_state_id(StateCode.STORE_STATE_YES);//店铺资料信息状态(ENUM):3210-待完善资料; 3220-等待审核 ; 3230-资料审核没有通过;3240-资料审核通过,待付款
shopStoreBase.setStore_state_id(StateCode.STORE_STATE_YES);
shopStoreBase.setStore_time(DateUtil.date());
shopStoreBase.setStore_end_time(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5); // 5年
shopStoreBase.setStore_end_time(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5);
if (!save(shopStoreBase)) {
logger.error("生成店铺:新增或更改店铺基本信息失败");
if (allowThrown) {
throw new ApiException(I18nUtil._("新增或更改店铺基本信息失败"));
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException("新增或更改店铺基本信息失败");
}
return Pair.of(0, "新增或更改店铺基础信息失败");
}
// 保存后店铺Id
// 获取店铺ID
Integer storeId = shopStoreBase.getStore_id();
if (CheckUtil.isEmpty(storeId)) {
logger.error("生成店铺店铺ID获取失败");
return Pair.of(0, "店铺ID获取失败");
}
// shop_store_info
// 创建店铺信息
ShopStoreInfo shopStoreInfo = new ShopStoreInfo();
shopStoreInfo.setStore_id(storeId);
shopStoreInfo.setStore_start_time(DateUtil.date());
shopStoreInfo.setStore_end_time(DateUtil.offsetDay(DateUtil.date(), 365 * 5));
shopStoreInfo.setStore_opening_hours("08:00");
shopStoreInfo.setStore_close_hours("22:00");
shopStoreInfo.setStore_discount(BigDecimal.valueOf(10));// 原价
shopStoreInfo.setStore_opening_hours("07:30");
shopStoreInfo.setStore_close_hours("23:00");
shopStoreInfo.setStore_discount(BigDecimal.valueOf(10));
shopStoreInfo.setStore_banner(storeFacadeImage);
// 联系人手机号码
String contact_mobile = StrUtil.isBlank(shopMchEntry.getLegal_person_mobile()) ? shopMchEntry.getLogin_mobile() : shopMchEntry.getLegal_person_mobile();
// 处理联系人信息
String contact_mobile = StrUtil.isNotBlank(shopMchEntry.getLegal_person_mobile()) ?
shopMchEntry.getLegal_person_mobile() : shopMchEntry.getLogin_mobile();
shopStoreInfo.setStore_tel(contact_mobile);
shopStoreInfo.setContact_mobile(contact_mobile);
shopStoreInfo.setContact_name(shopMchEntry.getContact_name());
String websiteXFTC = "https://www.gpxscs.cn";
// 构建幻灯片
JSONArray list = new JSONArray();
if (StrUtil.isNotBlank(storeFacadeImage)) {
JSONObject slide = new JSONObject();
slide.put("img", storeFacadeImage);
slide.put("name", "店铺门面照片");
slide.put("check", true);
slide.put("url", websiteXFTC);
slide.put("url", "https://www.gpxscs.cn");
list.put(slide);
}
if (StrUtil.isNotBlank(shopMchEntry.getEnvironment_image())) {
@ -3264,54 +3296,64 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
slide.put("img", shopMchEntry.getEnvironment_image());
slide.put("name", "店铺环境照片");
slide.put("check", true);
slide.put("url", websiteXFTC);
slide.put("url", "https://www.gpxscs.cn");
list.put(slide);
}
shopStoreInfo.setStore_slide(list.toString());
shopStoreInfo.setStore_address(shopMchEntry.getStore_address()); // 包含省市区的详细地址
if (shopMchEntry.getStore_address() != null) {
shopStoreInfo.setStore_address(shopMchEntry.getStore_address());
}
shopStoreInfo.setStore_state_id(StateCode.STORE_STATE_YES);
if (!shopStoreInfoService.save(shopStoreInfo)) {
logger.error("生成店铺新增店铺info失败");
if (allowThrown) {
throw new ApiException(I18nUtil._("新增店铺信息失败"));
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException("新增店铺信息失败");
}
return Pair.of(0, "新增店铺信息失败");
}
// 初始化默认公司信息避免商家编辑不了申请入驻即使是个人类型的也需要保存相关应有信息公司信息不能空着
// shop_store_company
// 创建店铺公司信息
ShopStoreCompany shopStoreCompany = shopStoreCompanyService.getCompany(storeId);
if (shopStoreCompany == null) {
shopStoreCompany = new ShopStoreCompany();
}
shopStoreCompany.setUser_id(userId);
shopStoreCompany.setStore_id(storeId);
// 联系人
// 设置联系人信息
shopStoreCompany.setContacts_name(shopMchEntry.getContact_name());
shopStoreCompany.setContacts_phone(contact_mobile);
// 公司名
String companyName = StrUtil.isBlank(shopMchEntry.getBiz_license_company()) ? shopMchEntry.getStore_name() : shopMchEntry.getBiz_license_company();
// 设置公司名称
String companyName = StrUtil.isNotBlank(shopMchEntry.getBiz_license_company()) ?
shopMchEntry.getBiz_license_company() : shopMchEntry.getStore_name();
shopStoreCompany.setCompany_name(companyName);
shopStoreCompany.setCompany_area(shopStoreBase.getStore_area());
if (storeArea != null) {
shopStoreCompany.setCompany_area(storeArea);
}
shopStoreCompany.setCompany_address(shopMchEntry.getStore_address());
// 营业执照
// 设置营业执照信息
shopStoreCompany.setBusiness_id(shopMchEntry.getBiz_license_number());
shopStoreCompany.setBusiness_license_electronic(shopMchEntry.getBiz_license_image());
// 企业法人
// 设置法人信息
shopStoreCompany.setLegal_person(shopMchEntry.getLegal_person_name());
shopStoreCompany.setLegal_person_number(shopMchEntry.getLegal_person_id_number());
shopStoreCompany.setLegal_person_electronic(shopMchEntry.getLegal_person_id_images());
// 银行对公账号
// 设置银行信息
shopStoreCompany.setBank_account_name(shopMchEntry.getAccount_holder_name());
shopStoreCompany.setBank_account_number(shopMchEntry.getAccount_number());
shopStoreCompany.setBank_name(shopMchEntry.getBank_name());
Date today = new Date(); // 当前时间
Date today = new Date();
shopStoreCompany.setOrganization_code_start(today);
shopStoreCompany.setOrganization_code_end(DateUtil.offsetDay(today, 365 * 5));// 五年
shopStoreCompany.setOrganization_code_end(DateUtil.offsetDay(today, 365 * 5));
shopStoreCompany.setEstablish_date(today);
shopStoreCompany.setBusiness_licence_start(today);
shopStoreCompany.setBusiness_licence_end(DateUtil.offsetDay(today, 365 * 10));
@ -3323,26 +3365,24 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
if (!shopStoreCompanyService.save(shopStoreCompany)) {
logger.error("生成店铺:新增店铺公司失败");
if (allowThrown) {
throw new ApiException(I18nUtil._("新增店铺公司失败"));
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException("新增店铺公司失败");
}
return Pair.of(0, "新增店铺公司失败");
}
}
// 创建店铺员工信息
List<ShopStoreEmployee> shopStoreEmployees = shopStoreEmployeeService.selectEmployeeByCondition(storeId, null, null);
ShopStoreEmployee shopStoreEmployee = new ShopStoreEmployee();
shopStoreEmployee.setStore_id(storeId);
shopStoreEmployee.setUser_id(userId);
shopStoreEmployee.setRights_group_id(""); // 店铺管理员,店铺
shopStoreEmployee.setRights_group_id("");
shopStoreEmployee.setEmployee_is_kefu(CommonConstant.Enable);
if (CollUtil.isEmpty(shopStoreEmployees)) { // 添加管理员
// shop_store_employee 店铺员工添加管理员
if (CollUtil.isEmpty(shopStoreEmployees)) {
shopStoreEmployee.setEmployee_is_admin(CommonConstant.Enable);
} else { // 添加店员或管理员
} else {
shopStoreEmployees = shopStoreEmployeeService.selectEmployeeByCondition(storeId, userId, null);
if (CollUtil.isEmpty(shopStoreEmployees)) {
shopStoreEmployee.setEmployee_is_admin(CommonConstant.Disable);
@ -3353,13 +3393,13 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
if (!shopStoreEmployeeService.save(shopStoreEmployee)) {
logger.error("生成店铺:新增店铺员工失败");
if (allowThrown) {
throw new ApiException(I18nUtil._("新增店铺员工失败"));
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException("新增店铺员工失败");
}
return Pair.of(0, "新增店铺员工失败");
}
// 生成店铺的太阳码 2025-03-31
// 生成微信二维码
if (StrUtil.isBlank(shopStoreBase.getWx_qrcode())) {
Pair<String, String> resp = wxQrCodeService.genUnlimitedWxQrCode("pagesub/index/store", "store_id=" + storeId);
if (StrUtil.isNotBlank(resp.getFirst())) {
@ -3367,252 +3407,294 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
}
// 注意关联店铺到用户给用户增加店铺管理员权限
// 初始化店铺额外信息
initStoreExtraInfo(userId, storeId, allowThrown);
// 更改店铺Id和状态
// 更新商家入驻状态和新建的店铺ID
if (shopMchEntry.getId() != null) {
shopMchEntryService.updateMerchEntryStoreStatus(shopMchEntry.getId(), storeId);
}
// 立即创建顺丰店铺附带初始化同城配送默认设置
String[] areaNames = StrUtil.isNotBlank(shopMchEntry.getStore_area()) ? shopMchEntry.getStore_area().split("/") : new String[0];
String cityName = areaNames.length > 0 ? areaNames[areaNames.length - 1] : shopMchEntry.getStore_area().replace("/", "");
sfExpressApiService.createSfExpressShop(storeId, shopMchEntry.getStore_name(), cityName, shopMchEntry.getStore_address(), shopMchEntry.getContact_name(), contact_mobile, shopMchEntry.getStore_longitude(), shopMchEntry.getStore_longitude());
// 创建顺丰店铺修复经纬度参数错误
if (storeArea != null) {
String[] areaNames = storeArea.split("/");
String cityName = areaNames.length > 0 ? areaNames[areaNames.length - 1] : storeArea.replace("/", "");
sfExpressApiService.createSfExpressShop(storeId, shopMchEntry.getStore_name(),
cityName, shopMchEntry.getStore_address(), shopMchEntry.getContact_name(),
contact_mobile, shopMchEntry.getStore_longitude(), shopMchEntry.getStore_latitude());
}
return Pair.of(storeId, "新增成功");
} catch (Exception e) {
logger.error("店铺生成失败", e);
if (allowThrown) {
throw new ApiException(I18nUtil._("店铺生成失败"));
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException("店铺生成失败");
}
return Pair.of(0, e.getMessage());
}
}
/**
* 初始化店长店铺管理员的权限组
*
* @param userId
* @param storeId
* @param userId 用户ID
* @param storeId 店铺ID
* @param allowThrown 是否允许抛出异常
*/
private void initStoreExtraInfo(Integer userId, Integer storeId, Boolean allowThrown) {
if (ObjectUtil.isNull(userId) || ObjectUtil.isNull(storeId)) {
log.warn("初始化店铺额外信息参数为空: userId={}, storeId={}", userId, storeId);
return;
}
Date today = new Date(); // 当前时间
try {
// 初始化时添加一条店铺分析信息
ShopStoreAnalytics storeAnalytics = shopStoreAnalyticsService.getByStoreId(storeId);
if (storeAnalytics == null) {
storeAnalytics = new ShopStoreAnalytics();
storeAnalytics.setStore_id(storeId);
if (!shopStoreAnalyticsService.add(storeAnalytics)) {
if (allowThrown) {
String errorMsg = "初始化店铺分析信息失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(ResultCode.FAILED);
}
log.error("初始化店铺分析信息失败");
log.error(errorMsg);
return;
}
}
// 初始化店铺商品标签
QueryWrapper<ShopBaseProductTag> tagQueryWrapper = new QueryWrapper<>();
tagQueryWrapper.orderByAsc("product_tag_id");
Page<ShopBaseProductTag> base_product_tag_row = shopBaseProductTagService.lists(tagQueryWrapper, 1, 5);
List<ShopStoreProductTag> store_product_tag_row = new ArrayList<>();
for (ShopBaseProductTag teg : base_product_tag_row.getRecords()) {
Page<ShopBaseProductTag> baseProductTagPage = shopBaseProductTagService.lists(tagQueryWrapper, 1, 5);
if (baseProductTagPage != null && CollUtil.isNotEmpty(baseProductTagPage.getRecords())) {
List<ShopStoreProductTag> storeProductTagList = new ArrayList<>();
for (ShopBaseProductTag tag : baseProductTagPage.getRecords()) {
if (tag != null) {
ShopStoreProductTag shopStoreProductTag = new ShopStoreProductTag();
store_product_tag_row.add(shopStoreProductTag);
shopStoreProductTag.setProduct_tag_id(teg.getProduct_tag_id());
shopStoreProductTag.setProduct_tag_id(tag.getProduct_tag_id());
shopStoreProductTag.setStore_id(storeId);
shopStoreProductTag.setProduct_tag_time(today);
shopStoreProductTag.setStore_product_tag_buildin(1);
storeProductTagList.add(shopStoreProductTag);
}
}
if (CollUtil.isNotEmpty(store_product_tag_row)) {
if (!shopStoreProductTagService.saveOrUpdate(store_product_tag_row)) {
if (allowThrown) {
if (CollUtil.isNotEmpty(storeProductTagList)) {
if (!shopStoreProductTagService.saveOrUpdate(storeProductTagList)) {
String errorMsg = "初始化店铺商品标签失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(ResultCode.FAILED);
}
log.error("初始化店铺商品标签失败");
log.error(errorMsg);
return;
}
}
}
// 初始化默认店铺仓库
InvoicingWarehouseBase invoicingWarehouseBase = new InvoicingWarehouseBase();
invoicingWarehouseBase.setWarehouse_name(I18nUtil._("默认"));
invoicingWarehouseBase.setWarehouse_name("默认");
invoicingWarehouseBase.setStore_id(storeId);
invoicingWarehouseBase.setWarehouse_address("");
invoicingWarehouseBase.setWarehouse_number("");
invoicingWarehouseBase.setWarehouse_contact("");
if (!invoicingWarehouseBaseService.saveOrUpdate(invoicingWarehouseBase)) {
if (allowThrown) {
String errorMsg = "初始化默认店铺仓库失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(ResultCode.FAILED);
}
log.error("初始化默认店铺仓库失败");
log.error(errorMsg);
return;
}
// 初始化默认权限
Page<Serializable> page = shopStoreEmployeeRightsBaseService.listKey(new QueryWrapper<>(), 1, ConfigConstant.MAX_LIST_NUM);
List<Integer> rightsGroupRightsIds = new ArrayList<>();
if (page != null && CollUtil.isNotEmpty(page.getRecords())) {
rightsGroupRightsIds = Convert.toList(Integer.class, page.getRecords());
}
List<Integer> rights_group_rights_ids = Convert.toList(Integer.class, page.getRecords());
List<ShopStoreEmployeeRightsGroup> shopStoreEmployeeRightsGroups = new ArrayList<>();
String str_rights_group_rights_ids = CollUtil.join(rights_group_rights_ids, ",");
String strRightsGroupRightsIds = CollUtil.join(rightsGroupRightsIds, ",");
// 创建各种角色权限组
ShopStoreEmployeeRightsGroup shopManager = new ShopStoreEmployeeRightsGroup();
shopManager.setStore_id(storeId);
shopManager.setRights_group_rights_ids(str_rights_group_rights_ids);
shopManager.setRights_group_name(I18nUtil._("店铺管理员")); //Store Owner
shopManager.setRights_group_rights_ids(strRightsGroupRightsIds);
shopManager.setRights_group_name("店铺管理员"); // Store Owner
shopManager.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(shopManager);
ShopStoreEmployeeRightsGroup operationsManager = new ShopStoreEmployeeRightsGroup();
operationsManager.setStore_id(storeId);
operationsManager.setRights_group_rights_ids(str_rights_group_rights_ids);
operationsManager.setRights_group_name(I18nUtil._("运营经理")); //Store Owner
operationsManager.setRights_group_rights_ids(strRightsGroupRightsIds);
operationsManager.setRights_group_name("运营经理"); // Store Owner
operationsManager.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(operationsManager);
ShopStoreEmployeeRightsGroup orderReviewer = new ShopStoreEmployeeRightsGroup();
orderReviewer.setStore_id(storeId);
orderReviewer.setRights_group_rights_ids(str_rights_group_rights_ids);
orderReviewer.setRights_group_name(I18nUtil._("订单审核员")); //Store Owner
orderReviewer.setRights_group_rights_ids(strRightsGroupRightsIds);
orderReviewer.setRights_group_name("订单审核员"); // Store Owner
orderReviewer.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(orderReviewer);
ShopStoreEmployeeRightsGroup financialAuditor = new ShopStoreEmployeeRightsGroup();
financialAuditor.setStore_id(storeId);
financialAuditor.setRights_group_rights_ids(str_rights_group_rights_ids);
financialAuditor.setRights_group_name(I18nUtil._("财务审核员")); //Store Owner
financialAuditor.setRights_group_rights_ids(strRightsGroupRightsIds);
financialAuditor.setRights_group_name("财务审核员"); // Store Owner
financialAuditor.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(financialAuditor);
ShopStoreEmployeeRightsGroup shippingAuditor = new ShopStoreEmployeeRightsGroup();
shippingAuditor.setStore_id(storeId);
shippingAuditor.setRights_group_rights_ids(str_rights_group_rights_ids);
shippingAuditor.setRights_group_name(I18nUtil._("发货审核员")); //Store Owner
shippingAuditor.setRights_group_rights_ids(strRightsGroupRightsIds);
shippingAuditor.setRights_group_name("发货审核员"); // Store Owner
shippingAuditor.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(shippingAuditor);
ShopStoreEmployeeRightsGroup businessManager = new ShopStoreEmployeeRightsGroup();
businessManager.setStore_id(storeId);
businessManager.setRights_group_rights_ids(str_rights_group_rights_ids);
businessManager.setRights_group_name(I18nUtil._("业务经理")); //Store Owner
businessManager.setRights_group_rights_ids(strRightsGroupRightsIds);
businessManager.setRights_group_name("业务经理"); // Store Owner
businessManager.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(businessManager);
ShopStoreEmployeeRightsGroup warehouseManager = new ShopStoreEmployeeRightsGroup();
warehouseManager.setStore_id(storeId);
warehouseManager.setRights_group_rights_ids(str_rights_group_rights_ids);
warehouseManager.setRights_group_name(I18nUtil._("仓库管理员")); //Store Owner
warehouseManager.setRights_group_rights_ids(strRightsGroupRightsIds);
warehouseManager.setRights_group_name("仓库管理员"); // Store Owner
warehouseManager.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(warehouseManager);
ShopStoreEmployeeRightsGroup dataMaintainer = new ShopStoreEmployeeRightsGroup();
dataMaintainer.setStore_id(storeId);
dataMaintainer.setRights_group_rights_ids(str_rights_group_rights_ids);
dataMaintainer.setRights_group_name(I18nUtil._("资料维护员")); //Store Owner
dataMaintainer.setRights_group_rights_ids(strRightsGroupRightsIds);
dataMaintainer.setRights_group_name("资料维护员"); // Store Owner
dataMaintainer.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(dataMaintainer);
ShopStoreEmployeeRightsGroup customerService = new ShopStoreEmployeeRightsGroup();
customerService.setStore_id(storeId);
customerService.setRights_group_rights_ids(str_rights_group_rights_ids);
customerService.setRights_group_name(I18nUtil._("客服")); //Store Owner
customerService.setRights_group_rights_ids(strRightsGroupRightsIds);
customerService.setRights_group_name("客服"); // Store Owner
customerService.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(customerService);
ShopStoreEmployeeRightsGroup extension1 = new ShopStoreEmployeeRightsGroup();
extension1.setStore_id(storeId);
extension1.setRights_group_rights_ids(str_rights_group_rights_ids);
extension1.setRights_group_name(I18nUtil._("扩展1")); //Store Owner
extension1.setRights_group_rights_ids(strRightsGroupRightsIds);
extension1.setRights_group_name("扩展1"); // Store Owner
extension1.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(extension1);
ShopStoreEmployeeRightsGroup extension2 = new ShopStoreEmployeeRightsGroup();
extension2.setStore_id(storeId);
extension2.setRights_group_rights_ids(str_rights_group_rights_ids);
extension2.setRights_group_name(I18nUtil._("扩展2")); //Store Owner
extension2.setRights_group_rights_ids(strRightsGroupRightsIds);
extension2.setRights_group_name("扩展2"); // Store Owner
extension2.setRights_group_rights_data(""); // Store Owner
shopStoreEmployeeRightsGroups.add(extension2);
if (!shopStoreEmployeeRightsGroupService.saveOrUpdate(shopStoreEmployeeRightsGroups)) {
if (allowThrown) {
String errorMsg = "初始化店铺员工默认权限失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(ResultCode.FAILED);
}
log.error("初始化店铺员工默认权限失败");
log.error(errorMsg);
return;
}
// 添加店铺到用户
AccountUserBase accountUserBase = new AccountUserBase();
List<Integer> rights_group_id = shopStoreEmployeeRightsGroups.stream().map(s -> s.getRights_group_id()).collect(Collectors.toList());
if (CollUtil.isNotEmpty(rights_group_id)) {
List<Integer> rightsGroupId = shopStoreEmployeeRightsGroups.stream()
.map(ShopStoreEmployeeRightsGroup::getRights_group_id)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(rightsGroupId)) {
// 初始化雇员信息
UpdateWrapper<ShopStoreEmployee> queryWrapper = new UpdateWrapper<>();
queryWrapper.eq("user_id", userId).eq("store_id", storeId)
.set("rights_group_id", CollUtil.join(rights_group_id, ","))
.set("rights_group_id", CollUtil.join(rightsGroupId, ","))
.set("employee_is_admin", CommonConstant.Enable)
.set("employee_is_kefu", CommonConstant.Enable);
if (!shopStoreEmployeeService.update(queryWrapper)) {
if (allowThrown) {
throw new ApiException(I18nUtil._("设置店铺管理员权限失败"));
String errorMsg = "设置店铺管理员权限失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(errorMsg);
}
log.error("设置店铺管理员权限失败!");
log.error(errorMsg);
return;
}
// todo 初始化商家角色默认 店铺管理员角色
String user_rights_group_id = Convert.toStr(rights_group_id.get(0));
accountUserBase.setRights_group_id(StrUtil.join(",", user_rights_group_id, 2));
// 初始化商家角色默认 店铺管理员角色
String userRightsGroupId = Convert.toStr(rightsGroupId.get(0));
accountUserBase.setRights_group_id(StrUtil.join(",", userRightsGroupId, "2"));
}
// 用法人小微个人的手机号注册商家账号作为店铺的管理员
accountUserBase.setUser_id(userId);
// 修复需要实现 appendStoreIdToAccount 方法或替换为正确的逻辑
String storeIds = appendStoreIdToAccount(userId, storeId);
accountUserBase.setStore_ids(storeIds); // 重要给用户添加上这个店铺的归属权
if (!accountService.saveOrUpdateUserBase(accountUserBase)) {
if (allowThrown) {
throw new ApiException(I18nUtil._("店铺关联到用户失败"));
String errorMsg = "店铺关联到用户失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(errorMsg);
}
log.error("店铺关联到用户失败!");
log.error(errorMsg);
return;
}
// 添加默认运输模板
ShopStoreTransportType shopStoreTransportType = new ShopStoreTransportType();
shopStoreTransportType.setTransport_type_name(I18nUtil._("通用全免")); // 模板名称
shopStoreTransportType.setTransport_type_name("通用全免"); // 模板名称
shopStoreTransportType.setStore_id(storeId); // 所属店铺
shopStoreTransportType.setTransport_type_pricing_method(1); // 计费规则(ENUM):1-按件数;2-按重量;3-按体积
shopStoreTransportType.setTransport_type_time(today);
shopStoreTransportType.setTransport_type_freight_free(BigDecimal.ZERO); // 免运费额度
shopStoreTransportType.setTransport_type_free(1);
if (!shopStoreTransportTypeService.saveOrUpdate(shopStoreTransportType)) {
if (allowThrown) {
throw new ApiException(I18nUtil._("添加运输模板失败"));
String errorMsg = "添加运输模板失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(errorMsg);
}
log.error("添加运输模板失败!");
log.error(errorMsg);
return;
}
// 店铺配置
ShopStoreConfig shopStoreConfig = new ShopStoreConfig();
shopStoreConfig.setStore_id(storeId);
List<Integer> sc_order_process = Arrays.asList(
List<Integer> scOrderProcess = Arrays.asList(
StateCode.ORDER_PROCESS_PAY, // 支付
StateCode.ORDER_PROCESS_OUT, // 出库审核
StateCode.ORDER_PROCESS_SHIPPED, // 发货确认
StateCode.ORDER_PROCESS_RECEIVED);
String str_sc_order_process = CollUtil.join(sc_order_process, ",");
shopStoreConfig.setSc_order_process(str_sc_order_process);
List<Integer> sc_order_return_process = Arrays.asList(
StateCode.RETURN_PROCESS_SUBMIT,
//客户提交退单1ReturnReturn
StateCode.RETURN_PROCESS_CHECK,
//退单审核1ReturnReturn
StateCode.RETURN_PROCESS_FINISH
//完成1ReturnReturn3130-商家拒绝退货
StateCode.ORDER_PROCESS_RECEIVED // 收货确认
);
String str_sc_order_return_process = CollUtil.join(sc_order_return_process, ",");
shopStoreConfig.setSc_order_return_process(str_sc_order_return_process); // 退货流程设置(DOT)
String strScOrderProcess = CollUtil.join(scOrderProcess, ",");
shopStoreConfig.setSc_order_process(strScOrderProcess);
List<Integer> scOrderReturnProcess = Arrays.asList(
StateCode.RETURN_PROCESS_SUBMIT, // 客户提交退单
StateCode.RETURN_PROCESS_CHECK, // 退单审核
StateCode.RETURN_PROCESS_FINISH // 完成
);
String strScOrderReturnProcess = CollUtil.join(scOrderReturnProcess, ",");
shopStoreConfig.setSc_order_return_process(strScOrderReturnProcess); // 退货流程设置(DOT)
shopStoreConfig.setSc_settle_circle(30);
shopStoreConfig.setSc_settle_last_time(System.currentTimeMillis());
shopStoreConfig.setSc_settle_next_time(Convert.toLong(DateUtil.nextMonth()));
@ -3625,27 +3707,46 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
shopStoreConfig.setSc_festival_amount_down(BigDecimal.ZERO);
shopStoreConfig.setSc_festival_amount_upper(BigDecimal.ZERO);
shopStoreConfig.setSc_festival_float_proportion(BigDecimal.ZERO);
if (!shopStoreConfigService.saveOrUpdate(shopStoreConfig)) {
if (allowThrown) {
throw new ApiException(I18nUtil._("添加订单流转配置失败"));
String errorMsg = "添加订单流转配置失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(errorMsg);
}
log.error("添加订单流转配置失败!");
log.error(errorMsg);
return;
}
// 添加默认客户等级
InvoicingCustomerLevel invoicingCustomerLevel = new InvoicingCustomerLevel();
invoicingCustomerLevel.setCustomer_level_name(I18nUtil._("普通(系统默认,不可删除)"));
invoicingCustomerLevel.setCustomer_level_name("普通(系统默认,不可删除)");
invoicingCustomerLevel.setCustomer_level_discountrate(new BigDecimal(100));
invoicingCustomerLevel.setCustomer_level_is_buildin(1);
invoicingCustomerLevel.setCustomer_level_desc("");
if (!invoicingCustomerLevelService.saveOrUpdate(invoicingCustomerLevel)) {
if (allowThrown) {
throw new ApiException(I18nUtil._("添加默认客户等级失败"));
String errorMsg = "添加默认客户等级失败";
if (Boolean.TRUE.equals(allowThrown)) {
throw new ApiException(errorMsg);
}
log.error("添加默认客户等级失败!");
log.error(errorMsg);
return;
}
log.info("初始化店铺额外信息成功: userId={}, storeId={}", userId, storeId);
} catch (Exception e) {
log.error("初始化店铺额外信息异常: userId={}, storeId={}", userId, storeId, e);
if (Boolean.TRUE.equals(allowThrown)) {
if (e instanceof ApiException) {
throw e;
} else {
throw new ApiException("初始化店铺信息失败: " + e.getMessage());
}
}
}
}
/**
* 根据店铺名称判断店铺是否存在
@ -3996,14 +4097,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
*
* @param userId 用户ID
* @param storeId 要追加的店铺ID
* @return 追加后的店铺ID字符串格式id1,id2,或空字符串参数无效/用户不存在
* @return 追加后的店铺ID字符串格式id1,id2或空字符串参数无效/用户不存在
* @throws IllegalArgumentException 当参数无效时抛出
*/
@Override
public String appendStoreIdToAccount(Integer userId, Integer storeId) {
// 参数校验
if (ObjectUtil.isNull(userId) || ObjectUtil.isNull(storeId)) {
log.error("用户ID和店铺ID不能为空userId: {}, storeId: {}", userId, storeId);
if (CheckUtil.isEmpty(userId) || CheckUtil.isEmpty(storeId)) {
log.warn("用户ID和店铺ID不能为空userId: {}, storeId: {}", userId, storeId);
return "";
}
@ -4011,16 +4112,20 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
// 查询用户现有的店铺ID列表
AccountUserBase accountUserBase = accountService.getUserBase(userId);
// 用户不存在或没有店铺时返回空
// 用户不存在时返回空字符串
if (accountUserBase == null) {
log.warn("用户不存在userId: {}", userId);
return "";
}
List<String> idList = new ArrayList<>();
String storeIds = accountUserBase.getStore_ids();
if (StrUtil.isBlank(storeIds)) {
// 用户当前没有店铺ID直接添加新店铺ID
idList.add(storeId.toString());
} else {
// 用户已有店铺ID列表解析并去重
idList = StrUtil.split(storeIds, ",");
if (!idList.contains(storeId.toString())) {
// 追加新店铺ID
@ -4028,8 +4133,14 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
}
}
// 返回去重后的店铺ID列表用逗号连接
return StrUtil.join(",", CollUtil.distinct(idList));
} catch (ApiException e) {
// 处理特定的API异常
log.error("调用账户服务异常userId: {}, storeId: {}", userId, storeId, e);
return "";
} catch (Exception e) {
// 处理其他未预期的异常
log.error("追加店铺ID到用户失败userId: {}, storeId: {}", userId, storeId, e);
return "";
}