From 21930ade441846c47102560ec121092b22f93e5c Mon Sep 17 00:00:00 2001 From: yitonglei Date: Fri, 10 Mar 2023 15:28:05 +0800 Subject: [PATCH] =?UTF-8?q?1.=E9=87=8D=E6=96=B0=E8=AE=BE=E8=AE=A1=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=88=9B=E5=BB=BA=E6=B5=81=E7=A8=8B=E5=B9=B6=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springblade/plugin/config/TaskConfig.java | 48 +-- .../plugin/listener/ProcessEndListener.java | 13 +- .../listener/WorkOrderLineListener.java | 44 +++ .../controller/AutoStartModelController.java | 2 + .../controller/WorkBenchController.java | 9 +- .../service/IAutoStartModelService.java | 6 +- .../impl/AutoStartModelServiceImpl.java | 358 +++++++++++------- .../service/impl/WorkBenchServiceImpl.java | 1 - .../plugin/workbench/util/MyDateUtil.java | 45 +++ .../workbench/util/RepeatMonthClass.java | 55 --- .../plugin/workbench/util/RepeatNoClass.java | 16 - .../workbench/util/RepeatOperation.java | 13 - .../workbench/util/RepeatQuarterClass.java | 63 --- .../workbench/util/RepeatWeekClass.java | 70 ---- 14 files changed, 326 insertions(+), 417 deletions(-) create mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/WorkOrderLineListener.java create mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/MyDateUtil.java delete mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java delete mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java delete mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java delete mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java delete mode 100644 lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java 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 index 5aff01b..5232947 100644 --- 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 @@ -43,11 +43,11 @@ public class TaskConfig { * *只要autoStartModel中存在 next_flag = 0 且 is_break = 0 status = 10 * *然后 next_Start_time <= 当前时间就生成新工单并修改next_flag = 1 */ - @Scheduled(fixedDelay = 90*1000)//上次任务结束后10分钟执行一次 - @Transactional(rollbackFor = Exception.class) - @Async("taskExecutor") +// @Scheduled(fixedDelay = 90*1000)//上次任务结束后10分钟执行一次 +// @Transactional(rollbackFor = Exception.class) +// @Async("taskExecutor") public void autoStartWorkOrder(){ - + System.out.println("重复执行工单任务要开始了。。.."); LocalDate nowDay = LocalDate.now(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(AutoStartModel::getIsBreak,0).eq(AutoStartModel::getStatus,10); @@ -125,44 +125,10 @@ public class TaskConfig { } /** - * 自动计算下一次的开始和结束时间,next_flag = 1 status = 10 is_delete = 0 + * 新增工单并计算下次的时间 + * @param autoStartModel */ -// @Scheduled(fixedRate = 90*1000) -// @Transactional(rollbackFor = Exception.class) -// @Async("taskExecutor") - public void computerNextDateOfOrder(){ + private void newWorkOrderAndComputeNextTime(AutoStartModel autoStartModel){ - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(AutoStartModel::getNextFlag, 1).eq(AutoStartModel::getIsBreak,0).eq(AutoStartModel::getStatus,10); - 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); - - log.info("TaskConfig修改工单的下次结束时间{},流程id:{}",autoStartModel.getNextEndTime(),autoStartModel.getProcessInstanceId()); - }); - } } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/ProcessEndListener.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/ProcessEndListener.java index 527cb37..fb28188 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/ProcessEndListener.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/ProcessEndListener.java @@ -10,7 +10,10 @@ import org.springblade.plugin.workbench.enumutil.RepeatEnum; import org.springblade.plugin.workbench.service.IAutoStartModelService; import org.springblade.plugin.workbench.service.impl.AutoStartModelServiceImpl; import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; @@ -30,22 +33,20 @@ public class ProcessEndListener implements ExecutionListener { Map variables = delegateExecution.getVariables(); Map variablesMap = new HashMap<>(); variablesMap.putAll(variables); + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletResponse response = servletRequestAttributes.getResponse(); switch (event) { case "start": System.out.println("ProcessEndListener-start event-------------------"); - - break; - case "end": IAutoStartModelService autoStartModelService = (IAutoStartModelService) SpringContextHolder.getBean(AutoStartModelServiceImpl.class); //判断工作流的的重复模式1 if (Func.isNotEmpty(variablesMap.get("chongfumoshi")) && !StringUtils.equals(RepeatEnum.不重复.getCode(), variablesMap.get("chongfumoshi").toString())) { - //保存任务信息使任务工单可以被自动创建,测试一下是不是跟预想的一样是第一个执行的时候,第二个任务还有 autoStartModelService.saveStartProcess(processInstanceId, variablesMap); - //使任务可以自动开启,这里不用新建工单,因为TaskConfig会自动创建 -// autoStartModelService.updateAutoStartModel(processInstanceId,variables); } else {//不重复任务 autoStartModelService.newWorkOrder(processInstanceId, variablesMap); } + break; + case "end": System.out.println("ProcessEndListener-end event----------------------"); break; diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/WorkOrderLineListener.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/WorkOrderLineListener.java new file mode 100644 index 0000000..663ba8e --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/WorkOrderLineListener.java @@ -0,0 +1,44 @@ +package org.springblade.plugin.listener; + +import liquibase.pro.packaged.E; +import org.springblade.plugin.config.SpringContextHolder; +import org.springblade.plugin.workbench.service.IAutoStartModelService; +import org.springblade.plugin.workbench.service.impl.AutoStartModelServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; + +/** + * @Description 系统启动时自动创建到期未创建的工单 + * @Author ytl + * @Date 2023/3/8 0008 8:53 + */ +@Component +public class WorkOrderLineListener implements CommandLineRunner { + + private IAutoStartModelService autoStartModelService; + + + @PostConstruct + public void init(){ + autoStartModelService = (IAutoStartModelService) SpringContextHolder.getBean(AutoStartModelServiceImpl.class); + } + + @Override + public void run(String... args) throws Exception { + new Thread(){ + public void run() { + try { + System.out.println("WorkOrderLineListener执行开始了...."); + autoStartModelService.autoCreateWorkOrderByQuartz(); + System.out.println("WorkOrderLineListener执行完毕了...."); + } catch (Exception e) { + e.printStackTrace(); + } + } + }.start(); + } +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java index 3654c1a..af327d5 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java @@ -121,5 +121,7 @@ public class AutoStartModelController extends BladeController { CacheUtil.clear(FLOW_CACHE, Boolean.FALSE); return R.status(autoStartModelService.breakAutoStartModel(ids)); } + + } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java index 1e2ec4b..6dd610a 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java @@ -38,20 +38,19 @@ import java.util.stream.Collectors; @RequestMapping("/workBench") @Api(value = "工作台", tags = "工作台") public class WorkBenchController extends BladeController { + private final IWorkBenchService workBenchService; + private final IAutoStartModelService bladeManMadeService; - private final HistoryService historyService; - private final RepositoryService repositoryService; - private final RuntimeService runtimeService; - private final TaskService taskService; + private final IAutoStartModelService autoStartModelService; @GetMapping("/repeat") @ApiOperationSupport(order = 1) @ApiOperation(value = "重复开启工作流", notes = "重复开启工作流") public void repeat(){ System.out.println("执行工作台调度任务重复开启工作流。。。。。。"); - workBenchService.getTaskToRepeat(); + autoStartModelService.autoCreateWorkOrderByQuartz(); } @GetMapping("/bladeManMadeVariabList") 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 8252335..f62074d 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 @@ -26,7 +26,11 @@ public interface IAutoStartModelService extends BaseService { void updateAutoStartModel(String processinstanceId,Map variables); - void saveStartProcess(String processinstanceId,Map variables); + String saveStartProcess(String processinstanceId,Map variables); void newWorkOrder(String processInstanceId,Map variables); + + String newWorkOrderAndSaveModel(String processinstanceId,Map variables); + + void autoCreateWorkOrderByQuartz(); } 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 f023231..690348b 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 @@ -3,6 +3,7 @@ package org.springblade.plugin.workbench.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import liquibase.pro.packaged.N; import lombok.AllArgsConstructor; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; @@ -39,6 +40,7 @@ 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.util.MyDateUtil; import org.springblade.plugin.workbench.vo.AutoStartModelVO; import org.springblade.plugin.workflow.core.utils.WfTaskUtil; import org.springblade.system.cache.DictBizCache; @@ -57,7 +59,11 @@ import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotEmpty; import java.text.SimpleDateFormat; +import java.time.DayOfWeek; import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; import java.util.*; /** @@ -172,121 +178,6 @@ 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; -//// } -// //还要自动生成work_order,所以以本次的信息为依据,auto_start_model nextFlag = 1 ,表示已经生成工单了 -// autoStartModel.setNextStartTime(startTime); -// autoStartModel.setNextEndTime(qiwangwanchengshijian); -// autoStartModel.setNextFlag(1); -// baseMapper.updateById(autoStartModel); -// -// -// //生成工单 -// WorkOrder workOrder = new WorkOrder(); -// workOrder.setProcessInstanceId(autoStartModel.getProcessInstanceId()); -// workOrder.setTenantId(autoStartModel.getTenantId()); -// 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.setType(autoStartModel.getType()); -// workOrder.setOperateSys(autoStartModel.getOperateSys().toString()); -// workOrder.setOperateModule(autoStartModel.getOperateModule().toString()); -// //如果是运维公司发起的日常任务(普通),生成工单,并标记为已完成 -// if(StringUtils.equals(autoStartModel.getApplyRole(),"运维公司") && StringUtils.equals(autoStartModel.getTaskLevel().toString(),"1624973130579636225")){ -// workOrder.setIsFinish(1); -// workOrder.setFinishTime(qiwangwanchengshijian); -// } -// -// workOrderService.save(workOrder); -// }); -// } -// } /** * 重复任务生成工单并更新重复任务的元数据 @@ -343,7 +234,7 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl variables){ + String result = ""; + + //保存新增工单和工单模板数据 返回结果: “1” 成功 或 “生成工单失败” 或 “保存工单模板数据失败” + result = this.newWorkOrderAndSaveModel(processinstanceId,variables); + + if(!StringUtils.equals(result,"1")) { + return result; + }else{ + //更新工单模板的nestStartTime和nextEndTime + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId).orderByDesc(AutoStartModel::getCreateTime).last("limit 1"); + AutoStartModel autoStartModel = baseMapper.selectOne(wrapper); + + Date startTime = autoStartModel.getNextStartTime(); + Date endTime = autoStartModel.getNextEndTime(); + String repeatMode = StringUtils.isEmpty(autoStartModel.getRepeatMode().toString()) ? "" : autoStartModel.getRepeatMode().toString(); + + Date nextEndTime = this.nextTime(endTime, repeatMode); + + //如果下次结束时间大于当前记录的结束时间,才会更新 + if(DateUtil.between(endTime,nextEndTime).getSeconds() > 0){ + Date nextStartTime = this.setStartTime(nextEndTime, repeatMode); + autoStartModel.setNextStartTime(nextStartTime); + autoStartModel.setNextEndTime(nextEndTime); + + int i = baseMapper.updateById(autoStartModel); + + if(i > 0) return "1"; + } + } + return "更新模板数据失败"; + } + + /** + * 新增工单并保存模板数据,返回结果: “0” 成功 或 “生成工单失败” 或 “保存工单模板数据失败” + * @param processinstanceId + * @param variables + * @return + */ + @Transactional(rollbackFor = Exception.class) @Override - public void saveStartProcess(String processinstanceId,Map variables){ - //将新增的流程实例id保存到blade_flow_autostart_model + public String newWorkOrderAndSaveModel(String processinstanceId,Map variables){ + String result = "1"; + //根据流程表单数据创建AutoStartModel对象 AutoStartModel autoStartModel = new AutoStartModel(); autoStartModel.setProcessInstanceId(processinstanceId); - HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstanceId).singleResult(); - Date processStartTime = processInstance.getStartTime(); String chongfumoshi = variables.get("chongfumoshi") == null ? "" : variables.get("chongfumoshi").toString(); - //Date nextStartTime = this.nextDate(processStartTime,chongfumoshi); - autoStartModel.setNextStartTime(DateUtil.now()); - Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss"); - //Date nextEndTime = this.nextDate(qiwangwanchengshijian,chongfumoshi); + Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString().substring(0,10) + " 23:59:59", "yyyy-MM-dd HH:mm:ss"); + Date nextStartTime = this.setStartTime(qiwangwanchengshijian, chongfumoshi); + //第一次创建工单的开始时间和结束时间都是以工作流的期望结束时间为基准的 + autoStartModel.setNextStartTime(nextStartTime); autoStartModel.setNextEndTime(qiwangwanchengshijian); - autoStartModel.setNextFlag(0); + autoStartModel.setApplyUser(Long.valueOf(variables.get("applyUser").toString())); autoStartModel.setApplyRole(variables.get("createRole").toString()); autoStartModel.setMaintenanceCompany(Long.valueOf(variables.get("yunweigongsi").toString())); @@ -385,35 +329,115 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl autoStartModelWrapper = Wrappers.lambdaQuery(); + autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId); + List autoStartModels = baseMapper.selectList(autoStartModelWrapper); + if(autoStartModels.size() > 0) return "数据库中已经有该工作数据了"; + + while(insertModel <= 0){ + try{ + insertModel = baseMapper.insert(autoStartModel); + }catch (Exception e){ + e.printStackTrace(); + retrySaveModel ++; + } + } + //如果保存模板数据失败,返回失败信息 + if(insertModel <=0){ + result = "保存工单模板数据失败"; + return result; + } + + return result; } + //根据期望结束时间,计算开始时间 + private Date setStartTime(Date endTime,String repeatMode){ + Date startDate; + LocalDateTime localEndTime = DateUtil.fromDate(endTime); + LocalDate localDate = LocalDate.of(localEndTime.getYear(),localEndTime.getMonth(),localEndTime.getDayOfMonth()); - private Date nextDate(Date startTime, String repeatMode){ - Date endTime; + //repeatMode 为空串 + if(StringUtils.isEmpty(repeatMode) || StringUtils.isBlank(repeatMode)) return endTime; + + //每天重复 + if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode)){ + startDate = DateUtil.toDate(localDate); + return startDate; + } + //每周重复,获取当前日期所在周的周一 if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode)){ - endTime = DateUtil.plusWeeks(startTime,1); - }else if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)){ - endTime = DateUtil.plusMonths(startTime,1); - }else if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)){ - endTime = DateUtil.plusMonths(startTime,3); - }else if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode)){ - endTime = DateUtil.plusMinutes(startTime,1); - }else{ - endTime = startTime; + Date date = DateUtil.toDate(localDate); + return MyDateUtil.getFirstDayOfWeek(date); + } + //每月重复,获取当前日期所在月的第一天 + if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)){ + LocalDate firsDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); + return DateUtil.toDate(firsDayOfMonth); + } + //每季度重复,获取当前日期所在季度的首月的第一天 + if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)){ + int month = localDate.getMonth().getValue(); + if (1 <= month && month <= 3) { + localDate = localDate.withMonth(1); + } else if (4 <= month && month <= 6) { + localDate = localDate.withMonth(4); + } else if (7 <= month && month <= 9) { + localDate = localDate.withMonth(7); + } else { + localDate = localDate.withMonth(10); + } + return DateUtil.toDate(localDate); } + return endTime; + } + + //计算下次时间 + private Date nextTime(Date date,String repeatMode){ + Date now = DateUtil.now(); + + //每分钟重复 + if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode)) return DateUtil.plusMinutes(date,1); + + //每天重复 + if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode)) return DateUtil.plusDays(date,1); - return endTime; + //每周重复 + if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode)) return DateUtil.plusWeeks(date,1); + + //每月重复 + if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)) return DateUtil.plusMonths(date,1); + + //每季度重复 + if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)) return DateUtil.plusMonths(date,3); + + return now; } - private void newWorkOrder(AutoStartModel autoStartModel){ + + private boolean newWorkOrder(AutoStartModel autoStartModel){ + boolean save = false; //生成工单 WorkOrder workOrder = new WorkOrder(); workOrder.setProcessInstanceId(autoStartModel.getProcessInstanceId()); @@ -437,6 +461,48 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl wrapper = Wrappers.lambdaQuery(); + //nextStartTime <= 当前时间 + wrapper.eq(AutoStartModel::getIsBreak, 0).le(AutoStartModel::getNextStartTime, now); + List autoStartModels = baseMapper.selectList(wrapper); + autoStartModels.forEach(autoStartModel -> { + this.autoCreateWorkOrder(now,autoStartModel); + }); + } + } + + //递归生成工单并更新autoStartModel的nextSatartTime nextEndTime + private void autoCreateWorkOrder(Date now,AutoStartModel autoStartModel){ + boolean b = this.newWorkOrder(autoStartModel); + if(b){ + Date endTime = autoStartModel.getNextEndTime(); + + //计算下次开始结束时间 + Date nextEndTime = this.nextTime(endTime, autoStartModel.getRepeatMode().toString()); + Date nextStartTime = this.setStartTime(nextEndTime, autoStartModel.getRepeatMode().toString()); + + //更新 + autoStartModel.setNextStartTime(nextStartTime); + autoStartModel.setNextEndTime(nextEndTime); + baseMapper.updateById(autoStartModel); + + while(DateUtil.between(nextStartTime,now).getSeconds() >= 0){ + autoCreateWorkOrder(now,autoStartModel); + } + } } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java index 93c291e..fc4199c 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java @@ -15,7 +15,6 @@ import org.springblade.plugin.workbench.entity.AutoStartModel; import org.springblade.plugin.workbench.enumutil.RepeatTypeEnum; import org.springblade.plugin.workbench.service.IAutoStartModelService; import org.springblade.plugin.workbench.service.IWorkBenchService; -import org.springblade.plugin.workbench.util.RepeatOperation; import org.springblade.system.cache.DictBizCache; import org.springblade.system.entity.DictBiz; import org.springblade.system.user.cache.UserCache; diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/MyDateUtil.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/MyDateUtil.java new file mode 100644 index 0000000..8447b21 --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/MyDateUtil.java @@ -0,0 +1,45 @@ +package org.springblade.plugin.workbench.util; + +import org.springblade.core.tool.utils.DateUtil; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @Description + * @Author ytl + * @Date 2023/3/10 0010 9:41 + */ +public class MyDateUtil { + public static Date getFirstDayOfWeek(Date date){ + + // 转为calendar格式 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // 如果是周日 + if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { + calendar.add(Calendar.DAY_OF_YEAR,-1); + } + + /** + * calendar.get(Calendar.MONTH)+1 calendar中的月份以0开头 + * Calendar.DAY_OF_WEEK 当前日期是所在周的第几天(以周日为一周的第一天) + * Calendar.DATE 当前日期是几号 + * */ + + // 获取当前日期是当周的第i天 + int i = calendar.get(Calendar.DAY_OF_WEEK) - 1; + + // 获取当前日期所在周的第一天 + calendar.add(Calendar.DATE , -i+1); + return calendar.getTime(); +// System.out.println("当前日期所在周的周一是:" + new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime())); +// // 获取当前日期所在周的最后一天 +// calendar.add(Calendar.DATE, 6); +// System.out.println("当前日期所在周的周日是:" + new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime())); + + } + +} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java deleted file mode 100644 index 504e02c..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.springblade.plugin.workbench.util; - -import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; -import org.flowable.engine.IdentityService; -import org.springblade.core.tool.utils.Func; -import org.springblade.plugin.workflow.core.constant.WfProcessConstant; -import org.springblade.plugin.workflow.process.service.IWfProcessService; -import org.springframework.stereotype.Component; - -import java.time.DayOfWeek; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -/** - * @Description 每月执行,每月的第一天执行 - * @Author ytl - * @Date 2023/2/21 0021 14:14 - */ - -@Component(value = "repeatMonthClass") -@AllArgsConstructor -public class RepeatMonthClass implements RepeatOperation{ - private final IdentityService identityService; - - - private final IWfProcessService wfProcessService; - - @Override - public void repeat(List> list) { - LocalDateTime localDateTime = LocalDateTime.now(); - int dayOfMonth = localDateTime.getDayOfMonth(); - - if(dayOfMonth == 1){ //如果是每月第一天才执行 - list.forEach(map ->{ - identityService.setAuthenticatedUserId(map.get("applyUser").toString()); - - //definitationid - String processDefId = map.get("defid").toString(); - //defnationkey - String defKey = map.get("defkey").toString(); - - map.remove("defid"); - map.remove("defkey"); - map.remove("repeatnum"); - map.remove("processinstanceid"); - - wfProcessService.autoStartProcessInstanceById(processDefId, defKey, map); - - - }); - } - } -} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java deleted file mode 100644 index a36d573..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.springblade.plugin.workbench.util; - -import java.util.List; -import java.util.Map; - -/** - * @Description - * @Author ytl - * @Date 2023/2/20 0020 17:06 - */ -public class RepeatNoClass implements RepeatOperation{ - @Override - public void repeat(List> list) { - - } -} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java deleted file mode 100644 index abdbd90..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springblade.plugin.workbench.util; - -import java.util.List; -import java.util.Map; - -/** - * @Description 重复开启工作流 - * @Author ytl - * @Date 2023/2/20 0020 17:00 - */ -public interface RepeatOperation { - public void repeat(List> list); -} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java deleted file mode 100644 index 388fab6..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.springblade.plugin.workbench.util; - -import lombok.AllArgsConstructor; -import org.flowable.engine.IdentityService; -import org.springblade.core.tool.utils.Func; -import org.springblade.plugin.workflow.core.constant.WfProcessConstant; -import org.springblade.plugin.workflow.process.service.IWfProcessService; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.util.List; -import java.util.Map; - -/** - * @Description 每季度第一天执行 - * @Author ytl - * @Date 2023/2/21 0021 17:18 - */ -@Component(value = "repeatQuarterClass") -@AllArgsConstructor -public class RepeatQuarterClass implements RepeatOperation{ - - private final IdentityService identityService; - - - private final IWfProcessService wfProcessService; - - @Override - public void repeat(List> list) { - LocalDate now = LocalDate.now(); - LocalDate localDate = now.withDayOfMonth(1); - int month = now.getMonth().getValue(); - if (1 <= month && month <= 3) { - localDate = localDate.withMonth(1); - } else if (4 <= month && month <= 6) { - localDate = localDate.withMonth(4); - } else if (7 <= month && month <= 9) { - localDate = localDate.withMonth(7); - } else { - localDate = localDate.withMonth(10); - } -//如果是每个季度第一天 - if(now.equals(localDate)){ - list.forEach(map ->{ - - identityService.setAuthenticatedUserId(map.get("applyUser").toString()); - - //definitationid - String processDefId = map.get("defid").toString(); - //defnationkey - String defKey = map.get("defkey").toString(); - - map.remove("defid"); - map.remove("defkey"); - map.remove("repeatnum"); - map.remove("processinstanceid"); - - wfProcessService.autoStartProcessInstanceById(processDefId,defKey,map); - - }); - } - } -} diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java deleted file mode 100644 index 897fd96..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.springblade.plugin.workbench.util; - -import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; -import org.flowable.bpmn.model.FlowNode; -import org.flowable.bpmn.model.Process; -import org.flowable.cmmn.engine.impl.cmd.DeleteTaskCmd; -import org.flowable.engine.*; - -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.task.api.Task; -import org.springblade.core.tool.utils.Func; -import org.springblade.plugin.workflow.core.constant.WfProcessConstant; -import org.springblade.plugin.workflow.process.service.IWfProcessService; -import org.springframework.stereotype.Component; -import java.time.DayOfWeek; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -/** - * @Description 每周执行,每周的第一天执行 - * @Author ytl - * @Date 2023/2/20 0020 17:07 - */ -@Component(value = "repeatWeekClass") -@AllArgsConstructor -public class RepeatWeekClass implements RepeatOperation{ - - private final IdentityService identityService; - - - private final IWfProcessService wfProcessService; - - private final RuntimeService runtimeService; - - private final RepositoryService repositoryService; - - private final TaskService taskService; - - private final ManagementService managementService; - - - @Override - public void repeat(List> list) { - LocalDateTime localDateTime = LocalDateTime.now(); - DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); -//MONDAY - if(StringUtils.equals(dayOfWeek.name(),"MONDAY")){ //如果是周一才执行 -// if(true){ - list.forEach(map ->{ - identityService.setAuthenticatedUserId(map.get("applyUser").toString()); - - //definitationid - String processDefId = map.get("defid").toString(); - //defnationkey - String defKey = map.get("defkey").toString(); - - map.remove("defid"); - map.remove("defkey"); - map.remove("repeatnum"); - map.remove("processinstanceid"); - - wfProcessService.autoStartProcessInstanceById(processDefId, defKey, map); - - }); - } - - } -}