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` 表
|
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
|
||||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||||
server:
|
server:
|
||||||
host: erp.52o.site
|
host: 127.0.0.1
|
||||||
port: 17888
|
port: 17888
|
||||||
# 详见 script/sql/snail_job.sql `sj_namespace` 表
|
# 详见 script/sql/snail_job.sql `sj_namespace` 表
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
# 随主应用端口飘逸
|
# 随主应用端口飘逸
|
||||||
port: 2${server.port}
|
port: 2${server.port}
|
||||||
# 客户端ip指定
|
# 客户端ip指定
|
||||||
host:
|
host: 127.0.0.1
|
||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
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;
|
private final ITpClientService tpClientService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行工作任务的方法
|
||||||
|
* 根据客户在特定时间范围内的订单活动情况,更新客户的健康状态
|
||||||
|
* 客户的健康状态根据其最近的订单活动分为三个等级:
|
||||||
|
* 1 - 在过去180天内有订单
|
||||||
|
* 2 - 在过去365天内有订单,但不是在过去180天内
|
||||||
|
* 3 - 在过去365天内没有订单
|
||||||
|
*
|
||||||
|
* @param jobArgs 工作参数,用于执行任务
|
||||||
|
* @return ExecuteResult 类型的执行结果,表示任务执行是否成功
|
||||||
|
*/
|
||||||
public ExecuteResult jobExecute(JobArgs jobArgs) {
|
public ExecuteResult jobExecute(JobArgs jobArgs) {
|
||||||
String dateMinus180Days = getCurrentDateMinus180Days(180L);
|
// 获取当前日期前180天和365天的日期
|
||||||
String dateMinus365Days = getCurrentDateMinus180Days(365L);
|
String dateMinus180Days = getDateBeforeCurrent(180L);
|
||||||
List<TpClient> list = tpClientService.queryAllList();
|
String dateMinus365Days = getDateBeforeCurrent(365L);
|
||||||
List<TpClient> newList = new ArrayList<>();
|
|
||||||
|
|
||||||
for (TpClient tpClient : list){
|
// 查询所有客户列表
|
||||||
boolean exist = tpOrderService.exists(new LambdaQueryWrapper<TpOrder>().eq(TpOrder::getKid, tpClient.getId()).eq(TpOrder::getIsDel, 1).ge(TpOrder::getAddTime, dateMinus180Days));
|
List<TpClient> list = tpClientService.queryAllList();
|
||||||
if (exist){
|
// 如果客户列表为空,直接返回执行成功
|
||||||
if(tpClient.getHealth() != 1){
|
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);
|
tpClient.setHealth(1);
|
||||||
newList.add(tpClient);
|
newList.add(tpClient);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean exist2 = tpOrderService.exists(new LambdaQueryWrapper<TpOrder>().eq(TpOrder::getKid, tpClient.getId()).eq(TpOrder::getIsDel, 1).ge(TpOrder::getAddTime, dateMinus365Days));
|
|
||||||
if (exist2){
|
// 检查客户在过去365天内是否有订单
|
||||||
if(tpClient.getHealth() != 2){
|
boolean hasRecentOrderIn365Days = tpOrderService.exists(
|
||||||
|
baseWrapper.clone().ge(TpOrder::getAddTime, dateMinus365Days));
|
||||||
|
|
||||||
|
if (hasRecentOrderIn365Days) {
|
||||||
|
// 如果客户健康状态不是2,则设置为2并添加到更新列表
|
||||||
|
if (tpClient.getHealth() != 2) {
|
||||||
tpClient.setHealth(2);
|
tpClient.setHealth(2);
|
||||||
newList.add(tpClient);
|
newList.add(tpClient);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}else {
|
}
|
||||||
if(tpClient.getHealth() != 3){
|
|
||||||
tpClient.setHealth(3);
|
// 如果客户在过去365天内没有订单,且健康状态不是3,则设置为3并添加到更新列表
|
||||||
newList.add(tpClient);
|
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("执行成功");
|
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) {
|
public static String getCurrentDateMinus180Days(Long days) {
|
||||||
try {
|
try {
|
||||||
// 获取当前日期
|
// 获取当前日期
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.dromara.work.service;
|
package org.dromara.work.service;
|
||||||
|
|
||||||
|
import org.dromara.work.domain.TzSharedAccount;
|
||||||
import org.dromara.work.domain.vo.TzSharedAccountVo;
|
import org.dromara.work.domain.vo.TzSharedAccountVo;
|
||||||
import org.dromara.work.domain.bo.TzSharedAccountBo;
|
import org.dromara.work.domain.bo.TzSharedAccountBo;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@@ -74,4 +75,11 @@ public interface ITzSharedAccountService {
|
|||||||
* @return 共享账号数量
|
* @return 共享账号数量
|
||||||
*/
|
*/
|
||||||
Map<String, Object> queryCount(TzSharedAccountBo bo);
|
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;
|
return baseMapper.updateById(update) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量更新共享账号
|
||||||
|
*
|
||||||
|
* @param list1 共享账号列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void updateBatchById(List<TzSharedAccount> list1) {
|
||||||
|
baseMapper.updateBatchById(list1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验并批量删除共享账号信息
|
* 校验并批量删除共享账号信息
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user