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 getArchivePage(MesPdArchivePageReqVO pageReqVO) { return archiveMapper.selectPage(pageReqVO); } @Override public IPage getArchivePageGroupByProject(MesPdArchivePageReqVO pageReqVO, Page page) { return archiveMapper.selectPageGroupByProjectId(page,pageReqVO); } @Override public List getArchiveDetailByProductCode(String productCode) { // 1. 查项目信息 List projects = projectService.getProjectByProductCode(productCode); List mesPdArchiveDetailRespVOS = new ArrayList<>(); projects.forEach(project -> { if (project == null) { throw exception(PD_PROJECT_NOT_EXISTS); } // 2. 查归档列表 List archives = archiveMapper.selectListByProjectId(project.getId()); // 3. 查资料列表 List documents = documentService.getDocumentListByProjectId(project.getId()); // 4. 组装 VO MesPdArchiveDetailRespVO respVO = new MesPdArchiveDetailRespVO(); // 4.1 项目信息 MesPdArchiveDetailRespVO.ProjectInfo projectInfo = BeanUtils.toBean(project, MesPdArchiveDetailRespVO.ProjectInfo.class); // 批量获取用户信息 Map 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 archiverUserMap = adminUserApi.getUserMap( cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet(archives, MesPdArchiveDO::getArchiver)); List 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 uploadUserMap = adminUserApi.getUserMap( cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet(documents, MesPdDocumentDO::getUploadUserId)); List 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); } } }