入驻流程优化流程

This commit is contained in:
Jack 2025-08-21 23:19:38 +08:00
parent 58998d62b9
commit 5ea8fb658c
10 changed files with 159 additions and 141 deletions

View File

@ -72,6 +72,7 @@ public class DateTimeUtils {
* - yyyy.MM.dd / yyyy/MM/dd / yyyy年MM月dd日
* - yyyy.M.d / yyyy/M/d / yyyy年M月d日
* - yy.MM.dd / yy.M.d
* - yyyyMMdd
* 特殊值空值"长期""永久" 转9999-12-31
*/
public static String convertLklDate(String dateStr) {
@ -97,6 +98,11 @@ public class DateTimeUtils {
// 快速判断格式并解析
try {
// 处理纯数字格式 yyyyMMdd
if (length == 8 && dateStr.matches("\\d{8}")) {
return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyyMMdd")).toString();
}
// 处理连字符格式yyyy-MM-dd yyyy-M-d
if (dateStr.contains("-")) {
if (length == 10 && dateStr.charAt(4) == '-' && dateStr.charAt(7) == '-') {
@ -243,7 +249,9 @@ public class DateTimeUtils {
// System.out.println(convertLklDate("永久")); // 9999-12-31
// System.out.println(convertLklDate(null)); // 9999-12-31
// System.out.println(convertLklDate("2025.2.30")); // 9999-12-31无效日期
System.out.println(convertLklDate("2045-01-10")); // 2025-01-10
System.out.println(formatLocalDate(LocalDate.now(), "yyyy-MM-dd"));
// System.out.println(formatLocalDate(LocalDate.now(), "yyyy-MM-dd"));
}
}

View File

@ -62,6 +62,7 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
public static void main(String[] args) {
// System.out.println(validateIDCard("45088119970105771X"));
System.out.println(getFileExt("https://media-mall-prod-1259811287.cos.ap-guangzhou.myqcloud.com/media/media/store/10073/20250807/41408657c5c84a758f5d0eca2b652cac.jpg"));
}
public static String encode(String str) {
@ -711,25 +712,6 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
return null;
}
/**
* 生成的随机数类型
*/
public enum RandomType {
/**
* 整数
*/
INT,
/**
* 字符串
*/
STRING,
/**
* 所有类型
*/
ALL
}
/**
* 判断字符串是否为有效的经度值
* 经度范围-180° ~ 180°
@ -767,4 +749,22 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
return false;
}
}
/**
* 生成的随机数类型
*/
public enum RandomType {
/**
* 整数
*/
INT,
/**
* 字符串
*/
STRING,
/**
* 所有类型
*/
ALL
}
}

View File

@ -1,12 +1,13 @@
package com.suisung.mall.shop.base.service.impl;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.suisung.mall.common.constant.RedisConstant;
import com.suisung.mall.common.modules.base.ShopBaseConfig;
import com.suisung.mall.common.utils.CaptchaUtil;
import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.base.mapper.ShopBaseConfigMapper;
@ -96,110 +97,104 @@ public class ShopBaseConfigServiceImpl extends BaseServiceImpl<ShopBaseConfigMap
}
/**
* 获取验证码
*/
@Override
public void image(HttpServletResponse response) {
// 设置响应头确保浏览器正确处理图片
response.setContentType("image/png");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setDateHeader("Expires", 0);
response.setHeader("Content-Disposition", "inline; filename=captcha.png");
// 添加防止代理缓存的头
response.setHeader("Proxy-Connection", "close");
response.setHeader("Connection", "close");
OutputStream os = null;
try {
// 获取verify_token参数
String verify_token = getParameter("verify_token", String.class);
if (StrUtil.isBlank(verify_token)) {
logger.warn("验证码请求缺少verify_token参数");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// 创建一个不依赖字体的简单数字验证码
String captchaCode = CaptchaUtil.generateSimpleCaptcha(4);
// 手动创建简单的验证码图片
BufferedImage image = CaptchaUtil.createSimpleCaptchaImage(captchaCode);
// 保存验证码到Redis
String code = RedisConstant.Verifycode_NameSpace + verify_token + captchaCode;
redisService.set(code, "", 60); // 有效期一分钟
// 输出图片到响应流
os = response.getOutputStream();
if (image != null) {
ImageIO.write(image, "png", os);
} else {
logger.error("生成验证码图片失败image为null");
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
os.flush();
} catch (Exception e) {
logger.error("获取验证码响应异常: " + e.getMessage(), e);
try {
// 确保即使出错也返回一个错误图片或空白图片
response.setContentType("image/png");
CaptchaUtil.createErrorImage(response.getOutputStream());
} catch (Exception ex) {
logger.error("设置错误响应状态异常: " + ex.getMessage(), ex);
}
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
logger.error("关闭输出流异常: " + e.getMessage(), e);
}
}
}
}
// /**
// * 获取验证码
// */
// @Override
// public void image(HttpServletResponse response) {
// // 设置响应头确保浏览器正确处理图片
// response.setContentType("image/png");
// response.setHeader("Pragma", "no-cache");
// response.setHeader("Cache-Control", "no-cache");
// response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
// response.setDateHeader("Expires", 0);
// // 产生验证码图片的图片的宽是116高是36验证码的长度是4干扰线的条数是20
// LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(120, 40, 4, 20);
// response.setHeader("Content-Disposition", "inline; filename=captcha.png");
//
// // 可选设置自定义字体如果需要
//// lineCaptcha.setFont(new Font("Arial", Font.BOLD, 16));
// // 添加防止代理缓存的头
// response.setHeader("Proxy-Connection", "close");
// response.setHeader("Connection", "close");
//
// // 拼接时间戳
// String verify_token = getParameter("verify_token", String.class);
//
// //获取验证码图片中的字符串
// String code = RedisConstant.Verifycode_NameSpace + verify_token + lineCaptcha.getCode();
// redisService.set(code, "", 60); // 有效期一分钟
//
// //获取到response的响应流
// BufferedImage image = lineCaptcha.getImage();
// OutputStream os = null;
// try {
// // 获取verify_token参数
// String verify_token = getParameter("verify_token", String.class);
// if (StrUtil.isBlank(verify_token)) {
// logger.warn("验证码请求缺少verify_token参数");
// response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
// return;
// }
//
// // 创建一个不依赖字体的简单数字验证码
// String captchaCode = CaptchaUtil.generateSimpleCaptcha(4);
//
// // 手动创建简单的验证码图片
// BufferedImage image = CaptchaUtil.createSimpleCaptchaImage(captchaCode);
//
// // 保存验证码到Redis
// String code = RedisConstant.Verifycode_NameSpace + verify_token + captchaCode;
// redisService.set(code, "", 60); // 有效期一分钟
//
// // 输出图片到响应流
// os = response.getOutputStream();
// ImageIO.write(image, "png", os);
// } catch (IOException e) {
// logger.error("获取验证码响应异常!" + e.getMessage(), e);
// } finally {
// if (image != null) {
// ImageIO.write(image, "png", os);
// } else {
// logger.error("生成验证码图片失败image为null");
// response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
// }
// os.flush();
// } catch (Exception e) {
// logger.error("获取验证码响应异常: " + e.getMessage(), e);
// try {
// assert os != null;
// os.close();
// } catch (IOException e) {
// logger.error("获取验证码响应异常!" + e.getMessage(), e);
// // 确保即使出错也返回一个错误图片或空白图片
// response.setContentType("image/png");
// CaptchaUtil.createErrorImage(response.getOutputStream());
// } catch (Exception ex) {
// logger.error("设置错误响应状态异常: " + ex.getMessage(), ex);
// }
// } finally {
// if (os != null) {
// try {
// os.close();
// } catch (IOException e) {
// logger.error("关闭输出流异常: " + e.getMessage(), e);
// }
// }
// }
// }
@Override
public void image(HttpServletResponse response) {
response.setContentType("image/png");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 产生验证码图片的图片的宽是116高是36验证码的长度是4干扰线的条数是20
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(120, 40, 4, 20);
// 拼接时间戳
String verify_token = getParameter("verify_token", String.class);
//获取验证码图片中的字符串
String code = RedisConstant.Verifycode_NameSpace + verify_token + lineCaptcha.getCode();
redisService.set(code, "", 60); // 有效期一分钟
//获取到response的响应流
BufferedImage image = lineCaptcha.getImage();
OutputStream os = null;
try {
os = response.getOutputStream();
ImageIO.write(image, "png", os);
} catch (IOException e) {
logger.error("获取验证码响应异常!" + e.getMessage(), e);
} finally {
try {
assert os != null;
os.close();
} catch (IOException e) {
logger.error("获取验证码响应异常!" + e.getMessage(), e);
}
}
}
}

View File

@ -430,7 +430,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
LocalDate today = LocalDate.now();
String signDate = DateTimeUtils.formatLocalDate(today, "yyyy-MM-dd");
String platformName = "桂平发发网络有限公司";
JSONObject ecParams = new JSONObject();
ecParams.put("A1", isQy ? shopMchEntry.getBiz_license_company() : shopMchEntry.getAccount_holder_name());
@ -1081,7 +1081,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
req.setLegalPersonCertificateType(paramsJSON.getStr("legalPersonCertificateType"));
req.setLegalPersonCertificateNo(paramsJSON.getStr("legalPersonCertificateNo"));
req.setAcctNo(paramsJSON.getStr("acctNo"));
req.setAcctName(paramsJSON.getStr("acctName"));
req.setAcctName(paramsJSON.getStr("licenseName"));
req.setAcctTypeCode(paramsJSON.getStr("acctTypeCode"));
req.setAcctCertificateType(paramsJSON.getStr("acctCertificateType"));
req.setAcctCertificateNo(paramsJSON.getStr("acctCertificateNo"));
@ -1109,10 +1109,12 @@ public class LakalaApiServiceImpl implements LakalaApiService {
try {
String fileBase64 = UploadUtil.fileUrlToBase64(fileUrl);
String fileExt = StringUtils.getFileExt(fileUrl);
fileExt = StrUtil.isBlank(fileExt) ? "jpg" : fileExt;
JSONObject uploadResponse = uploadFile(
StringUtils.genLklOrderNo(8),
attachType,
StringUtils.getFileExt(fileName),
fileExt,
fileBase64
);

View File

@ -357,12 +357,10 @@ public class LklTkServiceImpl {
Boolean isQy = CommonConstant.MCH_ENTITY_TYPE_QY.equals(shopMchEntry.getEntity_type());
reqJsonBody.put("merType", isQy ? "TP_MERCHANT" : "TP_PERSONAL");
reqJsonBody.put("longtude", shopMchEntry.getStore_longitude()); //longitude 经度
reqJsonBody.put("latitude", shopMchEntry.getStore_latitude());
reqJsonBody.put("source", "H5");
reqJsonBody.put("larIdType", "01"); // 01 身份证 02 护照03 港澳通行证04 台胞证10 外国人永久居留身份证11 港妨澳居民居住证12 台湾居民居住证13 执行事务合伙人99 其它证件
String larName = isQy ? shopMchEntry.getLegal_person_name() : shopMchEntry.getContact_name();
String larIdCard = isQy ? shopMchEntry.getLegal_person_id_number() : shopMchEntry.getIndividual_id_number();
@ -401,12 +399,12 @@ public class LklTkServiceImpl {
reqJsonBody.put("accountName", shopMchEntry.getAccount_holder_name()); //结算人账户名称
reqJsonBody.put("accountIdCard", larIdCard);//结算法人或小微个人证件号码(身份证)
Integer SettlementMethod = shopMchEntry.getSettlement_method();
if (SettlementMethod == null || SettlementMethod < 0 || SettlementMethod > 1) {
SettlementMethod = 0; // 结算类型 0-秒到1-次日结算
}
String settleType = String.format("D%d", SettlementMethod);
reqJsonBody.put("settleType", settleType); //结算类型D0秒到D1次日结算
// Integer SettlementMethod = shopMchEntry.getSettlement_method();
// if (SettlementMethod == null || SettlementMethod < 0 || SettlementMethod > 1) {
// SettlementMethod = 1; // 结算类型0-秒到不分账1-次日结算需要分账
// }
String settleType = String.format("D%d", 1);
reqJsonBody.put("settleType", settleType); //结算类型0-秒到不分账1-次日结算需要分账
// formData.put("settlementType", "AUTOMATIC"); // 结算方式MANUAL:手动结算(结算至拉卡拉APP钱包),AUTOMATIC:自动结算到银行卡,REGULAR:定时结算仅企业商户支持
// 店铺省市区信息
@ -531,7 +529,7 @@ public class LklTkServiceImpl {
String errMsg = response.getStr("retMsg") == null ? "拉卡拉发生未知错误" : response.getStr("retMsg");
shopMchEntryService.updateMerchEntryApprovalByMchId(shopMchEntry.getId(), CommonConstant.MCH_APPR_STA_LKL_NOPASS, "进件失败:" + errMsg);
return Pair.of(false, "提交进件失败:" + errMsg);
}
// {"merchantNo": "100132349","status": "WAIT_AUDI","state": "1"}

View File

@ -116,6 +116,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
try {
// 1. 验证必要参数
if (CheckUtil.isEmpty(storeId) || StringUtils.isAnyBlank(shopName, shopAddress, contactName, contactPhone)) {
logger.error("创建顺丰店铺缺少必要参数storeId:{},shopName:{},shopAddress:{},contactName:{},contactPhone:{}", storeId, shopName, shopAddress, contactName, contactPhone);
return Pair.of(false, "创建顺丰店铺,缺少必要参数!");
}
@ -127,7 +128,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
// 如果没有商家配送运费设置则初始化
Pair<Boolean, String> initResult = shopStoreSameCityTransportBaseService.initDefaultSameCityTransport(storeId);
if (!initResult.getFirst()) {
logger.error("初始化商家配送运费设置失败");
logger.error("初始化商家配送运费设置失败{}", initResult.getSecond());
return initResult;
}
transportBase = shopStoreSameCityTransportBaseService.getShopStoreSameCityTransportBaseById(Long.valueOf(storeId));

View File

@ -778,11 +778,11 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
// 转换拉卡拉的日期格式 yyyy-MM-dd
record = convLklDateFormat(record);
if (record.getSettlement_method() == null
|| record.getSettlement_method() < 0
|| record.getSettlement_method() > 1) {
record.setSettlement_method(0); // 结算类型0-秒到1-次日结算
}
// if (record.getSettlement_method() == null
// || record.getSettlement_method() < 0
// || record.getSettlement_method() > 1) {
record.setSettlement_method(1); // 结算类型0-秒到不分账1-次日结算需要分账
// }
// 执行更新操作
if (!updateById(record)) {

View File

@ -3094,10 +3094,11 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
return Pair.of(0, "该商家申请人手机未注册账号!");
}
if (isExistsByStoreName(shopMchEntry.getStore_name())) {
logger.error("生成店铺:店铺名称已存在");
return Pair.of(0, "店铺名称已存在,请使用另一名称");
}
// 入驻时已经检查过店铺名称了此处忽略
// if (isExistsByStoreName(shopMchEntry.getStore_name())) {
// logger.error("生成店铺:店铺名称已存在");
// return Pair.of(0, "店铺名称已存在,请使用另一名称");
// }
// 校验店铺状态
if (CommonConstant.Enable.equals(shopMchEntry.getStore_status())) {

View File

@ -36,6 +36,7 @@ import com.suisung.mall.shop.store.mapper.ShopStoreSameCityTransportBaseMapper;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService;
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -52,6 +53,7 @@ import java.util.List;
import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser;
@Slf4j
@Lazy
@Service
public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<ShopStoreSameCityTransportBaseMapper, ShopStoreSameCityTransportBase> implements ShopStoreSameCityTransportBaseService {
@ -362,30 +364,36 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
try {
// 校验店铺ID
if (storeId == null || storeId <= 0) {
log.error("初始化店铺默认配置缺少店铺Id必要参数");
return Pair.of(false, "缺少店铺Id必要参数");
}
// 获取预设配置
String sameCityDeliverySetting = accountBaseConfigService.getConfig("same_city_delivery_setting", "");
if (StrUtil.isBlank(sameCityDeliverySetting)) {
return Pair.of(false, "缺少同城配送预设设置");
return Pair.of(false, "缺少同城配送预设设置,请先配置好");
}
logger.info("同城配送预设设置:{}", sameCityDeliverySetting);
// 转换为 DTO 对象
ShopStoreSameCityTransportBaseDTO transportDTO = JSONUtil.toBean(sameCityDeliverySetting, ShopStoreSameCityTransportBaseDTO.class);
if (transportDTO == null) {
return Pair.of(false, "同城配送预设设置格式错误!");
log.error("初始化店铺默认配置:同城配送预设设置数据格式错误!");
return Pair.of(false, "同城配送预设设置数据格式错误!");
}
// 查询店铺信息
ShopStoreBase storeBase = shopStoreBaseService.get(storeId);
if (storeBase == null) {
log.error("初始化店铺默认配置:店铺不存在!");
return Pair.of(false, "店铺不存在!");
}
// 设置基础配送信息
ShopStoreSameCityTransportBase transportBase = transportDTO.getTransportBase();
if (transportBase == null) {
log.error("初始化店铺默认配置:缺少同城配送基础设置!");
return Pair.of(false, "缺少同城配送基础设置!");
}
@ -398,6 +406,7 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
Pair<Long, String> saveOrUpdateResult = saveOrUpdateShopStoreSameCityTransportBase(transportBase);
Long transportBaseId = saveOrUpdateResult.getFirst();
if (transportBaseId == null || transportBaseId <= 0) {
log.error("初始化店铺默认配置:新增同城配送基础设置失败!");
return Pair.of(false, saveOrUpdateResult.getSecond());
}
@ -409,7 +418,8 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
// 保存扩展配送信息
int count = shopStoreSameCityTransportService.saveOrUpdateShopStoreSameCityTransportList(transportDTO.getTransportList());
if (count <= 0) {
return Pair.of(false, "保存同城配送设置部分失败!");
log.error("初始化店铺默认配置:保存同城配送设置扩展配送信息失败!更新数:{}", count);
// return Pair.of(false, "保存同城配送设置扩展配送信息失败!");
}
return Pair.of(true, "初始化成功");

View File

@ -16,6 +16,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.modules.store.ShopStoreSameCityTransport;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.store.mapper.ShopStoreSameCityTransportMapper;
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportService;
@ -102,9 +103,8 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
int count = 0;
for (ShopStoreSameCityTransport transport : transportList) {
try {
if (transport == null ||
transport.getTransport_base_id() == null || transport.getTransport_base_id() <= 0 ||
transport.getStore_id() == null || transport.getStore_id() <= 0) {
if (transport == null || CheckUtil.isEmpty(transport.getTransport_base_id()) ||
CheckUtil.isEmpty(transport.getStore_id())) {
logger.error("缺少 transport_base_id 或 store_id 必要参数!");
continue;
}
@ -114,22 +114,25 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
transport.setArea_type(1); // 业务分类1-圆半径2-多边形
}
if (transport.getMax_delivery_radius() == null || transport.getMax_delivery_radius() <= 0) {
if (CheckUtil.isEmpty(transport.getMax_delivery_radius())) {
logger.error("缺少配送范围,忽略保存!");
continue;
// continue;
transport.setMax_delivery_radius(5000); //配送范围半径
}
if (transport.getMin_delivery_amount_type() == null && transport.getMin_delivery_amount() != null) {
transport.setMin_delivery_amount_type(CommonConstant.Delivery_Amount_Comput_Type_Payment); //起送金额依据1-订单原价2-订单折扣价3-订单实付金额
transport.setMin_delivery_amount(BigDecimal.ZERO);
}
if ((transport.getDelivery_discount_type() == null || transport.getMin_delivery_discount_amount() == null)
&& transport.getDelivery_discount() != null) {
transport.setDelivery_discount_type(CommonConstant.Delivery_Amount_Comput_Type_Payment);//起送金额依据1-订单原价2-订单折扣价3-订单实付金额
transport.setDelivery_discount(BigDecimal.ZERO);
}
// 新增或更新
if (transport.getTransport_id() == null || transport.getTransport_id() <= 0) {
if (CheckUtil.isEmpty(transport.getTransport_id())) {
if (save(transport)) {
count++;
}
@ -139,7 +142,7 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
}
}
} catch (Exception e) {
logger.error("处理单条运信息失败: ", e);
logger.error("处理单条运费配置信息失败: ", e);
}
}