From c4ab6a24d2825f11a0de0f165667dc533c458a01 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 21 三月 2025 10:57:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java           |   46 +++++++++++
 business/src/main/resources/mapper/ProjectInfoMapper.xml                   |    2 
 flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java    |   24 ++++++
 business/src/main/java/com/ycl/controller/HiddenAdminController.java       |    1 
 flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java               |    5 +
 flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java         |   13 +++
 business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java     |   20 +++++
 flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java                 |    5 +
 flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java               |   10 ++
 flowable/src/main/resources/mapper/FlowDeployMapper.xml                    |    4 +
 flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java                |    2 
 business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java       |   20 +++-
 flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java |   22 ++++
 business/src/main/java/com/ycl/service/ProcessLogService.java              |   18 ++++
 14 files changed, 182 insertions(+), 10 deletions(-)

diff --git a/business/src/main/java/com/ycl/controller/HiddenAdminController.java b/business/src/main/java/com/ycl/controller/HiddenAdminController.java
index ddebea4..9279e00 100644
--- a/business/src/main/java/com/ycl/controller/HiddenAdminController.java
+++ b/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();
diff --git a/business/src/main/java/com/ycl/service/ProcessLogService.java b/business/src/main/java/com/ycl/service/ProcessLogService.java
index 8609d33..9c7141e 100644
--- a/business/src/main/java/com/ycl/service/ProcessLogService.java
+++ b/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
diff --git a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
index 0c2d7a4..fdf46b4 100644
--- a/business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
+++ b/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));
             });
 
             // 鑾峰彇浠e姙鑺傜偣
@@ -1353,8 +1355,10 @@
                 // 鎵╁睍鍐呭 浠e姙鐨勯�氳繃褰撳墠鏃堕棿浣滀负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");
diff --git a/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
index e3f8512..306abc1 100644
--- a/business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
+++ b/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)
diff --git a/business/src/main/resources/mapper/ProjectInfoMapper.xml b/business/src/main/resources/mapper/ProjectInfoMapper.xml
index ea83801..36801ea 100644
--- a/business/src/main/resources/mapper/ProjectInfoMapper.xml
+++ b/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">
diff --git a/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java b/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
new file mode 100644
index 0000000..bea7801
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
@@ -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锛歺p
+ * @date锛�2025/3/17 14:54
+ */
+public class RemoveDeploymentCacheCMD implements Command<Deployment> {
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    private String processDefId;
+
+    public RemoveDeploymentCacheCMD(String processDefId) {
+        this.processDefId = processDefId;
+    }
+
+    /**
+     * 濡傛灉浼犲叆浜嗘祦绋嬪畾涔塱d锛岄偅涔堝彧鍒犻櫎鐗瑰畾鐨勭紦瀛樸�傛病浼犲氨鍒犻櫎鎵�鏈夌殑缂撳瓨
+     *
+     * @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;
+    }
+}
diff --git a/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java b/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
index ed436a0..e5cdd2f 100644
--- a/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
+++ b/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}")
diff --git a/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java b/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
index ab61566..ce384f8 100644
--- a/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
+++ b/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;
diff --git a/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java b/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
index 73ba121..9bad65e 100644
--- a/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
+++ b/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;
 }
diff --git a/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java b/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
index 589c5fc..b39f3e9 100644
--- a/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
+++ b/flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
@@ -69,4 +69,9 @@
      *
      */
     private UserTask userTask;
+
+    /**
+     * 浠诲姟鐨刬d
+     */
+    private String taskId;
 }
diff --git a/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java b/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
index 0c87247..ab787aa 100644
--- a/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
+++ b/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);
 }
diff --git a/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java b/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
index 6839c33..99f5e9e 100644
--- a/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
+++ b/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);
+
+
 }
diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
index 9f7aca6..d27ae14 100644
--- a/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
+++ b/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
      *
diff --git a/flowable/src/main/resources/mapper/FlowDeployMapper.xml b/flowable/src/main/resources/mapper/FlowDeployMapper.xml
index f1d880a..632bb71 100644
--- a/flowable/src/main/resources/mapper/FlowDeployMapper.xml
+++ b/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>

--
Gitblit v1.8.0