1.工作流元数据保存增加了相关处理,如果中途元流程中止,元数据也会删除。

2.工作流model增加了条件,自动发起的工作流跳过中间节点直接到“运维公司执行任务”
main
yitonglei 3 years ago
parent ea02bbfdda
commit 359f051e42
  1. 116
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.java
  2. 53
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartProcessController.java
  3. 49
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/WorkBenchController.java
  4. 26
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java
  5. 10
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/IAutoStartModelService.java
  6. 96
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/AutoStartModelServiceImpl.java
  7. 17
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/service/impl/WorkBenchServiceImpl.java
  8. 51
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/util/RepeatWeekClass.java
  9. 23
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/vo/AutoStartModelVO.java
  10. 53
      lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java

@ -0,0 +1,116 @@
package org.springblade.plugin.workbench.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.plugin.workbench.entity.AutoStartModel;
import org.springblade.plugin.workbench.service.IAutoStartModelService;
import org.springblade.plugin.workbench.vo.AutoStartModelVO;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static org.springblade.core.cache.constant.CacheConstant.FLOW_CACHE;
import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
/**
* @Description 自动启动的工作流的原型信息
* @Author ytl
* @Date 2023/2/22 0022 13:06
*/
@NonDS
@RestController
@AllArgsConstructor
@RequestMapping("/autoProcess")
@Api(value = "自动启动的工作流的原型信息", tags = "自动启动的工作流的原型信息")
public class AutoStartModelController extends BladeController {
private final IAutoStartModelService autoStartModelService;
/**
* 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "分页", notes = "传入autoStartModel")
public R<IPage<AutoStartModelVO>> list(AutoStartModel model, Query query) {
IPage<AutoStartModel> page = autoStartModelService.page(Condition.getPage(query), Condition.getQueryWrapper(model));
List<AutoStartModel> records = page.getRecords();
List<AutoStartModelVO> autoStartModelVOS = autoStartModelService.setInfo(records);
IPage<AutoStartModelVO> newPage = new IPage<AutoStartModelVO>() {
@Override
public List<OrderItem> orders() {
return page.orders();
}
@Override
public List<AutoStartModelVO> getRecords() {
return autoStartModelVOS;
}
@Override
public IPage<AutoStartModelVO> setRecords(List<AutoStartModelVO> records) {
return null;
}
@Override
public long getTotal() {
return page.getTotal();
}
@Override
public IPage<AutoStartModelVO> setTotal(long total) {
return null;
}
@Override
public long getSize() {
return page.getSize();
}
@Override
public IPage<AutoStartModelVO> setSize(long size) {
return null;
}
@Override
public long getCurrent() {
return page.getCurrent();
}
@Override
public IPage<AutoStartModelVO> setCurrent(long current) {
return null;
}
};
return R.data(newPage);
}
@GetMapping("/detail")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "详情", notes = "详情")
public R detail(@RequestParam String id){
return null;
}
@PostMapping("/remove")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "逻辑删除", notes = "逻辑删除")
public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids){
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE);
return R.status(autoStartModelService.breakAutoStartModel(ids));
}
}

@ -1,53 +0,0 @@
package org.springblade.plugin.workbench.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.plugin.workbench.entity.AutoStartModel;
import org.springblade.plugin.workbench.service.IAutoStartModelService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description 自动启动的工作流的原型信息
* @Author ytl
* @Date 2023/2/22 0022 13:06
*/
@NonDS
@RestController
@AllArgsConstructor
@RequestMapping("/autoProcess")
@Api(value = "自动启动的工作流的原型信息", tags = "自动启动的工作流的原型信息")
public class AutoStartProcessController extends BladeController {
private final IAutoStartModelService autoStartModelService;
/**
* 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "分页", notes = "传入autoStartModel")
public R<IPage<AutoStartModel>> list(AutoStartModel model, Query query) {
IPage<AutoStartModel> page = autoStartModelService.page(Condition.getPage(query), Condition.getQueryWrapper(model));
return R.data(page);
}
@GetMapping("/detail")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "详情", notes = "详情")
public R detail(@RequestParam String id){
return null;
}
}

@ -4,6 +4,14 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.TaskQuery;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
@ -13,8 +21,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description 工作台
@ -30,6 +40,11 @@ import java.util.Map;
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;
@GetMapping("/repeat")
@ApiOperationSupport(order = 1)
@ -54,4 +69,38 @@ public class WorkBenchController extends BladeController {
List<Map<String, Object>> maps = bladeManMadeService.bladeManMadeVariabList();
return R.data(maps);
}
//测试的
@GetMapping("/getStatusProcess")
public void getStatusProcess(String processinstanceid){
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstanceid).singleResult();
String businessStatus = historicProcessInstance.getBusinessStatus();
String endActivityId = historicProcessInstance.getEndActivityId();
String callbackId = historicProcessInstance.getCallbackId();
String callbackType = historicProcessInstance.getCallbackType();
System.out.println("businessStatus--" + businessStatus +",endActivityId--" +endActivityId +",callbackId--" + callbackId +",callbackType--" + callbackType);
}
@GetMapping("/getNodes")
public R getNodes(String processinstancid){
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstancid).singleResult();
String processDefinitionId = historicProcessInstance.getProcessDefinitionId();
List<Process> processes = repositoryService.getBpmnModel(processDefinitionId).getProcesses();
List<FlowElement> flowElementList = new ArrayList<>();
processes.stream().forEach(p->{
flowElementList.addAll(p.getFlowElements().stream()
.filter(start ->start instanceof StartEvent)
.collect(Collectors.toList()));
flowElementList.addAll(p.getFlowElements().stream()
.filter(start ->start instanceof UserTask)
.collect(Collectors.toList()));
flowElementList.addAll(p.getFlowElements().stream()
.filter(start ->start instanceof EndEvent)
.collect(Collectors.toList()));
});
return R.data(flowElementList);
}
}

@ -6,6 +6,8 @@ import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
import org.springblade.core.tool.utils.DateUtil;
import java.util.Date;
/**
* @Description
* @Author ytl
@ -18,24 +20,46 @@ import org.springblade.core.tool.utils.DateUtil;
public class AutoStartModel extends TenantEntity {
private static final long serialVersionUID = 1L;
private String procInstId;
private String processInstanceId;
private Long processSeconds;
//发起人id
private Long applyUser;
//发起人角色名
private String applyRole;
//运维公司id
private Long maintenanceCompany;
//管理部门id
private Long management;
//任务父类id 字典
private Long taskParent;
//任务种类id
private Long taskType;
//任务等级id 字典
private Long taskLevel;
//重复模式id 字典
private Long repeatMode;
//系统名称、数据库 1 系统 2数据库
private Integer type;
//系统名称或数据库id
private Long operateSys;
//模块或数据库表id
private Long operateModule;
//是否结束 0 否 1 是
private Integer isBreak;
//结束时间
private Date breakTime;
}

@ -1,9 +1,12 @@
package org.springblade.plugin.workbench.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import org.springblade.plugin.workbench.entity.AutoStartModel;
import org.springblade.plugin.workbench.vo.AutoStartModelVO;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Map;
@ -12,8 +15,13 @@ import java.util.Map;
* @Author ytl
* @Date 2023/2/20 0020 15:36
*/
public interface IAutoStartModelService extends IService<AutoStartModel> {
public interface IAutoStartModelService extends BaseService<AutoStartModel> {
List<Map<String,Object>> bladeManMadeVariabList();
R getOne(String id);
List<AutoStartModelVO> setInfo(List<AutoStartModel> list);
boolean breakAutoStartModel(String ids);
}

@ -3,15 +3,41 @@ package org.springblade.plugin.workbench.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.plugin.operation.database.entity.DataBase;
import org.springblade.plugin.operation.database.entity.DataTable;
import org.springblade.plugin.operation.database.service.IDataBaseService;
import org.springblade.plugin.operation.database.service.IDataTableService;
import org.springblade.plugin.operation.system.entity.ModuleInfo;
import org.springblade.plugin.operation.system.entity.ProjectInfo;
import org.springblade.plugin.operation.system.service.IModuleInfoService;
import org.springblade.plugin.operation.system.service.IProjectInfoService;
import org.springblade.plugin.operation.task.entity.TaskInfo;
import org.springblade.plugin.operation.task.service.ITaskInfoService;
import org.springblade.plugin.workbench.entity.AutoStartModel;
import org.springblade.plugin.workbench.mapper.BladeManMadeMapper;
import org.springblade.plugin.workbench.service.IAutoStartModelService;
import org.springblade.plugin.workbench.vo.AutoStartModelVO;
import org.springblade.system.cache.DictBizCache;
import org.springblade.system.feign.ISysClient;
import org.springblade.system.user.cache.UserCache;
import org.springframework.stereotype.Service;
import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -28,13 +54,29 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe
private final HistoryService historyService;
private final ISysClient sysClient;
private final ITaskInfoService taskInfoService;
private final IProjectInfoService projectInfoService;
private final IModuleInfoService moduleInfoService;
private final IDataBaseService dataBaseService;
private final IDataTableService dataTableService;
@Override
public List<Map<String, Object>> bladeManMadeVariabList() {
List<AutoStartModel> autoStartModels = baseMapper.selectList(Wrappers.lambdaQuery());
LambdaQueryWrapper<AutoStartModel> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(AutoStartModel::getIsBreak, 0);
List<AutoStartModel> autoStartModels = baseMapper.selectList(queryWrapper);
List<Map<String,Object>> maps = new ArrayList<>();
if(autoStartModels.size() > 0){
autoStartModels.forEach(bl ->{
List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list();
List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcessInstanceId()).list();
Map<String,Object> variable = new HashMap<>();
variableList.forEach(va ->{
variable.put(va.getVariableName(),va.getValue());
@ -56,6 +98,56 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe
return R.data(autoStartModel);
}
@Override
public List<AutoStartModelVO> setInfo(@NonNull List<AutoStartModel> list){
List<AutoStartModelVO> lists = new ArrayList<>();
list.forEach(l->{
AutoStartModelVO copy = Func.copy(l, AutoStartModelVO.class);
copy.setTaskType(taskInfoService.getById(l.getTaskType()).getTaskTypeName());
copy.setTaskParent(DictBizCache.getById(l.getTaskParent()).getDictValue());
copy.setApplyUser(UserCache.getUser(l.getApplyUser()).getName());
copy.setDeptName(sysClient.getDeptName(l.getManagement()).getData());
copy.setRepeatMode(DictBizCache.getById(l.getRepeatMode()).getDictValue());
copy.setMaintenanceCompany(UserCache.getUser(l.getMaintenanceCompany()).getName());
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().processInstanceId(l.getProcessInstanceId())
.orderByHistoricTaskInstanceStartTime().desc().list().get(0);
copy.setTaskId(historicTaskInstance.getId());
//模块和数据表
Integer type = l.getType();
if(type == 1){//系统
ProjectInfo projectInfo = projectInfoService.getById(l.getOperateSys());
ModuleInfo moduleInfo = moduleInfoService.getById(l.getOperateModule());
copy.setOperaModule(moduleInfo.getModuleName());
copy.setOperaObject(projectInfo.getProjectName());
}else{
DataBase dataBase = dataBaseService.getById(l.getOperateSys());
DataTable dataTable = dataTableService.getById(l.getOperateModule());
copy.setOperaModule(dataTable.getDataTableName());
copy.setOperaObject(dataBase.getDataBaseName());
}
lists.add(copy);
});
return lists;
}
@Override
public boolean breakAutoStartModel(String ids) {
List<String> strings = Func.toStrList(ids);
List<AutoStartModel> modelList = new ArrayList<>();
for(String s : strings){
AutoStartModel autoStartModel = baseMapper.selectById(Long.valueOf(s));
if(Func.isNotEmpty(autoStartModel)){
autoStartModel.setIsBreak(1);
autoStartModel.setBreakTime(DateUtil.now());
baseMapper.updateById(autoStartModel);
}
}
return true;
}
}

@ -1,5 +1,7 @@
package org.springblade.plugin.workbench.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
@ -103,15 +105,17 @@ public class WorkBenchServiceImpl implements IWorkBenchService {
@Override
public void getTaskToRepeat(){
List<AutoStartModel> list = bladeManMadeService.list();
LambdaQueryWrapper<AutoStartModel> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AutoStartModel::getIsBreak, 0).eq(AutoStartModel::getStatus,10);
List<AutoStartModel> list = bladeManMadeService.list(wrapper);
Map<String,List<Map<String,Object>>> maps = new HashMap<>();
if(list.size() > 0){
for(AutoStartModel bl : list){
//历史流程变量
Map<String,Object> processVariables = new HashMap<>();
List<HistoricVariableInstance> list1 = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(bl.getProcInstId()).singleResult();
List<HistoricVariableInstance> list1 = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcessInstanceId()).list();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(bl.getProcessInstanceId()).singleResult();
list1.forEach(l ->{
processVariables.put(l.getVariableName(),l.getValue());
@ -130,6 +134,13 @@ public class WorkBenchServiceImpl implements IWorkBenchService {
//设置期望完成时间
processVariables.put("qiwangwanchengshijian", DateUtil.plusSeconds(DateUtil.now(),bl.getProcessSeconds()));
//同意设置isauto = 1
processVariables.put("isauto","1");
//负责人改为运维公司
Object yunweigongsi = processVariables.get("yunweigongsi");
processVariables.put("assignee",yunweigongsi);
Object chongfumoshi = processVariables.get("chongfumoshi");
if(Func.isNotEmpty(chongfumoshi)){
DictBiz chongfuDic = DictBizCache.getById(Long.valueOf(chongfumoshi.toString()));

@ -1,16 +1,17 @@
package org.springblade.plugin.workbench.util;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
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.springblade.core.tool.utils.DateUtil;
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;
@ -30,13 +31,22 @@ public class RepeatWeekClass implements RepeatOperation{
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(StringUtils.equals(dayOfWeek.name(),"MONDAY")){ //如果是周一才执行
if(true){
list.forEach(map ->{
identityService.setAuthenticatedUserId(map.get("applyUser").toString());
@ -60,9 +70,34 @@ public class RepeatWeekClass implements RepeatOperation{
map.put("assignee",map.get("yunweigongsi"));
}
wfProcessService.autoStartProcessInstanceById(processDefId,defKey,map);
String processInstanceId = wfProcessService.autoStartProcessInstanceById(processDefId, defKey, map);
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
// boolean b = false;
// while(!b){
// List<Task> list1 = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
// while(list1.size() > 0){
// for(Task task :list1){
// String name = task.getName();
// if(!StringUtils.contains(name,"运维公司执行任务")){
// taskService.complete(task.getId());
// try {
// Thread.sleep(2000);
// }catch (Exception e){
// e.printStackTrace();
// }
// }else{
// b = true;
// }
// }
// }
// }
});
});
}
}

@ -2,9 +2,8 @@ package org.springblade.plugin.workbench.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* @Description
@ -12,7 +11,25 @@ import java.io.Serializable;
* @Date 2023/2/22 0022 15:23
*/
@Data
@ApiModel(value = "WfCopyVO对象", description = "流程抄送")
@ApiModel(value = "AutoStartModelVO对象", description = "重复任务元数据")
public class AutoStartModelVO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String processInstanceId;
private Date createTime;
private String taskType;
private String taskParent;
private String operaModule;
private String operaObject;
private String deptName;
private String maintenanceCompany;
private String applyUser;
private String repeatMode;
private String taskId;
}

@ -3,6 +3,7 @@ package org.springblade.plugin.workflow.process.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
@ -32,6 +33,7 @@ import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.flowable.variable.api.history.HistoricVariableInstanceQuery;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.mp.support.Query;
import org.springblade.core.redis.lock.RedisLock;
import org.springblade.core.secure.utils.AuthUtil;
@ -72,6 +74,8 @@ import java.util.*;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import static org.springblade.core.cache.constant.CacheConstant.FLOW_CACHE;
@Service
@AllArgsConstructor
@SuppressWarnings("all")
@ -179,17 +183,14 @@ public class WfProcessService implements IWfProcessService {
//判断该手动发起任务是否已经发起过,或者时不重复任务
if(StringUtils.equals(variables.get("$chongfumoshi").toString(),"不重复")){
System.out.println("发起不重复任务-----");
// 启动流程
identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
return handleProcessInstance(processInstance, variables);
}else if(this.isNewProcess(variables) && Func.isEmpty(variables.get("forcestart"))){
System.out.println("提醒是否要手动发起重复任务-----");
}else if(this.isNewProcess(variables) && StringUtils.equals(variables.get("forcestart").toString(),"0")){
return "类似任务已经发起过,是否要强制发起";
}else{
System.out.println("手动发起任务-------1");
//如果是技术员发起的一般任务,直接指定assignee = 公司
if(Func.equals(createRoleName, WfProcessConstant.COMMENT_ROLE_NAME) && Func.equals(variables.get("$renwudengji"), WfProcessConstant.COMMENT_TASK_LEVEL)){
variables.put("assignee",variables.get("yunweigongsi"));
@ -199,10 +200,9 @@ public class WfProcessService implements IWfProcessService {
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, definition.getKey(), variables);
System.out.println("手动发起任务-------2");
//将新增的流程实例id保存到blade_flow_man_made
AutoStartModel autoStartModel = new AutoStartModel();
autoStartModel.setProcInstId(processInstance.getId());
autoStartModel.setProcessInstanceId(processInstance.getId());
Date startTime = processInstance.getStartTime();
Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss");
Duration between = DateUtil.between(startTime, qiwangwanchengshijian);
@ -215,7 +215,10 @@ public class WfProcessService implements IWfProcessService {
autoStartModel.setTaskType(Long.valueOf(variables.get("renwuzhonglei").toString()));
autoStartModel.setTaskLevel(Long.valueOf(variables.get("renwudengji").toString()));
autoStartModel.setRepeatMode(Long.valueOf(variables.get("chongfumoshi").toString()));
System.out.println("手动发起任务-------3");
autoStartModel.setType(Integer.parseInt(variables.get("type").toString()));
autoStartModel.setOperateSys(Long.valueOf(variables.get("xitongmingchengshujuku").toString()));
autoStartModel.setOperateModule(Long.valueOf(variables.get("xitongmokuaishujubiao").toString()));
autoStartModel.setCreateTime(processInstance.getStartTime());
autoStartModelService.save(autoStartModel);
FlowCache.clearBladeManMadeCache();
return handleProcessInstance(processInstance, variables);
@ -226,13 +229,15 @@ public class WfProcessService implements IWfProcessService {
//判断该类型的流程是否已经发起过,false:有重复的,true:没重复
private boolean isNewProcess(Map<String, Object> variables){
variables.remove("forcestart");
variables.remove("isauto");
boolean b = false;
if(autoStartModelService.list().size() ==0){
b = false;
return b;
}
List<Map<String, Object>> processInstanceVariable = FlowCache.getProcessInstanceVariable();
System.out.println(processInstanceVariable.size() + "-----------------------------");
if (processInstanceVariable.size() > 0) {
for(Map<String,Object> hi : processInstanceVariable){
boolean noEqual = this.isNoEqual(variables, hi);
@ -745,6 +750,23 @@ public class WfProcessService implements IWfProcessService {
wfCopyService.resolveCopyUser(process);
}
//每次处理都要清空一下FLOW_CACHE缓存,使缓存中的参数使最新的
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE);
//判断这个流程是否整体结束,如果整体结束,修改blade_flow_autostart_model status = 10,也就是说此任务可以重复执行了
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).finished().singleResult();
if(Func.isNotEmpty(historicProcessInstance)){
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
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("操作成功");
}
@ -901,6 +923,7 @@ public class WfProcessService implements IWfProcessService {
.activityId(nodeId).list().get(0);
if (targetRealActivityInstance.getActivityType().equals(BpmnXMLConstants.ELEMENT_EVENT_START)) {
process.setProcessInstanceId(task.getProcessInstanceId());
//撤回任务六流程,发起人发起流程之后又撤回了,相当于这个流程结束了
this.terminateProcess(process);
} else {
if (StringUtil.isNoneBlank(comment)) { // 增加评论
@ -996,6 +1019,13 @@ public class WfProcessService implements IWfProcessService {
.setComment(comment)
.setType(WfNotice.Type.TERMINATE));
//清空FLOW_CACHE缓存,并删除blade_flow_autostart_model中processinstanceid = 的记录
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE);
//task.getProcessInstanceId()
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId());
autoStartModelService.remove(autoStartModelWrapper);
return R.success("终止成功");
}
@ -1090,6 +1120,13 @@ public class WfProcessService implements IWfProcessService {
taskService.addComment(taskId, task.getProcessInstanceId(), WfProcessConstant.COMMENT_TYPE_WITHDRAW, "撤销流程");
this.dispatchTaskTo(task.getProcessInstanceId(), endEvent.getId());
//清空FLOW_CACHE缓存,并删除blade_flow_autostart_model中processinstanceid 的记录
CacheUtil.clear(FLOW_CACHE, Boolean.FALSE);
//task.getProcessInstanceId()
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId());
autoStartModelService.remove(autoStartModelWrapper);
return R.success("撤销成功");
}

Loading…
Cancel
Save