From 07c4ad96c75dc93b39e002feb19845219fede415 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期五, 29 十一月 2024 16:49:09 +0800
Subject: [PATCH] 全部事项和待办事项查询功能完善

---
 business/src/main/java/com/ycl/domain/entity/ProjectProcess.java           |    8 
 flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java       |    4 
 business/src/main/java/com/ycl/controller/ProjectProcessController.java    |   14 +
 business/src/main/java/com/ycl/constant/TaskTypeConstant.java              |   19 +
 business/src/main/java/com/ycl/domain/query/TaskQuery.java                 |   33 +++
 business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java         |    4 
 business/src/main/resources/mapper/ProjectProcessMapper.xml                |    6 
 business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java               |  111 ++++++++++
 common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java     |   29 ++
 system/src/main/java/com/ycl/system/domain/base/AbsQuery.java              |    4 
 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java |  367 ++++++++++++++++++++++++--------
 business/src/main/java/com/ycl/service/ProjectProcessService.java          |   14 +
 business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java             |    8 
 13 files changed, 506 insertions(+), 115 deletions(-)

diff --git a/business/src/main/java/com/ycl/constant/TaskTypeConstant.java b/business/src/main/java/com/ycl/constant/TaskTypeConstant.java
new file mode 100644
index 0000000..a3f6896
--- /dev/null
+++ b/business/src/main/java/com/ycl/constant/TaskTypeConstant.java
@@ -0,0 +1,19 @@
+package com.ycl.constant;
+
+import lombok.Data;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/11/29 8:30
+ */
+public class TaskTypeConstant {
+
+    public final static String ALL = "all"; // 鍏ㄩ儴浠诲姟
+    public final static String TODO = "todo"; // 寰呭姙浠诲姟
+    public final static String CURRENT = "current"; // 褰撳墠鐜妭
+    public final static String REMAINING = "remaining"; // 鍓╀綑浠诲姟
+    public final static String TIMELY = "timely"; // 鍙婃椂瀹屾垚鐨勪换鍔�
+    public final static String WILL_OVER_TIME = "willOvertime"; // 鍗冲皢瓒呮椂浠诲姟
+    public final static String urge = "urge"; // 鐫e姙
+
+}
diff --git a/business/src/main/java/com/ycl/controller/ProjectProcessController.java b/business/src/main/java/com/ycl/controller/ProjectProcessController.java
index 9024cbf..31de96f 100644
--- a/business/src/main/java/com/ycl/controller/ProjectProcessController.java
+++ b/business/src/main/java/com/ycl/controller/ProjectProcessController.java
@@ -2,6 +2,7 @@
 
 import com.ycl.common.group.Update;
 import com.ycl.common.group.Add;
+import com.ycl.domain.query.TaskQuery;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
 import lombok.RequiredArgsConstructor;
@@ -55,10 +56,17 @@
         return projectProcessService.detail(projectId, processId);
     }
 
-    @PostMapping("/start/{projectId}/{processId}")
+    @PostMapping("/start/{projectId}/{processDefId}")
     @ApiOperation(value = "鍚姩娴佺▼", notes = "鍚姩娴佺▼")
 //    @PreAuthorize("@ss.hasPermi('projectProcess:start')")
-    public Result startProcess(@PathVariable("projectId") String projectId, @PathVariable("processId") String processId) {
-        return projectProcessService.startProcess(projectId, processId);
+    public Result startProcess(@PathVariable("projectId") String projectId, @PathVariable("processDefId") String processDefId) {
+        return projectProcessService.startProcess(projectId, processDefId);
+    }
+
+    @GetMapping("/detail/task/list")
+    @ApiOperation(value = "鑾峰彇浠诲姟鍒楄〃", notes = "鑾峰彇浠诲姟鍒楄〃")
+//    @PreAuthorize("@ss.hasPermi('projectProcess:detail')")
+    public Result taskList(TaskQuery query) {
+        return projectProcessService.taskList(query);
     }
 }
diff --git a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java
index e5609bf..7c161f1 100644
--- a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java
+++ b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java
@@ -23,12 +23,12 @@
     /** 椤圭洰ID */
     private Long projectId;
 
