From 4e2be858f4ccbb7490b59ed584fd1c829eb4d556 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期二, 01 四月 2025 15:22:47 +0800
Subject: [PATCH] 修改审签问题

---
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java                 |    5 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java                       |    6 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java              |    9 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml                       |    5 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java          |    6 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml                      |   70 ++++++---
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java               |    6 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java  |    9 +
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java                         |    3 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java                                |    2 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java                                          |   10 
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml |   42 +++--
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java                           |    4 
 lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java             |    7 +
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java                   |  166 ++++++++++++++++++++---
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java                      |   23 ++
 lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java                           |    6 
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java                            |   14 ++
 18 files changed, 304 insertions(+), 89 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java
index 5b2adb1..462d983 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java
@@ -30,6 +30,8 @@
     private String order;
     @ApiModelProperty(value = "鏂囨。鐘舵��")
     private String docStatus;
+    @ApiModelProperty(value = "瀹$鐘舵��")
+    private String docDispatchStatus;
     @ApiModelProperty(value = "鍑哄簱鐘舵��")
     private String pullStatus;
     @ApiModelProperty(value = "鍚屾鐘舵�� 1 鏈悓姝� 2 宸插悓姝�")
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
index 7d4f340..94b49ef 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -528,6 +528,13 @@
         }else {
             queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocStatus()),"u.doc_status",docQuery.getDocStatus());
         }
+        if (docQuery.getDocDispatchStatus() != null && docQuery.getDocDispatchStatus().contains(",")) {
+            String[] docDispatchStatusArray = docQuery.getDocDispatchStatus().split(",");
+            List<Integer> docDispatchStatusList = Arrays.stream(docDispatchStatusArray).map(Integer::parseInt).collect(Collectors.toList());
+            queryWrapper.in("u.doc_dispatch_status",docDispatchStatusList);
+        }else {
+            queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocDispatchStatus()),"u.doc_dispatch_status",docQuery.getDocDispatchStatus());
+        }
         if (StrUtil.isNotEmpty(docQuery.getPullStatus())){
             if (("1").equals(docQuery.getPullStatus())){
                 queryWrapper.isNull("o.doc_id");
@@ -754,6 +761,13 @@
         }else {
             queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocStatus()),"u.doc_status",docQuery.getDocStatus());
         }
+        if (docQuery.getDocDispatchStatus() != null && docQuery.getDocDispatchStatus().contains(",")) {
+            String[] docDispatchStatusArray = docQuery.getDocDispatchStatus().split(",");
+            List<Integer> docDispatchStatusList = Arrays.stream(docDispatchStatusArray).map(Integer::parseInt).collect(Collectors.toList());
+            queryWrapper.in("u.doc_dispatch_status",docDispatchStatusList);
+        }else {
+            queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocDispatchStatus()),"u.doc_dispatch_status",docQuery.getDocDispatchStatus());
+        }
         if (StrUtil.isNotEmpty(docQuery.getPullStatus())){
             if (("1").equals(docQuery.getPullStatus())){
                 queryWrapper.isNull("o.doc_id");
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
index 16ded6a..6a2c903 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/utils/TreeBuilder.java
@@ -91,11 +91,11 @@
             });
         }
 
-        // 6. 寰幆妫�娴�
-        if (sorted.size() != nodes.size()) {
-            handleSortingFailure(nodes, sorted, nodeMap);
-            return Collections.emptyList();
-        }
+//        // 6. 寰幆妫�娴�
+//        if (sorted.size() != nodes.size()) {
+//            handleSortingFailure(nodes, sorted, nodeMap);
+//            return Collections.emptyList();
+//        }
         return sorted;
     }
 
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java
index 6e7f712..6d338fb 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java
@@ -13,6 +13,8 @@
 import org.jeecg.modules.dncFlow.entity.DispatchFile;
 import org.jeecg.modules.dncFlow.service.IDispatchFileService;
 import org.jeecg.modules.dncFlow.vo.DispatchFileFlowTaskVo;
