| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcPurchaseReturnDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseReturnMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseConcessionMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | |
| | | @Service |
| | | public class MesQcPurchaseReturnService { |
| | | /** 采购退货单编码规则(MesMdAutoCodeRule 中的 code) */ |
| | | private static final String RETURN_VENDOR_CODE_RULE = "WM_RETURN_VENDOR_CODE"; |
| | | |
| | | @Resource private MesQcNcrPurchaseSourceValidator sourceValidator; |
| | | @Resource private MesQcPurchaseReturnMapper mapper; |
| | | @Resource private MesQcPurchaseConcessionMapper concessionMapper; |
| | | @Resource private MesQcArrivalDispositionService arrivalDispositionService; |
| | | @Resource private MesWmReturnVendorMapper returnVendorMapper; |
| | | @Resource private MesWmReturnVendorLineMapper returnVendorLineMapper; |
| | | @Resource private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | | /** 必须由已锁定 NCR 的处置事务调用。 */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | if (source.notice().getVendorId() == null || source.notice().getPurchaseOrderId() == null |
| | | || source.line().getPurchaseOrderItemId() == null) |
| | | throw new ServiceException(400, "到货单缺少供应商、采购订单或采购明细,无法生成可追溯退货单"); |
| | | |
| | | // 1. 生成「供应商退货单」:不合格品从未入库,不产生库存出库,也无需拣货与审批, |
| | | // 直接以已完成状态落到采购仓库-采购退货列表中,供仓库/采购追溯并按实物退回供应商。 |
| | | String code = autoCodeRecordService.generateAutoCode(RETURN_VENDOR_CODE_RULE, null); |
| | | MesWmReturnVendorDO vendorReturn = new MesWmReturnVendorDO(); |
| | | vendorReturn.setCode(code); |
| | | vendorReturn.setName("来料不合格退货-" + ncr.getCode()); |
| | | vendorReturn.setPurchaseOrderId(source.notice().getPurchaseOrderId()); |
| | | vendorReturn.setPurchaseOrderCode(source.notice().getPurchaseOrderCode()); |
| | | vendorReturn.setContractNo(source.notice().getContractNo()); |
| | | vendorReturn.setVendorId(source.notice().getVendorId()); |
| | | vendorReturn.setReturnDate(LocalDateTime.now()); |
| | | vendorReturn.setReturnReason("来料检验不合格"); |
| | | vendorReturn.setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus()); |
| | | vendorReturn.setRemark("由来料不合格单 " + ncr.getCode() + "(来料检验 " + source.iqc().getCode() |
| | | + ")退货处置自动生成;不合格品未入库,无需拣货,单据直接完成。"); |
| | | returnVendorMapper.insert(vendorReturn); |
| | | MesWmReturnVendorLineDO vendorReturnLine = new MesWmReturnVendorLineDO(); |
| | | vendorReturnLine.setReturnId(vendorReturn.getId()); |
| | | vendorReturnLine.setItemId(ncr.getItemId()); |
| | | vendorReturnLine.setQuantity(ncr.getUnqualifiedQuantity()); |
| | | vendorReturnLine.setBatchCode(StrUtil.blankToDefault(source.iqc().getVendorBatch(), null)); |
| | | vendorReturnLine.setRemark("来料检验 " + source.iqc().getCode() + " 不合格数量"); |
| | | returnVendorLineMapper.insert(vendorReturnLine); |
| | | |
| | | // 2. 记录质量侧处置台账(与退货单同号),因退货单已直接完成,这里同步标记为已确认, |
| | | // 不合格单关闭时校验的正是这条记录。 |
| | | MesQcPurchaseReturnDO doc = new MesQcPurchaseReturnDO(); |
| | | doc.setCode("NCR-RET-" + ncr.getId()); |
| | | doc.setCode(code); |
| | | doc.setNcrId(ncr.getId()); |
| | | doc.setIqcId(ncr.getQcId()); |
| | | doc.setNoticeId(source.notice().getId()); |
| | |
| | | doc.setItemId(ncr.getItemId()); |
| | | doc.setVendorBatch(source.iqc().getVendorBatch()); |
| | | doc.setQuantity(ncr.getUnqualifiedQuantity()); |
| | | doc.setStatus(0); |
| | | doc.setStatus(1); |
| | | doc.setConfirmedBy(getLoginUserId()); |
| | | doc.setConfirmedAt(LocalDateTime.now()); |
| | | doc.setConfirmationRemark("随不合格处置自动生成采购退货单 " + code + ",未发生库存出库"); |
| | | mapper.insert(doc); |
| | | arrivalDispositionService.refresh(source.notice().getId()); |
| | | return doc; |
| | | } |
| | | |