From ce02d5c60282c4779e45b180c615506933ca211d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Tue, 9 Jun 2026 16:24:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(inproduce):=20=E6=B7=BB=E5=8A=A0PDI?= =?UTF-8?q?=E8=B4=A8=E6=A3=80=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 集成QMS服务实现PDI质检任务推送和回调处理 - 新增质检状态字段用于跟踪31成品入库质检流程 - 添加机型编号和机台编号参数支持质检设备识别 - 实现质检不合格项目过滤显示逻辑 - 集成SAP服务实现质检结果同步处理 --- ...IncomingInspectionTaskCallbackService.java | 4 +- .../controller/InProduceOrderController.java | 51 ++++++++--------- .../nflg/wms/admin/service/QmsService.java | 55 +++++++++++++++---- .../qo/InProduceOrderGenerateMaterialsQO.java | 24 +++++++- .../common/pojo/qo/QmsPdiTaskRecordAddQO.java | 2 + .../common/pojo/vo/InProduceOrderItemVO.java | 5 ++ .../pojo/vo/InProduceOrderMaterialVO.java | 5 ++ .../entity/WmsInProduceOrderItem.java | 15 +++++ .../srm/receive/controller/QmsController.java | 27 +++++++-- .../pojo/qo/PdiInspectionTaskCallbackQO.java | 17 ++++++ 10 files changed, 160 insertions(+), 45 deletions(-) create mode 100644 nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/pojo/qo/PdiInspectionTaskCallbackQO.java diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java index ef978a29..44b3e9ff 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/WmsIncomingInspectionTaskCallbackService.java @@ -31,10 +31,10 @@ import java.util.Objects; @Service public class WmsIncomingInspectionTaskCallbackService { - @Value("${wms.incoming.inspection.task.callback.url}") + @Value("${wms.iqc.incoming.callback.url}") private String incomingUrl; - @Value("${wms.inventory.inspection.task.callback.url}") + @Value("${wms.iqc.inventory.callback.url}") private String inventoryUrl; @Resource diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index b580484f..2e954848 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -9,10 +9,7 @@ import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.request.NoScanningItemDataRequest; import com.nflg.wms.admin.pojo.request.NoScanningRequest; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; -import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; -import com.nflg.wms.admin.service.BinService; -import com.nflg.wms.admin.service.NoScanningBaseControllerService; -import com.nflg.wms.admin.service.SapService; +import com.nflg.wms.admin.service.*; import com.nflg.wms.admin.util.*; import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeType; @@ -86,21 +83,6 @@ public class InProduceOrderController extends BaseController { @Resource private IWmsInventoryService inventoryService; -// @Resource -// private IWmsStorageService storageService; -// -// @Resource -// private IDictionaryService dictionaryService; -// -// @Resource -// private IWmsWarehouseService warehouseService; -// -// @Resource -// private IWmsStorageBinService storageBinService; -// -// @Resource -// private IWmsBinService wmsBinService; - @Resource private InMaterialScanRecordRespository inMaterialScanRecordRespository; @@ -114,7 +96,7 @@ public class InProduceOrderController extends BaseController { private IWmsQrCodeMasterService qrCodeMasterService; @Resource - private IWmsStorageService storageService; + private QmsService qmsService; @Resource private IWmsWarehouseService warehouseService; @@ -142,6 +124,10 @@ public class InProduceOrderController extends BaseController { @Transactional @PostMapping("save") public ApiResult save(@Valid @RequestBody InProduceOrderGenerateMaterialsQO request) { + if (request.isNeedInspection()) { + VUtil.trueThrowBusinessError(StrUtil.isBlank(request.getModelNo()) || StrUtil.isBlank(request.getWorkbenchNo())) + .throwMessage("机型编号和机台编号不能为空"); + } WmsInProduceOrder order = new WmsInProduceOrder() .setId(IdUtil.getSnowflakeNextId()) .setDataType(request.getDataType()) @@ -166,7 +152,10 @@ public class InProduceOrderController extends BaseController { .setWarehouseNo(request.getLgort()) .setOrderNum(request.getPsmng()) .setBatchNo(date + index) - .setSernr(request.getSernr()); + .setSernr(request.getSernr()) + .setWorkbenchNo(request.getWorkbenchNo()) + .setModelNo(request.getModelNo()) + .setInspectionStatus(request.isNeedInspection() ? 0 : null); produceOrderItemService.save(parent); if (request.getList()) { List children = bomService.getChildren(request.getMatnr()); @@ -224,6 +213,7 @@ public class InProduceOrderController extends BaseController { .setCreateTime(LocalDateTime.now()) ); } + qmsService.pushPdiInspection(order.getNo(), parent); return ApiResult.success(order.getId()); } @@ -391,6 +381,7 @@ public class InProduceOrderController extends BaseController { .throwMessage("该订单非待收货状态"); InProduceOrderVO vo = Convert.convert(InProduceOrderVO.class, order); List list = produceOrderItemService.getVOByOrderId(order.getId()); + list.removeIf(item -> item.getInspectionStatus() == 0 || item.getInspectionStatus() == 2); list.forEach(it -> { if (it.getParentId() == 0) { it.setBinNo(binService.getBinNo(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo())); @@ -431,13 +422,16 @@ public class InProduceOrderController extends BaseController { .eq(StrUtil.isNotBlank(no), WmsInProduceOrder::getNo, no) .one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - if (order.getState()==1){ + if (order.getState() == 1) { return ApiResult.success(Collections.emptyList()); } List items = produceOrderItemService.lambdaQuery() .eq(WmsInProduceOrderItem::getOrderId, order.getId()) .list(); - items.removeIf(item -> noScanningBaseControllerService.existsQrCode(item.getMaterialNo())); + items.removeIf(item -> item.getInspectionStatus() == 0 + || item.getInspectionStatus() == 2 + || noScanningBaseControllerService.existsQrCode(item.getMaterialNo()) + ); return ApiResult.success( items.stream() .map(item -> new NoScanItemVO() @@ -517,7 +511,10 @@ public class InProduceOrderController extends BaseController { .setPSMNG(data.getNum()) .setAMEIN(item.getUnit()) .setLGORT(ri.getWarehouseNo()) - .setCHARG(data.getBatchNo()), (e, i) -> { e.setPSMNG(e.getPSMNG().add(i.getPSMNG())); return e; }); + .setCHARG(data.getBatchNo()), (e, i) -> { + e.setPSMNG(e.getPSMNG().add(i.getPSMNG())); + return e; + }); if (StrUtil.isNotBlank(data.getSerialNo())) { sernrs.add(data.getSerialNo()); } @@ -597,9 +594,9 @@ public class InProduceOrderController extends BaseController { List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() - .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) - .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) - .list(); + .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) + .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) + .list(); datas.forEach(it -> { InventoryIn1ItemQO qitem = request.getItems().stream() .filter(item -> Objects.equals(item.getItemId(), it.getId())) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/QmsService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/QmsService.java index f9398b1a..df030248 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/QmsService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/QmsService.java @@ -3,14 +3,10 @@ package com.nflg.wms.admin.service; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.nflg.wms.common.pojo.ApiResult; -import com.nflg.wms.common.pojo.qo.ExemptMaterialCheckQO; -import com.nflg.wms.common.pojo.qo.ExternalIncomingInspectionApplyQO; -import com.nflg.wms.common.pojo.qo.QmsCoaReportCheckQO; +import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.ExemptMaterialCheckVO; -import com.nflg.wms.common.pojo.qo.ExternalInventoryInspectionApplyQO; -import com.nflg.wms.common.pojo.qo.InventoryDetectionApplyQO; -import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordAddQO; import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.WmsInProduceOrderItem; import com.nflg.wms.repository.entity.WmsInventory; import com.nflg.wms.repository.entity.WmsOutProduce; import com.nflg.wms.repository.entity.WmsQrCodeMaster; @@ -72,6 +68,9 @@ public class QmsService { @Value("${qms.iqc.inventory.apply.url}") private String iqcInventoryApplyUrl; + @Value("${qms.pdi.apply.url}") + private String pdiApplyUrl; + /** * 推送IQC来料检验申请到QMS */ @@ -127,11 +126,11 @@ public class QmsService { * 检查COA报告 */ public boolean coaReportPass(String supplierCode, String materialNo, String purchaseNo) { - log.info("检测是否已提交COA报告,供应商:{},物料编号:{},采购单号:{}", supplierCode, materialNo,purchaseNo); + log.info("检测是否已提交COA报告,供应商:{},物料编号:{},采购单号:{}", supplierCode, materialNo, purchaseNo); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity requestEntity = new HttpEntity<>(new QmsCoaReportCheckQO(supplierCode, materialNo,purchaseNo), headers); + HttpEntity requestEntity = new HttpEntity<>(new QmsCoaReportCheckQO(supplierCode, materialNo, purchaseNo), headers); ResponseEntity> response = restTemplate.exchange( qmsHost + checkReportUrl, @@ -146,7 +145,7 @@ public class QmsService { VUtil.trueThrowBusinessError( Objects.isNull(response.getBody()) || response.getBody().getCode() != 200 ).throwMessage("检测是否已提交COA报告失败:" + response.getBody().getMessage()); - return !Objects.equals(response.getBody().getResult(),false); + return !Objects.equals(response.getBody().getResult(), false); } public void pushInventoryInspection(InventoryDetectionApplyQO request) { @@ -181,7 +180,8 @@ public class QmsService { qmsHost + iqcInventoryApplyUrl, HttpMethod.POST, requestEntity, - new ParameterizedTypeReference>() {} + new ParameterizedTypeReference>() { + } ); ApiResult body = response.getBody(); @@ -223,7 +223,8 @@ public class QmsService { qmsHost + "/external/pdi-task-record/add", HttpMethod.POST, requestEntity, - new ParameterizedTypeReference>() {} + new ParameterizedTypeReference>() { + } ); ApiResult body = response.getBody(); @@ -276,4 +277,36 @@ public class QmsService { return new ArrayList<>(qrCodes); } + /** + * 推送PDI检验申请 + * @param orderNo 订单编号 + * @param item 订单项 + */ + public void pushPdiInspection(String orderNo, WmsInProduceOrderItem item) { + QmsPdiTaskRecordAddQO qo = new QmsPdiTaskRecordAddQO() + .setDeviceNo(item.getWorkbenchNo()) + .setModelNo(item.getModelNo()) + .setFactoryNo(item.getFactoryNo()) + .setOrderNo(orderNo) + .setWarehouseNo(item.getWarehouseNo()); + log.info("推送PDI检验申请到QMS:{}", JSONUtil.toJsonStr(qo)); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity requestEntity = new HttpEntity<>(qo, headers); + + ResponseEntity> response = restTemplate.exchange( + qmsHost + pdiApplyUrl, + HttpMethod.POST, + requestEntity, + new ParameterizedTypeReference>() { + } + ); + + log.info("推送PDI检验申请到QMS结果:{},{}", + response.getStatusCode().value(), JSONUtil.toJsonStr(response.getBody())); + VUtil.trueThrowBusinessError( + Objects.isNull(response.getBody()) || response.getBody().getCode() != 200 + ).throwMessage("推送PDI检验申请到QMS失败:" + response.getBody().getMessage()); + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java index e2124f88..06011a39 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/InProduceOrderGenerateMaterialsQO.java @@ -1,5 +1,7 @@ package com.nflg.wms.common.pojo.qo; +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.nflg.wms.common.pojo.dto.ZWM00MB007DTO; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; @@ -29,4 +31,24 @@ public class InProduceOrderGenerateMaterialsQO extends ZWM00MB007DTO { @NotNull @Positive(message = "收货数量必须大于0") private BigDecimal num; -} + + /** + * 机台编号 + */ + private String workbenchNo; + + /** + * 机型编号 + */ + private String modelNo; + + /** + * 是否需要质检 + */ + @JsonIgnore + private boolean needInspection; + + public boolean isNeedInspection() { + return getMatnr().startsWith("31") && StrUtil.equals(getLgort(),"0041"); + } +} \ No newline at end of file diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiTaskRecordAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiTaskRecordAddQO.java index 3d18a906..6b8163a5 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiTaskRecordAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiTaskRecordAddQO.java @@ -2,11 +2,13 @@ package com.nflg.wms.common.pojo.qo; import jakarta.validation.constraints.NotBlank; import lombok.Data; +import lombok.experimental.Accessors; /** * PDI检测任务记录 新增请求参数(外部接口) */ @Data +@Accessors(chain = true) public class QmsPdiTaskRecordAddQO { /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java index 7d3510ab..71d5a505 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderItemVO.java @@ -85,6 +85,11 @@ public class InProduceOrderItemVO { @JsonProperty("isDisableLocation") private Boolean isDisableLocation = true; + /** + * 质检状态,31成品入库需要,0:待质检;1:质检通过;2:质检未通过 + */ + private Integer inspectionStatus; + /** * 清点件的齐套物料列表 */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderMaterialVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderMaterialVO.java index 96915239..5eefde01 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderMaterialVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/InProduceOrderMaterialVO.java @@ -62,5 +62,10 @@ public class InProduceOrderMaterialVO { */ private String batchNo; + /** + * 质检状态,31成品入库需要,0:待质检;1:质检通过;2:质检未通过 + */ + private Integer inspectionStatus; + private List children; } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInProduceOrderItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInProduceOrderItem.java index df791088..9a01d7bb 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInProduceOrderItem.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsInProduceOrderItem.java @@ -90,4 +90,19 @@ public class WmsInProduceOrderItem implements Serializable { * 序列号 */ private String sernr; + + /** + * 质检状态,31成品入库需要,0:待质检;1:质检通过;2:质检未通过 + */ + private Integer inspectionStatus; + + /** + * 机台编号 + */ + private String workbenchNo; + + /** + * 机型编号 + */ + private String modelNo; } diff --git a/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java index 7a64d8d9..06e64ba4 100644 --- a/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java +++ b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/controller/QmsController.java @@ -11,14 +11,12 @@ import com.nflg.wms.common.pojo.dto.MaterialQrCodeDTO; import com.nflg.wms.common.pojo.dto.SRMQualityInspectionResultDTO; import com.nflg.wms.common.pojo.qo.WmsIncomingInspectionTaskCallbackQO; import com.nflg.wms.common.util.VUtil; -import com.nflg.wms.repository.entity.WmsQcReceive; -import com.nflg.wms.repository.entity.WmsQcReceiveItem; -import com.nflg.wms.repository.entity.WmsQrCodeMaster; -import com.nflg.wms.repository.entity.WmsSrmQualityInspection; +import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.service.*; import com.nflg.wms.srm.receive.pojo.dto.ZWM3A17DTO; import com.nflg.wms.srm.receive.pojo.dto.ZWM3A17Item1DTO; import com.nflg.wms.srm.receive.pojo.dto.ZWM3A17Item2DTO; +import com.nflg.wms.srm.receive.pojo.qo.PdiInspectionTaskCallbackQO; import com.nflg.wms.srm.receive.service.SapService; import com.nflg.wms.srm.receive.util.NoUtil; import com.nflg.wms.starter.BaseController; @@ -63,6 +61,12 @@ public class QmsController extends BaseController { @Resource private SapService sapService; + @Resource + private IWmsInProduceOrderService produceOrderService; + + @Resource + private IWmsInProduceOrderItemService produceOrderItemService; + /** * IQC来料检测回调 */ @@ -231,4 +235,19 @@ public class QmsController extends BaseController { log.info("质检单处理完成: {}, 结果: {}", qo.getTaskNo(), inspect.getInspectionResult()); return ApiResult.success(); } + + /** + * PDI检测回调 + */ + @Transactional + @PostMapping("/pdi") + public ApiResult pdi(@RequestBody @NotNull PdiInspectionTaskCallbackQO qo) { + log.info("质检单解析完成, 单号: {}, 是否合格: {}", qo.getOrderNo(), qo.isPass()); + WmsInProduceOrder order = produceOrderService.getByNo(qo.getOrderNo()); + VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); + WmsInProduceOrderItem item = produceOrderItemService.getByOrderId(order.getId()).get(0); + item.setInspectionStatus(qo.isPass() ? 1 : 2); + produceOrderItemService.updateById(item); + return ApiResult.success(); + } } diff --git a/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/pojo/qo/PdiInspectionTaskCallbackQO.java b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/pojo/qo/PdiInspectionTaskCallbackQO.java new file mode 100644 index 00000000..135d23e4 --- /dev/null +++ b/nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/pojo/qo/PdiInspectionTaskCallbackQO.java @@ -0,0 +1,17 @@ +package com.nflg.wms.srm.receive.pojo.qo; + +import lombok.Data; + +@Data +public class PdiInspectionTaskCallbackQO { + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 质检是否合格 + */ + private boolean pass; +} \ No newline at end of file