-    @TableField("flowable_process_id")
+    @TableField("process_def_id")
     /** 娴佺▼瀹氫箟ID */
-    private String flowableProcessId;
+    private String processDefId;
 
-    @TableField("process_instance_id")
+    @TableField("process_ins_id")
     /** 娴佺▼瀹炰緥id */
-    private String processInstanceId;
+    private String processInsId;
 
 }
diff --git a/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java b/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java
index ea3ad13..d2db186 100644
--- a/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java
+++ b/business/src/main/java/com/ycl/domain/form/ProjectProcessForm.java
@@ -28,8 +28,8 @@
     private Long projectId;
 
     @NotBlank(message = "娴佺▼ID涓嶈兘涓虹┖", groups = {Add.class, Update.class})
-    @ApiModelProperty("娴佺▼ID")
-    private String flowableProcessId;
+    @ApiModelProperty("娴佺▼瀹氫箟ID")
+    private String processDefId;
 
     public static ProjectProcess getEntityByForm(@NonNull ProjectProcessForm form, ProjectProcess entity) {
         if(entity == null) {
diff --git a/business/src/main/java/com/ycl/domain/query/TaskQuery.java b/business/src/main/java/com/ycl/domain/query/TaskQuery.java
new file mode 100644
index 0000000..d6cdfb3
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/query/TaskQuery.java
@@ -0,0 +1,33 @@
+package com.ycl.domain.query;
+
+import com.ycl.system.domain.base.AbsQuery;
+import lombok.Data;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/11/29 8:12
+ */
+@Data
+public class TaskQuery extends AbsQuery {
+
+    /**
+     * 椤圭洰id
+     */
+    private Long projectId;
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    private String processDefId;
+
+    /**
+     * 浠诲姟鍚嶇О
+     */
+    private String taskName;
+
+    /**
+     * 浠诲姟绫诲瀷
+     */
+    private String taskType;
+
+}
diff --git a/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
new file mode 100644
index 0000000..86eebff
--- /dev/null
+++ b/business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
@@ -0,0 +1,111 @@
+package com.ycl.domain.vo;
+
+import com.ycl.common.enums.business.TaskStatusEnum;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浠诲姟鍥炴樉鍐呭
+ *
+ * @author锛歺p
+ * @date锛�2024/11/29 10:59
+ */
+@Data
+public class CustomerTaskVO {
+
+    /**
+     * flowable涓殑浠诲姟id
+     */
+    private String taskId;
+
+    /**
+     * flowable娴佺▼瀹炰緥id
+     */
+    private String processInsId;
+
+    /**
+     * flowable娴佺▼瀹氫箟id
+     */
+    private String processDefId;
+
+    /**
+     * 閮ㄧ讲id
+     */
+    private String deployId;
+
+    /**
+     * 鎵цid
+     */
+    private String executionId;
+
+    /**
+     * 浠诲姟鍚嶇О
+     */
+    private String taskName;
+
+    /**
+     * 娴佺▼鍚嶇О
+     */
+    private String processName;
+
+    /**
+     * 鍙戣捣浜篿d
+     */
+    private Long promoterId;
+
+    /**
+     * 鍙戣捣浜哄鍚�
+     */
+    private String promoterName;
+
+    /**
+     * 鍙戣捣浜哄崟浣�
+     */
+    private Long promoterUnitId;
+
+    /**
+     * 鍙戣捣浜哄崟浣嶅悕绉�
+     */
+    private String promoterUnitName;
+
+    /**
+     * 澶勭悊浜�
+     */
+    private String handlerName;
+
+    /**
+     * 鍙戣捣浜篿d
+     */
+    private Long handlerId;
+
+    /**
+     * 澶勭悊浜哄崟浣峣d
+     */
+    private Long handlerUnitId;
+
+    /**
+     * 澶勭悊浜哄崟浣嶅悕绉�
+     */
+    private String handlerUnitName;
+
+    /**
+     * 鍔炵悊鏈熼檺
+     */
+    private String timeLimit;
+
+    /**
+     * 鍓╀綑鏃堕棿
+     */
+    private String remainingTime;
+
+    /**
+     * 浠诲姟鐘舵��
+     */
+    private TaskStatusEnum taskStatus;
+
+    /**
+     * 浠诲姟鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+}
diff --git a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java
index 1c0c7b1..66df29d 100644
--- a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java
+++ b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java
@@ -21,13 +21,13 @@
 @ApiModel(value = "椤圭洰绠$悊鍩虹淇℃伅琛ㄥ搷搴旀暟鎹�", description = "椤圭洰绠$悊鍩虹淇℃伅琛ㄥ搷搴旀暟鎹�")
 public class ProjectProcessVO extends ProjectInfoVO {
 
-    /** 娴佺▼id */
-    @ApiModelProperty("娴佺▼id")
-    private String flowableProcessId;
+    /** 娴佺▼瀹氫箟id */
+    @ApiModelProperty("娴佺▼瀹氫箟id")
+    private String processDefId;
 
     @ApiModelProperty("娴佺▼鍚嶇О")
     private String flowableProcessName;
 
     @ApiModelProperty("娴佺▼瀹炰緥id")
-    private String processInstanceId;
+    private String processInsId;
 }
diff --git a/business/src/main/java/com/ycl/service/ProjectProcessService.java b/business/src/main/java/com/ycl/service/ProjectProcessService.java
index 2a67244..7ef2719 100644
--- a/business/src/main/java/com/ycl/service/ProjectProcessService.java
+++ b/business/src/main/java/com/ycl/service/ProjectProcessService.java
@@ -5,6 +5,8 @@
 import com.ycl.common.base.Result;
 import com.ycl.domain.form.ProjectProcessForm;
 import com.ycl.domain.query.ProjectProcessQuery;
+import com.ycl.domain.query.TaskQuery;
+
 import java.util.List;
 
 /**
@@ -41,9 +43,17 @@
     /**
      * 鍚姩娴佺▼
      *
-     * @param processId  娴佺▼瀹氫箟id
+     * @param processDefId  娴佺▼瀹氫箟id
      * @param projectId  椤圭洰id锛屼綔涓轰笟鍔d瀛樺叆activity琛�
      * @return
      */
-    Result startProcess(String projectId, String processId);
+    Result startProcess(String projectId, String processDefId);
+
+    /**
+     * 鏌ヨ浠诲姟鍒楄〃
+     *
+     * @param query
+     * @return
+     */
+    Result taskList(TaskQuery query);
 }
diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
index 4856ea1..ab53566 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -10,10 +10,13 @@
 import com.ycl.common.core.domain.entity.SysRole;
 import com.ycl.common.core.domain.entity.SysUser;
 import com.ycl.common.enums.FlowComment;
+import com.ycl.common.enums.business.TaskStatusEnum;
 import com.ycl.common.utils.SecurityUtils;
+import com.ycl.constant.TaskTypeConstant;
 import com.ycl.domain.dto.FlowTaskDto;
 import com.ycl.domain.entity.ProjectInfo;
 import com.ycl.domain.entity.ProjectProcess;
+import com.ycl.domain.vo.CustomerTaskVO;
 import com.ycl.domain.vo.ProjectProcessDetailVO;
 import com.ycl.mapper.ProjectInfoMapper;
 import com.ycl.mapper.ProjectProcessMapper;
@@ -26,15 +29,15 @@
 import com.ycl.system.service.ISysRoleService;
 import com.ycl.system.service.ISysUserService;
 import org.apache.commons.lang3.StringUtils;
-import org.flowable.bpmn.model.BpmnModel;
-import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.*;
 import org.flowable.bpmn.model.Process;
-import org.flowable.bpmn.model.StartEvent;
 import org.flowable.engine.*;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.identitylink.api.IdentityLink;
+import org.flowable.identitylink.api.IdentityLinkInfo;
+import org.flowable.identitylink.api.history.HistoricIdentityLink;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.TaskQuery;
 import org.flowable.task.api.history.HistoricTaskInstance;
@@ -81,13 +84,62 @@
         return Result.ok().data(page.getRecords()).total(page.getTotal());
     }
 