+import org.jeecg.modules.flowable.domain.dto.FlowTaskDto;
+import org.jeecg.modules.flowable.service.IHisWorkTaskService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
@@ -35,6 +37,8 @@
 	@Autowired
 	private IDispatchFileService dispatchFileService;
 
+	@Autowired
+	private IHisWorkTaskService hisWorkTaskService;
 	/**
 	 * 鍒嗛〉鍒楄〃鏌ヨ
 	 *
@@ -59,14 +63,14 @@
 
 	 /**
 	  * 閲嶆柊鍚姩
-	  * @param id
+	  * @param dispatchFileFlowTaskVo
 	  * @return
 	  */
 	 @AutoLog(value = "nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩")
 	 @ApiOperation(value="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩", notes="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-閲嶆柊鍚姩")
-	 @GetMapping(value = "/saveDispatchFile")
-	 public Result<?> saveDispatchFile(String id){
-		 return dispatchFileService.reStartDispatchFile(id);
+	 @PostMapping(value = "/saveDispatchFile")
+	 public Result<?> saveDispatchFile(@RequestBody DispatchFileFlowTaskVo dispatchFileFlowTaskVo){
+		 return dispatchFileService.reStartDispatchFile(dispatchFileFlowTaskVo);
 	 }
 
 
@@ -77,11 +81,18 @@
 	  */
 	 @AutoLog(value = "nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔")
 	 @ApiOperation(value="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔", notes="nc绋嬪簭涓庣數瀛愬浘鐗堢娲�-瀹℃壒鎿嶄綔")
-	 @GetMapping(value = "/approval")
-	 public Result<?> approval(DispatchFileFlowTaskVo dispatchFileFlowTaskVo){
+	 @PostMapping(value = "/approval")
+	 public Result<?> approval(@RequestBody DispatchFileFlowTaskVo dispatchFileFlowTaskVo){
 		 return dispatchFileService.auditDispatchFile(dispatchFileFlowTaskVo);
 	 }
 
+
+	 @ApiOperation(value = "鑾峰彇宸ヤ綔娴佸巻鍙蹭换鍔�", response = FlowTaskDto.class)
+	 @GetMapping(value = "/queryHisTaskList")
+	 public Result<?> queryHisTaskList(@RequestParam(name = "procInstId") String procInstId) {
+		 return Result.OK(hisWorkTaskService.queryHisTaskByProcInstId(procInstId));
+	 }
+
 	/**
 	 *   娣诲姞
 	 *
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java
index cdacf7e..7502bd7 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java
@@ -22,9 +22,9 @@
 
     /**
      * 閲嶆柊鍚姩
-     * @param id
+     * @param dispatchFileFlowTaskVo
      */
-    Result<?> reStartDispatchFile(String id);
+    Result<?> reStartDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo);
 
     /**
      * 瀹℃壒鎿嶄綔
diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java
index b768b7e..6ffcbf9 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java
@@ -1,11 +1,14 @@
 package org.jeecg.modules.dncFlow.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.common.collect.Lists;
 import org.apache.shiro.SecurityUtils;
+import org.flowable.common.engine.api.FlowableException;
 import org.flowable.engine.TaskService;
+import org.flowable.identitylink.api.IdentityLink;
+import org.flowable.task.api.Task;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.dnc.entity.*;
@@ -27,15 +30,14 @@
 import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
 import org.jeecg.modules.flowable.service.IFlowDefinitionService;
 import org.jeecg.modules.flowable.service.IFlowTaskService;
+import org.jeecg.modules.system.service.ISysUserRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @Description: nc绋嬪簭涓庣數瀛愬浘鐗堢娲�
@@ -69,6 +71,8 @@
     private IFlowMyBusinessService flowMyBusinessService;
     @Autowired
     private DocInfoMapper docInfoMapper;
+    @Autowired
+    private ISysUserRoleService sysUserRoleService;
     /**
      * 娴佺▼鍚姩,淇濆瓨瀵瑰簲鐨勬暟鎹�
      * @param dispatchFile
@@ -95,6 +99,7 @@
         Map<String, Object> variables = new HashMap<>();
         variables.put("dataId", dispatchFile.getId());
         variables.put("organization", "瀵煎叆鏂囨。榛樿鍚姩娴佺▼");
+        variables.put("comment", "瀵煎叆鏂囨。榛樿鍚姩娴佺▼");
         variables.put("proofreading",true);
         Result result= flowDefinitionService.startProcessInstanceByKey("nc_dispatch_file", variables);
         if (!result.isSuccess()) {
@@ -108,26 +113,116 @@
 
     /**
      * 閲嶆柊鍚姩
-     * @param id
+     * @param dispatchFileFlowTaskVo
      */
     @Override
     @Transactional(rollbackFor = {Exception.class})
-    public Result<?> reStartDispatchFile(String id){
-        DispatchFile dispatchFile = this.getById(id);
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        if (!dispatchFile.getCreateBy().equals(user.getUsername())){
-            return Result.error("鎮ㄦ病鏈夋潈闄愰噸鏂板惎鍔�");
+    public Result<?> reStartDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo) {
+        try {
+            // 1. 鑾峰彇褰撳墠鐢ㄦ埛骞舵牎楠岀櫥褰曠姸鎬�
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            if (user == null) {
+                return Result.error("鐢ㄦ埛鏈櫥褰�");
+            }
+
+            // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛�
+            List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                    new QueryWrapper<FlowMyBusiness>()
+                            .eq("process_instance_id", dispatchFileFlowTaskVo.getInstanceId())
+            );
+            if (businessList.isEmpty()) {
+                return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
+            }
+            FlowMyBusiness flowMyBusiness = businessList.get(0);
+
+            // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉
+            List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+            if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
+                return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+            }
+
+            // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛�
+            String taskId = flowMyBusiness.getTaskId();
+            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+            if (task == null) {
+                return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
+            }
+            if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+                return Result.error("浠诲姟宸茶浠栦汉璁ら");
+            }
+            taskService.claim(taskId, user.getUsername());
+
+            // 5. 瀹屾垚浠诲姟骞朵紶閫掑彉閲�
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("dataId", flowMyBusiness.getDataId());
+            variables.put("organization", dispatchFileFlowTaskVo.getComment());
+            variables.put("assignee", user.getUsername());
+            variables.put("comment", dispatchFileFlowTaskVo.getComment());
+            taskService.complete(taskId, variables);
+
+            // 6. 鑾峰彇涓嬩竴浠诲姟骞舵洿鏂颁笟鍔¤褰�
+            List<Task> nextTasks = taskService.createTaskQuery()
+                    .processInstanceId(dispatchFileFlowTaskVo.getInstanceId())
+                    .list();
+            if (!nextTasks.isEmpty()) {
+                Task nextTask = nextTasks.get(0); // 鍋囪鍙栫涓�涓换鍔�
+                flowMyBusiness.setTaskId(nextTask.getId());
+                flowMyBusiness.setTaskName(nextTask.getName());
+
+                // 鍔ㄦ�佽幏鍙栦笅涓�鑺傜偣鍊欓�変汉锛堢ず渚嬶級
+                List<String> nextTodoUsers = getNextTaskCandidates(nextTask.getId());
+                flowMyBusiness.setTodoUsers(JSON.toJSONString(nextTodoUsers));
+            } else {
+                // 娴佺▼宸茬粨鏉燂紝娓呯┖浠诲姟淇℃伅
+                flowMyBusiness.setTaskId(null);
+                flowMyBusiness.setTaskName(null);
+                flowMyBusiness.setTodoUsers(null);
+            }
+            flowMyBusinessService.updateById(flowMyBusiness);
+
+            return Result.ok("娴佺▼閲嶅惎鎴愬姛");
+        } catch (FlowableException e) {
+            return Result.error("娴佺▼鎿嶄綔澶辫触: " + e.getMessage());
+        } catch (Exception e) {
+            return Result.error("绯荤粺閿欒: " + e.getMessage());
         }
