1.修改了自动开启工单,抛弃了xxljob,改为通过注解实现

main
yitonglei 3 years ago
parent 3109a64a7e
commit 70842e9c76
  1. 30
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/AsyncPoolConfig.java
  2. 123
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/config/TaskConfig.java
  3. 6
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java
  4. 30
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/enumutil/RepeatEnum.java
  5. 2
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java
  6. 94
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java
  7. 2
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/WorkflowApplication.java
  8. 29
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.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;
}
}

@ -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<AutoStartModel> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AutoStartModel::getNextFlag, 0).eq(AutoStartModel::getIsBreak,0);
List<AutoStartModel> 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<AutoStartModel> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AutoStartModel::getNextFlag, 1).eq(AutoStartModel::getIsBreak,0);
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);
});
}
}
}

@ -64,6 +64,12 @@ public class AutoStartModel extends TenantEntity {
//结束时间 //结束时间
private Date breakTime; private Date breakTime;
//下次开始时间
private Date nextStartTime;
//下次期望结束时间
private Date nextEndTime;
//标识,下次任务的表单是否建立
private Integer nextFlag;
/** /**
* 开始时间 * 开始时间
*/ */

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

@ -24,4 +24,6 @@ public interface IAutoStartModelService extends BaseService<AutoStartModel> {
boolean breakAutoStartModel(String ids); boolean breakAutoStartModel(String ids);
void updateAutoStartModel(String processinstanceId);
} }

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.NonNull; import lombok.NonNull;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService; import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.history.HistoricTaskInstance; 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.operation.task.service.ITaskInfoService;
import org.springblade.plugin.workbench.cache.FlowCache; import org.springblade.plugin.workbench.cache.FlowCache;
import org.springblade.plugin.workbench.entity.AutoStartModel; 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.mapper.BladeManMadeMapper;
import org.springblade.plugin.workbench.service.IAutoStartModelService; import org.springblade.plugin.workbench.service.IAutoStartModelService;
import org.springblade.plugin.workbench.vo.AutoStartModelVO; 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.entity.Dept;
import org.springblade.system.feign.ISysClient; import org.springblade.system.feign.ISysClient;
import org.springblade.system.user.cache.UserCache; import org.springblade.system.user.cache.UserCache;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* @Description * @Description
@ -158,5 +159,90 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe
return true; return true;
} }
/**
* 整个工作流结束后根据processinstanceId更新AutoStartModel表中的该记录
* status = 10,表示可以周期性开启工单了
* 同时将该工作流中最终表单变量更新到AutoStartModel
* 其次是计算下一次工单开启时间和期望结束时间
* @param processinstanceId
*/
@Override
@Async("taskExecutor")
public void updateAutoStartModel(String processinstanceId){
//查询AutoStartModel status = 10 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;
}
autoStartModel.setNextStartTime(nextStartTime);
autoStartModel.setNextEndTime(nextEndTime);
autoStartModel.setNextFlag(0);
baseMapper.updateById(autoStartModel);
});
}
}
} }

@ -3,9 +3,11 @@ package org.springblade.plugin.workflow;
import org.springblade.core.cloud.feign.EnableBladeFeign; import org.springblade.core.cloud.feign.EnableBladeFeign;
import org.springblade.core.launch.BladeApplication; import org.springblade.core.launch.BladeApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableBladeFeign @EnableBladeFeign
@SpringCloudApplication @SpringCloudApplication
@EnableAsync
public class WorkflowApplication { public class WorkflowApplication {
public static void main(String[] args) { public static void main(String[] args) {

@ -181,16 +181,19 @@ public class WfProcessService implements IWfProcessService {
variables.put(WfProcessConstant.TASK_VARIABLE_APPLY_USER, userId); variables.put(WfProcessConstant.TASK_VARIABLE_APPLY_USER, userId);
variables.put(WfProcessConstant.TASK_CREATE_ROLE, createRoleName); variables.put(WfProcessConstant.TASK_CREATE_ROLE, createRoleName);
//判断该手动发起任务是否已经发起过,或者时不重复任务 //如果是不重复任务,直接发起
if(StringUtils.equals(variables.get("$chongfumoshi").toString(),"不重复")){ if(StringUtils.equals(variables.get("$chongfumoshi").toString(),"不重复")){
// 启动流程 // 启动流程
identityService.setAuthenticatedUserId(userId); identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
return handleProcessInstance(processInstance, 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 = 公司 //如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){ if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
variables.put("assignee",variables.get("yunweigongsi")); variables.put("assignee",variables.get("yunweigongsi"));
@ -220,7 +223,7 @@ public class WfProcessService implements IWfProcessService {
autoStartModel.setOperateModule(Long.valueOf(variables.get("xitongmokuaishujubiao").toString())); autoStartModel.setOperateModule(Long.valueOf(variables.get("xitongmokuaishujubiao").toString()));
autoStartModel.setCreateTime(processInstance.getStartTime()); autoStartModel.setCreateTime(processInstance.getStartTime());
autoStartModelService.save(autoStartModel); autoStartModelService.save(autoStartModel);
FlowCache.clearBladeManMadeCache(); // FlowCache.clearBladeManMadeCache();
return handleProcessInstance(processInstance, variables); return handleProcessInstance(processInstance, variables);
} }
@ -755,21 +758,13 @@ public class WfProcessService implements IWfProcessService {
wfCopyService.resolveCopyUser(process); wfCopyService.resolveCopyUser(process);
} }
//每次处理都要清空一下FLOW_CACHE缓存,使缓存中的参数使最新的 // //每次处理都要清空一下FLOW_CACHE缓存,使缓存中的参数使最新的
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE); // 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(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).finished().singleResult();
if(Func.isNotEmpty(historicProcessInstance)){ if(Func.isNotEmpty(historicProcessInstance)){
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery(); autoStartModelService.updateAutoStartModel(task.getProcessInstanceId());
autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId());
List<AutoStartModel> list = autoStartModelService.list(autoStartModelWrapper);
if(list.size() > 0){
list.forEach(autoStartModel -> {
autoStartModel.setStatus(10);
autoStartModelService.updateById(autoStartModel);
});
}
} }
return R.success("操作成功"); return R.success("操作成功");

Loading…
Cancel
Save