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; 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(); 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> 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; } 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=已逾期 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; 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("任务已处理或者不存在"); } 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()); } } ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
New file @@ -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); } } ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java
New file @@ -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); } } } ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java
New file @@ -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; } } ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java
New file @@ -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; } } ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java
New file @@ -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(); } } } ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java
New file @@ -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); } }