定时任务 瘦身
This commit is contained in:
parent
7a96cc7ae4
commit
28478ef8c8
@ -1,119 +0,0 @@
|
||||
/**
|
||||
* 确认收货处理
|
||||
* @param order_ids 订单ID列表
|
||||
* @param order_rows 订单数据列表
|
||||
* @return 是否处理成功
|
||||
*/
|
||||
public boolean receive(List<String> order_ids, List<ShopOrderBase> order_rows) {
|
||||
// 检测数据是否合法,过滤允许修改的数据
|
||||
if (CollUtil.isEmpty(order_ids)) {
|
||||
throw new ApiException(I18nUtil._("请选择需要确认收货的订单!"));
|
||||
}
|
||||
|
||||
if (CollUtil.isEmpty(order_rows)) {
|
||||
order_rows = gets(order_ids);
|
||||
}
|
||||
|
||||
List<String> receive_id_row = new ArrayList<>();
|
||||
|
||||
for (ShopOrderBase order_row : order_rows) {
|
||||
// 判断订单是否可以确认收货
|
||||
if (ifReceive(order_row.getOrder_state_id())) {
|
||||
receive_id_row.add(order_row.getOrder_id());
|
||||
|
||||
// 增加积分和经验
|
||||
// todo 目前付款支付积分,此处为收货后发放
|
||||
Integer user_id = order_row.getBuyer_user_id();
|
||||
String order_id = order_row.getOrder_id();
|
||||
Integer store_id = order_row.getStore_id();
|
||||
|
||||
ShopOrderData order_data_row = shopOrderDataService.get(order_id);
|
||||
BigDecimal order_points_add = order_data_row.getOrder_points_add();
|
||||
|
||||
BigDecimal order_points_add_all = order_points_add.add(order_data_row.getOrder_double_points_add());
|
||||
|
||||
// 发放购物积分
|
||||
if (CheckUtil.isNotEmpty(order_points_add_all)) {
|
||||
String desc = String.format(I18nUtil._("购物获取积分 %s,订单号 %s"), order_points_add_all, order_id);
|
||||
if (!payService.points(user_id, order_points_add_all, PointsType.POINTS_TYPE_CONSUME, desc, store_id, null, order_id)) {
|
||||
throw new ApiException(I18nUtil._("积分操作失败!"));
|
||||
}
|
||||
}
|
||||
|
||||
// todo 根据送花郎插件是否开启显示是否需要分钱给不同商户
|
||||
/*
|
||||
boolean hall_enable = accountBaseConfigService.getConfig("hall_enable", false);
|
||||
if (hall_enable) {
|
||||
BigDecimal order_commission_fee = order_data_row.getOrder_commission_fee();
|
||||
sendMoneyForTransfer(order_row, order_commission_fee);
|
||||
}
|
||||
*/
|
||||
|
||||
// 分销功能处理
|
||||
String fx_settle_type = accountBaseConfigService.getConfig("fx_settle_type", "receive");
|
||||
if (StrUtil.equals(fx_settle_type, "receive")) {
|
||||
// todo settleDistributionUserOrder
|
||||
shopDistributionUserOrderService.settleDistributionUserOrder(order_id);
|
||||
}
|
||||
|
||||
// 重要:拉卡拉给平台和代理商分账
|
||||
Pair<Boolean, String> retOrderSeparateRet = lakalaApiService.innerDoOrderSeparate(order_row.getOrder_id(), Convert.toStr(order_row.getStore_id()));
|
||||
if (!retOrderSeparateRet.getFirst()) {
|
||||
throw new ApiException(I18nUtil._("平台或代理商分账失败: " + retOrderSeparateRet.getSecond()));
|
||||
}
|
||||
|
||||
// 统计总营业额
|
||||
ShopStoreAnalytics analytics_row = shopStoreAnalyticsService.get(store_id);
|
||||
BigDecimal order_payment_amount = order_row.getOrder_payment_amount();
|
||||
analytics_row.setStore_trade_amount(NumberUtil.add(analytics_row.getStore_trade_amount(), order_payment_amount));
|
||||
if (!shopStoreAnalyticsService.edit(analytics_row)) {
|
||||
throw new ApiException(ResultCode.FAILED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否有符合条件的订单
|
||||
if (CollUtil.isEmpty(receive_id_row)) {
|
||||
throw new ApiException(I18nUtil._("无符合确认收货条件的订单!"));
|
||||
}
|
||||
|
||||
// 修改订单状态, 随机去一个订单获取店铺编号
|
||||
ShopOrderBase shopOrderBase = order_rows.get(0);
|
||||
Integer store_id = shopOrderBase.getStore_id();
|
||||
editNextState(receive_id_row, store_id, StateCode.ORDER_STATE_SHIPPED, order_rows, 0);
|
||||
|
||||
// 如果是商家,且启用供应商,则商家看到供应商店铺商品 store_type = 2
|
||||
boolean ifSupplierMarket = accountBaseConfigService.ifSupplierMarket();
|
||||
UserDto user = getCurrentUser();
|
||||
store_id = user != null ? Convert.toInt(user.getStore_id(), 0) : 0;
|
||||
|
||||
// 处理供应商市场的库存增加逻辑
|
||||
if (ifSupplierMarket && CheckUtil.isNotEmpty(store_id)) {
|
||||
// 供应商商品,增加商家库存
|
||||
QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>();
|
||||
itemQueryWrapper.in("order_id", receive_id_row);
|
||||
List<ShopOrderItem> order_item_rows = shopOrderItemService.find(itemQueryWrapper);
|
||||
|
||||
List<Long> item_src_ids = order_item_rows.stream().map(ShopOrderItem::getItem_id).distinct().collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(item_src_ids)) {
|
||||
QueryWrapper<ShopProductItem> productItemQueryWrapper = new QueryWrapper<>();
|
||||
productItemQueryWrapper.in("item_src_id", item_src_ids).eq("store_id", store_id);
|
||||
List<ShopProductItem> product_item_rows = shopProductItemService.find(productItemQueryWrapper);
|
||||
|
||||
// 更新供应商商品库存
|
||||
for (ShopProductItem product_item_row : product_item_rows) {
|
||||
String item_src_id = product_item_row.getItem_src_id();
|
||||
Optional<ShopOrderItem> orderItemOpl = order_item_rows.stream().filter(s -> ObjectUtil.equal(s.getItem_id(), item_src_id)).findFirst();
|
||||
if (orderItemOpl.isPresent()) {
|
||||
ShopOrderItem shopOrderItem = orderItemOpl.get();
|
||||
Integer order_item_quantity = shopOrderItem.getOrder_item_quantity();
|
||||
product_item_row.setItem_quantity(product_item_row.getItem_quantity() + order_item_quantity);
|
||||
if (!shopProductItemService.edit(product_item_row)) {
|
||||
throw new ApiException(ResultCode.FAILED);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -352,39 +352,37 @@ public class ShopBaseDistrictServiceImpl extends BaseServiceImpl<ShopBaseDistric
|
||||
*/
|
||||
@Override
|
||||
public String[] convertDistrictPath(String areaIds, String areaNames) {
|
||||
// 参数校验:至少一个参数不能为空
|
||||
if (StrUtil.isBlank(areaIds) && StrUtil.isBlank(areaNames)) {
|
||||
log.warn("[地区转换] 参数校验失败:areaIds和areaNames不能同时为空");
|
||||
return new String[]{"", ""};
|
||||
}
|
||||
// 初始化返回结果
|
||||
String resultAreaIds = "";
|
||||
String resultAreaNames = "";
|
||||
|
||||
try {
|
||||
String resultAreaIds = areaIds;
|
||||
String resultAreaNames = areaNames;
|
||||
|
||||
// 如果两个参数都有值,直接返回原始值
|
||||
if (StrUtil.isNotBlank(areaIds) && StrUtil.isNotBlank(areaNames)) {
|
||||
log.debug("[地区转换] 两个参数都有值,直接返回原始值: areaIds={}, areaNames={}", areaIds, areaNames);
|
||||
return new String[]{resultAreaIds, resultAreaNames};
|
||||
return new String[]{areaIds, areaNames};
|
||||
}
|
||||
|
||||
// 如果只有areaIds不为空,根据ID路径获取名称路径
|
||||
if (StrUtil.isNotBlank(areaIds)) {
|
||||
log.debug("[地区转换] 根据ID路径获取名称路径: {}", areaIds);
|
||||
resultAreaNames = getDistrictNamePathByIdPath(areaIds);
|
||||
resultAreaIds = areaIds;
|
||||
}
|
||||
|
||||
// 如果只有areaNames不为空,根据名称路径获取ID路径
|
||||
if (StrUtil.isNotBlank(areaNames)) {
|
||||
log.debug("[地区转换] 根据名称路径获取ID路径: {}", areaNames);
|
||||
resultAreaIds = getDistrictIdPathByNamePath(areaNames);
|
||||
resultAreaNames = areaNames;
|
||||
}
|
||||
|
||||
return new String[]{resultAreaIds, resultAreaNames};
|
||||
} catch (Exception e) {
|
||||
log.error("[地区转换] 转换过程中发生异常", e);
|
||||
return new String[]{"", ""};
|
||||
// 发生异常时,保持初始化的空字符串值
|
||||
}
|
||||
|
||||
// 始终返回包含两个元素的数组
|
||||
return new String[]{resultAreaIds, resultAreaNames};
|
||||
}
|
||||
|
||||
|
||||
@ -403,36 +401,30 @@ public class ShopBaseDistrictServiceImpl extends BaseServiceImpl<ShopBaseDistric
|
||||
|
||||
String[] idStrs = districtIdPath.split("/");
|
||||
List<String> names = new ArrayList<>(idStrs.length);
|
||||
List<ShopBaseDistrict> districts = new ArrayList<>(idStrs.length);
|
||||
|
||||
// 先获取所有地区对象
|
||||
// 先获取所有地区对象的名称
|
||||
for (String idStr : idStrs) {
|
||||
Integer districtId = Convert.toInt(idStr);
|
||||
if (districtId == null) {
|
||||
log.warn("[地区转换] ID格式不正确: {}", idStr);
|
||||
return "";
|
||||
names.add(""); // 添加空字符串而不是直接返回
|
||||
continue; // 继续处理下一个
|
||||
}
|
||||
|
||||
ShopBaseDistrict district = get(districtId);
|
||||
if (district == null) {
|
||||
log.warn("[地区转换] 未找到对应地区信息, districtId: {}", districtId);
|
||||
return "";
|
||||
names.add(""); // 添加空字符串而不是直接返回
|
||||
continue; // 继续处理下一个
|
||||
}
|
||||
|
||||
districts.add(district);
|
||||
}
|
||||
|
||||
// 按照层级关系重新排序
|
||||
List<ShopBaseDistrict> sortedDistricts = sortDistrictsByHierarchy(districts);
|
||||
|
||||
// 提取名称
|
||||
for (ShopBaseDistrict district : sortedDistricts) {
|
||||
names.add(district.getDistrict_name());
|
||||
}
|
||||
|
||||
return String.join("/", names);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据省市区名称路径获取对应的ID路径
|
||||
* 例如:广西壮族自治区/贵港市/桂平市 -> 450000/450800/450881
|
||||
@ -447,13 +439,14 @@ public class ShopBaseDistrictServiceImpl extends BaseServiceImpl<ShopBaseDistric
|
||||
}
|
||||
|
||||
String[] names = districtNamePath.split("/");
|
||||
List<ShopBaseDistrict> districts = new ArrayList<>(names.length);
|
||||
List<String> ids = new ArrayList<>(names.length);
|
||||
|
||||
// 先根据名称获取所有地区对象(不考虑顺序)
|
||||
// 先根据名称获取所有地区对象的ID
|
||||
for (String name : names) {
|
||||
if (StrUtil.isBlank(name)) {
|
||||
log.warn("[地区转换] 名称不能为空");
|
||||
return "";
|
||||
ids.add(""); // 添加空字符串而不是直接返回
|
||||
continue; // 继续处理下一个
|
||||
}
|
||||
|
||||
QueryWrapper<ShopBaseDistrict> queryWrapper = new QueryWrapper<>();
|
||||
@ -462,82 +455,15 @@ public class ShopBaseDistrictServiceImpl extends BaseServiceImpl<ShopBaseDistric
|
||||
ShopBaseDistrict district = findOne(queryWrapper);
|
||||
if (district == null) {
|
||||
log.warn("[地区转换] 未找到对应地区信息, name: {}", name);
|
||||
return "";
|
||||
ids.add(""); // 添加空字符串而不是直接返回
|
||||
continue; // 继续处理下一个
|
||||
}
|
||||
|
||||
districts.add(district);
|
||||
}
|
||||
|
||||
// 按照层级关系重新排序
|
||||
List<ShopBaseDistrict> sortedDistricts = sortDistrictsByHierarchy(districts);
|
||||
|
||||
// 提取ID
|
||||
List<String> ids = new ArrayList<>(sortedDistricts.size());
|
||||
for (ShopBaseDistrict district : sortedDistricts) {
|
||||
ids.add(district.getDistrict_id().toString());
|
||||
}
|
||||
|
||||
return String.join("/", ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据层级关系对地区进行排序
|
||||
*
|
||||
* @param districts 地区列表
|
||||
* @return 按层级排序后的地区列表
|
||||
*/
|
||||
private List<ShopBaseDistrict> sortDistrictsByHierarchy(List<ShopBaseDistrict> districts) {
|
||||
if (districts.size() <= 1) {
|
||||
return districts;
|
||||
}
|
||||
|
||||
// 构建ID到地区的映射
|
||||
Map<Integer, ShopBaseDistrict> districtMap = new HashMap<>();
|
||||
for (ShopBaseDistrict district : districts) {
|
||||
districtMap.put(district.getDistrict_id(), district);
|
||||
}
|
||||
|
||||
// 构建层级关系
|
||||
List<ShopBaseDistrict> result = new ArrayList<>(districts.size());
|
||||
Set<Integer> processedIds = new HashSet<>();
|
||||
|
||||
// 找到最顶级的地区(parent_id为0或者parent不在列表中的)
|
||||
for (ShopBaseDistrict district : districts) {
|
||||
if (district.getDistrict_parent_id() == 0 || !districtMap.containsKey(district.getDistrict_parent_id())) {
|
||||
result.add(district);
|
||||
processedIds.add(district.getDistrict_id());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 逐级查找子地区
|
||||
while (result.size() < districts.size()) {
|
||||
ShopBaseDistrict lastDistrict = result.get(result.size() - 1);
|
||||
boolean found = false;
|
||||
|
||||
for (ShopBaseDistrict district : districts) {
|
||||
if (!processedIds.contains(district.getDistrict_id()) &&
|
||||
district.getDistrict_parent_id().equals(lastDistrict.getDistrict_id())) {
|
||||
result.add(district);
|
||||
processedIds.add(district.getDistrict_id());
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 如果找不到下一级,则添加剩余未处理的地区
|
||||
if (!found) {
|
||||
for (ShopBaseDistrict district : districts) {
|
||||
if (!processedIds.contains(district.getDistrict_id())) {
|
||||
result.add(district);
|
||||
processedIds.add(district.getDistrict_id());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -29,32 +29,31 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
*/
|
||||
@Override
|
||||
public void addJob(String jName, String jGroup, String tName, String tGroup, String cron, String cName) {
|
||||
logger.info("[Quartz] 开始添加定时任务: 任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}, cron表达式={}, 类名={}",
|
||||
jName, jGroup, tName, tGroup, cron, cName);
|
||||
logger.info("[Quartz] 添加定时任务: 任务名称={}, cron表达式={}", jName, cron);
|
||||
|
||||
// 1. 参数校验
|
||||
if (jName == null || jName.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] 任务名称不能为空: {}", jName);
|
||||
logger.warn("[Quartz] 任务名称不能为空");
|
||||
throw new ApiException(I18nUtil._("任务名称不能为空!"));
|
||||
}
|
||||
if (jGroup == null || jGroup.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] 任务组不能为空: {}", jGroup);
|
||||
logger.warn("[Quartz] 任务组不能为空");
|
||||
throw new ApiException(I18nUtil._("任务组不能为空!"));
|
||||
}
|
||||
if (tName == null || tName.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] 触发器名称不能为空: {}", tName);
|
||||
logger.warn("[Quartz] 触发器名称不能为空");
|
||||
throw new ApiException(I18nUtil._("触发器名称不能为空!"));
|
||||
}
|
||||
if (tGroup == null || tGroup.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] 触发器组不能为空: {}", tGroup);
|
||||
logger.warn("[Quartz] 触发器组不能为空");
|
||||
throw new ApiException(I18nUtil._("触发器组不能为空!"));
|
||||
}
|
||||
if (cron == null || cron.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] cron表达式不能为空: {}", cron);
|
||||
logger.warn("[Quartz] cron表达式不能为空");
|
||||
throw new ApiException(I18nUtil._("cron表达式不能为空!"));
|
||||
}
|
||||
if (cName == null || cName.trim().isEmpty()) {
|
||||
logger.warn("[Quartz] 任务实现类名称不能为空: {}", cName);
|
||||
logger.warn("[Quartz] 任务实现类名称不能为空");
|
||||
throw new ApiException(I18nUtil._("任务实现类名称不能为空!"));
|
||||
}
|
||||
|
||||
@ -63,9 +62,7 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
Class<Job> clazz;
|
||||
|
||||
String fullClassName = PATH_PREFIX + cName;
|
||||
logger.debug("[Quartz] 尝试加载任务类: {}", fullClassName);
|
||||
clazz = (Class<Job>) Class.forName(fullClassName);
|
||||
logger.debug("[Quartz] 成功加载任务类: {}", fullClassName);
|
||||
|
||||
// 3. 构建任务详情和触发器
|
||||
JobKey jobKey = new JobKey(jName, jGroup);
|
||||
@ -77,52 +74,38 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
CronTrigger trigger = TriggerBuilder.newTrigger()
|
||||
.withIdentity(triggerKey)
|
||||
.startNow()
|
||||
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
|
||||
.withSchedule(CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing())
|
||||
.build();
|
||||
|
||||
logger.debug("[Quartz] 构建任务详情和触发器完成: jobKey={}, triggerKey={}", jobKey, triggerKey);
|
||||
|
||||
// 打印最终执行的 cron 表达式
|
||||
logger.info("[Quartz] 定时任务最终执行表达式: {}", trigger.getCronExpression());
|
||||
|
||||
// 4. 检查任务是否已存在
|
||||
if (scheduler.checkExists(jobKey)) {
|
||||
logger.info("[Quartz] 任务已存在,先删除旧任务: jobKey={}", jobKey);
|
||||
logger.info("[Quartz] 任务已存在,先删除旧任务: {}", jName);
|
||||
scheduler.deleteJob(jobKey);
|
||||
}
|
||||
|
||||
// 5. 调度任务
|
||||
logger.info("[Quartz] 开始调度任务: jobKey={}, triggerKey={}", jobKey, triggerKey);
|
||||
scheduler.scheduleJob(jobDetail, trigger);
|
||||
logger.info("[Quartz] 任务调度成功: jobKey={}, triggerKey={}", jobKey, triggerKey);
|
||||
logger.info("[Quartz] 任务调度成功: {}", jName);
|
||||
|
||||
// 6. 启动调度器(如果尚未启动)
|
||||
if (!scheduler.isStarted()) {
|
||||
logger.info("[Quartz] 调度器尚未启动,正在启动...");
|
||||
scheduler.start();
|
||||
logger.info("[Quartz] 调度器启动成功");
|
||||
}
|
||||
|
||||
|
||||
// 只在异常状态时记录详细信息
|
||||
if (scheduler.getTriggerState(triggerKey) != Trigger.TriggerState.NORMAL) {
|
||||
logger.error("Trigger注册异常,当前状态: {}", scheduler.getTriggerState(triggerKey));
|
||||
logger.error("[Quartz] Trigger注册异常,当前状态: {}", scheduler.getTriggerState(triggerKey));
|
||||
}
|
||||
|
||||
logger.info("Trigger当前状态: {}", scheduler.getTriggerState(triggerKey));
|
||||
|
||||
// 在调度器启动检查前添加
|
||||
logger.debug("[Quartz] 调度器当前状态 - isStarted: {}, SchedulerName: {}",
|
||||
scheduler.isStarted(), scheduler.getSchedulerName());
|
||||
|
||||
} catch (SchedulerException e) {
|
||||
logger.error("[Quartz] 添加定时任务失败!任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}",
|
||||
jName, jGroup, tName, tGroup, e);
|
||||
logger.error("[Quartz] 添加定时任务失败!任务名称={}", jName, 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);
|
||||
logger.error("[Quartz] 添加定时任务时发生未知异常!任务名称={}", jName, e);
|
||||
throw new ApiException(I18nUtil._("添加定时任务失败!"), e);
|
||||
}
|
||||
}
|
||||
@ -140,23 +123,22 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
*/
|
||||
public boolean addOrUpdateJobFromDatabase(String jobName, String jobGroup, String triggerName,
|
||||
String triggerGroup, String dbCron, String dbJobClass) {
|
||||
logger.info("[Quartz] 尝试从数据库信息添加或更新任务: 任务名称={}, 任务组={}", jobName, jobGroup);
|
||||
|
||||
logger.info("[Quartz] 添加或更新任务: {}", jobName);
|
||||
|
||||
try {
|
||||
JobKey jobKey = new JobKey(jobName, jobGroup);
|
||||
|
||||
// 检查任务是否已存在
|
||||
if (scheduler.checkExists(jobKey)) {
|
||||
logger.debug("[Quartz] 任务已存在于调度器中: jobKey={}", jobKey);
|
||||
return true; // 任务已存在,无需添加
|
||||
}
|
||||
|
||||
// 任务不存在,从数据库信息创建新任务
|
||||
logger.info("[Quartz] 调度器中不存在任务,从数据库信息创建: jobKey={}", jobKey);
|
||||
addJob(jobName, jobGroup, triggerName, triggerGroup, dbCron, dbJobClass);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
logger.error("[Quartz] 从数据库信息添加或更新任务失败: 任务名称={}, 任务组={}", jobName, jobGroup, e);
|
||||
logger.error("[Quartz] 添加或更新任务失败: {}", jobName, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -170,24 +152,22 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
*/
|
||||
@Override
|
||||
public void pauseJob(String jName, String jGroup) {
|
||||
logger.info("[Quartz] 开始暂停定时任务: 任务名称={}, 任务组={}", jName, jGroup);
|
||||
|
||||
logger.info("[Quartz] 暂停定时任务: {}", jName);
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jName, jGroup);
|
||||
|
||||
// 检查任务是否存在,不存在则记录日志并返回,不抛出异常
|
||||
if (!scheduler.checkExists(jobKey)) {
|
||||
logger.info("[Quartz] 任务不存在,无需暂停: jobKey={},可能任务已手动删除或尚未创建", jobKey);
|
||||
return;
|
||||
}
|
||||
|
||||
scheduler.pauseJob(jobKey);
|
||||
logger.info("[Quartz] 定时任务暂停成功: jobKey={}", jobKey);
|
||||
logger.info("[Quartz] 定时任务暂停成功: {}", jName);
|
||||
} catch (SchedulerException e) {
|
||||
logger.error("[Quartz] 暂停定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使暂停失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 暂停定时任务时发生调度异常!任务名称={}", jName, e);
|
||||
} catch (Exception e) {
|
||||
logger.error("[Quartz] 暂停定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使暂停失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 暂停定时任务时发生未知异常!任务名称={}", jName, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,24 +179,22 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
*/
|
||||
@Override
|
||||
public void resumeJob(String jName, String jGroup) {
|
||||
logger.info("[Quartz] 开始继续定时任务: 任务名称={}, 任务组={}", jName, jGroup);
|
||||
|
||||
logger.info("[Quartz] 继续定时任务: {}", jName);
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jName, jGroup);
|
||||
|
||||
// 检查任务是否存在,不存在则记录日志并返回,不抛出异常
|
||||
if (!scheduler.checkExists(jobKey)) {
|
||||
logger.info("[Quartz] 任务不存在,无需继续: jobKey={},可能任务已手动删除或尚未创建", jobKey);
|
||||
return;
|
||||
}
|
||||
|
||||
scheduler.resumeJob(jobKey);
|
||||
logger.info("[Quartz] 定时任务继续成功: jobKey={}", jobKey);
|
||||
logger.info("[Quartz] 定时任务继续成功: {}", jName);
|
||||
} catch (SchedulerException e) {
|
||||
logger.error("[Quartz] 继续定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使继续失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 继续定时任务时发生调度异常!任务名称={}", jName, e);
|
||||
} catch (Exception e) {
|
||||
logger.error("[Quartz] 继续定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使继续失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 继续定时任务时发生未知异常!任务名称={}", jName, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -228,30 +206,25 @@ public class QuartzServiceImpl implements QuartzService {
|
||||
*/
|
||||
@Override
|
||||
public void deleteJob(String jName, String jGroup) {
|
||||
logger.info("[Quartz] 开始删除定时任务: 任务名称={}, 任务组={}", jName, jGroup);
|
||||
logger.info("[Quartz] 删除定时任务: {}", jName);
|
||||
try {
|
||||
JobKey jobKey = JobKey.jobKey(jName, jGroup);
|
||||
|
||||
// 检查任务是否存在,不存在则记录日志并返回,不抛出异常
|
||||
if (!scheduler.checkExists(jobKey)) {
|
||||
logger.info("[Quartz] 任务不存在,无需删除: jobKey={},可能任务已手动删除或尚未创建", jobKey);
|
||||
return;
|
||||
}
|
||||
|
||||
boolean deleted = scheduler.deleteJob(jobKey);
|
||||
if (deleted) {
|
||||
logger.info("[Quartz] 定时任务删除成功: jobKey={}", jobKey);
|
||||
logger.info("[Quartz] 定时任务删除成功: {}", jName);
|
||||
} else {
|
||||
logger.warn("[Quartz] 定时任务删除失败: jobKey={}", jobKey);
|
||||
logger.warn("[Quartz] 定时任务删除失败: {}", jName);
|
||||
}
|
||||
} catch (SchedulerException e) {
|
||||
logger.error("[Quartz] 删除定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使删除失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 删除定时任务时发生调度异常!任务名称={}", jName, e);
|
||||
} catch (Exception e) {
|
||||
logger.error("[Quartz] 删除定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e);
|
||||
// 即使删除失败也继续执行,避免阻塞业务流程
|
||||
logger.error("[Quartz] 删除定时任务时发生未知异常!任务名称={}", jName, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.suisung.mall.common.api.CommonResult;
|
||||
import com.suisung.mall.common.service.impl.BaseControllerImpl;
|
||||
import com.suisung.mall.shop.base.service.ShopBaseDistrictService;
|
||||
import com.suisung.mall.shop.lakala.service.LakalaApiService;
|
||||
import com.suisung.mall.shop.lakala.service.LklLedgerEcService;
|
||||
import com.suisung.mall.shop.library.service.LibraryProductService;
|
||||
@ -23,6 +24,7 @@ import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
|
||||
import com.suisung.mall.shop.store.service.ShopStoreSameCityTransportBaseService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@ -36,6 +38,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Api(tags = "拉卡拉相关接口 - 前端控制器")
|
||||
@RestController
|
||||
@RequestMapping("/mobile/shop/lakala")
|
||||
@ -80,6 +83,9 @@ public class LakalaController extends BaseControllerImpl {
|
||||
@Resource
|
||||
private LklLedgerEcService lklLedgerEcService;
|
||||
|
||||
@Resource
|
||||
private ShopBaseDistrictService shopBaseDistrictService;
|
||||
|
||||
@ApiOperation(value = "测试案例", notes = "测试案例")
|
||||
@RequestMapping(value = "/testcase", method = RequestMethod.POST)
|
||||
public Object testcase(@RequestBody JSONObject paramsJSON) {
|
||||
@ -118,7 +124,10 @@ public class LakalaController extends BaseControllerImpl {
|
||||
|
||||
// return lakalaApiService.sacsQuery("8226330541100GU", "20250918770188017227140800").toString();
|
||||
|
||||
return lakalaApiService.queryLedgerMer("8226330541100HA");
|
||||
String[] result = shopBaseDistrictService.convertDistrictPath(paramsJSON.getStr("id"), paramsJSON.getStr("name"));
|
||||
log.info("result: " + result[0] + " " + result[1]);
|
||||
|
||||
return ""; //lakalaApiService.queryLedgerMer("8226330541100HA");
|
||||
}
|
||||
|
||||
@ApiOperation(value = "批量发送推送消息 - 测试案例", notes = "批量发送推送消息 - 测试案例")
|
||||
|
||||
@ -357,4 +357,14 @@ public interface ShopMchEntryService {
|
||||
* @return 分账比例
|
||||
*/
|
||||
BigDecimal getMchEntryRatioOrDefault(Integer mch1stBizCategory, Integer mch2ndBizCategory, BigDecimal srcRatio, BigDecimal defaultRatio);
|
||||
|
||||
/**
|
||||
* 处理店铺省市区信息
|
||||
*
|
||||
* @param storeDistrict 店铺省市区ID路径
|
||||
* @param storeArea 店铺省市区名称路径
|
||||
* @param refStoreAddress 参考店铺地址(用于解析省市区信息)
|
||||
* @return 包含ID路径和名称路径的字符串数组,格式为 [ID路径, 名称路径]
|
||||
*/
|
||||
String[] handleStoreDistrictInfo(String storeDistrict, String storeArea, String refStoreAddress);
|
||||
}
|
||||
@ -29,10 +29,12 @@ 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.pojo.to.AddressParseResultTO;
|
||||
import com.suisung.mall.common.utils.*;
|
||||
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
|
||||
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
|
||||
import com.suisung.mall.shop.base.service.AccountBaseConfigService;
|
||||
import com.suisung.mall.shop.base.service.ShopBaseDistrictService;
|
||||
import com.suisung.mall.shop.base.service.ShopBaseStoreCategoryService;
|
||||
import com.suisung.mall.shop.esign.service.EsignPlatformInfoService;
|
||||
import com.suisung.mall.shop.lakala.service.LklLedgerEcService;
|
||||
@ -91,6 +93,9 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
|
||||
@Resource
|
||||
private AccountService accountService;
|
||||
|
||||
@Resource
|
||||
private ShopBaseDistrictService shopBaseDistrictService;
|
||||
|
||||
/**
|
||||
* 获取店铺的经营类目列表
|
||||
*
|
||||
@ -952,6 +957,12 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
|
||||
shopMchEntry.setSettlement_method(1); // 结算类型:0-秒到(不分账);1-次日结算(需要分账)
|
||||
shopMchEntry.setSplit_ratio(splitRatio);
|
||||
|
||||
// 店铺省市区处理
|
||||
String[] result = handleStoreDistrictInfo(shopMchEntry.getStore_district(), shopMchEntry.getStore_area(), shopMchEntry.getStore_address());
|
||||
if (result == null || result.length < 2 || StrUtil.isAllBlank(result[0], result[1])) {
|
||||
return CommonResult.failed("缺少店铺的省市区参数!");
|
||||
}
|
||||
|
||||
// 转换拉卡拉的日期格式 yyyy-MM-dd
|
||||
shopMchEntry = convLklDateFormat(shopMchEntry);
|
||||
|
||||
@ -975,39 +986,23 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
|
||||
log.debug("开始调用拉卡拉电子合同签署申请,mchId={}", mchId);
|
||||
Pair<Boolean, String> resultPair = lakalaApiService.applyLedgerMerEc(mchId);
|
||||
if (!resultPair.getFirst()) {
|
||||
log.warn("拉卡拉电子合同签署申请失败: {}", resultPair.getSecond());
|
||||
log.warn("拉卡拉入网电子合同提交失败: {}", resultPair.getSecond());
|
||||
return CommonResult.failed(resultPair.getSecond());
|
||||
}
|
||||
|
||||
// 执行更新操作
|
||||
if (!updateMerchEntryApprovalByMchId(shopMchEntry.getId(), null, "入网申请已提交!")) {
|
||||
log.error("系统处理审批出错,请联系管理员!当前记录ID: {}", mchId);
|
||||
log.error("系统处理审批出错,请联系管理员!当前入驻编号: {}", mchId);
|
||||
return CommonResult.failed("系统处理审批出错,请联系管理员!");
|
||||
}
|
||||
|
||||
log.info("商家入驻平台初步审批处理完成,mchId={}", mchId);
|
||||
|
||||
// E签宝暂时停止使用
|
||||
// if (approvalStatus.equals(CommonConstant.Enable)) {
|
||||
// // 多线程执行电子合同生成和填充
|
||||
// taskService.executeTask(() -> {
|
||||
// log.debug("###开始异步执行生成电子合同模版和填充模版数据,并生该商家和平台方签署的未盖章合同文件###");
|
||||
// // 生成电子合同模版和填充模版数据,并生该商家和平台方签署的未盖章合同文件
|
||||
// Boolean genSuccess = esignContractFillingFileService.fillDocTemplate(record.getLogin_mobile(), "");
|
||||
// if (!genSuccess) {
|
||||
// log.error("###商家入驻电子合同生成失败###");
|
||||
// }
|
||||
//
|
||||
// // 发短信通知商家,入驻申请已通过审核
|
||||
// });
|
||||
// }
|
||||
|
||||
return CommonResult.success();
|
||||
} catch (Exception e) {
|
||||
log.error("调用拉卡拉电子合同接口异常", e);
|
||||
return CommonResult.failed("调用拉卡拉服务失败,请稍后重试");
|
||||
}
|
||||
|
||||
return CommonResult.success();
|
||||
}
|
||||
|
||||
|
||||
@ -2470,6 +2465,57 @@ public class ShopMchEntryServiceImpl extends BaseServiceImpl<ShopMchEntryMapper,
|
||||
return srcRatio;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理店铺省市区信息
|
||||
*
|
||||
* @param storeDistrict 店铺省市区ID路径
|
||||
* @param storeArea 店铺省市区名称路径
|
||||
* @param refStoreAddress 参考店铺地址(用于解析省市区信息)
|
||||
* @return 包含ID路径和名称路径的字符串数组,格式为 [ID路径, 名称路径]
|
||||
*/
|
||||
@Override
|
||||
public String[] handleStoreDistrictInfo(String storeDistrict, String storeArea, String refStoreAddress) {
|
||||
// 当店铺省市区ID和名称都不为空时,直接返回
|
||||
if (StrUtil.isAllNotBlank(storeDistrict, storeArea)) {
|
||||
log.debug("省市区信息已完整,直接返回: ID路径={}, 名称路径={}", storeDistrict, storeArea);
|
||||
return new String[]{storeDistrict, storeArea};
|
||||
}
|
||||
|
||||
// 当店铺省市区ID和名称都为空时,尝试从地址中解析
|
||||
if (StrUtil.isAllBlank(storeDistrict, storeArea)) {
|
||||
if (StrUtil.isBlank(refStoreAddress)) {
|
||||
log.warn("缺少店铺的省市区参数且地址信息为空");
|
||||
return new String[]{"", ""};
|
||||
}
|
||||
|
||||
try {
|
||||
AddressParseResultTO addressParseResultTO = AddressUtil.parseAddress(refStoreAddress);
|
||||
if (addressParseResultTO == null || StrUtil.isBlank(addressParseResultTO.getJoinArea())) {
|
||||
log.warn("地址解析失败,无法获取省市区信息,地址: {}", refStoreAddress);
|
||||
return new String[]{"", ""};
|
||||
}
|
||||
|
||||
String[] result = shopBaseDistrictService.convertDistrictPath("", addressParseResultTO.getJoinArea());
|
||||
log.debug("通过地址解析获取省市区信息: {}", Arrays.toString(result));
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
log.error("地址解析异常,地址: {}", refStoreAddress, e);
|
||||
return new String[]{"", ""};
|
||||
}
|
||||
} else {
|
||||
// 当只有省市区ID或名称其中一个有值时,进行转换处理
|
||||
log.debug("省市区信息不完整,storeDistrict={}, storeArea={}", storeDistrict, storeArea);
|
||||
try {
|
||||
String[] result = shopBaseDistrictService.convertDistrictPath(storeDistrict, storeArea);
|
||||
log.debug("转换省市区信息结果: {}", Arrays.toString(result));
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
log.error("省市区信息转换异常,storeDistrict={}, storeArea={}", storeDistrict, storeArea, e);
|
||||
return new String[]{"", ""};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -65,6 +65,14 @@ spring:
|
||||
transport:
|
||||
dashboard: @sentinel.transport.dashboard@
|
||||
eager: true
|
||||
quartz:
|
||||
# 调度器实例名称
|
||||
scheduler-name: mallScheduler
|
||||
# 线程池配置
|
||||
thread-pool:
|
||||
thread-count: 15 # 增加线程数以处理更多并发任务
|
||||
# 错过触发器策略
|
||||
job-store-type: memory
|
||||
upload: # 图片上传配置
|
||||
filepath: @upload.filepath@ # 本地环境静态文件路径
|
||||
seata:
|
||||
|
||||
@ -65,6 +65,14 @@ spring:
|
||||
transport:
|
||||
dashboard: @sentinel.transport.dashboard@
|
||||
eager: true
|
||||
quartz:
|
||||
# 调度器实例名称
|
||||
scheduler-name: mallScheduler
|
||||
# 线程池配置
|
||||
thread-pool:
|
||||
thread-count: 15 # 增加线程数以处理更多并发任务
|
||||
# 错过触发器策略
|
||||
job-store-type: memory
|
||||
upload: # 图片上传配置
|
||||
filepath: @upload.filepath@ # 本地环境静态文件路径
|
||||
seata:
|
||||
|
||||
@ -72,6 +72,14 @@ spring:
|
||||
transport:
|
||||
dashboard: @sentinel.transport.dashboard@
|
||||
eager: true
|
||||
quartz:
|
||||
# 调度器实例名称
|
||||
scheduler-name: mallScheduler
|
||||
# 线程池配置
|
||||
thread-pool:
|
||||
thread-count: 15 # 增加线程数以处理更多并发任务
|
||||
# 错过触发器策略
|
||||
job-store-type: memory
|
||||
upload: # 图片上传配置
|
||||
filepath: @upload.filepath@ # 本地环境静态文件路径
|
||||
seata:
|
||||
|
||||
@ -69,6 +69,14 @@ spring:
|
||||
transport:
|
||||
dashboard: @sentinel.transport.dashboard@
|
||||
eager: true
|
||||
quartz:
|
||||
# 调度器实例名称
|
||||
scheduler-name: mallScheduler
|
||||
# 线程池配置
|
||||
thread-pool:
|
||||
thread-count: 15 # 增加线程数以处理更多并发任务
|
||||
# 错过触发器策略
|
||||
job-store-type: memory
|
||||
upload: # 图片上传配置
|
||||
filepath: @upload.filepath@ # 本地环境静态文件路径
|
||||
seata:
|
||||
|
||||
@ -69,6 +69,14 @@ spring:
|
||||
transport:
|
||||
dashboard: @sentinel.transport.dashboard@
|
||||
eager: true
|
||||
quartz:
|
||||
# 调度器实例名称
|
||||
scheduler-name: mallScheduler
|
||||
# 线程池配置
|
||||
thread-pool:
|
||||
thread-count: 15 # 增加线程数以处理更多并发任务
|
||||
# 错过触发器策略
|
||||
job-store-type: memory
|
||||
upload: # 图片上传配置
|
||||
filepath: @upload.filepath@ # 本地环境静态文件路径
|
||||
seata:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user