From 622a5566fbf4592698706c26e3816a95f265dc17 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 25 八月 2026 16:30:32 +0800
Subject: [PATCH] feat(mes): 设计项目分页返回待审核文件数 pendingAuditCount,文件审核完成后才可提交审批

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/vo/MesPdProjectRespVO.java   |    3 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java              |   10 +++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java          |   26 +++++++++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/document/MesPdDocumentMapper.java           |   10 +++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentService.java            |    9 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/MesPdProjectController.java  |    4 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java        |    6 +++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/documentaudit/MesPdDocumentAuditMapper.java |   17 ++++++++
 8 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/MesPdProjectController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/MesPdProjectController.java
index 45c7cb9..2ca8e14 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/MesPdProjectController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/MesPdProjectController.java
@@ -160,12 +160,16 @@
         // 1.1 鎵归噺鑾峰彇鍏宠仈鏁版嵁锛堜富璁捐甯� + 瀹℃牳浜猴級
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSetByFlatMap(list,
                 project -> Stream.of(project.getChiefDesigner(), project.getReviewer())));
+        // 1.2 鎵归噺鑾峰彇鍚勯」鐩緟瀹℃牳鏂囦欢鏁�
+        Map<Long, Integer> pendingAuditCountMap = projectService.getPendingAuditCountMap(
+                convertSet(list, MesPdProjectDO::getId));
         // 2. 鎷兼帴 VO
         return BeanUtils.toBean(list, MesPdProjectRespVO.class, vo -> {
             MapUtils.findAndThen(userMap, vo.getChiefDesigner(),
                     user -> vo.setChiefDesignerNickname(user.getNickname()));
             MapUtils.findAndThen(userMap, vo.getReviewer(),
                     user -> vo.setReviewerNickname(user.getNickname()));
+            vo.setPendingAuditCount(pendingAuditCountMap.getOrDefault(vo.getId(), 0));
         });
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/vo/MesPdProjectRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/vo/MesPdProjectRespVO.java
index 28a581f..3dd2303 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/vo/MesPdProjectRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pd/project/vo/MesPdProjectRespVO.java
@@ -69,6 +69,9 @@
     @Schema(description = "BPM 娴佺▼瀹炰緥缂栧彿")
     private String processInstanceId;
 
+    @Schema(description = "寰呭鏍告枃浠舵暟", example = "3")
+    private Integer pendingAuditCount;
+
     @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("鍒涘缓鏃堕棿")
     private LocalDateTime createTime;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/document/MesPdDocumentMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/document/MesPdDocumentMapper.java
index 2b3a04c..5c24220 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/document/MesPdDocumentMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/document/MesPdDocumentMapper.java
@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.mes.dal.mysql.pd.document;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -7,6 +8,8 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pd.document.MesPdDocumentDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 @Mapper
@@ -24,6 +27,13 @@
         return selectList(MesPdDocumentDO::getProjectId, projectId);
     }
 
+    default List<MesPdDocumentDO> selectListByProjectIds(Collection<Long> projectIds) {
+        if (CollUtil.isEmpty(projectIds)) {
+            return Collections.emptyList();
+        }
+        return selectList(MesPdDocumentDO::getProjectId, projectIds);
+    }
+
     default int deleteByProjectId(Long projectId) {
         return delete(MesPdDocumentDO::getProjectId, projectId);
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/documentaudit/MesPdDocumentAuditMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/documentaudit/MesPdDocumentAuditMapper.java
index bb34e18..619fae5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/documentaudit/MesPdDocumentAuditMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pd/documentaudit/MesPdDocumentAuditMapper.java
@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.mes.dal.mysql.pd.documentaudit;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -8,6 +9,7 @@
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 @Mapper
@@ -54,4 +56,19 @@
                 .eq(MesPdDocumentAuditDO::getAuditStatus, 0)) > 0;
     }
 
