1.重新设计工单创建流程并实现编码

main
yitonglei 3 years ago
parent 400abc21f9
commit 21930ade44
  1. 48
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/TaskConfig.java
  2. 13
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/ProcessEndListener.java
  3. 44
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/listener/WorkOrderLineListener.java
  4. 2
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java
  5. 9
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java
  6. 6
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java
  7. 358
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java
  8. 1
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java
  9. 45
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/MyDateUtil.java
  10. 55
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatMonthClass.java
  11. 16
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatNoClass.java
  12. 13
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatOperation.java
  13. 63
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatQuarterClass.java
  14. 70
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.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<AutoStartModel> 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<AutoStartModel> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AutoStartModel::getNextFlag, 1).eq(AutoStartModel::getIsBreak,0).eq(AutoStartModel::getStatus,10);
List<AutoStartModel> 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());
});
}
}
}

@ -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<String, Object> variables = delegateExecution.getVariables();
Map<String, Object> 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;

@ -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();
}
}

@ -121,5 +121,7 @@ public class AutoStartModelController extends BladeController {
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE);
return R.status(autoStartModelService.breakAutoStartModel(ids));
}
}

@ -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")

@ -26,7 +26,11 @@ public interface IAutoStartModelService extends BaseService<AutoStartModel> {
void updateAutoStartModel(String processinstanceId,Map<String,Object> variables);
void saveStartProcess(String processinstanceId,Map<String,Object> variables);
String saveStartProcess(String processinstanceId,Map<String,Object> variables);
void newWorkOrder(String processInstanceId,Map<String,Object> variables);
String newWorkOrderAndSaveModel(String processinstanceId,Map<String,Object> variables);
void autoCreateWorkOrderByQuartz();
}

@ -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<BladeManMadeMappe
return true;
}
/**
* 整个工作流结束后根据processinstanceId更新AutoStartModel表中的该记录
* status = 10,表示可以周期性开启工单了
* 同时将该工作流中最终表单变量更新到AutoStartModel
* 其次是计算下一次工单开启时间和期望结束时间
* @param processinstanceId
*/
// @Override
//// @Async("taskExecutor")
// public void updateAutoStartModel(String processinstanceId){
// try{
// Thread.sleep(200);
// }catch (Exception e){
// e.printStackTrace();
// }
//
// //查询AutoStartModel status = 1 isBreak = 0的数据
// LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
// autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId).eq(AutoStartModel::getIsBreak,0);
// List<AutoStartModel> list = this.list(autoStartModelWrapper);
// if(list.size() > 0){
// list.forEach(autoStartModel -> {
// autoStartModel.setStatus(10);
// List<HistoricVariableInstance> 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<BladeManMadeMappe
workOrder.setMaintenanceCompany(variables.get("yunweigongsi").toString());
workOrder.setTenantId(WfTaskUtil.getTenantId());
workOrder.setProcessInstanceId(processInstanceId);
workOrder.setExpectedCompletionTime(DateUtil.parse(variables.get("qiwangwanchengshijian").toString(),"yyyy-MM-dd HH:mm:ss"));
workOrder.setExpectedCompletionTime(DateUtil.parse(variables.get("qiwangwanchengshijian").toString().substring(0,10) + " 23:59:59","yyyy-MM-dd HH:mm:ss"));
workOrder.setRepeatMode(variables.get("chongfumoshi").toString());
//如果是运维公司发起的日常任务(普通),生成工单,并标记为已完成
User applyUser = UserCache.getUser(Long.valueOf(variables.get("applyUser").toString()));
@ -357,20 +248,73 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe
}
/**
* 保存工作流程要做的事情
* 1.新建工单
* 2.保存模板数据
* 3.更新模板的下一次开始和结束时间
* @param processinstanceId
* @param variables
* @return
* "更新模板数据失败"
* 生成工单失败
* 保存工单模板数据失败
*/
@Override
public String saveStartProcess(String processinstanceId,Map<String,Object> variables){
String result = "";
//保存新增工单和工单模板数据 返回结果: “1” 成功 或 “生成工单失败” 或 “保存工单模板数据失败”
result = this.newWorkOrderAndSaveModel(processinstanceId,variables);
if(!StringUtils.equals(result,"1")) {
return result;
}else{
//更新工单模板的nestStartTime和nextEndTime
LambdaQueryWrapper<AutoStartModel> 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<String,Object> variables){
//将新增的流程实例id保存到blade_flow_autostart_model
public String newWorkOrderAndSaveModel(String processinstanceId,Map<String,Object> 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<BladeManMadeMappe
autoStartModel.setIsDeleted(0);
autoStartModel.setUploadRecord(JSON.toJSONString(variables.get("uploadrecord")));
//自动生成工单
this.newWorkOrder(autoStartModel);
//修改status = 10 nextFlag = 1,表示该记录已经生成工单了,并且该记录可以重复执行了
autoStartModel.setCreateTime(DateUtil.now());
autoStartModel.setStatus(10);
autoStartModel.setNextFlag(1);
baseMapper.insert(autoStartModel);
//自动生成工单并保存
boolean saveOrder = false;
int retrySaveOrder = 0;
while(!saveOrder && retrySaveOrder < 5){
try{
saveOrder = this.newWorkOrder(autoStartModel);
}catch (Exception e){
e.printStackTrace();
retrySaveOrder ++;
}
}
//如果生成工单失败,返回失败信息
if(!saveOrder){
result = "生成工单失败";
return result;
}
//保存模板数据
int insertModel = 0;
int retrySaveModel = 0;
//首先判断autoStartModel中是否有符合processinstanceId的记录,没有才能继续
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId);
List<AutoStartModel> 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<BladeManMadeMappe
workOrder.setFinishTime(new Date());
}
workOrder.setExpectedCompletionTime(autoStartModel.getNextEndTime());
workOrderService.save(workOrder);
save = workOrderService.save(workOrder);
return save;
}
@Override
public void autoCreateWorkOrderByQuartz(){
this.autoCreateWorkOrder();
}
//自动生成工单
private void autoCreateWorkOrder(){
synchronized (AutoStartModelServiceImpl.class){
Date now = DateUtil.now();
LambdaQueryWrapper<AutoStartModel> wrapper = Wrappers.lambdaQuery();
//nextStartTime <= 当前时间
wrapper.eq(AutoStartModel::getIsBreak, 0).le(AutoStartModel::getNextStartTime, now);
List<AutoStartModel> 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);
}
}
}
}

@ -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;

@ -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()));
}
}

@ -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<Map<String, Object>> 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);
});
}
}
}

@ -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<Map<String,Object>> list) {
}
}

@ -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<Map<String,Object>> list);
}

@ -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<Map<String, Object>> 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);
});
}
}
}

@ -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<Map<String,Object>> 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);
});
}
}
}
Loading…
Cancel
Save