-        FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>()
-                .eq("data_id",dispatchFile.getId())).get(0);
-        String processInstanceId = flowMyBusiness.getProcessInstanceId();
-        Map<String, Object> variables = new HashMap<>();
-        variables.put("dataId", dispatchFile.getId());
-        variables.put("organization", "閲嶆柊鍚姩");
-        String TaskId=taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult().getId();
-        taskService.complete(TaskId, variables);
-        return Result.ok("閲嶆柊鍚姩鎴愬姛");
     }
+
+    // 杈呭姪鏂规硶锛氳幏鍙栦笅涓�浠诲姟鐨勬墍鏈夊�欓�変俊鎭紙澶勭悊浜恒�佸�欓�夌敤鎴枫�佸�欓�夌粍锛�
+    private List<String> getNextTaskCandidates(String taskId) {
+        List<IdentityLink> links = taskService.getIdentityLinksForTask(taskId);
+        List<String> candidates = new ArrayList<>();
+
+        // 1. 鑾峰彇鐩存帴澶勭悊浜猴紙assignee锛�
+        links.stream()
+                .filter(link -> "assignee".equals(link.getType()))
+                .map(IdentityLink::getUserId)
+                .filter(Objects::nonNull)
+                .forEach(candidates::add);
+
+        // 2. 鑾峰彇鍊欓�夌敤鎴峰拰鍊欓�夌粍
+        links.stream()
+                .filter(link -> "candidate".equals(link.getType()))
+                .forEach(link -> {
+                    if (link.getUserId() != null) {
+                        // 鍊欓�夌敤鎴风洿鎺ユ坊鍔�
+                        candidates.add(link.getUserId());
+                    } else if (link.getGroupId() != null) {
+                        // 鍊欓�夌粍杞崲涓哄疄闄呯敤鎴凤紙绀轰緥閫昏緫锛岄渶鏍规嵁涓氬姟瀹炵幇锛�
+                        List<String> groupUsers = convertGroupToUsers(link.getGroupId());
+                        candidates.addAll(groupUsers);
+                    }
+                });
+
+        return candidates;
+    }
+
+    // 绀轰緥鏂规硶锛氬皢鍊欓�夌粍ID杞崲涓虹敤鎴峰垪琛紙闇�鑷畾涔夊疄鐜帮級
+    private List<String> convertGroupToUsers(String groupId) {
+        // 瀹為檯涓氬姟涓皟鐢ㄦ湇鍔℃帴鍙h幏鍙栫粍鎴愬憳
+        return sysUserRoleService.getUserNameByRoleId(groupId);
+    }
+
 
     /**
      * 瀹℃壒鎿嶄綔
@@ -157,6 +252,33 @@
             if (docInfo == null) {
                 return Result.error(ActivitiCode.ACT_DOC_ERROR.toString());
             }
+
+            // 2. 鏌ヨ娴佺▼涓氬姟璁板綍锛堝鐞嗙┖缁撴灉锛�
+            List<FlowMyBusiness> businessList = flowMyBusinessService.list(
+                    new QueryWrapper<FlowMyBusiness>()
+                            .eq("process_instance_id", dispatchFileFlowTaskVo.getInstanceId())
+            );
+            if (businessList.isEmpty()) {
+                return Result.error("娴佺▼璁板綍涓嶅瓨鍦�");
+            }
+            FlowMyBusiness flowMyBusiness = businessList.get(0);
+
+            // 3. 鏍¢獙鐢ㄦ埛鏄惁涓哄�欓�夊鐞嗕汉
+            List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
+            if (todoUsers == null || !todoUsers.contains(user.getUsername())) {
+                return Result.error("鐢ㄦ埛鏃犳潈鎿嶄綔姝や换鍔�");
+            }
+
+            // 4. 璁ら浠诲姟锛堝鐞嗗凡琚棰嗙殑鎯呭喌锛�
+            String taskId = flowMyBusiness.getTaskId();
+            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
+            if (task == null) {
+                return Result.error("浠诲姟涓嶅瓨鍦ㄦ垨宸插畬鎴�");
+            }
+            if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
+                return Result.error("浠诲姟宸茶浠栦汉璁ら");
+            }
+            taskService.claim(taskId, user.getUsername());
 
             // 璁剧疆娴佺▼鍙橀噺
             Map<String, Object> values = setProcessVariables(dispatchFile, userId, dispatchFileFlowTaskVo);
@@ -203,7 +325,6 @@
         values.put("organization", dispatchFile.getOrganization());
         values.put("assignee", userId);
         values.put("comment", dispatchFileFlowTaskVo.getComment());
-
         if (StrUtil.isNotBlank(dispatchFileFlowTaskVo.getProofreadStatus())) {
             values.put("proofreadStatus", dispatchFileFlowTaskVo.getProofreadStatus());
         }
@@ -352,8 +473,7 @@
 
     @Override
     public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
-        String dataId = values.get("dataId").toString();
-        FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>().eq("data_id",dataId)).get(0);
-        return Lists.newArrayList(flowMyBusiness.getCreateBy());
+        //涓氬姟鏄惁骞查娴佺▼锛屼笟鍔″共棰勶紝娴佺▼骞查锛屾寚瀹氫汉鍛樿繘琛屽鐞�
+        return null;
     }
 }
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
index cf2f3ad..72d3f84 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
@@ -8,6 +8,10 @@
         flow_my_business.proposer,
         flow_my_business.task_name,
         flow_my_business.task_id,
+        flow_my_business.data_id AS 'dataId',
+        flow_my_business.process_definition_key,
+        flow_my_business.process_definition_id,
+        flow_my_business.process_instance_id,
         ACT_RU_TASK.ASSIGNEE_ as todoUsers,
         flow_my_business.done_Users,
         ACT_HI_PROCINST.START_TIME_ AS start_time,
@@ -41,25 +45,27 @@
     </select>
     <select id="PageListMyBusiness" resultType="org.jeecg.modules.flowable.domain.dto.FlowTaskDto">
         SELECT
-            task.ID_ as 'hisProcInsId',
-            TASK.PROC_INST_ID_ AS 'taskId',
-            ACT_RE_PROCDEF.CATEGORY_ AS 'category',
-            ACT_RE_PROCDEF.NAME_ 'procDefName',
-            flow_my_business.title AS 'Description',
-            flow_my_business.data_id AS 'dataId',
-            flow_my_business.process_definition_key AS 'processDefinitionKey',
-            flow_my_business.process_definition_id AS 'processDefinitionId',
-            flow_my_business.process_instance_id AS 'processInstanceId',
-            TASK.EXECUTION_ID_ AS 'executionId',
-            task.NAME_ AS 'taskName',
-            task.DURATION_ 'duration',
-            task.START_TIME_ AS 'createTime',
-            task.END_TIME_ AS 'finishTime',
-            task.TASK_DEF_KEY_ AS 'TaskDefKey'
+        task.ID_ AS 'taskId',
+        TASK.PROC_INST_ID_ AS 'procInsId',
+        ACT_RE_PROCDEF.CATEGORY_ AS 'category',
+        ACT_RE_PROCDEF.NAME_ 'procDefName',
+        flow_my_business.title AS 'Description',
+        flow_my_business.data_id AS 'dataId',
+        flow_my_business.process_definition_key AS 'processDefinitionKey',
+        flow_my_business.process_definition_id AS 'processDefinitionId',
+        ACT_HI_PROCINST.START_TIME_ AS createTime,
+        ACT_RU_TASK.ASSIGNEE_ as todoUsers,
+        task.END_TIME_ AS 'finishTime',
+        TASK.EXECUTION_ID_ AS 'executionId',
+        task.NAME_ AS 'taskName',
+        task.DURATION_ 'duration',
+        task.TASK_DEF_KEY_ AS 'TaskDefKey'
         FROM
-            ACT_HI_TASKINST TASK
-                LEFT JOIN flow_my_business ON flow_my_business.process_instance_id = TASK.PROC_INST_ID_
-                LEFT JOIN ACT_RE_PROCDEF ON flow_my_business.process_definition_id = ACT_RE_PROCDEF.ID_
+        ACT_HI_TASKINST TASK
+        LEFT JOIN flow_my_business ON flow_my_business.process_instance_id = TASK.PROC_INST_ID_
+        LEFT JOIN ACT_RE_PROCDEF ON flow_my_business.process_definition_id = ACT_RE_PROCDEF.ID_
+        LEFT JOIN ACT_HI_PROCINST ON TASK.PROC_INST_ID_ = ACT_HI_PROCINST.ID_
+        left join ACT_RU_TASK on flow_my_business.task_id = ACT_RU_TASK.ID_
         WHERE
            TASK.END_TIME_ IS NOT NULL
         <if test="flowMyBusinessDto.currentUser != null and flowMyBusinessDto.currentUser != ''">
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java
index 4fc8beb..403bfec 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/dto/FlowTaskDto.java
@@ -113,5 +113,9 @@
     @Excel(name = "娴佺▼涓氬姟瀹炰緥id 涓�涓祦绋嬩笟鍔″敮涓�锛屾湰琛ㄤ腑涔熷敮涓�", width = 15)
     @ApiModelProperty(value = "娴佺▼涓氬姟瀹炰緥id 涓�涓祦绋嬩笟鍔″敮涓�锛屾湰琛ㄤ腑涔熷敮涓�")
     private String processInstanceId;
-
+    /**褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚嶏紝涓簎sername鐨勯泦鍚坖son瀛楃涓�*/
+    @Excel(name = "褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚�", width = 15)
+    @ApiModelProperty(value = "褰撳墠鐨勮妭鐐瑰彲浠ュ鐞嗙殑鐢ㄦ埛鍚�")
+    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
+    private String todoUsers;
 }
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java
index 3dec366..2a858bf 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java
@@ -3,6 +3,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
@@ -61,6 +62,7 @@
     /**
      * 澶勭悊浜�
      */
