From c474556f44163526700fd7c99a88e37e4297e23f Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期四, 27 二月 2025 19:14:23 +0800 Subject: [PATCH] 审批流定时任务 --- ruoyi-system/pom.xml | 4 ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java | 37 ++++ ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java | 43 +++++ ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java | 128 ++++++++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java | 28 +++ ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java | 47 ++++- ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java | 26 ++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java | 72 ++++---- ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java | 37 ++++ ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java | 30 +++ ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java | 6 13 files changed, 412 insertions(+), 57 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java index 46e24ae..a00e890 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java @@ -1,6 +1,5 @@ package com.ruoyi.web.controller.api; -import com.aizuda.bpm.engine.entity.FlwTask; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -8,18 +7,15 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseModel; import com.ruoyi.common.core.domain.BasePage; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.GlobalException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.bo.*; import com.ruoyi.system.model.StateProcessModule; import com.ruoyi.system.model.StateProcessTemplate; -import com.ruoyi.system.model.TContract; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.StateProcessModuleService; import com.ruoyi.system.service.StateProcessTemplateService; @@ -32,7 +28,10 @@ import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java index ff6b9ed..f00b9e5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java @@ -3,34 +3,39 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; -import cn.hutool.core.util.ObjectUtil; -import com.aizuda.bpm.engine.core.FlowCreator; +import com.aizuda.bpm.engine.entity.FlwTask; +import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.ImmutableMap; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.constant.DictConstants; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.ProcessCategoryEnum; -import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.DictUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.WebUtils; import com.ruoyi.system.bo.ProcessStartBO; -import com.ruoyi.system.dto.*; +import com.ruoyi.system.dto.RevokeDTO; +import com.ruoyi.system.dto.SetContractDto; +import com.ruoyi.system.dto.TContractDTO; +import com.ruoyi.system.dto.TerminateContractDTO; import com.ruoyi.system.export.ContractExport; -import com.ruoyi.system.export.OpticalInspectionExport; import com.ruoyi.system.model.*; import com.ruoyi.system.query.TContractBillQuery; import com.ruoyi.system.query.TContractQuery; -import com.ruoyi.system.query.THouseQuery; -import com.ruoyi.system.query.TUserHistoryQuery; import com.ruoyi.system.service.*; +import com.ruoyi.system.task.base.QuartzManager; +import com.ruoyi.system.task.base.TimeJobType; +import com.ruoyi.system.task.jobs.StateProcessJob; import com.ruoyi.system.vo.BillVO; import com.ruoyi.system.vo.CheckAcceptRecordVO; -import com.ruoyi.system.vo.HouseVO; +import com.ruoyi.system.vo.TContractVO; import com.ruoyi.web.controller.tool.NumberToChineseUtils; import com.ruoyi.web.controller.tool.WordUtil; -import io.swagger.annotations.Api; -import com.ruoyi.system.vo.TContractVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; @@ -45,7 +50,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; @@ -74,7 +78,8 @@ private TCheckAcceptRecordService checkAcceptRecordService; @Autowired private StateProcessTemplateService stateProcessTemplateService; - + @Autowired + private FlwTaskMapper flwTaskMapper; @ApiOperation(value = "测试生成账单") @PostMapping(value = "/testBill") public R testBill(String id) { @@ -208,7 +213,21 @@ variable.put("projectId", dto.getId()); processStartBO.setVariable(variable); //开启工作流程 - stateProcessTemplateService.start(processStartBO); + Boolean start = stateProcessTemplateService.start(processStartBO); + if(start){ + FlwTask flwTask = flwTaskMapper.selectOne(Wrappers.lambdaQuery(FlwTask.class) + .like(FlwTask::getVariable, dto.getId()) + .orderByDesc(FlwTask::getCreateTime) + .last("LIMIT 1")); + if(Objects.nonNull(flwTask)){ + // 添加定时任务 + Map<String, ? extends Object> maps = + new ImmutableMap.Builder<String, Long>(). + put("id", flwTask.getId()) + .build(); + QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps); + } + } } if (dto.getIsIncreasing()){ TContractRentType tContractRentType = new TContractRentType(); diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index da794d7..b55145b 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -32,6 +32,10 @@ <!-- </exclusion>--> <!-- </exclusions>--> </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-quartz</artifactId> + </dependency> <dependency> <groupId>cn.afterturn</groupId> diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java index a009e7d..b52551e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java @@ -1,5 +1,6 @@ package com.ruoyi.system.bo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -26,5 +27,10 @@ * 图片 */ private String pictures; + /** + * 审批用户id + */ + @ApiModelProperty(value = "前端忽略") + private Long userId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java index e2141dd..c4a5b44 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java @@ -1,12 +1,14 @@ package com.ruoyi.system.query; import com.ruoyi.common.core.domain.BasePage; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data +@ApiModel("租户详情-缴费账单列表查询") public class TBillAppletQuery extends BasePage { /** * 缴费状态 1=未缴费 2=待确认 3=已缴费 4=已逾期 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java index 598e73b..48bf079 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java @@ -25,19 +25,21 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.google.common.collect.ImmutableMap; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.enums.ProcessCategoryEnum; import com.ruoyi.common.enums.SubmitStatusEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.TContractService; +import com.ruoyi.system.task.base.QuartzManager; +import com.ruoyi.system.task.base.TimeJobType; +import com.ruoyi.system.task.jobs.StateProcessJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -93,6 +95,15 @@ if (ObjectUtil.isEmpty(flwHisTask)) { return true; } + + // 添加定时任务 + Map<String, ? extends Object> maps = + new ImmutableMap.Builder<String, Long>(). + put("id", flwTask.getId()) + .build(); + QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps); + + //对比发起人和节点审批人 if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) { return true; @@ -135,6 +146,15 @@ if (ObjectUtil.isEmpty(flwHisTask)) { return true; } + + // 添加定时任务 + Map<String, ? extends Object> maps = + new ImmutableMap.Builder<String, Long>(). + put("id", flwTask.getId()) + .build(); + QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+10*1000L), maps); + + //对比发起人和节点审批人 if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) { return true; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java index afbd802..7c3da74 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.ImmutableMap; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.BaseModel; import com.ruoyi.common.core.domain.entity.SysUser; @@ -580,40 +581,29 @@ new PageInfo<>(); } - List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId) + List<String> instanceIds = flwHisTaskList.stream().map(FlwTask::getInstanceId) .map(String::valueOf).collect(Collectors.toList()); //分页查询任务中心任务 - LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>(); - if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) { - stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName()); - } - if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) { - stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName()); - } - if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) { - stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy()); - } - if (ObjectUtil.isEmpty(instanceId)) { - return new PageInfo<>(); - } - stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId); - stateTaskQuery.orderByDesc(BaseModel::getCreateTime); - PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); - PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery); - //转换类 - List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class); - - // 查询合同信息 - for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { - // 查询合同信息 - TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId")); - processTaskListVO.setContract(contract); - } - - pageInfo.setRecords(processTaskListVOS); +// LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>(); +// if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) { +// stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName()); +// } +// if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) { +// stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName()); +// } +// if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) { +// stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy()); +// } +// if (ObjectUtil.isEmpty(instanceId)) { +// return new PageInfo<>(); +// } +// stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId); +// stateTaskQuery.orderByDesc(BaseModel::getCreateTime); + processTaskListBO.setInstanceIds(instanceIds); + PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO); if (ObjectUtil.isEmpty(processTaskListVOS)) { - return pageInfo; + return new PageInfo<>(); } Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId)); //查询原因 @@ -622,7 +612,7 @@ Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds)); Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity())); - List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); + List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList()); Map<Long, SysUser> sysUserMap; if (!CollectionUtils.isEmpty(updateUserId)) { List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId); @@ -636,7 +626,7 @@ sysUserMap = new HashMap<>(); } - for (ProcessTaskListVO processTaskListVO : processTaskListVOS) { + for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) { List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId())); if (ObjectUtil.isNotEmpty(flwHisTaskMap)) { //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错 @@ -659,7 +649,7 @@ processTaskListVO.setCreateBy(sysUser.getNickName()); } } - return pageInfo; + return processTaskListVOS; } @Override public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) { @@ -912,12 +902,16 @@ if (ObjectUtil.isNull(flwTask)) { throw new GlobalException("任务已处理或者不存在"); } - flowLongEngine.executeTask(taskId, currentFlowCreator()); + if(Objects.nonNull(processAgreeBO.getUserId())){ + flowLongEngine.executeTask(taskId, currentFlowCreator(processAgreeBO.getUserId())); + }else { + flowLongEngine.executeTask(taskId, currentFlowCreator()); + } // 动作执行记录 StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction(); stateProcessInstanceAction.setId(IdUtils.simpleUUID()); stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString()); - stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId())); + stateProcessInstanceAction.setAuditorId(String.valueOf(processAgreeBO.getUserId())); stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue()); stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId()); stateProcessInstanceAction.setRemark(processAgreeBO.getRemark()); @@ -1208,6 +1202,7 @@ // 查询历史任务 List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId)); + processDetailVO.setFlwHisTasks(flwHisTasks); List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId) @@ -1309,5 +1304,12 @@ } return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName()); } + private FlowCreator currentFlowCreator(Long userId) { + if (null == userId) { + throw new GlobalException("非法用户"); + } + SysUser sysUser = sysUserService.selectUserById(userId); + return FlowCreator.of(String.valueOf(sysUser.getUserId()), sysUser.getNickName()); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java new file mode 100644 index 0000000..720445d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java @@ -0,0 +1,30 @@ +package com.ruoyi.system.task.base; + +import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper; +import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper; +import com.ruoyi.system.service.StateProcessTemplateService; +import com.ruoyi.system.task.utils.SpringContextsUtil; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractJob implements Job{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public abstract void execute(JobExecutionContext context) throws JobExecutionException; + + protected StateProcessTemplateService stateProcessTemplateService; + protected FlwTaskMapper flwTaskMapper; + protected FlwTaskActorMapper flwTaskActorMapper; + + public AbstractJob(){ + this.stateProcessTemplateService = SpringContextsUtil.getBean(StateProcessTemplateService.class); + this.flwTaskMapper = SpringContextsUtil.getBean(FlwTaskMapper.class); + this.flwTaskActorMapper = SpringContextsUtil.getBean(FlwTaskActorMapper.class); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java new file mode 100644 index 0000000..90a0017 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java @@ -0,0 +1,128 @@ +package com.ruoyi.system.task.base; + +import org.quartz.*; +import org.quartz.impl.StdSchedulerFactory; + +import java.util.Date; +import java.util.Map; + +public class QuartzManager { + private static SchedulerFactory factory = new StdSchedulerFactory(); + private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_"; + private static final String JOB_NAME_PREFIX = "JOB_PREFIX_"; + + /** + * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息 + * + * @param jobName + * 具体的任务名+ID标识唯一 + * @param jobType + * @param date + * @param jp + */ + public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date, + Map<String, ? extends Object> jp) { + //logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date); + try { + Scheduler sched = factory.getScheduler(); + JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType()) + .setJobData(new JobDataMap(jp)).build(); + + SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() + .withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build(); + removeJob(jobName, jobType); + + sched.scheduleJob(job, trigger); + + if (!sched.isShutdown()) { + sched.start(); + } + } catch (Exception e) { + //logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date); + } + } + + /** + * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) + * @param jobName + * @param time + */ + public synchronized static void modifyJobTime(String jobName,TimeJobType jobType, Date time) { + //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time); + try { + JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType()); + TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType()); + + + Scheduler sched = factory.getScheduler(); + SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key); + if(trigger == null) { + return; + } + Date oldTime = trigger.getStartTime(); + + if (oldTime.getTime() != time.getTime()) { + JobDetail jobDetail = sched.getJobDetail(jobKey); + Class<? extends Job> objJobClass = jobDetail.getJobClass(); + removeJob(jobName,jobType); + Map<String, Object> jp = jobDetail.getJobDataMap(); + addJob(objJobClass, jobName, jobType, time, jp); + } + } catch (Exception e) { + // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time); + } + } + + /** + * 移除一个任务 + * + * @param jobName + */ + public synchronized static void removeJob(String jobName, TimeJobType jobType) { + try { + JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType()); + TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType()); + Scheduler sched = factory.getScheduler(); + + JobDetail detail = sched.getJobDetail(jobKey); + if (detail != null) { + sched.pauseJob(jobKey); + sched.pauseTrigger(key);// 停止触发器 + sched.unscheduleJob(key);// 移除触发器 + sched.deleteJob(jobKey);// 删除任务 + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + /** + * 启动所有定时任务 + */ + public synchronized static void startJobs() { + try { + Scheduler sched = factory.getScheduler(); + sched.start(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + /** + * 关闭所有定时任务 + */ + public synchronized static void shutdownJobs() { + try { + Scheduler sched = factory.getScheduler(); + if (!sched.isShutdown()) { + sched.shutdown(); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java new file mode 100644 index 0000000..8bacc4a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java @@ -0,0 +1,28 @@ +package com.ruoyi.system.task.base; + +/** + * @Description 按时间点发布的任务类型 + * @date 2025年2月17日 下午7:22:28 + */ +public enum TimeJobType { + AUTO_AUDIT("auto_audit","自动审核"); + private String type; + private String desc; + private TimeJobType(String type, String desc) { + this.type = type; + this.desc = desc; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getDesc() { + return desc; + } + public void setDesc(String desc) { + this.desc = desc; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java new file mode 100644 index 0000000..efd9cf8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java @@ -0,0 +1,37 @@ +package com.ruoyi.system.task.exceptions; + +/** + * @文件说明:定时器任务执行异常 + * @版权所有:成都喜来达 + * @项目名称: fengsheng + * @创建者: Leeyns + * @创建日期: 2016年5月18日 + * @最近修改者:Leeyns + * @最近修改日期:2016年5月18日 + */ +public class TimeException extends Exception { + + /** + * TODO + */ + private static final long serialVersionUID = 5703430073981692250L; + + private String message; + + public TimeException() { + super(); + } + + public TimeException(String message) { + super(message); + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java new file mode 100644 index 0000000..d42aada --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java @@ -0,0 +1,43 @@ +package com.ruoyi.system.task.jobs; + +import com.aizuda.bpm.engine.entity.FlwTaskActor; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.system.bo.ProcessAgreeBO; +import com.ruoyi.system.task.base.AbstractJob; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.util.Objects; + +/** + * 发票定时任务 + * @author Administrator + * + */ +public class StateProcessJob extends AbstractJob { + + public static final String name = "stateProcess_"; + + @Override + public void execute(JobExecutionContext context) + throws JobExecutionException { + JobDataMap maps = context.getMergedJobDataMap(); + Long taskId = maps.getLong("id"); + try { + System.err.println("执行定时任务"); + ProcessAgreeBO processAgreeBO = new ProcessAgreeBO(); + processAgreeBO.setTaskId(String.valueOf(taskId)); + FlwTaskActor flwTaskActor = flwTaskActorMapper.selectOne(Wrappers.lambdaQuery(FlwTaskActor.class).eq(FlwTaskActor::getTaskId, taskId).last("LIMIT 1")); + if(Objects.isNull(flwTaskActor)){ + System.err.println("该任务不存在"); + return; + } + processAgreeBO.setUserId(Long.valueOf(flwTaskActor.getActorId())); + stateProcessTemplateService.agree(processAgreeBO); + }catch(Exception e){ + e.printStackTrace(); + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java new file mode 100644 index 0000000..558257f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java @@ -0,0 +1,37 @@ +package com.ruoyi.system.task.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextsUtil implements ApplicationContextAware{ + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if (SpringContextsUtil.applicationContext == null) { + SpringContextsUtil.applicationContext = applicationContext; + } + } + // 获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + // 通过name获取 Bean. + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + // 通过class获取Bean. + public static <T> T getBean(Class<T> clazz) { + return getApplicationContext().getBean(clazz); + } + // 通过name,以及Clazz返回指定的Bean + public static <T> T getBean(String name, Class<T> clazz) { + System.out.println(getApplicationContext().getBean(name, clazz)); + return getApplicationContext().getBean(name, clazz); + } + +} -- Gitblit v1.7.1