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 new file mode 100644 index 0000000..6beec9a --- /dev/null +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartModelController.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> list(AutoStartModel model, Query query) { + IPage page = autoStartModelService.page(Condition.getPage(query), Condition.getQueryWrapper(model)); + List records = page.getRecords(); + List autoStartModelVOS = autoStartModelService.setInfo(records); + IPage newPage = new IPage() { + @Override + public List orders() { + return page.orders(); + } + + @Override + public List getRecords() { + return autoStartModelVOS; + } + + @Override + public IPage setRecords(List records) { + return null; + } + + @Override + public long getTotal() { + return page.getTotal(); + } + + @Override + public IPage setTotal(long total) { + return null; + } + + @Override + public long getSize() { + return page.getSize(); + } + + @Override + public IPage setSize(long size) { + return null; + } + + @Override + public long getCurrent() { + return page.getCurrent(); + } + + @Override + public IPage 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)); + } +} + diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartProcessController.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartProcessController.java deleted file mode 100644 index b2f8e0b..0000000 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/controller/AutoStartProcessController.java +++ /dev/null @@ -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> list(AutoStartModel model, Query query) { - IPage 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; - } - -} 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 1595252..4491ced 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 @@ -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> 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 processes = repositoryService.getBpmnModel(processDefinitionId).getProcesses(); + List 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); + } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java index 2aa4ff5..8a9ca05 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/entity/AutoStartModel.java @@ -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; } 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 d8bc23b..e83df91 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 @@ -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 { +public interface IAutoStartModelService extends BaseService { List> bladeManMadeVariabList(); R getOne(String id); + + List setInfo(List list); + + boolean breakAutoStartModel(String ids); + } 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 654bc46..7cd7cfc 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,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> bladeManMadeVariabList() { - List autoStartModels = baseMapper.selectList(Wrappers.lambdaQuery()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(AutoStartModel::getIsBreak, 0); + List autoStartModels = baseMapper.selectList(queryWrapper); List> maps = new ArrayList<>(); if(autoStartModels.size() > 0){ autoStartModels.forEach(bl ->{ - List variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list(); + List variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcessInstanceId()).list(); Map variable = new HashMap<>(); variableList.forEach(va ->{ variable.put(va.getVariableName(),va.getValue()); @@ -56,6 +98,56 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl setInfo(@NonNull List list){ + List 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 strings = Func.toStrList(ids); + List 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; + } } 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 7921871..93c291e 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 @@ -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 list = bladeManMadeService.list(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(AutoStartModel::getIsBreak, 0).eq(AutoStartModel::getStatus,10); + List list = bladeManMadeService.list(wrapper); Map>> maps = new HashMap<>(); if(list.size() > 0){ for(AutoStartModel bl : list){ //历史流程变量 Map processVariables = new HashMap<>(); - List list1 = historyService.createHistoricVariableInstanceQuery().processInstanceId(bl.getProcInstId()).list(); - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(bl.getProcInstId()).singleResult(); + List 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())); 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 index 3ca3861..77ad13e 100644 --- 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 @@ -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> 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 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; +// } +// } +// } +// } + + + - }); + }); } } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/vo/AutoStartModelVO.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/vo/AutoStartModelVO.java index f01c21a..4b8f919 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/vo/AutoStartModelVO.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workbench/vo/AutoStartModelVO.java @@ -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; + } diff --git a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java index 509b2f9..43ae339 100644 --- a/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java +++ b/lab-plugin/lab-workflow/src/main/java/org/springblade/plugin/workflow/process/service/impl/WfProcessService.java @@ -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 variables){ + variables.remove("forcestart"); + variables.remove("isauto"); boolean b = false; if(autoStartModelService.list().size() ==0){ b = false; return b; } List> processInstanceVariable = FlowCache.getProcessInstanceVariable(); - System.out.println(processInstanceVariable.size() + "-----------------------------"); + if (processInstanceVariable.size() > 0) { for(Map 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 autoStartModelWrapper = Wrappers.lambdaQuery(); + autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId()); + List list = autoStartModelService.list(autoStartModelWrapper); + if(list.size() > 0){ + list.forEach(autoStartModel -> { + autoStartModel.setStatus(10); + autoStartModelService.updateById(autoStartModel); + }); + } + } + 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 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 autoStartModelWrapper = Wrappers.lambdaQuery(); + autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId, task.getProcessInstanceId()); + autoStartModelService.remove(autoStartModelWrapper); + return R.success("撤销成功"); }