diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java index 5ae4193..10bd8a3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ipqc/vo/MesQcIpqcRespVO.java @@ -43,6 +43,9 @@ public class MesQcIpqcRespVO { @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; + @Schema(description = "来源单据编号", example = "FB20250101001") + private String sourceDocCode; + // ========== 生产关联 ========== @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java index fa094ac..ab51d36 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcRespVO.java @@ -39,6 +39,9 @@ public class MesQcIqcRespVO { @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; + @Schema(description = "来源单据编号", example = "DOC20250101001") + private String sourceDocCode; + // ========== 供应商 ========== @Schema(description = "供应商 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java index 9dcd968..8c314bb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/vo/MesQcOqcRespVO.java @@ -39,6 +39,9 @@ public class MesQcOqcRespVO { @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; + @Schema(description = "来源单据编号", example = "DOC20250101001") + private String sourceDocCode; + // ========== 客户 ========== @Schema(description = "客户 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java index 5966a24..b9566c1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcPageReqVO.java @@ -23,6 +23,9 @@ public class MesQcRqcPageReqVO extends PageParam { @Schema(description = "来源单据类型", example = "1") private Integer sourceDocType; + @Schema(description = "来源单据编码", example = "RT2025") + private String sourceDocCode; + @Schema(description = "产品物料 ID", example = "20") private Long itemId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java index 8fb6899..df8d1bc 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/vo/MesQcRqcRespVO.java @@ -39,6 +39,9 @@ public class MesQcRqcRespVO { @Schema(description = "来源单据行 ID", example = "300") private Long sourceLineId; + @Schema(description = "来源单据编码", example = "RT20250101001") + private String sourceDocCode; + // ========== 检验类型 ========== @Schema(description = "检验类型", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java index f907a76..b33bcf8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/ipqc/MesQcIpqcDO.java @@ -69,16 +69,20 @@ public class MesQcIpqcDO extends BaseDO { * 来源单据 ID * * 关联:根据 {@link #sourceDocType} 不同: - * 1. {@link MesQcSourceDocTypeEnum#FEEDBACK} 时,关联 {@link MesProFeedbackDO#getId()} + * 1. {@link MesQcSourceDocTypeEnum#PRO_FEEDBACK} 时,关联 {@link MesProFeedbackDO#getId()} */ private Long sourceDocId; /** * 来源单据行 ID * * 关联:根据 {@link #sourceDocType} 不同: - * 1. {@link MesQcSourceDocTypeEnum#FEEDBACK} 时,暂不使用(预留) + * 1. {@link MesQcSourceDocTypeEnum#PRO_FEEDBACK} 时,暂不使用(预留) */ private Long sourceLineId; + /** + * 来源单据编号(冗余) + */ + private String sourceDocCode; // ========== 生产关联 ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java index 427aa97..d0a0201 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcDO.java @@ -74,6 +74,10 @@ public class MesQcIqcDO extends BaseDO { * 1. {@link MesQcSourceDocTypeEnum#ARRIVAL_NOTICE} 时,关联 {@link MesWmArrivalNoticeLineDO#getId()} */ private Long sourceLineId; + /** + * 来源单据编号(冗余) + */ + private String sourceDocCode; // ========== 供应商 ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java index 59d0b99..bdd8ca4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/oqc/MesQcOqcDO.java @@ -51,18 +51,28 @@ public class MesQcOqcDO extends BaseDO { /** * 来源单据 ID + * + * 关联:根据 {@link #sourceDocType} 不同: + * 1. {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum#PRODUCT_SALES} 时,关联 {@link cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO#getId()} */ private Long sourceDocId; /** * 来源单据类型 * - * 关联 {@link cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants} + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum} */ private Integer sourceDocType; /** * 来源单据行 ID + * + * 关联:根据 {@link #sourceDocType} 不同: + * 1. {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcSourceDocTypeEnum#PRODUCT_SALES} 时,关联 {@link cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO#getId()} */ private Long sourceLineId; + /** + * 来源单据编号(冗余) + */ + private String sourceDocCode; // ========== 客户 ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java index e3f97ea..868f4c9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/rqc/MesQcRqcDO.java @@ -63,6 +63,10 @@ public class MesQcRqcDO extends BaseDO { * 来源单据行 ID */ private Long sourceLineId; + /** + * 来源单据编码(冗余) + */ + private String sourceDocCode; // ========== 检验类型 ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java index efd1db9..0874ea8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/rqc/MesQcRqcMapper.java @@ -19,6 +19,7 @@ public interface MesQcRqcMapper extends BaseMapperX { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(MesQcRqcDO::getCode, reqVO.getCode()) .eqIfPresent(MesQcRqcDO::getSourceDocType, reqVO.getSourceDocType()) + .likeIfPresent(MesQcRqcDO::getSourceDocCode, reqVO.getSourceDocCode()) .eqIfPresent(MesQcRqcDO::getItemId, reqVO.getItemId()) .likeIfPresent(MesQcRqcDO::getBatchCode, reqVO.getBatchCode()) .eqIfPresent(MesQcRqcDO::getCheckResult, reqVO.getCheckResult()) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/qc/MesQcSourceDocTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/qc/MesQcSourceDocTypeEnum.java index eeed840..01c8050 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/qc/MesQcSourceDocTypeEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/qc/MesQcSourceDocTypeEnum.java @@ -16,9 +16,19 @@ import java.util.Arrays; @AllArgsConstructor public enum MesQcSourceDocTypeEnum implements ArrayValuable { + // === IQC 来源单据 === ARRIVAL_NOTICE(MesBizTypeConstants.WM_ARRIVAL_NOTICE, "到货通知单"), OUTSOURCE_RECPT(MesBizTypeConstants.WM_OUTSOURCE_RECPT, "外协入库单"), - FEEDBACK(MesBizTypeConstants.PRO_FEEDBACK, "生产报工"), + + // === IPQC 来源单据 === + PRO_FEEDBACK(MesBizTypeConstants.PRO_FEEDBACK, "生产报工"), + + // === OQC 来源单据 === + PRODUCT_SALES(MesBizTypeConstants.WM_PRODUCT_SALES, "销售出库单"), + + // === RQC 来源单据 === + RETURN_ISSUE(MesBizTypeConstants.WM_RETURN_ISSUE, "生产退料单"), + RETURN_SALES(MesBizTypeConstants.WM_RETURN_SALES, "销售退货单"), ; public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesQcSourceDocTypeEnum::getType).toArray(Integer[]::new); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java index 917ba4f..2f3ba48 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.ipqc.vo.MesQcIpqcSaveReqV import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; @@ -95,12 +96,16 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { MesQcTemplateItemDO templateItem = templateDetailService.getRequiredTemplateByItemIdAndType( workOrder.getProductId(), MesQcTypeEnum.IPQC.getType()); Long templateId = templateItem.getTemplateId(); + // 1.4 获取来源单据编号 + String sourceDocCode = validateAndGetSourceDocCode( + createReqVO.getSourceDocType(), createReqVO.getSourceDocId()); // 2. 插入主表 MesQcIpqcDO ipqc = BeanUtils.toBean(createReqVO, MesQcIpqcDO.class) .setItemId(workOrder.getProductId()) .setProcessId(getProcessId(workOrder.getProductId(), workstation.getProcessId())) .setTemplateId(templateId) + .setSourceDocCode(sourceDocCode) .setStatus(MesQcStatusEnum.DRAFT.getStatus()); ipqcMapper.insert(ipqc); @@ -224,6 +229,17 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { } } + private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceDocId) { + if (sourceDocType == null || sourceDocId == null) { + return null; + } + if (Objects.equals(sourceDocType, MesBizTypeConstants.PRO_FEEDBACK)) { + MesProFeedbackDO feedback = feedbackService.getFeedback(sourceDocId); + return feedback != null ? feedback.getCode() : null; + } + return null; + } + /** * 推导工序 ID:对齐 KTG getProcessInfo() 逻辑 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java index bf8dc71..d0a466b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java @@ -76,17 +76,19 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { itemService.validateItemExists(createReqVO.getItemId()); adminUserApi.validateUser(createReqVO.getInspectorUserId()); // 1.3 校验来源单据参数,并验证数据存在 - validateSourceDoc(createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); + String sourceDocCode = validateAndGetSourceDocCode( + createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); // 1.4 通过 itemId + IQC 类型自动查找模板 MesQcTemplateItemDO templateItem = templateDetailService.getRequiredTemplateByItemIdAndType( createReqVO.getItemId(), MesQcTypeEnum.IQC.getType()); Long templateId = templateItem.getTemplateId(); // 2. 插入主表 - MesQcIqcDO iqc = BeanUtils.toBean(createReqVO, MesQcIqcDO.class); - iqc.setTemplateId(templateId); - iqc.setCheckQuantity(createReqVO.getQualifiedQuantity().add(createReqVO.getUnqualifiedQuantity())); - iqc.setStatus(MesQcStatusEnum.DRAFT.getStatus()); + MesQcIqcDO iqc = BeanUtils.toBean(createReqVO, MesQcIqcDO.class) + .setTemplateId(templateId) + .setCheckQuantity(createReqVO.getQualifiedQuantity().add(createReqVO.getUnqualifiedQuantity())) + .setSourceDocCode(sourceDocCode) + .setStatus(MesQcStatusEnum.DRAFT.getStatus()); iqcMapper.insert(iqc); // 3. 从模板指标自动生成检验行 @@ -213,9 +215,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { * @param sourceDocId 来源单据 ID * @param sourceLineId 来源单据行 ID */ - private void validateSourceDoc(Integer sourceDocType, Long sourceDocId, Long sourceLineId) { + private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceDocId, Long sourceLineId) { if (sourceDocType == null) { - return; + return null; } if (ObjUtil.hasNull(sourceDocId, sourceLineId)) { throw exception(QC_IQC_SOURCE_DOC_PARAMS_MISSING); @@ -223,9 +225,12 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { // 根据来源单据类型,校验数据存在且匹配 if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_ARRIVAL_NOTICE)) { arrivalNoticeService.validateArrivalNoticeAndLineExists(sourceDocId, sourceLineId); + return arrivalNoticeService.getArrivalNotice(sourceDocId).getCode(); } else if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_OUTSOURCE_RECPT)) { outsourceReceiptService.validateOutsourceReceiptAndLineExists(sourceDocId, sourceLineId); + return outsourceReceiptService.getOutsourceReceipt(sourceDocId).getCode(); } + return null; } @Override diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java index 19994e3..d49adfc 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java @@ -18,6 +18,9 @@ import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateDetailService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService; +import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; @@ -60,6 +63,9 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { @Resource @Lazy private MesWmProductSalesLineService productSalesLineService; + @Resource + @Lazy + private MesWmProductSalesService productSalesService; @Resource private AdminUserApi adminUserApi; @@ -77,11 +83,15 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { MesQcTemplateItemDO templateItem = templateDetailService.getRequiredTemplateByItemIdAndType( createReqVO.getItemId(), MesQcTypeEnum.OQC.getType()); Long templateId = templateItem.getTemplateId(); + // 1.4 获取来源单据编号 + String sourceDocCode = validateAndGetSourceDocCode( + createReqVO.getSourceDocType(), createReqVO.getSourceLineId()); // 2. 插入主表 - MesQcOqcDO oqc = BeanUtils.toBean(createReqVO, MesQcOqcDO.class); - oqc.setTemplateId(templateId); - oqc.setStatus(MesQcStatusEnum.DRAFT.getStatus()); + MesQcOqcDO oqc = BeanUtils.toBean(createReqVO, MesQcOqcDO.class) + .setTemplateId(templateId) + .setSourceDocCode(sourceDocCode) + .setStatus(MesQcStatusEnum.DRAFT.getStatus()); oqcMapper.insert(oqc); // 3. 从模板指标自动生成检验行 @@ -193,6 +203,20 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { } } + private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceLineId) { + if (sourceDocType == null || sourceLineId == null) { + return null; + } + if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_PRODUCT_SALES)) { + MesWmProductSalesLineDO salesLine = productSalesLineService.getProductSalesLine(sourceLineId); + if (salesLine != null && salesLine.getSalesId() != null) { + MesWmProductSalesDO sales = productSalesService.getProductSales(salesLine.getSalesId()); + return sales != null ? sales.getCode() : null; + } + } + return null; + } + @Override public MesQcOqcDO getOqc(Long id) { return oqcMapper.selectById(id); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java index cd6e513..3d6fd1f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java @@ -15,6 +15,8 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueService; +import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateDetailService; import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueLineService; import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesLineService; @@ -60,6 +62,12 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { @Resource @Lazy private MesWmReturnSalesLineService returnSalesLineService; + @Resource + @Lazy + private MesWmReturnIssueService returnIssueService; + @Resource + @Lazy + private MesWmReturnSalesService returnSalesService; @Resource private AdminUserApi adminUserApi; @@ -76,10 +84,14 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { MesQcTemplateItemDO templateItem = templateDetailService.getRequiredTemplateByItemIdAndType( createReqVO.getItemId(), createReqVO.getType()); Long templateId = templateItem.getTemplateId(); + // 1.4 获取来源单据编号 + String sourceDocCode = validateAndGetSourceDocCode( + createReqVO.getSourceDocType(), createReqVO.getSourceDocId()); // 2. 插入主表 MesQcRqcDO rqc = BeanUtils.toBean(createReqVO, MesQcRqcDO.class) .setTemplateId(templateId) + .setSourceDocCode(sourceDocCode) .setStatus(MesQcStatusEnum.DRAFT.getStatus()); rqcMapper.insert(rqc); @@ -217,6 +229,21 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { return rqcMapper.selectById(id); } + /** + * 根据来源单据类型 + 来源单据 ID,推导来源单据编码 + */ + private String validateAndGetSourceDocCode(Integer sourceDocType, Long sourceDocId) { + if (sourceDocType == null || sourceDocId == null) { + return null; + } + if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_RETURN_ISSUE)) { + return returnIssueService.getReturnIssue(sourceDocId).getCode(); + } else if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_RETURN_SALES)) { + return returnSalesService.getReturnSales(sourceDocId).getCode(); + } + return null; + } + @Override public PageResult getRqcPage(MesQcRqcPageReqVO pageReqVO) { return rqcMapper.selectPage(pageReqVO); diff --git a/yudao-module-mes/src/test/resources/sql/create_tables.sql b/yudao-module-mes/src/test/resources/sql/create_tables.sql index 68c52c3..1b40521 100644 --- a/yudao-module-mes/src/test/resources/sql/create_tables.sql +++ b/yudao-module-mes/src/test/resources/sql/create_tables.sql @@ -119,6 +119,7 @@ CREATE TABLE IF NOT EXISTS "mes_qc_iqc" ( "source_doc_type" int DEFAULT NULL, "source_doc_id" bigint DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, + "source_doc_code" varchar(64) DEFAULT NULL, "vendor_id" bigint DEFAULT NULL, "vendor_batch" varchar(64) DEFAULT NULL, "item_id" bigint DEFAULT NULL, @@ -159,6 +160,7 @@ CREATE TABLE IF NOT EXISTS "mes_qc_ipqc" ( "source_doc_type" int DEFAULT NULL, "source_doc_id" bigint DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, + "source_doc_code" varchar(64) DEFAULT NULL, "work_order_id" bigint DEFAULT NULL, "task_id" bigint DEFAULT NULL, "workstation_id" bigint DEFAULT NULL, @@ -310,6 +312,7 @@ CREATE TABLE IF NOT EXISTS "mes_qc_oqc" ( "source_doc_id" bigint DEFAULT NULL, "source_doc_type" int DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, + "source_doc_code" varchar(64) DEFAULT NULL, "client_id" bigint NOT NULL, "batch_code" varchar(64) DEFAULT NULL, "item_id" bigint NOT NULL, @@ -351,6 +354,7 @@ CREATE TABLE IF NOT EXISTS "mes_qc_rqc" ( "source_doc_id" bigint DEFAULT NULL, "source_doc_type" int DEFAULT NULL, "source_line_id" bigint DEFAULT NULL, + "source_doc_code" varchar(64) DEFAULT NULL, "type" int DEFAULT NULL, "item_id" bigint NOT NULL, "batch_code" varchar(128) DEFAULT NULL,