+    @Override
+    public Result projectSetProcess(ProjectProcessForm form) {
+        // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡
+        ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper)
+                .eq(ProjectProcess::getProjectId, form.getProjectId())
+                .one();
+        if (Objects.nonNull(pp)) {
+            // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁
+            new LambdaUpdateChainWrapper<>(baseMapper)
+                    .eq(ProjectProcess::getProjectId, form.getProjectId())
+                    .set(ProjectProcess::getProcessDefId, form.getProcessDefId())
+                    .update();
+        } else {
+            ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null);
+            baseMapper.insert(entity);
+        }
+        return Result.ok("娴佺▼鍙樻洿鎴愬姛");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result startProcess(String projectId, String processDefId) {
+        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId)
+                .latestVersion().singleResult();
+        if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
+            return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�");
+        }
+        Map<String, Object> variables = new HashMap<>(2);
+        // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑
+        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+        identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
+        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
+        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId, variables);
+//        // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐�
+//        // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚
+//        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
+//        if (Objects.nonNull(task)) {
+//            taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠");
+//            taskService.complete(task.getId(), variables);
+//        }
+        // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id
+        new LambdaUpdateChainWrapper<>(baseMapper)
+                .eq(ProjectProcess::getProjectId, projectId)
+                .eq(ProjectProcess::getProcessDefId, processDefId)
+                .set(ProjectProcess::getProcessInsId, processInstance.getProcessInstanceId())
+                .update();
+        return Result.ok("娴佺▼鍚姩鎴愬姛");
+    }
+
     /**
      * 鑾峰彇娴佺▼璇︽儏
      * @param projectId
      * @return
      */
     @Override
