From 419fab9d84e6b2fbeb6d32b7d7253a6cd195200d Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 24 十二月 2025 17:26:48 +0800
Subject: [PATCH] 上报

---
 business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java |  521 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 402 insertions(+), 119 deletions(-)

diff --git a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
index d348364..f375bc5 100644
--- a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
@@ -1,9 +1,7 @@
 package com.ycl.service.impl;
 
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import com.ycl.common.annotation.DataScope;
 import com.ycl.common.base.Result;
 import com.ycl.common.constant.ProcessOverTimeConstants;
 import com.ycl.common.core.domain.BaseEntity;
@@ -17,14 +15,15 @@
 import com.ycl.domain.entity.ProjectInfo;
 import com.ycl.domain.entity.ProjectProcess;
 import com.ycl.domain.form.ProjectProgressStatisticsForm;
+import com.ycl.domain.query.WaitTodoQuery;
 import com.ycl.domain.vo.*;
 import com.ycl.factory.FlowServiceFactory;
 import com.ycl.mapper.ProcessCodingMapper;
 import com.ycl.mapper.ProcessLogMapper;
 import com.ycl.mapper.ProjectInfoMapper;
-import com.ycl.mapper.ProjectProcessMapper;
 import com.ycl.service.IndexHomeService;
 import com.ycl.service.ProjectProcessService;
+import com.ycl.service.common.TaskCommonService;
 import com.ycl.system.mapper.SysDeptMapper;
 import com.ycl.system.service.ISysDeptService;
 import com.ycl.system.service.ISysRoleService;
@@ -39,8 +38,8 @@
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.identitylink.api.IdentityLink;
 import org.flowable.identitylink.api.IdentityLinkInfo;
-import org.flowable.identitylink.api.IdentityLinkType;
 import org.flowable.task.api.Task;
+import org.flowable.task.api.TaskQuery;
 import org.flowable.task.api.history.HistoricTaskInstance;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -78,13 +77,14 @@
     private final ISysDeptService sysDeptService;
 
     private final ISysRoleService sysRoleService;
+
+    private final TaskCommonService taskCommonService;
+
+
     @Override
     public Result projectCodingStatusCount() {
         //鏉冮檺鎺у埗
         List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
-
-
-
 
         Map<String,Integer> map = new HashMap<>();
         map.put(ProcessOverTimeConstants.GREEN,0);
@@ -151,6 +151,7 @@
         return Result.ok().data(map);
     }
 
+    @Override
     public List<ProjectInfo> getLoginUserOwnProjectInfo(){
         //鏉冮檺鎺у埗
         Long userId = SecurityUtils.getUserId();
@@ -389,6 +390,58 @@
 
         return Result.ok().data(projectInfoAndFunding);
     }
