business/src/main/java/com/ycl/controller/HiddenAdminController.java
@@ -82,7 +82,6 @@ } @GetMapping("/list") @PreAuthorize("@ss.hasPermi('hiddenAdmin:list')") @ApiOperation(value = "列表", notes = "列表") public Result list() { return hiddenAdminService.all(); business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -79,6 +79,24 @@ Boolean taskIsHangup(String taskId, String processInsId); /** * 检查任务是否容缺 * * @param taskId * @param processInsId * @return */ Boolean taskIsWait(String taskId, String processInsId); /** * 检查任务是否跳过 * * @param taskId * @param processInsId * @return */ Boolean taskIsJump(String taskId, String processInsId); /** * 检查任务是否协同办理了 * * @param taskId 任务id business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -1336,6 +1336,8 @@ if (StringUtils.isBlank(s.getDeleteReason())) { flowViewerList.add(flowViewerDto); } flowViewerDto.setHasJump(processLogService.taskIsJump(s.getTaskId(), procInsId)); flowViewerDto.setHasWait(processLogService.taskIsWait(s.getTaskId(), procInsId)); }); // 获取代办节点 @@ -1353,8 +1355,10 @@ // 扩展内容 代办的通过当前时间作为endTime ProcessCoding processCoding = processCodingMap.get(s.getTaskId()); //如果有监控数据 不反的话前端默认是进行中(蓝色) if (processCoding != null && (RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus()))) { flowViewerDto.setOvertime(processCoding.getStatus()); if (Objects.nonNull(processCoding)) { if (RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus())) { flowViewerDto.setOvertime(processCoding.getStatus()); } } flowViewerList.add(flowViewerDto); }); @@ -1402,6 +1406,7 @@ Map<String, List<FormDetailVO>> map = new HashMap<>(2); beforeNodes.stream().forEach(node -> { if (node.getCurrent()) { node.setTaskId(taskId); dataList.add(node); } else { List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery() @@ -1412,6 +1417,7 @@ .desc() .list(); if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) { node.setTaskId(beforeTasks.get(0).getId()); List<FormDetailVO> l = map.get(beforeTasks.get(0)); if (CollectionUtils.isEmpty(l)) { map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node)); @@ -1435,7 +1441,7 @@ } // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来 ProcessLogQuery query = new ProcessLogQuery(); query.setTaskDefKey(node.getUserTask().getId()); query.setTaskId(node.getTaskId()); query.setProcessInsId(finalProcessInsId); Result result = processLogService.projectProcessLogPage(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); @@ -1479,6 +1485,7 @@ Map<String, List<FormDetailVO>> map = new HashMap<>(2); beforeNodes.stream().forEach(node -> { if (node.getCurrent()) { node.setTaskId(taskId); dataList.add(node); } else { List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery() @@ -1489,6 +1496,7 @@ .desc() .list(); if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) { node.setTaskId(beforeTasks.get(0).getId()); List<FormDetailVO> l = map.get(beforeTasks.get(0)); if (CollectionUtils.isEmpty(l)) { map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node)); @@ -1512,7 +1520,7 @@ } // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来 ProcessLogQuery query = new ProcessLogQuery(); query.setTaskDefKey(node.getUserTask().getId()); query.setTaskId(node.getTaskId()); query.setProcessInsId(hisTask.getProcessInstanceId()); Result result = processLogService.projectProcessLogPage(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); @@ -1548,6 +1556,7 @@ Map<String, List<FormDetailVO>> map = new HashMap<>(2); beforeNodes.stream().forEach(node -> { if (node.getCurrent()) { node.setTaskId(taskId); dataList.add(node); } else { List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery() @@ -1558,6 +1567,7 @@ .desc() .list(); if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) { node.setTaskId(beforeTasks.get(0).getId()); List<FormDetailVO> l = map.get(beforeTasks.get(0)); if (CollectionUtils.isEmpty(l)) { map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node)); @@ -1581,7 +1591,7 @@ } // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来 ProcessLogQuery query = new ProcessLogQuery(); query.setTaskDefKey(node.getUserTask().getId()); query.setTaskId(node.getTaskId()); query.setProcessInsId(processInsId); Result result = processLogService.projectProcessLogPage(query); List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data"); business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -145,6 +145,26 @@ } @Override public Boolean taskIsWait(String taskId, String processInsId) { List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProcessLog::getProcessInsId, processInsId) .eq(ProcessLog::getTaskId, taskId) .list(); return list.stream().anyMatch(log -> ProcessLogEventTypeEnum.WAIT.equals(log.getEventType())) && list.stream().filter(log -> ProcessLogEventTypeEnum.FINISHED.equals(log.getEventType())).count() < 1; } @Override public Boolean taskIsJump(String taskId, String processInsId) { List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProcessLog::getProcessInsId, processInsId) .eq(ProcessLog::getTaskId, taskId) .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP) .list(); return list.size() > 0; } @Override public Boolean taskIsTeamwork(String taskId, String processInsId) { ProcessLog log = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProcessLog::getProcessInsId, processInsId) business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -175,7 +175,7 @@ ${query.params.dataScope} </if> </where> order by TPI.id DESC ORDER BY FIELD(TPI.used_status, 1, -1, 0, 2), TPI.gmt_create DESC </select> <select id="homeCount" parameterType="com.ycl.common.core.domain.BaseEntity" resultType="com.ycl.domain.vo.ProjectVO"> flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
New file @@ -0,0 +1,46 @@ package com.ycl.cmd; import lombok.RequiredArgsConstructor; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.persistence.deploy.DeploymentCache; import org.flowable.engine.impl.persistence.deploy.DeploymentManager; import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionCacheEntry; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.repository.Deployment; import org.springframework.util.StringUtils; /** * @author:xp * @date:2025/3/17 14:54 */ public class RemoveDeploymentCacheCMD implements Command<Deployment> { /** * 流程定义id */ private String processDefId; public RemoveDeploymentCacheCMD(String processDefId) { this.processDefId = processDefId; } /** * 如果传入了流程定义id,那么只删除特定的缓存。没传就删除所有的缓存 * * @param commandContext * @return */ @Override public Deployment execute(CommandContext commandContext) { DeploymentManager deploymentManager = CommandContextUtil.getProcessEngineConfiguration().getDeploymentManager(); DeploymentCache<ProcessDefinitionCacheEntry> deploymentCache = deploymentManager.getProcessDefinitionCache(); if (StringUtils.hasText(processDefId)) { deploymentCache.remove(processDefId); } else { deploymentCache.clear(); } return null; } } flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
@@ -152,6 +152,30 @@ return AjaxResult.success("导入成功"); } @ApiOperation(value = "修改原来部署的流程,不再以新版本部署") @Log(title = "修改原来部署的流程,不再以新版本部署", businessType = BusinessType.UPDATE) @PostMapping("/update") public AjaxResult update(@RequestBody FlowSaveXmlVo vo) { InputStream in = null; try { in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8)); flowDefinitionService.updateProcess(vo.getDeploymentId(), vo.getName(), vo.getCategory(), in); } catch (Exception e) { log.error("导入失败:", e); return AjaxResult.error(e.getMessage()); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { log.error("关闭输入流出错", e); } } return AjaxResult.success("导入成功"); } @ApiOperation(value = "发起流程") @Log(title = "发起流程", businessType = BusinessType.INSERT) @PostMapping("/start/{procDefId}") flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
@@ -12,6 +12,11 @@ public class FlowSaveXmlVo implements Serializable { /** * 流程部署id,只有二次保存时才会有 */ private String deploymentId; /** * 流程名称 */ private String name; flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
@@ -25,4 +25,14 @@ * 项目超时颜色码 green/yellow/red */ private String overtime; /** * 是否容缺了 */ private Boolean hasWait; /** * 是否跳过了 */ private Boolean hasJump; } flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
@@ -69,4 +69,9 @@ * */ private UserTask userTask; /** * 任务的id */ private String taskId; } flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
@@ -39,4 +39,6 @@ * @param query */ IPage selectDeployListWithConfigPage(IPage<FlowProcDefWithConfigDto> page, @Param("query") ProcessConfigInfoQuery query); void updateProcess(@Param("bytes") Object bytes, @Param("deployId") String deployId); } flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
@@ -37,6 +37,17 @@ void importFile(String name, String category, InputStream in); /** * 更新部署的流程,不再重新部署 * * @param deploymentId * @param name * @param category * @param in */ void updateProcess(String deploymentId, String name, String category, InputStream in); /** * 读取xml * @param deployId * @return @@ -77,4 +88,6 @@ * @return */ InputStream readImage(String deployId); } flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycl.cmd.RemoveDeploymentCacheCMD; import com.ycl.common.constant.ProcessConstants; import com.ycl.common.core.domain.AjaxResult; import com.ycl.common.core.domain.entity.SysUser; @@ -20,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.engine.ManagementService; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinitionQuery; @@ -28,6 +30,7 @@ import org.flowable.task.api.Task; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.io.IOException; @@ -50,12 +53,10 @@ public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService { private final ISysDeployFormService sysDeployFormService; private final ISysUserService sysUserService; private final ISysDeptService sysDeptService; private final FlowDeployMapper flowDeployMapper; private final ManagementService managementService; private static final String BPMN_FILE_SUFFIX = ".bpmn"; @@ -135,6 +136,21 @@ } @Override public void updateProcess(String deploymentId, String name, String category, InputStream in) { if (! StringUtils.hasText(deploymentId)) { throw new RuntimeException("该流程第一次部署,请直接选择保存按钮"); } ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); if (Objects.isNull(processDefinition)) { throw new RuntimeException("流程定义不存在"); } // 1.更新流程图数据 flowDeployMapper.updateProcess(in, deploymentId); // 2.清除该流程的缓存,使其重新加载新的流程图 managementService.executeCommand(new RemoveDeploymentCacheCMD(processDefinition.getId())); } /** * 读取xml * flowable/src/main/resources/mapper/FlowDeployMapper.xml
@@ -82,4 +82,8 @@ order by rd.deploy_time_ desc </select> <update id="updateProcess"> UPDATE act_ge_bytearray SET BYTES_ = #{bytes, jdbcType=BLOB} WHERE DEPLOYMENT_ID_ = #{deployId} AND GENERATED_ = 0 </update> </mapper>