diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index de7ea04..b527e5f 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -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: diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SharedAccountExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SharedAccountExecutor.java new file mode 100644 index 0000000..b33468e --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/SharedAccountExecutor.java @@ -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 list = tzSharedAccountService.queryList(bo); + + // 如果列表为空,表示没有可用的共享账号,返回成功消息并结束执行 + if (list.isEmpty()) { + return ExecuteResult.success("没有可用的共享账号"); + } + + // 创建一个空列表,用于存储需要更新的共享账号信息 + List 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()); + } + } + + + +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java index 89e120b..f42e021 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/TestAnnoJobExecutor.java @@ -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 list = tpClientService.queryAllList(); - List newList = new ArrayList<>(); + // 获取当前日期前180天和365天的日期 + String dateMinus180Days = getDateBeforeCurrent(180L); + String dateMinus365Days = getDateBeforeCurrent(365L); - for (TpClient tpClient : list){ - boolean exist = tpOrderService.exists(new LambdaQueryWrapper().eq(TpOrder::getKid, tpClient.getId()).eq(TpOrder::getIsDel, 1).ge(TpOrder::getAddTime, dateMinus180Days)); - if (exist){ - if(tpClient.getHealth() != 1){ + // 查询所有客户列表 + List list = tpClientService.queryAllList(); + // 如果客户列表为空,直接返回执行成功 + if (list.isEmpty()) { + return ExecuteResult.success("执行成功"); + } + + // 初始化需要更新的客户列表 + List newList = new ArrayList<>(); + for (TpClient tpClient : list) { + Long clientId = tpClient.getId(); + // 构建查询条件,查找未删除且属于当前客户的订单 + LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper() + .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().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 { // 获取当前日期 diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java index 2ecb006..987da13 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/ITzSharedAccountService.java @@ -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 queryCount(TzSharedAccountBo bo); + + /** + * 批量更新共享账号 + * + * @param list1 共享账号列表 + */ + void updateBatchById(List list1); } diff --git a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java index 0814184..bc0e083 100644 --- a/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java +++ b/ruoyi-modules/ruoyi-work/src/main/java/org/dromara/work/service/impl/TzSharedAccountServiceImpl.java @@ -140,6 +140,16 @@ public class TzSharedAccountServiceImpl implements ITzSharedAccountService { return baseMapper.updateById(update) > 0; } + /** + * 批量更新共享账号 + * + * @param list1 共享账号列表 + */ + @Override + public void updateBatchById(List list1) { + baseMapper.updateBatchById(list1); + } + /** * 校验并批量删除共享账号信息 *