| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; |
| | |
| | | import java.util.Objects; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportExcelVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportRespVO; |
| | |
| | | .setTemplateId(templateId) |
| | | .setSourceDocCode(sourceDocCode) |
| | | .setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | // 检测人员、检测日期未填写时使用默认值,不影响流程 |
| | | if (rqc.getInspectorUserId() == null) { |
| | | rqc.setInspectorUserId(getLoginUserId()); |
| | | } |
| | | if (rqc.getInspectDate() == null) { |
| | | rqc.setInspectDate(LocalDateTime.now()); |
| | | } |
| | | rqcMapper.insert(rqc); |
| | | |
| | | // 3. 从模板指标自动生成检验行 |
| | |
| | | validateRqcCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // 校验物料、检测人员存在(兼容 mdm_item.id / mes_md_item.id) |
| | | qcItemResolver.validateItemExists(reqVO.getItemId()); |
| | | adminUserApi.validateUser(reqVO.getInspectorUserId()); |
| | | // 校验检测人员存在(非必填,未填写时由创建逻辑默认当前登录人) |
| | | if (reqVO.getInspectorUserId() != null) { |
| | | adminUserApi.validateUser(reqVO.getInspectorUserId()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | throw exception(QC_RQC_QUANTITY_MISMATCH); |
| | | } |
| | | } |
| | | // 1.4 校验至少存在一条检测结果 |
| | | // 1.4 校验检测数量与来源退货行数量一致,避免回写时覆盖来源行数量 |
| | | validateSourceLineQuantity(rqc); |
| | | // 1.5 校验至少存在一条检测结果 |
| | | indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType()); |
| | | |
| | | // 2. 更新状态为已完成 |
| | |
| | | |
| | | // 4. 回写来源单据 |
| | | writeBackSourceDoc(rqc); |
| | | } |
| | | |
| | | /** |
| | | * 校验检测数量与来源退货行数量一致 |
| | | * |
| | | * <p>回写来源单据时会用合格/不合格数量重写行的数量,若检测数量与来源行不一致会静默改变退货数量, |
| | | * 因此完成检验前必须保证两者相等。 |
| | | */ |
| | | private void validateSourceLineQuantity(MesQcRqcDO rqc) { |
| | | if (rqc.getSourceDocType() == null || rqc.getSourceLineId() == null || rqc.getCheckQuantity() == null) { |
| | | return; |
| | | } |
| | | BigDecimal sourceQuantity = null; |
| | | if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) { |
| | | MesWmReturnIssueLineDO line = returnIssueLineService.getReturnIssueLine(rqc.getSourceLineId()); |
| | | if (line != null) { |
| | | sourceQuantity = line.getQuantity(); |
| | | } |
| | | } else if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)) { |
| | | MesWmReturnSalesLineDO line = returnSalesLineService.getReturnSalesLine(rqc.getSourceLineId()); |
| | | if (line != null) { |
| | | sourceQuantity = line.getQuantity(); |
| | | } |
| | | } |
| | | if (sourceQuantity != null && rqc.getCheckQuantity().compareTo(sourceQuantity) != 0) { |
| | | throw exception(QC_RQC_SOURCE_QUANTITY_INVALID, sourceQuantity.stripTrailingZeros().toPlainString()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | return; |
| | | } |
| | | if (rqc.getSourceLineId() == null) { |
| | | throw new IllegalArgumentException( |
| | | "RQC 单[" + rqc.getId() + "] sourceDocType 非空但 sourceLineId 为空"); |
| | | throw exception(QC_RQC_SOURCE_LINE_REQUIRED); |
| | | } |
| | | |
| | | if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) { |
| | |
| | | rqc.getSourceLineId(), rqc.getSourceDocId(), rqc.getCheckResult(), |
| | | rqc.getQualifiedQuantity(), rqc.getUnqualifiedQuantity()); |
| | | } else { |
| | | throw new IllegalArgumentException( |
| | | "RQC 单[" + rqc.getId() + "] sourceDocType=" + rqc.getSourceDocType() + " 无法识别,无法回写来源单据"); |
| | | throw exception(QC_RQC_SOURCE_DOC_TYPE_UNKNOWN, rqc.getSourceDocType()); |
| | | } |
| | | } |
| | | |