+    /**
+     * 鎵归噺鏌ヨ鎸囧畾璧勬枡ID鍒楄〃涓墍鏈夊緟瀹℃牳鐨勮褰�
+     *
+     * @param documentIds 璧勬枡ID鍒楄〃
+     * @return 寰呭鏍歌褰曞垪琛�
+     */
+    default List<MesPdDocumentAuditDO> selectPendingAuditListByDocumentIds(Collection<Long> documentIds) {
+        if (CollUtil.isEmpty(documentIds)) {
+            return Collections.emptyList();
+        }
+        return selectList(new LambdaQueryWrapperX<MesPdDocumentAuditDO>()
+                .in(MesPdDocumentAuditDO::getDocumentId, documentIds)
+                .eq(MesPdDocumentAuditDO::getAuditStatus, 0));
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentService.java
index 1f9c12b..f6bf09d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentService.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pd.document.MesPdDocumentDO;
 import jakarta.validation.Valid;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -62,6 +63,14 @@
     List<MesPdDocumentDO> getDocumentListByProjectId(Long projectId);
 
     /**
+     * 鎵归噺鑾峰緱鎸囧畾澶氫釜璁捐椤圭洰涓嬬殑璧勬枡鍒楄〃
+     *
+     * @param projectIds 璁捐椤圭洰ID闆嗗悎
+     * @return 璧勬枡鍒楄〃
+     */
+    List<MesPdDocumentDO> getDocumentListByProjectIds(Collection<Long> projectIds);
+
+    /**
      * 鍒犻櫎鎸囧畾璁捐椤圭洰涓嬬殑鎵�鏈夎祫鏂�
      *
      * @param projectId 璁捐椤圭洰ID
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
index 18f02e4..2bb158f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
@@ -18,6 +18,7 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -109,6 +110,11 @@
     }
 
     @Override
+    public List<MesPdDocumentDO> getDocumentListByProjectIds(Collection<Long> projectIds) {
+        return documentMapper.selectListByProjectIds(projectIds);
+    }
+
+    @Override
     public void deleteByProjectId(Long projectId) {
         List<MesPdDocumentDO> documents = documentMapper.selectListByProjectId(projectId);
         for (MesPdDocumentDO document : documents) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java
index 54deaeb..af4c5c8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectService.java
@@ -125,4 +125,14 @@
 
     List<MesPdProjectDO> getProjectByProductCode(String productCode);
 
+    /**
+     * 鎵归噺缁熻鍚勮璁¢」鐩殑寰呭鏍告枃浠舵暟
+     * <p>
+     * 缁熻鍙e緞锛氳椤圭洰涓嬭祫鏂欏搴旂殑瀹℃牳璁板綍涓紝瀛樺湪 auditStatus=0锛堝緟瀹℃牳锛夌殑璁板綍鏁般��
+     *
+     * @param projectIds 璁捐椤圭洰ID闆嗗悎
+     * @return 椤圭洰ID -> 寰呭鏍告枃浠舵暟
+     */
+    Map<Long, Integer> getPendingAuditCountMap(Collection<Long> projectIds);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
index 6648c60..aa655a4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/project/MesPdProjectServiceImpl.java
@@ -343,6 +343,32 @@
         return projectMapper.selectList(new QueryWrapper<MesPdProjectDO>().lambda().eq(MesPdProjectDO::getProductCode,productCode).eq(MesPdProjectDO::getStatus, MesPdProjectStatusEnum.ARCHIVE.getStatus()));
     }
 
+    @Override
+    public Map<Long, Integer> getPendingAuditCountMap(Collection<Long> projectIds) {
+        if (CollUtil.isEmpty(projectIds)) {
+            return Collections.emptyMap();
+        }
+        // 1. 鎵归噺鏌ュ嚭杩欎簺椤圭洰涓嬬殑鎵�鏈夎祫鏂�
+        List<MesPdDocumentDO> documents = documentService.getDocumentListByProjectIds(projectIds);
+        if (CollUtil.isEmpty(documents)) {
+            return Collections.emptyMap();
+        }
+        // 2. 璧勬枡ID -> 椤圭洰ID
+        Map<Long, Long> documentProjectIdMap = convertMap(documents, MesPdDocumentDO::getId, MesPdDocumentDO::getProjectId);
+        // 3. 鎵归噺鏌ュ嚭鎵�鏈夊緟瀹℃牳璁板綍锛坅uditStatus=0锛�
+        List<MesPdDocumentAuditDO> pendingAudits =
+                documentAuditMapper.selectPendingAuditListByDocumentIds(documentProjectIdMap.keySet());
+        // 4. 鎸夐」鐩粺璁″緟瀹℃牳鏂囦欢鏁�
+        Map<Long, Integer> result = new HashMap<>();
+        for (MesPdDocumentAuditDO audit : pendingAudits) {
+            Long projectId = documentProjectIdMap.get(audit.getDocumentId());
+            if (projectId != null) {
+                result.merge(projectId, 1, Integer::sum);
+            }
+        }
+        return result;
+    }
+
     private void validateProjectInitiate(MesPdProjectDO project) {
         if (!MesPdProjectStatusEnum.INITIATE.getStatus().equals(project.getStatus())) {
             throw exception(PD_PROJECT_NOT_INITIATE);

--
Gitblit v1.9.3