package org.jeecg.modules.activiti.controller; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.*; import org.activiti.engine.history.HistoricIdentityLink; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricProcessInstanceQuery; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstanceQuery; import org.activiti.engine.task.Task; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.base.entity.ActBusiness; import org.jeecg.common.base.entity.ActZprocess; import org.jeecg.common.base.entity.ActivitiConstant; import org.jeecg.common.base.vo.HistoricProcessInsVo; import org.jeecg.common.base.vo.ProcessInsVo; import org.jeecg.common.base.vo.ProcessNodeVo; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.ComboModel; import org.jeecg.modules.activiti.service.impl.ActBusinessServiceImpl; import org.jeecg.modules.activiti.service.impl.ActZprocessServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author pmc */ @Slf4j @RestController @RequestMapping("/actProcessIns") @Transactional @Api(tags="流程") public class ActProcessInsController { @Autowired private ActZprocessServiceImpl actZprocessService; @Autowired private RepositoryService repositoryService; @Autowired private RuntimeService runtimeService; @Autowired private HistoryService historyService; @Autowired private TaskService taskService; @Autowired private ActBusinessServiceImpl actBusinessService; @Autowired private ISysBaseAPI sysBaseAPI; /*通过流程定义id获取第一个任务节点*/ @AutoLog(value = "流程-通过流程定义id获取第一个任务节点") @ApiOperation(value="流程-通过流程定义id获取第一个任务节点", notes="通过流程定义id获取第一个任务节点,包含可供选择的审批人、网关信息等") @RequestMapping(value = "/getFirstNode", method = RequestMethod.GET) public Result getFirstNode(@ApiParam(value = "流程定义Id" ,required = true) String procDefId, @ApiParam(value = "表名" ,required = true) String tableName, @ApiParam(value = "表id" ,required = true) String tableId){ ProcessNodeVo node = actZprocessService.getFirstNode(procDefId,tableName,tableId); return Result.ok(node); } /*获取运行中的流程实例*/ @RequestMapping(value = "/getRunningProcess", method = RequestMethod.GET) public Result getRunningProcess(@RequestParam(required = false) String name, @RequestParam(required = false) String categoryId, @RequestParam(required = false) String key ){ List list = new ArrayList<>(); ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery() .orderByProcessInstanceId().desc(); if(StrUtil.isNotBlank(name)){ query.processInstanceNameLike("%"+name+"%"); } if(StrUtil.isNotBlank(categoryId)){ query.processDefinitionCategory(categoryId); } if(StrUtil.isNotBlank(key)) { query.processDefinitionKey(key); } List processInstanceList = query.list(); processInstanceList.forEach(e -> { list.add(new ProcessInsVo(e)); }); List allUser = sysBaseAPI.queryAllUserBackCombo(); Map userMap = allUser.stream().collect(Collectors.toMap(ComboModel::getUsername, ComboModel::getTitle)); list.forEach(e -> { List identityLinks = historyService.getHistoricIdentityLinksForProcessInstance(e.getId()); for(HistoricIdentityLink hik : identityLinks){ // 关联发起人 if("starter".equals(hik.getType())&& StrUtil.isNotBlank(hik.getUserId())){ e.setApplyer(userMap.get(hik.getUserId())); } } // 关联当前任务 List taskList = taskService.createTaskQuery().processInstanceId(e.getProcInstId()).list(); if(taskList!=null&&taskList.size()==1){ e.setCurrTaskName(taskList.get(0).getName()); }else if(taskList!=null&&taskList.size()>1){ StringBuilder sb = new StringBuilder(); for(int i=0;i delInsByIds(@PathVariable String ids, @RequestParam(required = false) String reason){ if(StrUtil.isBlank(reason)){ reason = ""; } for(String id : ids.split(",")){ // 关联业务状态结束 ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult(); ActBusiness actBusiness = actBusinessService.getById(pi.getBusinessKey()); if (actBusiness!=null){ actBusiness.setStatus(ActivitiConstant.STATUS_TO_APPLY); actBusiness.setResult(ActivitiConstant.RESULT_TO_SUBMIT); actBusinessService.updateById(actBusiness); } runtimeService.deleteProcessInstance(id, ActivitiConstant.DELETE_PRE+reason); } return Result.ok("删除成功"); } /*激活或挂起流程实例*/ @RequestMapping(value = "/updateInsStatus", method = RequestMethod.POST) public Result updateStatus(@RequestParam String id, @RequestParam Integer status){ if(ActivitiConstant.PROCESS_STATUS_ACTIVE.equals(status)){ runtimeService.activateProcessInstanceById(id); }else if(ActivitiConstant.PROCESS_STATUS_SUSPEND.equals(status)){ runtimeService.suspendProcessInstanceById(id); } return Result.ok("修改成功"); } /*获取结束的的流程实例*/ @RequestMapping(value = "/getFinishedProcess", method = RequestMethod.GET) public Result getFinishedProcess(@RequestParam(required = false) String name, @RequestParam(required = false) String categoryId, @RequestParam(required = false) String key,String startDate,String endDate){ List list = new ArrayList<>(); HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().finished(). orderByProcessInstanceEndTime().desc(); if(StrUtil.isNotBlank(name)){ query.processInstanceNameLike("%"+name+"%"); } if(StrUtil.isNotBlank(categoryId)){ query.processDefinitionCategory(categoryId); } if(StrUtil.isNotBlank(key)) { query.processDefinitionKey(key); } if(StrUtil.isNotBlank(startDate)&&StrUtil.isNotBlank(endDate)){ Date start = DateUtil.parse(startDate); Date end = DateUtil.parse(endDate); query.finishedAfter(start); query.finishedBefore(DateUtil.endOfDay(end)); } List processInstanceList = query.list(); processInstanceList.forEach(e -> { list.add(new HistoricProcessInsVo(e)); }); List allUser = sysBaseAPI.queryAllUserBackCombo(); Map userMap = allUser.stream().collect(Collectors.toMap(ComboModel::getUsername, ComboModel::getTitle)); list.forEach(e -> { List identityLinks = historyService.getHistoricIdentityLinksForProcessInstance(e.getId()); for(HistoricIdentityLink hik : identityLinks){ // 关联发起人 if("starter".equals(hik.getType())&&StrUtil.isNotBlank(hik.getUserId())){ e.setApplyer(userMap.get(hik.getUserId())); } } // 关联流程表单路由 ActZprocess actProcess = actZprocessService.getById(e.getProcDefId()); if(actProcess!=null){ e.setRouteName(actProcess.getRouteName()); } // 关联业务表id和结果 ActBusiness actBusiness = actBusinessService.getById(e.getBusinessKey()); if(actBusiness!=null){ e.setTableId(actBusiness.getTableId()); e.setTableName(actBusiness.getTableName()); String reason = e.getDeleteReason(); if(reason==null){ e.setResult(ActivitiConstant.RESULT_PASS); }else if(reason.contains(ActivitiConstant.CANCEL_PRE)){ e.setResult(ActivitiConstant.RESULT_CANCEL); if(reason.length()>9){ e.setDeleteReason(reason.substring(9)); }else{ e.setDeleteReason(""); } }else if(ActivitiConstant.BACKED_FLAG.equals(reason)){ e.setResult(ActivitiConstant.RESULT_FAIL); e.setDeleteReason(""); }else if(reason.contains(ActivitiConstant.DELETE_PRE)){ e.setResult(ActivitiConstant.RESULT_DELETED); if(reason.length()>8){ e.setDeleteReason(reason.substring(8)); }else{ e.setDeleteReason(""); } }else{ e.setResult(ActivitiConstant.RESULT_PASS); } } }); return Result.ok(list); } @RequestMapping(value = "/delHistoricInsByIds/{ids}") public Result delHistoricInsByIds(@PathVariable String ids){ for(String id : ids.split(",")){ historyService.deleteHistoricProcessInstance(id); } return Result.ok("删除成功"); } }