From bee96a1d36c86068cd5a7eb69f4e3294a8123b04 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 03 七月 2026 18:02:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/archive/MesPdArchiveServiceImpl.java |  187 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 187 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/archive/MesPdArchiveServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/archive/MesPdArchiveServiceImpl.java
new file mode 100644
index 0000000..7c80e0e
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/archive/MesPdArchiveServiceImpl.java
@@ -0,0 +1,187 @@
+package cn.iocoder.yudao.module.mes.service.pd.archive;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.archive.vo.MesPdArchiveDetailRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.archive.vo.MesPdArchiveGroupRespVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.archive.vo.MesPdArchivePageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pd.archive.vo.MesPdArchiveSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.archive.MesPdArchiveDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.document.MesPdDocumentDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.project.MesPdProjectDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pd.archive.MesPdArchiveMapper;
+import cn.iocoder.yudao.module.mes.service.pd.document.MesPdDocumentService;
+import cn.iocoder.yudao.module.mes.service.pd.project.MesPdProjectService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 褰掓。鍙拌处 Service 瀹炵幇绫�
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@Service
+@Validated
+public class MesPdArchiveServiceImpl implements MesPdArchiveService {
+
+    @Resource
+    private MesPdArchiveMapper archiveMapper;
+
+    @Resource
+    @Lazy
+    private MesPdProjectService projectService;
+
+    @Resource
+    @Lazy
+    private MesPdDocumentService documentService;
+
+    @Resource
+    @Lazy
+    private AdminUserApi adminUserApi;
+
+    @Override
+    public Long createArchive(MesPdArchiveSaveReqVO createReqVO) {
+        // 鏍¢獙褰掓。缂栧彿鍞竴
+        validateArchiveCodeUnique(null, createReqVO.getArchiveCode());
+        // 鏍¢獙璁捐椤圭洰瀛樺湪
+        projectService.validateProjectExists(createReqVO.getProjectId());
+        // 鎻掑叆
+        MesPdArchiveDO archive = BeanUtils.toBean(createReqVO, MesPdArchiveDO.class);
+        archiveMapper.insert(archive);
+        return archive.getId();
+    }
+
+    @Override
+    public void updateArchive(MesPdArchiveSaveReqVO updateReqVO) {
+        // 鏍¢獙瀛樺湪
+        validateArchiveExists(updateReqVO.getId());
+        // 鏍¢獙褰掓。缂栧彿鍞竴
+        validateArchiveCodeUnique(updateReqVO.getId(), updateReqVO.getArchiveCode());
+        // 鏇存柊
+        MesPdArchiveDO updateObj = BeanUtils.toBean(updateReqVO, MesPdArchiveDO.class);
+        archiveMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteArchive(Long id) {
+        // 鏍¢獙瀛樺湪
+        validateArchiveExists(id);
+        // 鍒犻櫎
+        archiveMapper.deleteById(id);
+    }
+
+    @Override
+    public MesPdArchiveDO getArchive(Long id) {
+        return archiveMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<MesPdArchiveDO> getArchivePage(MesPdArchivePageReqVO pageReqVO) {
+        return archiveMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public IPage<MesPdArchiveGroupRespVO> getArchivePageGroupByProject(MesPdArchivePageReqVO pageReqVO, Page<MesPdArchiveGroupRespVO> page) {
+        return archiveMapper.selectPageGroupByProjectId(page,pageReqVO);
+    }
+
+    @Override
+    public List<MesPdArchiveDetailRespVO> getArchiveDetailByProductCode(String productCode) {
+        // 1. 鏌ラ」鐩俊鎭�
+        List<MesPdProjectDO> projects = projectService.getProjectByProductCode(productCode);
+        List<MesPdArchiveDetailRespVO> mesPdArchiveDetailRespVOS = new ArrayList<>();
+        projects.forEach(project -> {
+            if (project == null) {
+                throw exception(PD_PROJECT_NOT_EXISTS);
+            }
+            // 2. 鏌ュ綊妗e垪琛�
+            List<MesPdArchiveDO> archives = archiveMapper.selectListByProjectId(project.getId());
+            // 3. 鏌ヨ祫鏂欏垪琛�
+            List<MesPdDocumentDO> documents = documentService.getDocumentListByProjectId(project.getId());
+
+            // 4. 缁勮 VO
+            MesPdArchiveDetailRespVO respVO = new MesPdArchiveDetailRespVO();
+
+            // 4.1 椤圭洰淇℃伅
+            MesPdArchiveDetailRespVO.ProjectInfo projectInfo = BeanUtils.toBean(project, MesPdArchiveDetailRespVO.ProjectInfo.class);
+            // 鎵归噺鑾峰彇鐢ㄦ埛淇℃伅
+            Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+                    cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet(
+                            java.util.stream.Stream.of(project.getChiefDesigner(), project.getReviewer())
+                                    .filter(java.util.Objects::nonNull)
+                                    .collect(java.util.stream.Collectors.toSet()),
+                            id -> id));
+            MapUtils.findAndThen(userMap, project.getChiefDesigner(),
+                    user -> projectInfo.setChiefDesignerNickname(user.getNickname()));
+            MapUtils.findAndThen(userMap, project.getReviewer(),
+                    user -> projectInfo.setReviewerNickname(user.getNickname()));
+            respVO.setProject(projectInfo);
+
+            // 4.2 褰掓。璁板綍鍒楄〃
+            if (!archives.isEmpty()) {
+                Map<Long, AdminUserRespDTO> archiverUserMap = adminUserApi.getUserMap(
+                        cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet(archives, MesPdArchiveDO::getArchiver));
+                List<MesPdArchiveDetailRespVO.ArchiveInfo> archiveInfos = BeanUtils.toBean(archives, MesPdArchiveDetailRespVO.ArchiveInfo.class,
+                        info -> MapUtils.findAndThen(archiverUserMap, info.getArchiver(),
+                                user -> info.setArchiverNickname(user.getNickname())));
+                respVO.setArchives(archiveInfos);
+            }
+
+            // 4.3 璁捐璧勬枡鍒楄〃
+            if (!documents.isEmpty()) {
+                Map<Long, AdminUserRespDTO> uploadUserMap = adminUserApi.getUserMap(
+                        cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet(documents, MesPdDocumentDO::getUploadUserId));
+                List<MesPdArchiveDetailRespVO.DocumentInfo> documentInfos = BeanUtils.toBean(documents, MesPdArchiveDetailRespVO.DocumentInfo.class,
+                        info -> MapUtils.findAndThen(uploadUserMap, info.getUploadUserId(),
+                                user -> info.setUploadUserNickname(user.getNickname())));
+                respVO.setDocuments(documentInfos);
+            }
+            mesPdArchiveDetailRespVOS.add(respVO);
+        });
+
+        return mesPdArchiveDetailRespVOS;
+    }
+
+    @Override
+    public Long getArchiveCountByProjectId(Long projectId) {
+        return archiveMapper.selectCountByProjectId(projectId);
+    }
+
+    private MesPdArchiveDO validateArchiveExists(Long id) {
+        MesPdArchiveDO archive = archiveMapper.selectById(id);
+        if (archive == null) {
+            throw exception(PD_ARCHIVE_NOT_EXISTS);
+        }
+        return archive;
+    }
+
+    private void validateArchiveCodeUnique(Long id, String archiveCode) {
+        MesPdArchiveDO existing = archiveMapper.selectByArchiveCode(archiveCode);
+        if (existing == null) {
+            return;
+        }
+        // 濡傛灉 id 涓虹┖锛岃鏄庢槸鏂板锛岀紪鐮侀噸澶�
+        if (id == null) {
+            throw exception(PD_ARCHIVE_CODE_DUPLICATE);
+        }
+        // 濡傛灉 id 涓嶄负绌猴紝璇存槑鏄慨鏀癸紝缂栫爜閲嶅涓斾笉鏄悓涓�鏉¤褰�
+        if (!existing.getId().equals(id)) {
+            throw exception(PD_ARCHIVE_CODE_DUPLICATE);
+        }
+    }
+
+}

--
Gitblit v1.9.3