From 06c312e584b99df613728d5ea8b32df4e156f3cc Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 07 九月 2026 17:40:09 +0800
Subject: [PATCH] feat(mes): 采购退货关联采购订单后自动带入物料并锁定选料
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java | 188 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 186 insertions(+), 2 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
index 56ff706..e535b20 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
@@ -1,22 +1,34 @@
package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.qc.vo.MesQcQualityExportVO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcLineMapper;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mes.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
+import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService;
+import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService;
import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -31,9 +43,14 @@
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -52,9 +69,15 @@
@Resource
private SrmSupplierApi srmSupplierApi;
@Resource
+ private MesQcIndicatorResultService indicatorResultService;
+ @Resource
+ private MesQcIndicatorService indicatorService;
+ @Resource
private MesMdItemService itemService;
@Resource
private MesMdUnitMeasureService unitMeasureService;
+ @Resource
+ private MesQcIqcLineMapper iqcLineMapper;
@Resource
private AdminUserApi adminUserApi;
@@ -117,8 +140,8 @@
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MesQcIqcDO> list = iqcService.getIqcPage(pageReqVO).getList();
- List<MesQcIqcRespVO> voList = buildIqcRespVOList(list);
- ExcelUtils.write(response, "鏉ユ枡妫�楠屽崟.xls", "鏁版嵁", MesQcIqcRespVO.class, voList);
+ List<MesQcQualityExportVO> exportList = buildIqcQualityExportList(list);
+ ExcelUtils.write(response, "鏉ユ枡妫�楠屽崟.xls", "鏁版嵁", MesQcQualityExportVO.class, exportList);
}
// ==================== 鎷兼帴 VO ====================
@@ -140,6 +163,63 @@
// 鎵归噺鏌ヨ妫�娴嬩汉鍛�
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(list, MesQcIqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ妫�楠岄」鎸囨爣
+ Set<Long> qcIds = convertSet(list, MesQcIqcDO::getId);
+ Map<Long, List<MesQcIndicatorResultDO>> indicatorResultMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(qcIds)) {
+ // 鎸塓C ID鎵归噺鏌ヨ妫�楠岀粨鏋滐紙IQC绫诲瀷锛�
+ List<MesQcIndicatorResultDO> indicatorResults = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), MesBizTypeConstants.QC_IQC);
+ indicatorResults.forEach(result -> {
+ indicatorResultMap.computeIfAbsent(result.getQcId(), k -> new ArrayList<>()).add(result);
+ });
+ }
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁嗗苟鏋勫缓鎸囨爣鏄犲皠
+ Map<Long, String> indicatorSummaryMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(indicatorResultMap)) {
+ Set<Long> resultIds = new HashSet<>();
+ indicatorResultMap.values().forEach(results -> {
+ results.forEach(result -> resultIds.add(result.getId()));
+ });
+ if (CollUtil.isNotEmpty(resultIds)) {
+ // 鎵归噺鏌ヨ妫�楠岀粨鏋滄槑缁�
+ List<MesQcIndicatorResultDetailDO> indicatorDetails = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultIds));
+ // 鎸夌粨鏋淚D鍒嗙粍鏄庣粏
+ Map<Long, List<MesQcIndicatorResultDetailDO>> detailMapByResultId = indicatorDetails.stream()
+ .collect(Collectors.groupingBy(MesQcIndicatorResultDetailDO::getResultId));
+
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍囷紙indicatorId -> indicator锛�
+ Set<Long> indicatorIds = convertSet(indicatorDetails, MesQcIndicatorResultDetailDO::getIndicatorId);
+ Map<Long, MesQcIndicatorDO> indicatorMap = indicatorService.getIndicatorMap(indicatorIds);
+
+ // 鏋勫缓姣忎釜QC鐨勬寚鏍囨眹鎬诲瓧绗︿覆
+ indicatorResultMap.forEach((qcId, results) -> {
+ List<String> indicatorSummaries = new ArrayList<>();
+ for (MesQcIndicatorResultDO result : results) {
+ List<MesQcIndicatorResultDetailDO> details = detailMapByResultId.getOrDefault(result.getId(), Collections.emptyList());
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ // 閫氳繃 indicatorId 鍏宠仈鎸囨爣鍚嶇О锛屾煡涓嶅埌鍒欏洖閫�涓� "鎸囨爣"
+ String indicatorName = "鎸囨爣";
+ MesQcIndicatorDO indicator = indicatorMap.get(detail.getIndicatorId());
+ if (indicator != null && StrUtil.isNotBlank(indicator.getName())) {
+ indicatorName = indicator.getName();
+ }
+ String value = detail.getValue();
+ String remark = detail.getRemark();
+ // 鏍煎紡鍖栦负 "鎸囨爣鍚嶇О:鍊�" 鎴� "鎸囨爣鍚嶇О:鍊�(澶囨敞)"
+ String indicatorStr = indicatorName + ":" + value;
+ if (StrUtil.isNotBlank(remark)) {
+ indicatorStr += "(" + remark + ")";
+ }
+ indicatorSummaries.add(indicatorStr);
+ }
+ }
+ // 鐢ㄩ�楀彿杩炴帴澶氫釜鎸囨爣
+ indicatorSummaryMap.put(qcId, String.join(", ", indicatorSummaries));
+ });
+ }
+ }
// 鎷艰 VO
return BeanUtils.toBean(list, MesQcIqcRespVO.class, vo -> {
findAndThen(vendorMap, vo.getVendorId(),
@@ -153,7 +233,111 @@
});
findAndThen(userMap, vo.getInspectorUserId(),
user -> vo.setInspectorNickname(user.getNickname()));
+ // 璁剧疆妫�楠岄」鎸囨爣姹囨��
+ vo.setIndicatorResultSummary(indicatorSummaryMap.getOrDefault(vo.getId(), ""));
});
}
+ /**
+ * 鏋勫缓瀵煎嚭琛岋細涓�鍗曚竴琛岋紝妫�楠屾寚鏍� / 鍒ゅ畾渚濇嵁鍙栬嚜琛屾槑缁嗗苟鎷兼帴
+ */
+ private List<MesQcQualityExportVO> buildIqcQualityExportList(List<MesQcIqcDO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return Collections.emptyList();
+ }
+ // 鎵归噺鏌ヨ妫�娴嬩汉鍛�
+ Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
+ convertSet(list, MesQcIqcDO::getInspectorUserId));
+ // 鎵归噺鏌ヨ鐗╂枡
+ Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+ convertSet(list, MesQcIqcDO::getItemId));
+ // 鎵归噺鏌ヨ琛屾槑缁�
+ List<MesQcIqcLineDO> lines = iqcLineMapper.selectListByIqcIds(convertSet(list, MesQcIqcDO::getId));
+ Map<Long, List<MesQcIqcLineDO>> lineMap = lines.stream()
+ .collect(Collectors.groupingBy(MesQcIqcLineDO::getIqcId));
+ // 鎵归噺鏌ヨ妫�娴嬫寚鏍�
+ Map<Long, MesQcIndicatorDO> indicatorMap = CollUtil.isEmpty(lines) ? Collections.emptyMap()
+ : indicatorService.getIndicatorMap(convertSet(lines, MesQcIqcLineDO::getIndicatorId));
+ // 鎵归噺鏌ヨ瀹炴祴鍊硷細妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏
+ Map<Long, Map<Long, String>> measureMap = buildMeasureValueMap(
+ convertSet(list, MesQcIqcDO::getId), MesBizTypeConstants.QC_IQC);
+ // 缁勮瀵煎嚭琛�
+ List<MesQcQualityExportVO> exportList = new ArrayList<>(list.size());
+ for (MesQcIqcDO iqc : list) {
+ MesQcQualityExportVO vo = new MesQcQualityExportVO();
+ vo.setDocName(iqc.getName());
+ MesMdItemDO item = itemMap.get(iqc.getItemId());
+ vo.setItemName(item != null ? item.getName() : "");
+ vo.setBatchNo(iqc.getVendorBatch());
+ vo.setInspectDate(MesQcQualityExportVO.formatDateTime(iqc.getInspectDate()));
+ List<String> indicatorNames = new ArrayList<>();
+ List<String> judgementSegments = new ArrayList<>();
+ for (MesQcIqcLineDO line : lineMap.getOrDefault(iqc.getId(), Collections.emptyList())) {
+ MesQcIndicatorDO indicator = indicatorMap.get(line.getIndicatorId());
+ String name = indicator != null && StrUtil.isNotBlank(indicator.getName())
+ ? indicator.getName() : "";
+ String range = MesQcQualityExportVO.buildRangeText(
+ line.getStandardValue(), line.getMinThreshold(), line.getMaxThreshold());
+ if (StrUtil.isNotBlank(name)) {
+ String measuredValue = measureMap
+ .getOrDefault(iqc.getId(), Collections.emptyMap())
+ .get(line.getIndicatorId());
+ indicatorNames.add(StrUtil.isNotBlank(measuredValue) ? name + ":" + measuredValue : name);
+ if (StrUtil.isNotBlank(range)) {
+ judgementSegments.add(name + range);
+ }
+ }
+ }
+ vo.setIndicatorNames(String.join("銆�", indicatorNames));
+ vo.setJudgementBasis(String.join("锛�", judgementSegments));
+ vo.setCheckResultText(getCheckResultLabel(iqc.getCheckResult()));
+ findAndThen(userMap, iqc.getInspectorUserId(),
+ user -> vo.setInspectorName(user.getNickname()));
+ // 鏆傛棤瀹℃牳浜烘暟鎹潵婧愶紝瀵煎嚭绌哄垪
+ vo.setAuditorName("");
+ vo.setRemark(iqc.getRemark());
+ exportList.add(vo);
+ }
+ return exportList;
+ }
+
+ /**
+ * 鏋勫缓 妫�楠屽崟 ID -> {鎸囨爣 ID -> 瀹炴祴鍊紏 鏄犲皠锛屽疄娴嬪�煎彇鑷楠岀粨鏋滄槑缁嗚〃
+ */
+ private Map<Long, Map<Long, String>> buildMeasureValueMap(Set<Long> qcIds, int qcType) {
+ Map<Long, Map<Long, String>> measureMap = new HashMap<>();
+ if (CollUtil.isEmpty(qcIds)) {
+ return measureMap;
+ }
+ List<MesQcIndicatorResultDO> results = indicatorResultService.getIndicatorResultListByQcIdsAndType(
+ new ArrayList<>(qcIds), qcType);
+ if (CollUtil.isEmpty(results)) {
+ return measureMap;
+ }
+ Map<Long, Long> resultQcMap = results.stream()
+ .collect(Collectors.toMap(MesQcIndicatorResultDO::getId, MesQcIndicatorResultDO::getQcId));
+ List<MesQcIndicatorResultDetailDO> details = indicatorResultService.getIndicatorResultDetailListByResultIds(
+ new ArrayList<>(resultQcMap.keySet()));
+ if (CollUtil.isEmpty(details)) {
+ return measureMap;
+ }
+ for (MesQcIndicatorResultDetailDO detail : details) {
+ Long qcId = resultQcMap.get(detail.getResultId());
+ if (qcId == null) {
+ continue;
+ }
+ measureMap.computeIfAbsent(qcId, k -> new HashMap<>())
+ .put(detail.getIndicatorId(), detail.getValue());
+ }
+ return measureMap;
+ }
+
+ private String getCheckResultLabel(Integer checkResult) {
+ if (checkResult == null) {
+ return "";
+ }
+ return DictFrameworkUtils.parseDictDataLabel(
+ DictTypeConstants.MES_QC_CHECK_RESULT, String.valueOf(checkResult));
+ }
+
}
--
Gitblit v1.9.3