-    public Result detail(Long projectId, String processId) {
+    public Result detail(Long projectId, String processDefId) {
         // 椤圭洰淇℃伅
         ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper)
                 .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode)
@@ -100,7 +152,7 @@
 
         ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper)
                 .eq(ProjectProcess::getProjectId, projectId)
-                .eq(ProjectProcess::getFlowableProcessId, processId)
+                .eq(ProjectProcess::getProcessDefId, processDefId)
                 .one();
         if (Objects.isNull(projectProcess)) {
             return Result.error("璇ラ」鐩湭璁剧疆娴佺▼");
@@ -113,110 +165,86 @@
 
         ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics();
         // 鐘舵�佺粺璁�
-        taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processId));
-        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInstanceId()));
+        taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId));
+        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
 //        taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
-        taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInstanceId()));
+        taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId()));
         detail.setStatistics(taskStatistics);
 
         Result result = Result.ok();
 
         // 浠e姙浠诲姟
-        this.getTodoTaskList(projectProcess.getProcessInstanceId(),"", 1, 5, result);
+        this.getTodoTaskList(projectProcess.getProcessInsId(),"", 5, 1, result);
         return result.data(detail);
     }
 
-
     @Override
-    public Result projectSetProcess(ProjectProcessForm form) {
-        // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡
-        ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper)
-                .eq(ProjectProcess::getProjectId, form.getProjectId())
+    public Result taskList(com.ycl.domain.query.TaskQuery query) {
+        // 鑾峰彇椤圭洰瀵瑰簲鐨勬祦绋嬪疄渚媔d
+        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper)
+                .eq(ProjectProcess::getProjectId, query.getProjectId())
+                .eq(ProjectProcess::getProcessDefId, query.getProcessDefId())
                 .one();
-        if (Objects.nonNull(pp)) {
-            // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁
-            new LambdaUpdateChainWrapper<>(baseMapper)
-                    .eq(ProjectProcess::getProjectId, form.getProjectId())
-                    .set(ProjectProcess::getFlowableProcessId, form.getFlowableProcessId())
-                    .update();
-        } else {
-            ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null);
-            baseMapper.insert(entity);
+        if (Objects.isNull(projectProcess)) {
+            throw new RuntimeException("璇ラ」鐩湭閰嶇疆娴佺▼");
         }
