| | |
| | | } |
| | | |
| | | private void createTransactionList(Long produceId, List<MesWmProductProduceLineDO> lines) { |
| | | // 生产订单 ID 冗余到流水,便于出库台账按生产订单追溯 |
| | | MesWmProductProduceDO produce = productProduceMapper.selectById(produceId); |
| | | Long workOrderId = produce != null ? produce.getWorkOrderId() : null; |
| | | for (MesWmProductProduceLineDO line : lines) { |
| | | if (MesWmQualityStatusEnum.FAIL.getStatus().equals(line.getQualityStatus())) { |
| | | // 不合格产出保留记录,交由不合格品处理,不生成合格库存流水。 |
| | |
| | | .setQuantity(detail.getQuantity()) |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId) |
| | | .setBizType(MesBizTypeConstants.WM_PRODUCT_PRODUCE).setBizId(produceId).setWorkOrderId(workOrderId) |
| | | .setBizCode("").setBizLineId(line.getId())); |
| | | } |
| | | } |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MesWmProductProduceDO generateProductProduce(MesProFeedbackDO feedback, boolean checkFlag, |
| | | MesProFeedbackApproveReqVO approveReqVO) { |
| | | if (!checkFlag) throw exception(WM_PRODUCT_PRODUCE_QUALITY_PENDING); |
| | | // 0. 查询关联的工单(用于获取 clientId 等信息) |
| | | // 0. 查询关联的工单(用于获取 clientId、产品等信息) |
| | | MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(feedback.getWorkOrderId()); |
| | | |
| | | // 1. 创建产出单头 |
| | |
| | | Long batchId = batch != null ? batch.getId() : null; |
| | | String batchCode = batch != null ? batch.getCode() : null; |
| | | |
| | | // 新报工产出统一待检,历史不检验即入库分支已移除。 |
| | | // 半成品(报工物料 != 工单成品)按生产 BOM 直接自动入库,不等质检、不走审批; |
| | | // 成品仍统一待检,质检合格后才生成入库流水。 |
| | | boolean semiFinished = workOrder != null && feedback.getItemId() != null |
| | | && ObjUtil.notEqual(feedback.getItemId(), workOrder.getProductId()); |
| | | MesWmProductProduceLineDO line = buildProduceLine(produce, feedback, batchId, batchCode, |
| | | feedback.getFeedbackQuantity(), MesWmQualityStatusEnum.PENDING.getStatus(), |
| | | feedback.getFeedbackQuantity(), |
| | | semiFinished ? MesWmQualityStatusEnum.PASS.getStatus() : MesWmQualityStatusEnum.PENDING.getStatus(), |
| | | workOrder != null ? workOrder.getReelNo() : null); |
| | | productProduceLineService.createProductProduceLine(line); |
| | | if (semiFinished) { |
| | | WarehouseTarget target = resolveOutputTarget(feedback.getWorkOrderId(), feedback.getProcessId(), |
| | | feedback.getItemId()); |
| | | productProduceDetailService.createProductProduceDetail(MesWmProductProduceDetailDO.builder() |
| | | .produceId(produce.getId()).lineId(line.getId()) |
| | | .itemId(feedback.getItemId()).quantity(feedback.getFeedbackQuantity()) |
| | | .batchId(batchId).batchCode(batchCode).reelNo(line.getReelNo()) |
| | | .warehouseId(target.warehouseId()).locationId(target.locationId()).areaId(target.areaId()) |
| | | .build()); |
| | | finishProductProduce(produce.getId()); |
| | | } |
| | | return produce; |
| | | } |
| | | |
| | |
| | | if (produce == null) { |
| | | throw exception(WM_PRODUCT_PRODUCE_NOT_EXISTS); |
| | | } |
| | | // 半成品在报工审批时已自动入库(产出单已完成),质检完成时不再重复拆分入库 |
| | | if (ObjUtil.equal(produce.getStatus(), MesWmProductProduceStatusEnum.FINISHED.getStatus())) { |
| | | return; |
| | | } |
| | | // 2. 通过 sourceLineId 直接定位待检验行 |
| | | MesWmProductProduceLineDO pendingLine = productProduceLineService.validateProductProduceLineExists(sourceLineId); |
| | | if (!ObjUtil.equal(pendingLine.getProduceId(), produce.getId()) |