+    @Override
+    public int countWaitTask() {
+        Long userId = SecurityUtils.getUserId();
+        List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
+        if (CollectionUtils.isEmpty(loginUserOwnProjectInfo)) {
+            return 0;
+        }
+        List<Long> ids = loginUserOwnProjectInfo.stream()
+                .filter(Objects::nonNull)
+                .map(ProjectInfo::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(ids)) {
+            return 0;
+        }
+        List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
+                .eq(ProjectProcess::getDeleted, Boolean.FALSE)
+                .in(ProjectProcess::getProjectId, ids)
+                .list();
+        if (CollectionUtils.isEmpty(projectProcessList)) {
+            return 0;
+        }
+        List<String> targetProcessInsIds = projectProcessList.stream()
+                .filter(Objects::nonNull) // 杩囨护null鐨凱rojectProcess瀵硅薄
+                .map(ProjectProcess::getProcessInsId)
+                .filter(defId -> defId != null && !defId.trim().isEmpty()) // 鍏堝垽null鍐峵rim锛屼慨澶嶉闄�3
+                .distinct()
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(targetProcessInsIds)) {
+            return 0;
+        }
+
+        List<Task> allRunningTasks = taskService.createTaskQuery().active().list();
+        if (CollectionUtils.isEmpty(allRunningTasks)) {
+            return 0;
+        }
+        List<Task> targetRunningTasks = allRunningTasks.stream()
+                .filter(Objects::nonNull)
+                .filter(task -> {
+                    // 鍏堝垽null锛屽啀鍖归厤锛屼慨澶嶉闄�1
+                    String processInsId = task.getProcessInstanceId();
+                    return processInsId != null && targetProcessInsIds.contains(processInsId);
+                })
+                .filter(task -> {
+                    String assignee = task.getAssignee();
+                    return assignee == null || userId.toString().equals(assignee);//鎺掗櫎棰嗗彇浜�
+                })
+                .collect(Collectors.toList());
+
+
+        return targetRunningTasks.size();
+    }
 
     @Override
     public Result projectAdvanceCheckPoint() {
@@ -401,7 +454,7 @@
         List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
                 .eq(ProjectProcess::getDeleted, Boolean.FALSE)
                 .in(ProjectProcess::getProjectId, ids).list();
-
+        Long userId = SecurityUtils.getUserId();
         //娴佺▼瀹炰緥id闆嗗悎
         List<String> targetProcessInsIds = projectProcessList.stream()
                 .map(ProjectProcess::getProcessInsId)
@@ -454,11 +507,16 @@
 
 
         List<Task> allRunningTasks  = taskService.createTaskQuery().active().list();
+
         List<Task> targetRunningTasks = allRunningTasks.stream()
                 // 鍏抽敭鍖归厤锛氫换鍔$殑娴佺▼瀹氫箟ID 瀛樺湪浜� projectProcessList 鐨勬祦绋嬪畾涔塈D鍒楄〃涓�
                 .filter(task -> targetProcessInsIds.contains(task.getProcessInstanceId()))
+                .filter(task -> {
+                    String assignee = task.getAssignee();
+                    log.info("assignee:{}",assignee);
+                    return assignee == null || userId.toString().equals(assignee);
+                })
                 .collect(Collectors.toList());
-
 
         List<TaskInfoVo> list = new ArrayList<>();
         // 鎸夋祦绋嬪疄渚媔d鍒嗙粍
@@ -471,9 +529,11 @@
                     .eq(ProcessCoding::getDeleted, Boolean.FALSE)
                     .in(ProcessCoding::getTaskId, taskIds)
                     .list();
+            log.info("processCodingList.size():{}", processCodingList.size()); // 鐪嬫棩蹇楁槸鍚︿负0
+            Map<String, ProcessCoding> processCodingMap = new HashMap<>();
             //鎸塼askId杞崲涓簃ap鏂归潰涓嬮潰鑾峰彇
             if (!CollectionUtils.isEmpty(processCodingList)){
-                Map<String, ProcessCoding> processCodingMap = processCodingList.stream()
+                processCodingMap = processCodingList.stream()
                         .filter(Objects::nonNull) // 閬垮厤null鍏冪礌瀵艰嚧NPE锛堝彲閫変繚鐣欙級
                         .filter(vo -> vo.getTaskId() != null) // 杩囨护taskId涓簄ull鐨勬棤鏁堟暟鎹�
                         .collect(Collectors.toMap(
@@ -493,128 +553,126 @@
                                     return newCreateTime.getTime() > oldCreateTime.getTime() ? newVal : oldVal;
                                 }
                         ));
+            }
+            for (Task task : targetRunningTasks) {
 
-                for (Task task : targetRunningTasks) {
+                TaskInfoVo taskVo = new TaskInfoVo();
 
-                    TaskInfoVo taskVo = new TaskInfoVo();
-
-                    taskVo.setId(task.getId());
-                    taskVo.setTaskName(task.getName());
-                    taskVo.setStartTime(task.getCreateTime());
-                    taskVo.setEndTime(task.getDueDate());
+                taskVo.setId(task.getId());
+                taskVo.setTaskName(task.getName());
+                taskVo.setStartTime(task.getCreateTime());
+                taskVo.setEndTime(task.getDueDate());
 //                    taskVo.setTaskType();
 
-                    List<Long> handlerIds = new ArrayList<>(2);
-                    List<String> handlerNames = new ArrayList<>(2);
-                    List<Long> handlerUnitIds = new ArrayList<>(2);
-                    List<String> handlerUnitNames = new ArrayList<>(2);
-                    List<String> promoterNames = new ArrayList<>(2);
-                    List<String> promoterUnitNames = new ArrayList<>(2);
-                    CustomerTaskVO customerTaskVO = new CustomerTaskVO();
-                    customerTaskVO.setHandlerId(handlerIds);
-                    customerTaskVO.setHandlerName(handlerNames);
-                    customerTaskVO.setHandlerUnitId(handlerUnitIds);
-                    customerTaskVO.setHandlerUnitName(handlerUnitNames);
-                    customerTaskVO.setPromoterName(promoterNames);
-                    customerTaskVO.setPromoterUnitName(promoterUnitNames);
+                List<Long> handlerIds = new ArrayList<>(2);
+                List<String> handlerNames = new ArrayList<>(2);
+                List<Long> handlerUnitIds = new ArrayList<>(2);
+                List<String> handlerUnitNames = new ArrayList<>(2);
+                List<String> promoterNames = new ArrayList<>(2);
+                List<String> promoterUnitNames = new ArrayList<>(2);
+                CustomerTaskVO customerTaskVO = new CustomerTaskVO();
+                customerTaskVO.setHandlerId(handlerIds);
+                customerTaskVO.setHandlerName(handlerNames);
+                customerTaskVO.setHandlerUnitId(handlerUnitIds);
+                customerTaskVO.setHandlerUnitName(handlerUnitNames);
+                customerTaskVO.setPromoterName(promoterNames);
+                customerTaskVO.setPromoterUnitName(promoterUnitNames);
 
-                    // 娴佺▼澶勭悊浜轰俊鎭�
-                    List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
-                    for (IdentityLinkInfo identityLink : identityLinksForTask) {
-                        // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
-                        if (StringUtils.isNotBlank(identityLink.getUserId())) {
-                            // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝杩愯涓殑浠诲姟鏃犻渶鍐嶅鐞嗚〃杈惧紡浜嗭紝flowable宸茬粡鑷姩鏍规嵁鍙橀噺璁剧疆浜�
-                            customerTaskVO.setHandlerType(HandlerTypeEnum.USER);
-                            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
-                            if (Objects.nonNull(sysUser)) {
-                                customerTaskVO.getHandlerId().add(sysUser.getUserId());
-                                customerTaskVO.getHandlerName().add(this.getUserShowName(sysUser));
-                                if (Objects.nonNull(sysUser.getDept())) {
-                                    customerTaskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
-                                    customerTaskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
-                                    customerTaskVO.getPromoterName().add(this.getUserShowName(sysUser));
-                                    String[] str = sysUser.getDept().getAncestors().split(",");
-                                    if (str.length >= 4){
-                                        customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName());
-                                    }else {
-                                        customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
-                                    }
-
+                // 娴佺▼澶勭悊浜轰俊鎭�
+                List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
+                for (IdentityLinkInfo identityLink : identityLinksForTask) {
+                    // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
+                    if (StringUtils.isNotBlank(identityLink.getUserId())) {
+                        // 澶勭悊鍙橀噺琛ㄨ揪寮忥紝杩愯涓殑浠诲姟鏃犻渶鍐嶅鐞嗚〃杈惧紡浜嗭紝flowable宸茬粡鑷姩鏍规嵁鍙橀噺璁剧疆浜�
+                        customerTaskVO.setHandlerType(HandlerTypeEnum.USER);
+                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
+                        if (Objects.nonNull(sysUser)) {
+                            customerTaskVO.getHandlerId().add(sysUser.getUserId());
+                            customerTaskVO.getHandlerName().add(this.getUserShowName(sysUser));
+                            if (Objects.nonNull(sysUser.getDept())) {
+                                customerTaskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
+                                customerTaskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
+                                customerTaskVO.getPromoterName().add(this.getUserShowName(sysUser));
+                                String[] str = sysUser.getDept().getAncestors().split(",");
+                                if (str.length >= 4){
+                                    customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName());
+                                }else {
+                                    customerTaskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
                                 }
-                            }
-                            // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂�
-                        } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
-                            if (identityLink.getGroupId().startsWith("dept")) {   // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1
-                                customerTaskVO.setHandlerType(HandlerTypeEnum.DEPT);
-                                String[] split = identityLink.getGroupId().split(":");
-                                if (split.length > 1) {
-                                    // 閮ㄩ棬
-                                    SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
-                                    if (Objects.nonNull(dept)) {
-                                        customerTaskVO.getHandlerUnitId().add(dept.getDeptId());
-                                        customerTaskVO.getHandlerUnitName().add(dept.getDeptName());
-                                        customerTaskVO.getPromoterName().add(this.getDeptLeaderShowName(dept));
-                                        customerTaskVO.getPromoterUnitName().add(this.setDeptNameWithParentName(dept));
-                                    }
-                                }
-                            } else {
-                                customerTaskVO.setHandlerType(HandlerTypeEnum.ROLE);
-                                SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
-                                if (Objects.nonNull(role)) {
-                                    customerTaskVO.getHandlerUnitId().add(Long.parseLong(identityLink.getGroupId()));
-                                    customerTaskVO.getHandlerUnitName().add(role.getRoleName());
-                                }
-                            }
-                        }
-                        this.distinctVo(customerTaskVO);
-                    }
-                    taskVo.setCustomerTaskInfo(customerTaskVO);
-
-                    //缁勮浠诲姟淇℃伅
-                    CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
-                    if (checkPointVO != null) {
-                       taskVo.setCheckPointInfo(checkPointVO);
-                    }
-                    //瓒呮椂鏃堕棿鍜屾鏁板湪 processCodingList涓�  杩欓噷闇�瑕佹洿鍏穞askId鏉ヨ幏寰楀搴斾俊鎭�
-                    ProcessCoding processCoding = processCodingMap.get(task.getId());
-                    //璁剧疆瓒呮椂淇℃伅
-                    if (processCoding != null) {
-
-                        String overTimeTotalStr = processCoding.getOverTimeTotal();
-                        long overTimeTotal = 0L;
-                        if (StringUtils.isNotBlank(overTimeTotalStr)) {
-                            try {
-                                overTimeTotal = Long.parseLong(overTimeTotalStr.trim());
-                            } catch (NumberFormatException e) {
 
                             }
                         }
-                        String overTimeDesc = convertHoursToDayHourStr(overTimeTotal);
-                        taskVo.setTotalOverTime(overTimeDesc);
-
-                        // 2. 鎻愬彇绾㈢爜闃堝�� 濡傦細 0-22 澶�-灏忔椂 骞惰浆鎹负灏忔椂
-                        String redTimeStr = processCoding.getRedTime();
-                        Long redTimeSec = getTime(redTimeStr);
-                        Double redTimeHour = null;
-                        if (redTimeSec != null && redTimeSec > 0) {
-                            redTimeHour = redTimeSec / 3600.0;
+                        // 缁戝畾鐨勬槸瑙掕壊鎴栬�呴儴闂�
+                    } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
+                        if (identityLink.getGroupId().startsWith("dept")) {   // 閮ㄩ棬鐨刬d鏄姞浜嗗墠缂�鐨勫锛歞ept:1
+                            customerTaskVO.setHandlerType(HandlerTypeEnum.DEPT);
+                            String[] split = identityLink.getGroupId().split(":");
+                            if (split.length > 1) {
+                                // 閮ㄩ棬
+                                SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1]));
+                                if (Objects.nonNull(dept)) {
+                                    customerTaskVO.getHandlerUnitId().add(dept.getDeptId());
+                                    customerTaskVO.getHandlerUnitName().add(dept.getDeptName());
+                                    customerTaskVO.getPromoterName().add(this.getDeptLeaderShowName(dept));
+                                    customerTaskVO.getPromoterUnitName().add(this.setDeptNameWithParentName(dept));
+                                }
+                            }
+                        } else {
+                            customerTaskVO.setHandlerType(HandlerTypeEnum.ROLE);
+                            SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
+                            if (Objects.nonNull(role)) {
+                                customerTaskVO.getHandlerUnitId().add(Long.parseLong(identityLink.getGroupId()));
+                                customerTaskVO.getHandlerUnitName().add(role.getRoleName());
+                            }
                         }
-                        long overTimeCount = 0L;
-                        // 鍒ゆ柇瓒呮椂娆℃暟
-                        if (overTimeTotal > 0 && redTimeHour != null && redTimeHour > 0) {
-                            overTimeCount = (long) (overTimeTotal / redTimeHour);
-                        }
-
-
-                        taskVo.setOverTimeCount(overTimeCount);
-                    }else {
-                        //涓簄ull 璇存槑鏈厤缃秴鏃舵椂闂� 榛樿鏈秴鏃�
-                        taskVo.setOverTimeCount(0L);
-                        taskVo.setTotalOverTime("0灏忔椂");
                     }
-                    list.add(taskVo);
+                    this.distinctVo(customerTaskVO);
                 }