-        return Result.ok("娴佺▼鍙樻洿鎴愬姛");
+        Result ok = Result.ok();
+        switch (query.getTaskType()) {
+            case TaskTypeConstant.ALL:
+                this.getAllUserTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok);
+            case TaskTypeConstant.TODO:
+                this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int)query.getPageSize(), (int)query.getCurrentPage(), ok);
+            case TaskTypeConstant.CURRENT:
+
+            case TaskTypeConstant.REMAINING:
+
+            default:
+
+
+        }
+        return ok;
     }
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Result startProcess(String projectId, String processId) {
-        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processId)
-                .latestVersion().singleResult();
-        if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
-            return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�");
-        }
-        Map<String, Object> variables = new HashMap<>(2);
-        // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑
-        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
-        identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
-        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
-        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId, projectId, variables);
-//        // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐�
-//        // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚
-//        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
-//        if (Objects.nonNull(task)) {
-//            taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠");
-//            taskService.complete(task.getId(), variables);
-//        }
-        // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id
-        new LambdaUpdateChainWrapper<>(baseMapper)
-                .eq(ProjectProcess::getProjectId, projectId)
-                .eq(ProjectProcess::getFlowableProcessId, processId)
-                .set(ProjectProcess::getProcessInstanceId, processInstance.getProcessInstanceId())
-                .update();
-        return Result.ok("娴佺▼鍚姩鎴愬姛");
-    }
-
-
-    private void getTodoTaskList(String processInstanceId, String name, Integer pageNum, Integer pageSize, Result result) {
+    private void getTodoTaskList(String processInsId, String taskName, int pageSize, int pageNum, Result result) {
         TaskQuery taskQuery = taskService.createTaskQuery()
                 .active()
-                .processInstanceId(processInstanceId)
+                .processInstanceId(processInsId)
                 .includeProcessVariables()
                 .orderByTaskCreateTime().desc();
 
 //        TODO 浼犲叆鍚嶇О鏌ヨ涓嶅埌鏁版嵁?
-        if (StringUtils.isNotBlank(name)) {
-            taskQuery.processDefinitionNameLike(name);
+        if (StringUtils.isNotBlank(taskName)) {
+            taskQuery.processDefinitionNameLike(taskName);
         }
         result.total(taskQuery.count());
         List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize);
-        List<FlowTaskDto> flowList = new ArrayList<>();
+        List<CustomerTaskVO> vos = new ArrayList<>();
         for (Task task : taskList) {
-            FlowTaskDto flowTask = new FlowTaskDto();
+            CustomerTaskVO taskVO = new CustomerTaskVO();
             // 褰撳墠娴佺▼淇℃伅
-            flowTask.setTaskId(task.getId());
-            flowTask.setTaskDefKey(task.getTaskDefinitionKey());
-            flowTask.setCreateTime(task.getCreateTime());
-            flowTask.setProcDefId(task.getProcessDefinitionId());
-            flowTask.setExecutionId(task.getExecutionId());
-            flowTask.setTaskName(task.getName());
+            taskVO.setTaskId(task.getId());
+            taskVO.setCreateTime(task.getCreateTime());
+            taskVO.setProcessDefId(task.getProcessDefinitionId());
+            taskVO.setExecutionId(task.getExecutionId());
+            taskVO.setTaskName(task.getName());
+            taskVO.setTaskStatus(TaskStatusEnum.TODO);
             // 娴佺▼瀹氫箟淇℃伅
             ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
                     .processDefinitionId(task.getProcessDefinitionId())
                     .singleResult();
-            flowTask.setDeployId(pd.getDeploymentId());
-            flowTask.setProcDefName(pd.getName());
-            flowTask.setProcDefVersion(pd.getVersion());
-            flowTask.setProcInsId(task.getProcessInstanceId());
+            taskVO.setDeployId(pd.getDeploymentId());
+            taskVO.setProcessName(pd.getName());
+            taskVO.setProcessInsId(task.getProcessInstanceId());
 
             // 娴佺▼鍙戣捣浜轰俊鎭�
             HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                     .processInstanceId(task.getProcessInstanceId())
                     .singleResult();
             SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
-            flowTask.setStartUserId(startUser.getUserId().toString());
-            flowTask.setStartUserName(startUser.getNickName());
-            flowTask.setStartDeptName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
+            taskVO.setPromoterId(startUser.getUserId());
+            taskVO.setPromoterName(startUser.getNickName());
+            taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
+            taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null);
             // 娴佺▼澶勭悊浜轰俊鎭�
             List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
             for (IdentityLink identityLink : identityLinksForTask) {
@@ -224,34 +252,179 @@
                 if (StringUtils.isNotBlank(identityLink.getUserId())) {
                     SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                     if (Objects.nonNull(sysUser)) {
-                        flowTask.setAssigneeId(sysUser.getUserId());
+                        taskVO.setHandlerId(sysUser.getUserId());
                         if (Objects.nonNull(sysUser.getDept())) {
-                            flowTask.setAssigneeDeptName(sysUser.getDept().getDeptName());
+                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
+                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
                         }
-                        flowTask.setAssigneeName(sysUser.getNickName());
+                        taskVO.setHandlerName(sysUser.getNickName());
                     }
-                // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉�
+                    // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉�
                 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                     SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                     if (Objects.nonNull(role)) {
-                        flowTask.setAssigneeId(Long.parseLong(identityLink.getGroupId()));
-                        flowTask.setAssigneeDeptName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�");
-                        flowTask.setAssigneeName("鏆傛湭澶勭悊");
+                        taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
+                        taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�");
+                        taskVO.setHandlerName("鏆傛湭澶勭悊");
+                        taskVO.setHandlerId(null);
                     }
                 }
             }
-            flowList.add(flowTask);
+            vos.add(taskVO);
         }
-        result.put("taskList", flowList);
+        result.put("taskList", vos);
     }
 
     /**
-     * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級
+     * 鑾峰彇鎵�鏈変换鍔�
      *
-     * @param processDefinitionId  娴佺▼瀹氫箟id
+     * @param processDefinitionId 娴佺▼杩愯id
+     * @param processInsId 娴佺▼瀹炰緥id
+     * @param pageNum
+     * @param pageSize
+     * @param result
      * @return
      */
