feat(job): 新增共享账号定时任务执行器

- 添加 SharedAccountExecutor 类,实现共享账号定时任务逻辑
- 在 ITzSharedAccountService 接口中新增 updateBatchById 方法
- 在 TzSharedAccountServiceImpl 类中实现 updateBatchById 方法
- 修改 TestAnnoJobExecutor 类,优化客户健康状态更新逻辑
- 更新 application-prod.yml 文件,修改 SnailJob 服务器配置
This commit is contained in:
清晨
2025-05-06 12:55:53 +08:00
parent 6c73947ef3
commit 9c1c9f7e35
5 changed files with 170 additions and 19 deletions

View File

@@ -22,14 +22,14 @@ snail-job:
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server:
host: erp.52o.site
host: 127.0.0.1
port: 17888
# 详见 script/sql/snail_job.sql `sj_namespace` 表
namespace: ${spring.profiles.active}
# 随主应用端口飘逸
port: 2${server.port}
# 客户端ip指定
host:
host: 127.0.0.1
--- # 数据源配置
spring:

View File

@@ -0,0 +1,79 @@
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import lombok.RequiredArgsConstructor;
import org.dromara.work.domain.TzSharedAccount;
import org.dromara.work.domain.bo.TzSharedAccountBo;
import org.dromara.work.domain.vo.TzSharedAccountVo;
import org.dromara.work.service.ITzSharedAccountService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: Maosw
*/
@Component
@RequiredArgsConstructor
@JobExecutor(name = "sharedAccountExecutor")
public class SharedAccountExecutor {
private final ITzSharedAccountService tzSharedAccountService;
/**
* 执行作业
*
* 此方法用于处理作业的执行逻辑,主要负责检查共享账号的状态,并根据当前时间更新过期账号的状态
*
* @param jobArgs 作业参数,包含作业执行所需的信息
* @return ExecuteResult 作业执行结果,包含执行状态和消息
*/
public ExecuteResult jobExecute(JobArgs jobArgs) {
try {
// 创建共享账号业务对象并设置状态为1表示查询可用的共享账号
TzSharedAccountBo bo = new TzSharedAccountBo();
bo.setStatus(1);
// 查询符合条件的共享账号列表
List<TzSharedAccountVo> list = tzSharedAccountService.queryList(bo);
// 如果列表为空,表示没有可用的共享账号,返回成功消息并结束执行
if (list.isEmpty()) {
return ExecuteResult.success("没有可用的共享账号");
}
// 创建一个空列表,用于存储需要更新的共享账号信息
List<TzSharedAccount> list1 = new ArrayList<>();
// 获取当前时间,用于后续判断账号是否过期
long now = System.currentTimeMillis();
// 遍历共享账号列表,检查每个账号的结束时间
for (TzSharedAccountVo tzSharedAccountVo : list) {
// 如果账号结束时间小于当前时间,表示账号已过期,需要更新其状态
if (tzSharedAccountVo.getEndTime().getTime() < now) {
TzSharedAccount account = new TzSharedAccount();
account.setId(tzSharedAccountVo.getId());
account.setStatus(0);
// 将过期账号添加到待更新列表中
list1.add(account);
}
}
// 如果待更新列表不为空,执行批量更新操作
if (!list1.isEmpty()) {
tzSharedAccountService.updateBatchById(list1);
}
// 作业执行成功,返回成功消息
return ExecuteResult.success("执行成功");
} catch (Exception e) {
// 作业执行过程中发生异常,返回失败消息,并包含异常信息
return ExecuteResult.failure("执行失败: " + e.getMessage());
}
}
}

View File

