feat(job): 新增共享账号定时任务执行器
- 添加 SharedAccountExecutor 类,实现共享账号定时任务逻辑 - 在 ITzSharedAccountService 接口中新增 updateBatchById 方法 - 在 TzSharedAccountServiceImpl 类中实现 updateBatchById 方法 - 修改 TestAnnoJobExecutor 类,优化客户健康状态更新逻辑 - 更新 application-prod.yml 文件,修改 SnailJob 服务器配置
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
// 获取当前日期
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除共享账号信息
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user