-    private Long getTotalTaskNum(String processDefinitionId) {
+    private List<CustomerTaskVO> getAllUserTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
+        int startNum = pageSize * (pageNum - 1);
+        int endNum = startNum + pageSize;
+        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
+        result.total(allUserTaskElement.size());
+        if (startNum >= allUserTaskElement.size()) {
+            // 濡傛灉璧峰绱㈠紩瓒呭嚭浜嗗垪琛ㄧ殑澶у皬锛岃繑鍥炰竴涓┖鍒楄〃
+            return new ArrayList<>();
+        }
+        if (StringUtils.isNotBlank(taskName)) {
+            // 妯℃嫙妯$硦鏌ヨ
+            allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList());
+        }
+        int end = Math.min(endNum, allUserTaskElement.size());
+        List<UserTask> userTasks = allUserTaskElement.subList(startNum, end);
+        // 鏌ュ嚭娴佺▼
+        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
+        // 鍒ゆ柇浠诲姟鐘舵��
+        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
+            CustomerTaskVO vo = new CustomerTaskVO();
+            vo.setProcessInsId(process.getId());
+            vo.setProcessDefId(processDefinitionId);
+            vo.setDeployId(process.getDeploymentId());
+            vo.setTaskName(userTask.getName());
+            vo.setProcessName(process.getProcessDefinitionName());
+            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
+            if (Objects.isNull(task)) {
+                // 濡傛灉浠诲姟鍦ㄨ繍琛屾椂娌℃壘鍒帮紝閭d箞鍙兘涓烘湭寮�濮嬫垨鑰呭凡瀹屾垚锛岄渶瑕佷粠鍘嗗彶浠诲姟涓啀鎵句竴涓�
+                HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery()
+                        .processInstanceId(process.getProcessInstanceId())
+                        .taskDefinitionKey(userTask.getId())
+                        .includeIdentityLinks()
+                        .singleResult();
+                if (Objects.isNull(historicTask)) {
+                    vo.setTaskStatus(TaskStatusEnum.NOT_START);
+                } else {
+                    vo.setTaskStatus(TaskStatusEnum.FINISHED);
+                    // 濡傛灉鏄凡瀹屾垚鐨勶紝淇℃伅闇�瑕佸崟鐙祴鍊�
+                    vo.setTaskId(historicTask.getId());
+                    vo.setExecutionId(historicTask.getExecutionId());
+                    vo.setCreateTime(historicTask.getStartTime());
+                    // 鏌ヨ瀹為檯澶勭悊浜�
+                    long handlerUserId = Long.parseLong(historicTask.getAssignee());
+                    SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
+                    if (Objects.nonNull(handlerUser)) {
+                        vo.setHandlerId(handlerUserId);
+                        vo.setHandlerName(handlerUser.getNickName());
+                    }
+                    this.setPromoterAndHandler(vo, historicTask.getIdentityLinks());
+                }
+            } else {
+                vo.setTaskStatus(TaskStatusEnum.TODO);
+                vo.setTaskId(task.getId());
+                vo.setExecutionId(task.getExecutionId());
+                vo.setCreateTime(task.getCreateTime());
+                this.setPromoterAndHandler(vo, null);
+            }
+            return vo;
+        }).collect(Collectors.toList());
+        result.data(vos);
+        return vos;
+    }
+
+    /**
+     * 璁剧疆浠诲姟鐨勫彂璧蜂汉&澶勭悊浜�
+     *
+     * @param taskVO
+     * @param identityLinkInfos 濡傛灉鏄凡瀹屾垚鐨勪换鍔★紝鐢ㄨ繖涓幓鍙栧叧鑱旂殑鐢ㄦ埛/鐢ㄦ埛缁�
+     */
+    private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) {
+        // 娴佺▼鍙戣捣浜轰俊鎭�
+        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
+                .processInstanceId(taskVO.getProcessInsId())
+                .singleResult();
+        SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
+        taskVO.setPromoterId(startUser.getUserId());
+        taskVO.setPromoterName(startUser.getNickName());
+        taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null);
+        taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
+        // 娴佺▼澶勭悊浜轰俊鎭�
+        if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) {
+            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId());
+            for (IdentityLink identityLink : identityLinksForTask) {
+                // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
+                if (StringUtils.isNotBlank(identityLink.getUserId())) {
+                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
+                    if (Objects.nonNull(sysUser)) {
+                        taskVO.setHandlerId(sysUser.getUserId());
+                        if (Objects.nonNull(sysUser.getDept())) {
+                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
+                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
+                        }
+                        taskVO.setHandlerName(sysUser.getNickName());
+                    }
+                    // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉�
+                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
+                    SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
+                    if (Objects.nonNull(role)) {
+                        taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
+                        taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�");
+                        taskVO.setHandlerName("鏆傛湭澶勭悊");
+                        taskVO.setHandlerId(null);
+                    }
+                }
+            }
+        } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus())){
+            for (IdentityLinkInfo identityLink : identityLinkInfos) {
+                // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
+                if (StringUtils.isNotBlank(identityLink.getUserId())) {
+                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
+                    if (Objects.nonNull(sysUser)) {
+//                        taskVO.setHandlerId(sysUser.getUserId());
+                        if (Objects.nonNull(sysUser.getDept())) {
+                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
+                            taskVO.setHandlerUnitName(sysUser.getDept().getDeptName());
+                        }
+//                        taskVO.setHandlerName(sysUser.getNickName());
+                    }
+                    // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉�
+                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
+                    SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
+                    if (Objects.nonNull(role)) {
+                        taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
+                        taskVO.setHandlerUnitName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�");
+//                        taskVO.setHandlerName(role.getRoleName());
+//                        taskVO.setHandlerId(null);
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 鑾峰彇鏌愪釜娴佺▼鐨勬墍鏈変换鍔¤妭鐐�
+     *
+     * @param processDefinitionId
+     * @return
+     */
+    private List<UserTask> getAllUserTaskElement(String processDefinitionId) {
         // 鑾峰彇娴佺▼瀹氫箟
         ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                 .processDefinitionId(processDefinitionId)
@@ -273,15 +446,21 @@
             throw new IllegalStateException("鏃犳硶鑾峰彇娴佺▼瀵硅薄: " + processDefinition.getKey());
         }
 
-        // 璁$畻浠诲姟鑺傜偣鏁伴噺
-        Long taskNodeCount = 0L;
         List<FlowElement> flowElements = process.getFlowElements().stream().toList();
-        for (FlowElement flowElement : flowElements) {
-            if (flowElement instanceof org.flowable.bpmn.model.UserTask) {
-                taskNodeCount++;
-            }
-        }
-        return taskNodeCount;
+        List<UserTask> userTaskElements = flowElements.stream().filter(flowElement -> flowElement instanceof UserTask).map(flowElement -> {
+            return (UserTask) flowElement;
+        }).collect(Collectors.toList());
+        return userTaskElements;
+    }
+
+    /**
+     * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級
+     *
+     * @param processDefinitionId  娴佺▼瀹氫箟id
+     * @return
+     */
+    private Long getTotalTaskNum(String processDefinitionId) {
+        return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size());
     }
 
     /**
diff --git a/business/src/main/resources/mapper/ProjectProcessMapper.xml b/business/src/main/resources/mapper/ProjectProcessMapper.xml
index 5ce1bb6..ae53deb 100644
--- a/business/src/main/resources/mapper/ProjectProcessMapper.xml
+++ b/business/src/main/resources/mapper/ProjectProcessMapper.xml
@@ -37,7 +37,7 @@
         <result column="gmt_update_time" property="gmtUpdateTime" />
         <result column="update_by" property="updateBy" />
         <result column="create_by" property="createBy" />
-        <result column="flowable_process_id" property="flowableProcessId" />
+        <result column="process_def_id" property="processDefId" />
 <!--        <association property="id" column=""-->
     </resultMap>
 
@@ -47,7 +47,7 @@
     <select id="getById" resultMap="BaseResultMap">
         SELECT
             TPP.project_id,
-            TPP.flowable_process_id,
+            TPP.process_def_id,
             TPP.id
         FROM
             t_project_process TPP
@@ -59,7 +59,7 @@
     <select id="getPage" resultMap="BaseResultMap">
         SELECT
             PI.*,
-            TPP.flowable_process_id
+            TPP.process_def_id
         FROM
             t_project_info PI
                 LEFT JOIN t_project_process TPP ON TPP.project_id = PI.id AND TPP.deleted = 0 AND PI.deleted = 0
diff --git a/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java b/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java
new file mode 100644
index 0000000..a942187
--- /dev/null
+++ b/common/src/main/java/com/ycl/common/enums/business/TaskStatusEnum.java
@@ -0,0 +1,29 @@
+package com.ycl.common.enums.business;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * 宸ヤ綔娴佷换鍔$姸鎬�
+ *
+ * @author锛歺p
+ * @date锛�2024/11/29 11:13
+ */
+@Getter
+public enum TaskStatusEnum {
+
+    NOT_START("not_start", "鏈紑濮�"),
+    TODO("todo", "寰呭姙"),
+    FINISHED("finished", "宸插畬鎴�")
+    ;
+
+    private final String value;
+
+    @JsonValue
+    private final String desc;
+
+    TaskStatusEnum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}
diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
index e8d0fdb..d2d5a45 100644
--- a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
+++ b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -113,12 +113,14 @@
      * @return
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables) {
         Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
         if (Objects.isNull(task)) {
             return AjaxResult.error("浠诲姟涓嶅瓨鍦�");
         }
-//        variables.put(taskId + "formJson", variables.get("formJson"));
+        // 鍏堣褰撳墠鐢ㄦ埛璁ら杩欎釜浠诲姟
+        taskService.claim(taskId, SecurityUtils.getUserId() + "");
         taskService.addComment(taskId, task.getProcessInstanceId(), FlowComment.SUBMIT.getType(), "瀹屾垚鎻愪氦");
         taskService.complete(taskId, variables);
         return AjaxResult.success("鎻愪氦鎴愬姛");
diff --git a/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java b/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java
index 3a669db..940053d 100644
--- a/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java
+++ b/system/src/main/java/com/ycl/system/domain/base/AbsQuery.java
@@ -13,9 +13,9 @@
 public class AbsQuery {
 
     @ApiModelProperty(value = "褰撳墠椤�", required = true)
-    private Long currentPage = 1L;
+    private long currentPage = 1L;
 
     @ApiModelProperty(value = "姣忛〉鏉℃暟", required = true)
-    private Long pageSize = 10L;
+    private long pageSize = 10L;
 
 }

--
Gitblit v1.8.0