package com.ydw.bat.wkflow.config; import com.alibaba.fastjson.JSON; import com.ydw.bat.wkflow.business_oa.webService.service.WebServiceOAService; import net.sf.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; import com.ydw.bat.wkflow.business_main.datas.entity.OaTaskExec; import com.ydw.bat.wkflow.business_main.datas.service.IOaTaskExecService; import com.ydw.bat.wkflow.business_mq.service.CreateMQService; import com.ydw.bat.wkflow.util.SpringContextUtil; import com.ydw.bat.wkflow.util.Utils; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.HistoryService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.history.HistoricTaskInstanceQuery; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @EnableScheduling @Component @Slf4j public class ScheduledJob { /** * 根据配置文件设置是否开启定时器 */ @Value("${isNotScheduled}") private boolean isNotScheduled; //是否开启定时器 // @Scheduled(cron = "0 0 0 * * ?") //每天的凌晨0点执行 @Scheduled(cron="*/5 * * * * ?") @Async public void SchedulingTask() { if(isNotScheduled){ TaskService taskService = SpringContextUtil.getBean(TaskService.class); HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); IOaTaskExecService execService = SpringContextUtil.getBean(IOaTaskExecService.class); CreateMQService oaService = SpringContextUtil.getBean(CreateMQService.class); WebServiceOAService webServiceOAService = SpringContextUtil.getBean(WebServiceOAService.class); SimpleDateFormat sdfQuery = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("EXEC_TYPE",2); wrapper.eq("EXEC_STATUS",1); wrapper.eq("EXEC_TIME",sdfQuery.format(new Date())); List taskExecs = execService.list(wrapper); if(!taskExecs.isEmpty()){ taskExecs.forEach(taskExec -> { net.sf.json.JSONObject jsonObject = JSONObject.fromObject(taskExec.getMesg()); net.sf.json.JSONObject jsonObjectFilter = JSONObject.fromObject(taskExec.getMesg()); jsonObjectFilter = jsonObjectFilter.discard("PId"); jsonObjectFilter.put("pid",jsonObject.getString("PId")); BusProcessNew object = JSON.parseObject(jsonObjectFilter.toString(),BusProcessNew.class); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .processInstanceId(object.getPId()).taskId(object.getTaskId()).finished(); List list = historicTaskInstanceQuery.list(); // 判断定时任务的流程节点是否已完成 if(!list.isEmpty()){ // 业务系统流程节点已完成 则不再发送 OA 待办 // 任务状态置为已完成 updateTask(execService, sdf, taskExec); }else { // 业务系统流程节点未完成 再发送 OA 待办 // 任务状态置为已完成 业务流程 干活流程节点 均显示 提交 updateTask(execService, sdf, taskExec); Task task = taskService.createTaskQuery().taskId(object.getTaskId()).singleResult(); webServiceOAService.completeOA(task); // 直接发送OA待办 重置任务状态 0 object.setTaskStatus(0); oaService.sendTodoMq(object); } }); } } } private void updateTask(IOaTaskExecService execService, SimpleDateFormat sdf, OaTaskExec taskExec) { OaTaskExec exec = new OaTaskExec(); exec.setId(taskExec.getId()); exec.setExecStatus(2); exec.setUpdateTime(sdf.format(new Date())); execService.updateById(exec); } }