+                taskVo.setCustomerTaskInfo(customerTaskVO);
 
+                //缁勮浠诲姟淇℃伅
+                CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
+                if (checkPointVO != null) {
+                    taskVo.setCheckPointInfo(checkPointVO);
+                }
+                //瓒呮椂鏃堕棿鍜屾鏁板湪 processCodingList涓�  杩欓噷闇�瑕佹洿鍏穞askId鏉ヨ幏寰楀搴斾俊鎭�
+                ProcessCoding processCoding = processCodingMap.get(task.getId());
+                //璁剧疆瓒呮椂淇℃伅
+                if (processCoding != null) {
+
+                    String overTimeTotalStr = processCoding.getOverTimeTotal();
+                    long overTimeTotal = 0L;
+                    if (StringUtils.isNotBlank(overTimeTotalStr)) {
+                        try {
+                            overTimeTotal = Long.parseLong(overTimeTotalStr.trim());
+                        } catch (NumberFormatException e) {
+
+                        }
+                    }
+                    String overTimeDesc = convertHoursToDayHourStr(overTimeTotal);
+                    taskVo.setTotalOverTime(overTimeDesc);
+
+                    // 2. 鎻愬彇绾㈢爜闃堝�� 濡傦細 0-22 澶�-灏忔椂 骞惰浆鎹负灏忔椂
+                    String redTimeStr = processCoding.getRedTime();
+                    Long redTimeSec = getTime(redTimeStr);
+                    Double redTimeHour = null;
+                    if (redTimeSec != null && redTimeSec > 0) {
+                        redTimeHour = redTimeSec / 3600.0;
+                    }
+                    long overTimeCount = 0L;
+                    // 鍒ゆ柇瓒呮椂娆℃暟
+                    if (overTimeTotal > 0 && redTimeHour != null && redTimeHour > 0) {
+                        overTimeCount = (long) (overTimeTotal / redTimeHour);
+                    }
+
+
+                    taskVo.setOverTimeCount(overTimeCount);
+                }else {
+                    //涓簄ull 璇存槑鏈厤缃秴鏃舵椂闂� 榛樿鏈秴鏃�
+                    taskVo.setOverTimeCount(0L);
+                    taskVo.setTotalOverTime("0灏忔椂");
+                }
+                list.add(taskVo);
             }
 
 
