diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/AsyncPoolConfig.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/AsyncPoolConfig.java new file mode 100644 index 0000000..f752c83 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/AsyncPoolConfig.java @@ -0,0 +1,30 @@ +package org.springblade.plugin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * @Description 异步调度任务的线程池配置 + * @Author ytl + * @Date 2023/3/2 0002 11:28 + */ +@EnableAsync +@Configuration +public class AsyncPoolConfig { + @Bean("taskExecutor") + public Executor taskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); + executor.setMaxPoolSize(50); + executor.setQueueCapacity(200); + executor.setKeepAliveSeconds(60); + executor.setThreadNamePrefix("taskExecutor-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/TaskConfig.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/TaskConfig.java new file mode 100644 index 0000000..c9ce57c --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/TaskConfig.java @@ -0,0 +1,123 @@ +package org.springblade.plugin.config; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.plugin.operation.workorder.entity.WorkOrder; +import org.springblade.plugin.operation.workorder.service.IWorkOrderService; +import org.springblade.plugin.workbench.entity.AutoStartModel; +import org.springblade.plugin.workbench.enumutil.RepeatEnum; +import org.springblade.plugin.workbench.service.IAutoStartModelService; +import org.springblade.plugin.workflow.core.utils.WfTaskUtil; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * @Description 定时任务,异步执行 + * @Author ytl + * @Date 2023/3/1 0001 17:35 + */ +@Component +@EnableScheduling +@AllArgsConstructor +public class TaskConfig { + private final IAutoStartModelService autoStartModelService; + private final IWorkOrderService workOrderService; + + /** + * 重复执行新建工单 + * *只要autoStartModel中存在 next_flag = 0 且 is_break = 0 + * *然后 next_Start_time <= 当前时间就生成新工单并修改next_flag = 1 + */ + @Scheduled(fixedDelay = 6000*1000)//上次任务结束后10分钟执行一次 + @Transactional(rollbackFor = Exception.class) + @Async("taskExecutor") + public void autoStartWorkOrder(){ + + LocalDate nowDay = LocalDate.now(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AutoStartModel::getNextFlag, 0).eq(AutoStartModel::getIsBreak,0); + List list = autoStartModelService.list(wrapper); + + if(list.size() > 0){ + for(AutoStartModel autoStartModel : list){ + Date nextStartTime = autoStartModel.getNextStartTime(); + LocalDateTime localDateTime = DateUtil.fromDate(nextStartTime); + LocalDate nextStartDay = LocalDate.of(localDateTime.getYear(),localDateTime.getMonth(),localDateTime.getDayOfMonth()); + + if(nowDay.equals(nextStartDay) || nowDay.isAfter(nextStartDay)){ + WorkOrder workOrder = new WorkOrder(); + workOrder.setApplyUser(autoStartModel.getApplyUser().toString()); + workOrder.setMaintenanceCompany(autoStartModel.getMaintenanceCompany().toString()); + workOrder.setManagement(autoStartModel.getManagement().toString()); + workOrder.setTaskParent(autoStartModel.getTaskParent().toString()); + workOrder.setTaskType(autoStartModel.getTaskType().toString()); + workOrder.setTaskLevel(autoStartModel.getTaskLevel().toString()); + workOrder.setRepeatMode(autoStartModel.getRepeatMode().toString()); + workOrder.setOperateSys(autoStartModel.getOperateSys().toString()); + workOrder.setOperateModule(autoStartModel.getOperateModule().toString()); + workOrder.setProcessInstanceId(autoStartModel.getProcessInstanceId()); + workOrder.setType(autoStartModel.getType()); + workOrder.setTenantId(WfTaskUtil.getTenantId()); + //新增 + workOrderService.save(workOrder); + //修改nextFlag = 1,表示已经生成新工单了 + autoStartModel.setNextFlag(1); + autoStartModelService.updateById(autoStartModel); + } + + } + } + } + + /** + * 自动计算下一次的开始和结束时间 + */ + @Scheduled(fixedDelay = 6000*1000) + @Transactional(rollbackFor = Exception.class) + @Async("taskExecutor") + public void computerNextDateOfOrder(){ + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AutoStartModel::getNextFlag, 1).eq(AutoStartModel::getIsBreak,0); + List list = autoStartModelService.list(wrapper); + + if(list.size() > 0){ + list.forEach(autoStartModel -> { + Long repeatMode = autoStartModel.getRepeatMode(); + if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode.toString())){ + autoStartModel.setNextStartTime(DateUtil.plusWeeks(autoStartModel.getNextStartTime(),1)); + autoStartModel.setNextEndTime(DateUtil.plusWeeks(autoStartModel.getNextEndTime(),1)); + }else if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode.toString())){ + autoStartModel.setNextStartTime(DateUtil.plusMonths(autoStartModel.getNextStartTime(),1)); + autoStartModel.setNextEndTime(DateUtil.plusMonths(autoStartModel.getNextEndTime(),1)); + }else if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode.toString())){ + autoStartModel.setNextStartTime(DateUtil.plusMonths(autoStartModel.getNextStartTime(),1)); + autoStartModel.setNextEndTime(DateUtil.plusMonths(autoStartModel.getNextEndTime(),1)); + }else if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode.toString())){ + autoStartModel.setNextStartTime(DateUtil.plusDays(autoStartModel.getNextStartTime(),1)); + autoStartModel.setNextEndTime(DateUtil.plusDays(autoStartModel.getNextEndTime(),1)); + }else if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode.toString())){ + autoStartModel.setNextStartTime(DateUtil.plusMinutes(autoStartModel.getNextStartTime(),1)); + autoStartModel.setNextEndTime(DateUtil.plusMinutes(autoStartModel.getNextEndTime(),1)); + } + else{ + return; + } + autoStartModel.setNextFlag(0); + autoStartModelService.updateById(autoStartModel); + }); + } + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java index c87a061..5a250dc 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java @@ -64,6 +64,12 @@ public class AutoStartModel extends TenantEntity { //结束时间 private Date breakTime; + //下次开始时间 + private Date nextStartTime; + //下次期望结束时间 + private Date nextEndTime; + //标识,下次任务的表单是否建立 + private Integer nextFlag; /** * 开始时间 */ diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RepeatEnum.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RepeatEnum.java new file mode 100644 index 0000000..a7d01e9 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RepeatEnum.java @@ -0,0 +1,30 @@ +package org.springblade.plugin.workbench.enumutil; + +/** + * @Description + * @Author ytl + * @Date 2023/3/1 0001 18:04 + */ +public enum RepeatEnum { + 不重复("1627589799957266433"), + 每周("1627589960532000769"), + 每月("1627590001325801474"), + 每季度("1627590044137062402"), + 每天("1631099324142473218"), + 每分钟("1631111669916913665"); + + //表dict_biz中code = reminde_mode 的id + private String code; + + + RepeatEnum(String code){ + + this.code = code; + } + + public String getCode(){ + return code; + } + + +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java index e83df91..4ba2031 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java @@ -24,4 +24,6 @@ public interface IAutoStartModelService extends BaseService { boolean breakAutoStartModel(String ids); + void updateAutoStartModel(String processinstanceId); + } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java index bbbe282..8d782af 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import lombok.NonNull; +import org.apache.commons.lang3.StringUtils; import org.flowable.engine.HistoryService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.api.history.HistoricTaskInstance; @@ -31,6 +32,8 @@ import org.springblade.plugin.operation.task.entity.TaskInfo; import org.springblade.plugin.operation.task.service.ITaskInfoService; import org.springblade.plugin.workbench.cache.FlowCache; import org.springblade.plugin.workbench.entity.AutoStartModel; +import org.springblade.plugin.workbench.enumutil.RepeatEnum; +import org.springblade.plugin.workbench.enumutil.RepeatTypeEnum; import org.springblade.plugin.workbench.mapper.BladeManMadeMapper; import org.springblade.plugin.workbench.service.IAutoStartModelService; import org.springblade.plugin.workbench.vo.AutoStartModelVO; @@ -39,13 +42,11 @@ import org.springblade.system.cache.SysCache; import org.springblade.system.entity.Dept; import org.springblade.system.feign.ISysClient; import org.springblade.system.user.cache.UserCache; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.validation.constraints.NotEmpty; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @Description @@ -158,5 +159,90 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl autoStartModelWrapper = Wrappers.lambdaQuery(); + autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId).eq(AutoStartModel::getIsBreak,0); + List list = this.list(autoStartModelWrapper); + if(list.size() > 0){ + list.forEach(autoStartModel -> { + autoStartModel.setStatus(10); + List variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(processinstanceId).list(); + Date qiwangwanchengshijian = DateUtil.plusDays(DateUtil.now(),1); + for(HistoricVariableInstance hv : variableList){ + switch (hv.getVariableName()){ + case "guanlibumen": + autoStartModel.setManagement(Long.valueOf(hv.getValue().toString())); + break; + case "renwufulei": + autoStartModel.setTaskParent(Long.valueOf(hv.getValue().toString())); + break; + case "renwuzhonglei": + autoStartModel.setTaskType(Long.valueOf(hv.getValue().toString())); + break; + case "renwudengji": + autoStartModel.setTaskLevel(Long.valueOf(hv.getValue().toString())); + break; + case "xitongmingchengshujuku": + autoStartModel.setOperateSys(Long.valueOf(hv.getValue().toString())); + break; + case "xitongmokuaishujubiao": + autoStartModel.setOperateModule(Long.valueOf(hv.getValue().toString())); + break; + case "chongfumoshi": + autoStartModel.setRepeatMode(Long.valueOf(hv.getValue().toString())); + break; + case "qiwangwanchengshijian": + qiwangwanchengshijian = DateUtil.parse(hv.getValue().toString(),"yyyy-MM-dd HH:mm:ss"); + break; + case "type": + autoStartModel.setRepeatMode(Long.valueOf(hv.getValue().toString())); + break; + } + } + //获取工作流的开始时间 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstanceId).singleResult(); + Date startTime = historicProcessInstance.getStartTime(); + Date nextStartTime; + Date nextEndTime; + //获取任务重复模式 + Long repeatMode = autoStartModel.getRepeatMode(); + System.out.println(Long.valueOf(RepeatEnum.每周.getCode())); + System.out.println(repeatMode); + if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode.toString())){ + nextStartTime = DateUtil.plusWeeks(startTime,1); + nextEndTime = DateUtil.plusWeeks(qiwangwanchengshijian,1); + }else if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode.toString())){ + nextStartTime = DateUtil.plusMonths(startTime,1); + nextEndTime = DateUtil.plusMonths(qiwangwanchengshijian,1); + }else if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode.toString())){ + nextStartTime = DateUtil.plusMonths(startTime,3); + nextEndTime = DateUtil.plusMonths(qiwangwanchengshijian,3); + }else if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode.toString())){ + nextStartTime = DateUtil.plusDays(startTime,1); + nextEndTime = DateUtil.plusDays(qiwangwanchengshijian,1); + }else if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode.toString())){ + nextStartTime = DateUtil.plusMinutes(startTime,1); + nextEndTime = DateUtil.plusMinutes(qiwangwanchengshijian,1); + } + else{ + return; + } + autoStartModel.setNextStartTime(nextStartTime); + autoStartModel.setNextEndTime(nextEndTime); + autoStartModel.setNextFlag(0); + baseMapper.updateById(autoStartModel); + }); + } + } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/WorkflowApplication.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/WorkflowApplication.java index fee7997..d69872f 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/WorkflowApplication.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/WorkflowApplication.java @@ -3,9 +3,11 @@ package org.springblade.plugin.workflow; import org.springblade.core.cloud.feign.EnableBladeFeign; import org.springblade.core.launch.BladeApplication; import org.springframework.cloud.client.SpringCloudApplication; +import org.springframework.scheduling.annotation.EnableAsync; @EnableBladeFeign @SpringCloudApplication +@EnableAsync public class WorkflowApplication { public static void main(String[] args) { diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java index 2f402f1..80a2576 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java @@ -181,16 +181,19 @@ public class WfProcessService implements IWfProcessService { variables.put(WfProcessConstant.TASK_VARIABLE_APPLY_USER, userId); variables.put(WfProcessConstant.TASK_CREATE_ROLE, createRoleName); - //判断该手动发起任务是否已经发起过,或者时不重复任务 + //如果是不重复任务,直接发起 if(StringUtils.equals(variables.get("$chongfumoshi").toString(),"不重复")){ // 启动流程 identityService.setAuthenticatedUserId(userId); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables); return handleProcessInstance(processInstance, variables); - }else if(this.isRepeatProcess(variables) && StringUtils.equals(variables.get("forcestart").toString(),"0")){ - return "类似任务已经发起过,是否要强制发起"; - }else{ + } + //这里目前还有问题,有时候不提示。而且目前客户不需要此功能 +// else if(this.isRepeatProcess(variables) && StringUtils.equals(variables.get("forcestart").toString(),"0")){ +// return "类似任务已经发起过,是否要强制发起"; +// } + else{ //如果是技术员发起的一般任务,直接指定assignee = 公司 if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){ variables.put("assignee",variables.get("yunweigongsi")); @@ -220,7 +223,7 @@ public class WfProcessService implements IWfProcessService { autoStartModel.setOperateModule(Long.valueOf(variables.get("xitongmokuaishujubiao").toString())); autoStartModel.setCreateTime(processInstance.getStartTime()); autoStartModelService.save(autoStartModel); - FlowCache.clearBladeManMadeCache(); +// FlowCache.clearBladeManMadeCache(); return handleProcessInstance(processInstance, variables); } @@ -755,21 +758,13 @@ public class WfProcessService implements IWfProcessService { wfCopyService.resolveCopyUser(process); } - //每次处理都要清空一下FLOW_CACHE缓存,使缓存中的参数使最新的 - CacheUtil.clear(FLOW_CACHE, Boolean.FALSE); +// //每次处理都要清空一下FLOW_CACHE缓存,使缓存中的参数使最新的 +// CacheUtil.clear(FLOW_CACHE, Boolean.FALSE); - //判断这个流程是否整体结束,如果整体结束,修改blade_flow_autostart_model status = 10,也就是说此任务可以重复执行了 + //判断这个流程是否整体结束,如果整体结束,修改变量值,并且修改blade_flow_autostart_model status = 10,也就是说此任务可以重复执行了 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).finished().singleResult(); if(Func.isNotEmpty(historicProcessInstance)){ - LambdaQueryWrapper autoStartModelWrapper = Wrappers.lambdaQuery(); - autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId()); - List list = autoStartModelService.list(autoStartModelWrapper); - if(list.size() > 0){ - list.forEach(autoStartModel -> { - autoStartModel.setStatus(10); - autoStartModelService.updateById(autoStartModel); - }); - } + autoStartModelService.updateAutoStartModel(task.getProcessInstanceId()); } return R.success("操作成功");