@@ -29,40 +29,94 @@ public class TestAnnoJobExecutor {
private final ITpClientService tpClientService;
/**
* 执行工作任务的方法
* 根据客户在特定时间范围内的订单活动情况,更新客户的健康状态
* 客户的健康状态根据其最近的订单活动分为三个等级:
* 1 - 在过去180天内有订单
* 2 - 在过去365天内有订单但不是在过去180天内
* 3 - 在过去365天内没有订单
*
* @param jobArgs 工作参数,用于执行任务
* @return ExecuteResult 类型的执行结果,表示任务执行是否成功
*/
public ExecuteResult jobExecute(JobArgs jobArgs) {
String dateMinus180Days = getCurrentDateMinus180Days(180L);
String dateMinus365Days = getCurrentDateMinus180Days(365L);
List<TpClient> list = tpClientService.queryAllList();
List<TpClient> newList = new ArrayList<>();
// 获取当前日期前180天和365天的日期
String dateMinus180Days = getDateBeforeCurrent(180L);
String dateMinus365Days = getDateBeforeCurrent(365L);
for (TpClient tpClient : list){
boolean exist = tpOrderService.exists(new LambdaQueryWrapper<TpOrder>().eq(TpOrder::getKid, tpClient.getId()).eq(TpOrder::getIsDel, 1).ge(TpOrder::getAddTime, dateMinus180Days));
if (exist){
if(tpClient.getHealth() != 1){
// 查询所有客户列表
List<TpClient> list = tpClientService.queryAllList();
// 如果客户列表为空,直接返回执行成功
if (list.isEmpty()) {
return ExecuteResult.success("执行成功");
}
// 初始化需要更新的客户列表
List<TpClient> newList = new ArrayList<>();
for (TpClient tpClient : list) {
Long clientId = tpClient.getId();
// 构建查询条件,查找未删除且属于当前客户的订单
LambdaQueryWrapper<TpOrder> baseWrapper = new LambdaQueryWrapper<TpOrder>()
.eq(TpOrder::getIsDel, 1)
.eq(TpOrder::getKid, clientId);
// 检查客户在过去180天内是否有订单
boolean hasRecentOrderIn180Days = tpOrderService.exists(
baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus180Days));
if (hasRecentOrderIn180Days) {
// 如果客户健康状态不是1则设置为1并添加到更新列表
if (tpClient.getHealth() != 1) {
tpClient.setHealth(1);
newList.add(tpClient);
}
continue;
}
boolean exist2 = tpOrderService.exists(new LambdaQueryWrapper<TpOrder>().eq(TpOrder::getKid, tpClient.getId()).eq(TpOrder::getIsDel, 1).ge(TpOrder::getAddTime, dateMinus365Days));
if (exist2){
if(tpClient.getHealth() != 2){
// 检查客户在过去365天内是否有订单
boolean hasRecentOrderIn365Days = tpOrderService.exists(
baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus365Days));
if (hasRecentOrderIn365Days) {
// 如果客户健康状态不是2则设置为2并添加到更新列表
if (tpClient.getHealth() != 2) {
tpClient.setHealth(2);
newList.add(tpClient);
}
continue;
}else {
if(tpClient.getHealth() != 3){
tpClient.setHealth(3);
newList.add(tpClient);
}
}
// 如果客户在过去365天内没有订单且健康状态不是3则设置为3并添加到更新列表
if (tpClient.getHealth() != 3) {
tpClient.setHealth(3);
newList.add(tpClient);
}
}
tpClientService.updateBatchById(newList);
try {
// 如果有需要更新的客户,尝试批量更新
if (!newList.isEmpty()) {
tpClientService.updateBatchById(newList);
}
} catch (Exception e) {
// 如果更新失败,打印错误信息
System.err.println("批量更新客户健康状态失败: " + e.getMessage());
}
// 返回执行成功
return ExecuteResult.success("执行成功");
}
private static String getDateBeforeCurrent(Long days) {
LocalDate currentDate = LocalDate.now();
LocalDate targetDate = currentDate.minusDays(days);
return targetDate.format(DateTimeFormatter.ISO_DATE);
}
public static String getCurrentDateMinus180Days(Long days) {
try {
// 获取当前日期

View File

@@ -1,5 +1,6 @@
package org.dromara.work.service;
import org.dromara.work.domain.TzSharedAccount;
import org.dromara.work.domain.vo.TzSharedAccountVo;
import org.dromara.work.domain.bo.TzSharedAccountBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -74,4 +75,11 @@ public interface ITzSharedAccountService {
* @return 共享账号数量
*/
Map<String, Object> queryCount(TzSharedAccountBo bo);
/**
* 批量更新共享账号
*
* @param list1 共享账号列表
*/
void updateBatchById(List<TzSharedAccount> list1);
}

View File

@@ -140,6 +140,16 @@ public class TzSharedAccountServiceImpl implements ITzSharedAccountService {
return baseMapper.updateById(update) > 0;
}
/**
* 批量更新共享账号
*
* @param list1 共享账号列表
*/
@Override
public void updateBatchById(List<TzSharedAccount> list1) {
baseMapper.updateBatchById(list1);
}
/**
* 校验并批量删除共享账号信息
*