@@ -622,6 +680,222 @@
 
         return Result.ok().data(list);
     }
+
+    public HashMap<String,Object> buildEmptyResultMap(){
+        HashMap<String,Object> map = new HashMap<>();
+        map.put("data", new ArrayList<>());
+        map.put("total", 0L);
+        return map;
+    }
+    @Override
+    public Result getWaitTaskList(WaitTodoQuery baseQuery) {
+        int pageNum = (int) baseQuery.getCurrentPage();
+        int pageSize = (int) baseQuery.getPageSize();
+        Long userId = SecurityUtils.getUserId(); // 褰撳墠鐢ㄦ埛ID
+        boolean isAdmin = SecurityUtils.getLoginUser().getUser().isAdmin(); // 鏄惁绠$悊鍛�
+        List<String> userGroups = taskCommonService.getCurrentUserGroups(); // 褰撳墠鐢ㄦ埛鎵�灞炵粍
+        List<ProjectInfo> targetProjectList = new ArrayList<>();
+        String queryProjectId = baseQuery.getProjectId();
+
+        if ("all".equals(queryProjectId) || StringUtils.isBlank(queryProjectId)){
+            // 鏌ヨ鍏ㄩ儴
+            targetProjectList = getLoginUserOwnProjectInfo();
+        }else{
+            try {
+                Long projectId = Long.parseLong(queryProjectId);
+                // 鈶� 鏌ヨ璇ラ」鐩熀纭�淇℃伅锛堟浛鎹负瀹為檯鏌ヨ鏂规硶锛�
+                ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
+                if (projectInfo == null) {
+                    // 椤圭洰涓嶅瓨鍦紝杩斿洖绌烘暟鎹�
+                    return Result.ok().data(buildEmptyResultMap());
+                }
+                targetProjectList.add(projectInfo);
+            } catch (NumberFormatException e) {
+                // 椤圭洰ID鏍煎紡閿欒锛岃繑鍥炵┖鏁版嵁
+                return Result.ok().data(buildEmptyResultMap());
+            }
+        }
+
+        List<Long> projectIds = targetProjectList.stream().map(ProjectInfo::getId).collect(Collectors.toList());
+
+        List<ProjectProcess> projectProcessList = new LambdaQueryChainWrapper<>(projectProcessService.getBaseMapper())
+                .eq(ProjectProcess::getDeleted, Boolean.FALSE)
+                .in(ProjectProcess::getProjectId, projectIds).list();
+        // 4. 鎻愬彇鏈夋晥鐨勬祦绋嬪疄渚婭D锛堝幓閲�+闈炵┖杩囨护锛�
+        List<String> targetProcessInsIds = projectProcessList.stream()
+                .map(ProjectProcess::getProcessInsId)
+                .distinct()
+                .filter(defId -> defId != null && !defId.trim().isEmpty())
+                .collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(targetProcessInsIds)) {
+            return Result.ok().data(new HashMap<String, Object>() {{
+                put("data", new ArrayList<>());
+                put("total", 0L);
+            }});
+        }
+
+        // 5. 鏋勫缓processInfoMap锛堟牳蹇冿細椤圭洰ID鈫扖heckPointVO锛屽啀鍏宠仈娴佺▼淇℃伅锛�
+        Map<String, CheckPointVO> map = new HashMap<>();
+        // 鍏堝~鍏呴」鐩熀纭�淇℃伅
+        for (ProjectInfo projectInfo : targetProjectList) {
+            CheckPointVO checkPointVO = new CheckPointVO();
+            checkPointVO.setId(projectInfo.getId());
+            checkPointVO.setProjectName(projectInfo.getProjectName());
+            map.put(String.valueOf(projectInfo.getId()), checkPointVO);
+        }
+        // 鍐嶅~鍏呮祦绋嬩俊鎭紙閮ㄧ讲ID銆佹祦绋嬪悕绉扮瓑锛�
+        for (ProjectProcess projectProcess : projectProcessList) {
+            CheckPointVO checkPointVO = map.get(projectProcess.getProjectId().toString()); // 淇锛歱rojectId鏄疞ong锛岄渶杞瓧绗︿覆
+            if (checkPointVO == null) {
+                continue; // 鏃犲尮閰嶉」鐩紝璺宠繃
+            }
+            checkPointVO.setProcessDefinitionId(projectProcess.getProcessDefId());
+            checkPointVO.setProcessInstanceId(projectProcess.getProcessInsId());
+
+            // 鑾峰緱娴佺▼閮ㄧ讲id鍜屾祦绋嬪悕绉帮紙鍏煎杩愯涓�/宸茬粨鏉熸祦绋嬶級
+            ProcessInstance process = runtimeService.createProcessInstanceQuery()
+                    .processInstanceId(projectProcess.getProcessInsId()).singleResult();
+            if (Objects.nonNull(process)) {
+                checkPointVO.setDeployId(process.getDeploymentId());
+                checkPointVO.setProcessName(process.getProcessDefinitionName());
+            } else {
+                HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery()
+                        .processInstanceId(projectProcess.getProcessInsId()).singleResult();
+                if (Objects.nonNull(hisProcess)) { // 閬垮厤鍘嗗彶娴佺▼涓簄ull鐨凬PE
+                    checkPointVO.setDeployId(hisProcess.getDeploymentId());
+                    checkPointVO.setProcessName(hisProcess.getProcessDefinitionName());
+                }
+            }
+            map.put(projectProcess.getProjectId().toString(), checkPointVO); // 淇锛歱rojectId杞瓧绗︿覆
+        }
+        Map<String, CheckPointVO> processInfoMap = map.values().stream()
+                .filter(Objects::nonNull)
+                .filter(vo -> vo.getProcessInstanceId() != null)
+                .collect(Collectors.toMap(
+                        CheckPointVO::getProcessInstanceId,
+                        vo -> vo,
+                        (oldVal, newVal) -> newVal // 閲嶅娴佺▼瀹炰緥ID淇濈暀鍚庤��
+                ));
+
+        TaskQuery query = getTaskService().createTaskQuery()
+                .active() // 鏈畬鎴愩�佹湭鎸傝捣鐨勬椿璺冧换鍔�
+                .processInstanceIdIn(targetProcessInsIds); // 浠呮煡椤圭洰鍏宠仈鐨勬祦绋嬪疄渚嬩换鍔�
+
+        // 鏉冮檺杩囨护锛氶潪绠$悊鍛樹粎鏌ヨ嚜宸辨湁鏉冮檺鐨勪换鍔★紙宸查鍙�+鍊欓�夛級
+        if (!isAdmin) {
+            query.or()
+                    .taskAssignee(userId+"") // 鑷繁宸查鍙栫殑浠诲姟
+                    .taskCandidateUser(userId+"") // 鑷繁鏄�欓�夌敤鎴风殑浠诲姟
+                    .taskCandidateGroupIn(userGroups) // 鑷繁鍦ㄥ�欓�夌粍鐨勪换鍔�
+                    .endOr();
+        }
+
+        query.orderByTaskCreateTime().desc();
+        List<Task> allTaskList = query.list();
+        // 鎺掗櫎棰嗗彇浜洪棶棰�
+        allTaskList = allTaskList.stream()
+                .filter(Objects::nonNull) // 绌轰换鍔¢槻鎶�
+                .filter(task -> {
+                    String assignee = task.getAssignee();
+                    return assignee == null || userId.toString().equals(assignee);
+                })
+                .collect(Collectors.toList());
+        // 浠诲姟鍘婚噸
+        Set<String> taskIdSet = new HashSet<>();
+        List<Task> distinctAllTaskList = new ArrayList<>();
+        for (Task task : allTaskList) {
+            if (!taskIdSet.contains(task.getId())) {
+                taskIdSet.add(task.getId());
+                distinctAllTaskList.add(task);
+            }
+        }
+
+        // ========== 淇鐐�1锛氭彁鍓嶆煡璇换鍔$姸鎬侊紝杩囨护宸插畬鎴愪换鍔★紙鍒嗛〉鍓嶆墽琛岋級 ==========
+        // 鏌ヨ浠诲姟鐘舵��
+        final HashMap<String, ProcessLog> taskInfoMap = new HashMap<>();
+
+        List<String> allTaskIds = distinctAllTaskList.stream().map(Task::getId).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(allTaskIds)) {
+            // 2. 涓嶅啀閲嶆柊璧嬪�硷紝鑰屾槸鍏堟煡璇㈠嚭缁撴灉锛屽啀鏀惧叆宸插垵濮嬪寲鐨刴ap涓�
+            List<ProcessLog> processLogs = new LambdaQueryChainWrapper<>(processLogMapper)
+                    .eq(ProcessLog::getDeleted, Boolean.FALSE)
+                    .in(ProcessLog::getTaskId, allTaskIds)
+                    .list();
+
+            // 3. 濉厖鏁版嵁鍒皌askInfoMap锛屽紩鐢ㄦ湭鏀瑰彉
+            Map<String, ProcessLog> tempMap = processLogs.stream()
+                    .filter(processLog -> processLog.getTaskId() != null && processLog.getGmtCreate() != null)
+                    .collect(Collectors.toMap(
+                            ProcessLog::getTaskId,
+                            processLog -> processLog,
+                            (existing, replacement) -> replacement.getGmtCreate().after(existing.getGmtCreate()) ? replacement : existing,
+                            HashMap::new
+                    ));
+            taskInfoMap.putAll(tempMap);
+        }
+
+        // 杩囨护宸插畬鎴愪换鍔★紝寰楀埌鏈夋晥浠诲姟鍒楄〃锛堝垎椤电殑渚濇嵁锛�
+        List<Task> validTaskList = distinctAllTaskList.stream()
+                .filter(task -> {
+                    ProcessLog processLog = taskInfoMap.get(task.getId());
+                    // 鏈煡璇㈠埌鏃ュ織 鈫� 寰呭畬鎴愶紱鏃ュ織鐘舵�佷笉鏄疐INISHED 鈫� 鏈夋晥
+                    return processLog == null || !ProcessLogEventTypeEnum.FINISHED.getDesc().equals(processLog.getEventType().getDesc());
+                })
+                .collect(Collectors.toList());
+
+        // 鏈夋晥鏁版嵁鎬绘潯鏁�
+        long validTotal = validTaskList.size();
+        System.out.println("鏈夋晥浠诲姟鎬绘暟锛堟帓闄ゅ凡瀹屾垚锛夛細" + validTotal);
+
+        // ========== 淇鐐�2锛氬垎椤靛悎娉曟�ф牎楠� ==========
+        // 璁$畻鏈�澶ф湁鏁堥〉鐮�
+        int maxPageNum = (int) (validTotal % pageSize == 0 ? validTotal / pageSize : (validTotal / pageSize) + 1);
+        // 鑻ユ�绘潯鏁颁负0锛岀洿鎺ヨ繑鍥炵┖鏁版嵁
+        if (validTotal == 0) {
+            return Result.ok().data(new HashMap<String, Object>() {{
+                put("data", new ArrayList<>());
+                put("total", 0L);
+            }});
+        }
+        // 鑻ヨ姹傞〉鐮佽秴杩囨渶澶ч〉鐮侊紝榛樿杩斿洖鏈�鍚庝竴椤�
+        if (pageNum > maxPageNum) {
+            pageNum = maxPageNum;
+        }
+
+        // ========== 淇鐐�3锛氫紭鍖栧唴瀛樺垎椤� ==========
+        int startIndex = (pageNum - 1) * pageSize;
+        int endIndex = Math.min(startIndex + pageSize, validTaskList.size());
+        // 杞负鏂板垪琛紝閬垮厤subList瑙嗗浘鐨勯闄�
+        List<Task> pageTaskList = new ArrayList<>(validTaskList.subList(startIndex, endIndex));
+
+        // 缁勮杩斿洖VO
+        List<TaskInfoVo> taskInfoVoList = new ArrayList<>();
+        for (Task task : pageTaskList) {
+            TaskInfoVo taskVo = new TaskInfoVo();
+            taskVo.setId(task.getId());
+            taskVo.setTaskName(task.getName());
+            taskVo.setStartTime(task.getCreateTime());
+            taskVo.setEndTime(task.getDueDate());
+            // 濉厖浠诲姟鐘舵�佸瓧娈�
+            taskVo.setTaskType("寰呭畬鎴�");
+            ProcessLog processLog = taskInfoMap.get(task.getId());
+            if (Objects.nonNull(processLog)) {
+                taskVo.setTaskType(processLog.getEventType().getDesc());
+            }
+
+            CheckPointVO checkPointVO = processInfoMap.get(task.getProcessInstanceId());
+            if (checkPointVO != null) {
+                taskVo.setCheckPointInfo(checkPointVO);
+            }
+
+            taskInfoVoList.add(taskVo);
+        }
+        return Result.ok().data(taskInfoVoList).total(validTotal);
+    }
+
+
+
     private String convertHoursToDayHourStr(long totalHours) {
         if (totalHours < 0) {
             return "0灏忔椂"; // 闃插尽鎬у鐞嗚礋鏁板満鏅�
@@ -681,11 +955,18 @@
     }
 
     @Override
+    public Result getProjectList(){
+        List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
+        return Result.ok().data(loginUserOwnProjectInfo);
+    }
+
+    @Override
     public Result getProjectSelectList() {
         List<ProjectInfo> loginUserOwnProjectInfo = getLoginUserOwnProjectInfo();
         if (CollectionUtils.isEmpty(loginUserOwnProjectInfo)) {
             return Result.ok().data(loginUserOwnProjectInfo);
         }
+
         Map<String, String> projectMap = loginUserOwnProjectInfo.stream()
                 .collect(Collectors.toMap(
                         projectInfo -> String.valueOf(projectInfo.getId()),          // key: 椤圭洰ID
@@ -695,4 +976,6 @@
                 ));
         return Result.ok().data(projectMap);
     }
+
+
 }

--
Gitblit v1.8.0