+    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
     private String assignee;
     /**
      * 浠诲姟鑰楁椂
@@ -70,4 +72,8 @@
      * 浠诲姟鎻忚堪
      */
     private String description;
+    /**
+     * 澶勭悊缁撴灉
+     */
+    private String sequenceFlowName;
 }
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java
index b4f9f6b..b8ed938 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java
@@ -67,6 +67,9 @@
     private String dataId;
     @ApiModelProperty(value = "鍓嶉┍鑺傜偣")
     private String preNode;
+    @ApiModelProperty(value = "鍓嶉┍鑺傜偣澶勭悊浜�")
+    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
+    private String preNodeAssignee;
 
     @ApiModelProperty(value = "娴佺▼鍚嶇О")
     private transient String flowName;
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml
index ac9df17..edb48a8 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml
@@ -24,34 +24,52 @@
             aht.START_TIME_ ASC
     </select>
     <select id="queryHisTaskByProcInstId" resultType="org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo">
-        SELECT
-            p.PROC_INST_ID_ AS procInstId,
-            p.BUSINESS_KEY_ AS businessKey,
-            p.START_TIME_ AS startTime,
-            p.END_TIME_ AS endTime,
-            a.ACT_NAME_ AS actName,
-            a.ACT_TYPE_ AS actType,
-            a.START_TIME_ AS actStartTime,
-            a.END_TIME_ AS actEndTime,
-            c.NAME_ AS taskName,
-            c.ASSIGNEE_ AS assignee,
-            CASE
-                WHEN c.DURATION_ IS NOT NULL THEN
-                    CASE
-                        WHEN FLOOR(c.DURATION_ / 1000.0) = 0 THEN NULL
-                        ELSE FLOOR(c.DURATION_ / 1000.0)
-                        END
-                ELSE NULL
-                END AS duration,
-            c.DESCRIPTION_ AS description
+        WITH ActivitySequence AS (
+            SELECT
+                p.PROC_INST_ID_ AS procInstId,
+                p.BUSINESS_KEY_ AS businessKey,
+                p.START_TIME_ AS procStartTime,
+                p.END_TIME_ AS procEndTime,
+                a.ACT_ID_,
+                COALESCE ( a.ACT_NAME_, a.ACT_ID_ ) AS actName,
+                a.ACT_TYPE_ AS actType,
+                a.START_TIME_ AS actStartTime,
+                a.END_TIME_ AS actEndTime,
+                c.NAME_ AS taskName,
+                c.ASSIGNEE_ AS assignee,
+                c.DESCRIPTION_ AS description,
+-- 浣跨敤 LEAD 鑾峰彇涓嬩竴涓椿鍔ㄤ俊鎭�
+                LEAD ( COALESCE ( a.ACT_NAME_, a.ACT_ID_ ) ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActName,
+                LEAD ( a.ACT_TYPE_ ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActType,
+                LEAD ( a.START_TIME_ ) OVER ( PARTITION BY p.PROC_INST_ID_ ORDER BY a.START_TIME_ ) AS nextActStartTime
+            FROM
+                act_hi_procinst p
+                    LEFT JOIN act_hi_actinst a ON p.PROC_INST_ID_ = a.PROC_INST_ID_
+                    AND a.ACT_TYPE_ IN ( 'userTask', 'sequenceFlow' )
+                    LEFT JOIN ACT_HI_TASKINST c ON a.TASK_ID_ = c.ID_
+            WHERE
+                p.PROC_INST_ID_ = #{procInstId}
+        ) SELECT
+              procInstId,
+              businessKey,
+-- 褰撳墠娲诲姩锛坲serTask锛変俊鎭�
+              actName AS userTaskName,
+              taskName,
+              assignee,
+              actStartTime,
+              actEndTime,
+              description,
+-- 涓嬩竴涓椿鍔紙sequenceFlow锛変俊鎭�
+              nextActName AS sequenceFlowName,
+              nextActStartTime AS sequenceFlowStartTime
         FROM
-            act_hi_procinst p
-                LEFT JOIN act_hi_actinst a ON p.PROC_INST_ID_ = a.PROC_INST_ID_
-                LEFT JOIN ACT_HI_TASKINST c ON a.TASK_ID_ = c.ID_
+            ActivitySequence
         WHERE
-            p.PROC_INST_ID_ = #{procInstId}
-          AND a.ACT_NAME_ IS NOT NULL
+            actType = 'userTask' -- 绛涢�夊綋鍓嶆椿鍔ㄤ负 userTask
+
+          AND nextActType = 'sequenceFlow' -- 涓斾笅涓�涓椿鍔ㄤ负 sequenceFlow
+
         ORDER BY
-            COALESCE(a.END_TIME_, '9999-12-31') ASC;
+            actStartTime;
     </select>
 </mapper>
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml
index 4137c80..017f4b5 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml
@@ -13,6 +13,7 @@
             atask.priority_ AS priority,
             atask.create_time_ AS createTime,
             atask.suspension_state_ AS suspensionState,
+            atask.ASSIGNEE_ as assignee,
             fmb.act_status AS actStatus,
             fmb.title AS title,
             fmb.data_id AS dataId,
@@ -26,7 +27,9 @@
             LEFT JOIN flow_my_business fmb on atask.id_ = fmb.task_id
             LEFT JOIN ACT_RE_PROCDEF pro on atask.PROC_DEF_ID_ = pro.id_
         WHERE
-            atask.assignee_ = #{flowMy.username}
+            (atask.assignee_ = #{flowMy.username}
+                OR ( atask.assignee_ IS NULL AND fmb.todo_users LIKE CONCAT('%',#{flowMy.username},'%'))
+                )
           <if test="flowMy.flowName!= null and flowMy.flowName!= ''">
               AND pro.name_ LIKE CONCAT('%',#{flowMy.flowName},'%')
           </if>
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
index ab62a88..c9ae8f1 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
@@ -994,16 +994,15 @@
             flowTaskDto.setCategory(pd.getCategory());
             // 娴佺▼鍙戣捣浜轰俊鎭�
             HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
-                    .processInstanceId(flowTaskDto.getTaskId())
+                    .processInstanceId(flowTaskDto.getProcInsId())
                     .singleResult();
             SysUser startUser = iFlowThirdService.getUserByUsername(historicProcessInstance.getStartUserId());
             flowTaskDto.setStartUserId(startUser.getUsername());
             flowTaskDto.setStartUserName(startUser.getRealname());
             List<String> departNamesByUsername = iFlowThirdService.getDepartNamesByUsername(historicProcessInstance.getStartUserId());
             flowTaskDto.setStartDeptName(CollUtil.join(departNamesByUsername,"锛�"));
-            flowTaskDto.setTaskId(flowTaskDto.getHisProcInsId());
         });
-        return Result.OK(page);
+        return Result.OK(flowTaskDtoIPage);
     }
 
     private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java
index 32fc6b0..87fa156 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java
@@ -1,19 +1,22 @@
 package org.jeecg.modules.flowable.service.impl;
 
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.ibatis.annotations.Param;
+import org.flowable.engine.HistoryService;
 import org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo;
 import org.jeecg.modules.flowable.domain.vo.HisWorkTask;
 import org.jeecg.modules.flowable.mapper.IHisWorkTaskMapper;
 import org.jeecg.modules.flowable.service.IHisWorkTaskService;
 import org.jeecg.modules.flowable.util.TimeUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 @Service
 
 public class HisWorkTaskServiceImpl extends ServiceImpl<IHisWorkTaskMapper,HisWorkTask> implements IHisWorkTaskService {
+    @Autowired
+    private HistoryService historyService;
     @Override
     public List<HisWorkTask> queryHisTaskList(String drapprovedataId) {
         return baseMapper.queryHisTaskList(drapprovedataId);
@@ -30,8 +33,8 @@
         List<FlowHistoricalVo> flowHistoricalVoList=baseMapper.queryHisTaskByProcInstId(procInstId);
         flowHistoricalVoList.forEach(flowHistoricalVo->{
             //璁$畻鏃堕棿
-            if (StrUtil.isNotEmpty(flowHistoricalVo.getDuration())){
-                flowHistoricalVo.setDuration(TimeUtil.howLongByMillis(Long.parseLong(flowHistoricalVo.getDuration()),2));
+            if (flowHistoricalVo.getActStartTime()!=null && flowHistoricalVo.getActEndTime()!=null){
+                flowHistoricalVo.setDuration(TimeUtil.howLong(flowHistoricalVo.getActStartTime(),flowHistoricalVo.getActEndTime(),2));
             }
         });
         return flowHistoricalVoList;
diff --git a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java
index 1cf95eb..ee8f6ea 100644
--- a/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java
+++ b/lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.flowable.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -23,7 +24,10 @@
             HistoricActivityInstance historicActivityInstance=flowMyBusinessService.getPreviousNode(workTaskDataVo.getId());
             if (historicActivityInstance != null){
                 workTaskDataVo.setPreNode(historicActivityInstance.getActivityName());
-                workTaskDataVo.setAssignee(historicActivityInstance.getAssignee());
+                workTaskDataVo.setPreNodeAssignee(historicActivityInstance.getAssignee());
+            }
+            if (StrUtil.isEmpty(workTaskDataVo.getAssignee())){
+                workTaskDataVo.setAssignee(flowMy.getUsername());
             }
         });
         return workTaskDataVoIPage;
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java
index 84fa63b..15f8bb8 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java
@@ -41,4 +41,11 @@
 	List<SysUser> getUsersByRoles(@Param("roleList") List<String> roleList);
 
 
+	/**
+	 * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username
+	 * @param roleId
+	 */
+	@Select("select username from sys_user where id in (select user_id from sys_user_role where role_id = #{roleId})")
+	List<String> getUserNameByRoleId(@Param("roleId") String roleId);
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java
index cb1ef5f..c0096a3 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java
@@ -22,4 +22,10 @@
      * */
     List<SysUser> queryUsersByRoles(List<String> roleList);
 
+    /**
+     * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username
+     * @param roleId
+     */
+    List<String> getUserNameByRoleId(String roleId);
+
 }
diff --git a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java
index dad8e87..463b020 100644
--- a/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java
+++ b/lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java
@@ -33,4 +33,13 @@
         return sysUserRoleMapper.getUsersByRoles(roleList);
     }
 
+    /**
+     * 閫氳繃瑙掕壊id鑾峰彇鐢ㄦ埛username
+     * @param roleId
+     */
+    @Override
+    public List<String> getUserNameByRoleId(String roleId){
+        return sysUserRoleMapper.getUserNameByRoleId(roleId);
+    }
+
 }

--
Gitblit v1.9.3