From 7511d211c6741f1e8044ec6a721b013c795c99d6 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 09:14:01 +0800 Subject: [PATCH 01/27] =?UTF-8?q?fix(wms):=20=E4=BF=AE=E5=A4=8D=E7=9B=98?= =?UTF-8?q?=E7=82=B9=E8=AF=A6=E6=83=85=E6=89=B9=E6=AC=A1=E5=B1=9E=E6=80=A7?= =?UTF-8?q?attributeValue=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 标签映射表改LinkedHashMap固定优先级,补全批次号/入库日期/生产日期/过期日期及英文标签映射 2. fieldName反射取不到值时回退按batchLabels映射再取,修复fieldName配置失效导致值永远为空 3. batchDetailId为空的批次属性配置行不再丢弃,改为batchDetailId+标签双重去重 --- ...InvestigationManageApplicationService.java | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java index 6cb4ca1d8..728655db5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java @@ -236,8 +236,9 @@ public class InvestigationManageApplicationService { if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) { List batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId); - // 用于跟踪已添加到列表中的batchDetailId + // 用于跟踪已添加到列表中的batchDetailId(batchDetailId为空的配置行改用标签去重,不再丢弃) Set addedBatchDetailIds = new HashSet<>(); + Set addedLabelKeys = new HashSet<>(); for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) { MaterialMoreDetailPO materialMoreDetailPO = new MaterialMoreDetailPO(); @@ -249,40 +250,44 @@ public class InvestigationManageApplicationService { materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption()); materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark()); - // 确保添加到列表中(使用batchDetailId来避免重复) + // 确保添加到列表中(按batchDetailId+标签双重去重,batchDetailId为空的配置行也保留) Long batchDetailId = batchDetailFeignPO.getBatchDetailId(); - if (batchDetailId != null && !addedBatchDetailIds.contains(batchDetailId)) { + String labelKey = batchDetailFeignPO.getBatchLabels() == null ? "" : batchDetailFeignPO.getBatchLabels().trim(); + boolean duplicated = addedLabelKeys.contains(labelKey) + || (batchDetailId != null && addedBatchDetailIds.contains(batchDetailId)); + if (!duplicated) { materialMoreDetailList.add(materialMoreDetailPO); - addedBatchDetailIds.add(batchDetailId); + addedLabelKeys.add(labelKey); + if (batchDetailId != null) { + addedBatchDetailIds.add(batchDetailId); + } } // 根据fieldName或batchLabels从库存表中获取对应的字段值 if (materialInventoryPO != null) { String fieldValue = null; - String usedFieldName = null; // 优先使用fieldName(如果存在) if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) { - usedFieldName = batchDetailFeignPO.getFieldName(); + String usedFieldName = batchDetailFeignPO.getFieldName(); fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName); - log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", + log.info("批次属性 batchDetailId={}, fieldName={}, 从库存表获取到的值={}", batchDetailFeignPO.getBatchDetailId(), usedFieldName, fieldValue); - } - // 如果fieldName为空,尝试根据batchLabels映射到字段名 - else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { + } + // fieldName没取到值时,回退按batchLabels映射字段名再取一次(修复fieldName配置失效导致值永远为空) + if (fieldValue == null && StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) { String fieldNameByLabel = getFieldNameByBatchLabel(batchDetailFeignPO.getBatchLabels()); if (StringUtils.isNotBlank(fieldNameByLabel)) { - usedFieldName = fieldNameByLabel; - fieldValue = getFieldValueByFieldName(materialInventoryPO, usedFieldName); - log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", - batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), - usedFieldName, fieldValue); + fieldValue = getFieldValueByFieldName(materialInventoryPO, fieldNameByLabel); + log.info("批次属性 batchDetailId={}, batchLabels={}, 映射字段名={}, 从库存表获取到的值={}", + batchDetailFeignPO.getBatchDetailId(), batchDetailFeignPO.getBatchLabels(), + fieldNameByLabel, fieldValue); } } // 只有当获取到值时才更新attributeValue if (fieldValue != null) { materialMoreDetailPO.setAttributeValue(fieldValue); - log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", - materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), + log.info("设置更多属性:batchDetailId={}, batchLabels={}, attributeValue={}", + materialMoreDetailPO.getBatchDetailId(), materialMoreDetailPO.getBatchLabels(), materialMoreDetailPO.getAttributeValue()); } } @@ -306,22 +311,29 @@ public class InvestigationManageApplicationService { return null; } - // 批次标签到字段名的映射关系 - Map labelToFieldNameMap = new HashMap<>(); - labelToFieldNameMap.put("Invoice No.", "invoiceNo"); - labelToFieldNameMap.put("Invoice No", "invoiceNo"); - labelToFieldNameMap.put("发票号", "invoiceNo"); + // 批次标签到字段名的映射关系(LinkedHashMap保证匹配优先级稳定;长key放前面,避免短标签模糊匹配被抢先误匹配) + Map labelToFieldNameMap = new LinkedHashMap<>(); labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo"); + labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo"); + labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo"); + labelToFieldNameMap.put("Invoice No.", "invoiceNo"); + labelToFieldNameMap.put("发票号", "invoiceNo"); labelToFieldNameMap.put("Batch Ref NO", "batchRefNo"); labelToFieldNameMap.put("批次参考号", "batchRefNo"); - labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo"); labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo"); labelToFieldNameMap.put("单据参考号", "sheetRefNo"); - labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo"); labelToFieldNameMap.put("箱号", "boxPalletNo"); labelToFieldNameMap.put("卡板号", "boxPalletNo"); + labelToFieldNameMap.put("Batch Number", "batchNumber"); + labelToFieldNameMap.put("Production Date", "productionDate"); labelToFieldNameMap.put("生产日期", "productionDate"); + labelToFieldNameMap.put("Expiry Date", "expiryDate"); + labelToFieldNameMap.put("EXP Date", "expiryDate"); labelToFieldNameMap.put("过期日期", "expiryDate"); + labelToFieldNameMap.put("Batch No", "batchNumber"); + labelToFieldNameMap.put("批次号", "batchNumber"); + labelToFieldNameMap.put("入库日期", "createTime"); + labelToFieldNameMap.put("入库时间", "createTime"); labelToFieldNameMap.put("存货日期", "inventoryDate"); labelToFieldNameMap.put("扩展字段1", "extAttr1"); labelToFieldNameMap.put("扩展字段2", "extAttr2"); @@ -334,14 +346,16 @@ public class InvestigationManageApplicationService { return fieldName; } - // 模糊匹配(包含关系) + // 模糊匹配(包含关系):多个key命中时取最长的key,保证同一标签映射结果稳定 + String bestMatchKey = null; for (Map.Entry entry : labelToFieldNameMap.entrySet()) { if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(batchLabel)) { - return entry.getValue(); + if (bestMatchKey == null || entry.getKey().length() > bestMatchKey.length()) { + bestMatchKey = entry.getKey(); + } } } - - return null; + return bestMatchKey != null ? labelToFieldNameMap.get(bestMatchKey) : null; } /** From 764958571551a5de1142dea575d06924d56ec37d Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 09:27:57 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E5=8F=91=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../main/java/com/mhd/system/api/WlhyServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/WmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/YmsServiceFeign.java | 2 +- .../com/mhd/common/core/feign/ThirdPartyServiceFeign.java | 2 +- .../oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java index 93cb610ff..6889c728b 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/BmsServiceFeign.java @@ -19,7 +19,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.109:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface BmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java index 78bce4d42..7c4b7082f 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface OmsServiceFeign { diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index d976fcc98..ba9a45148 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.33.0.129:8014",configuration = FeignAutoConfiguration.class) public interface WlhyServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java index 9016575f6..ceaf3780b 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java @@ -21,7 +21,7 @@ import java.util.Map; * @description: TODO * @date 2024/5/10 8:58 **/ -@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,url = "http://10.102.192.32:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface WmsServiceFeign { /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java index 750ed853e..beba5b1af 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/YmsServiceFeign.java @@ -9,7 +9,7 @@ import com.mhd.system.api.feign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; -@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface YmsServiceFeign { /** diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java index 48bf17cd1..b8db7365f 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/feign/ThirdPartyServiceFeign.java @@ -26,7 +26,7 @@ import java.io.InputStream; import java.util.List; import java.util.Map; -@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.33.0.129:8012", configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/java/com/mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java b/mhd_oms/src/main/java/com/mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java index b54559ade..49f1ebafb 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java +++ b/mhd_oms/src/main/java/com/mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java @@ -22,7 +22,7 @@ import java.util.Map; /** * 三方服务 Feign */ -@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.33.0.129:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index e8f169bf2..b97ce9a79 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -14,18 +14,18 @@ spring: nacos: discovery: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From fcc8102d9e6699bea2cde191f8748ffa03eed426 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 14:16:32 +0800 Subject: [PATCH 03/27] =?UTF-8?q?feat(wms):=20=E5=BA=93=E5=AD=98=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=AE=B0=E5=BD=95=E5=88=97=E8=A1=A8=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=8C=89=E5=85=A5=E5=BA=93=E5=8D=95=E5=8F=B7(inOrderNumber)?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InventoryAdjustmentRecordDTO.java | 3 +++ .../InventoryAdjustmentRecordMapper.xml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inventoryAdjustmentRecord/InventoryAdjustmentRecordDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inventoryAdjustmentRecord/InventoryAdjustmentRecordDTO.java index 49baa55d7..e8f781bac 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inventoryAdjustmentRecord/InventoryAdjustmentRecordDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inventoryAdjustmentRecord/InventoryAdjustmentRecordDTO.java @@ -164,6 +164,9 @@ public class InventoryAdjustmentRecordDTO extends BaseVOEntity { @ApiModelProperty("关联单号") private String relateNo; + @ApiModelProperty("入库单号") + private String inOrderNumber; + @ApiModelProperty(name = "组织ID集合") private List organizationIdList; diff --git a/mhd_wms/src/main/resources/mapper/inventoryAdjustmentRecord/InventoryAdjustmentRecordMapper.xml b/mhd_wms/src/main/resources/mapper/inventoryAdjustmentRecord/InventoryAdjustmentRecordMapper.xml index cd6ca9eb0..f94040577 100644 --- a/mhd_wms/src/main/resources/mapper/inventoryAdjustmentRecord/InventoryAdjustmentRecordMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inventoryAdjustmentRecord/InventoryAdjustmentRecordMapper.xml @@ -111,6 +111,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.relate_no = #{relateNo} + + and b.in_order_number = #{inOrderNumber} + and a.material_name like concat('%', #{materialName}, '%') From 139a3a82dab0f6d1be73ed21a42768a73c3dfeb9 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 14:18:48 +0800 Subject: [PATCH 04/27] =?UTF-8?q?feat(wms):=20=E7=9B=98=E7=82=B9=E5=8D=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85investigetionManageDetailList=E6=8C=89?= =?UTF-8?q?=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81=E6=8E=92=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=BC=96=E7=A0=81=E7=9B=B8=E9=82=BB=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=EF=BC=88=E4=BB=85=E6=8E=92=E5=BA=8F=E4=B8=8D=E8=81=9A?= =?UTF-8?q?=E5=90=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InvestigationManageApplicationService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java index 728655db5..034e168e1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/investigationManage/InvestigationManageApplicationService.java @@ -167,7 +167,11 @@ public class InvestigationManageApplicationService { } List detailList = investigationManagePO.getInvestigetionManageDetailList(); - + + // 物料编码相同的明细排在一起展示(稳定排序,同编码内保持原顺序;仅排序不聚合,各条明细独立) + detailList.sort(Comparator.comparing(InvestigetionManageDetailPO::getMaterialCode, + Comparator.nullsLast(Comparator.naturalOrder()))); + // 性能优化:批量获取批次属性,避免N+1查询问题 // 1. 收集所有唯一的materialBaseInfoId Set materialBaseInfoIdSet = detailList.stream() From 715883f1d4cdbd5e09785c61b3d5e6dd6bcb3a3f Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 15:20:13 +0800 Subject: [PATCH 05/27] =?UTF-8?q?feat(oms,wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=8F=8D=E5=AE=A1=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=B7=B2=E5=87=BA=E5=BA=93/=E5=B7=B2=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=8D=95=E6=8D=AE=E5=9B=9E=E9=80=80=E5=B7=B2=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 POST /reservationStockOutOrderApi/reverseAudit,按issueStatus(2-已审核/4-已出库)判断可反审 - 主单回退已创建并打reverseStatus标记,进【已反审】tab(list status=-2),重新审核通过自动复位 - 执行单/明细软删+reverseFlag=1,预约库存调整记录软删 - WMS新增/stockOutOrderApi/omsReverseExecutionOrder:已出库还原实物库存+推OMS,未出库仅还原分配占用,WMS无数据幂等成功 - W出库/拣货/复核/交接单软删+reverseFlag=1,列表支持delFlag=2&reverseFlag=1【已反审】tab - 四页面新增归档详情接口getReverseInfo* - 生成出库异常记录【反审记录】(abnormalType=3,前缀FSYC) - 需先执行SQL: 20260908两个反审脚本(OMS库+WMS库) --- .../com/mhd/system/api/WmsServiceFeign.java | 23 +- .../api/factory/RemoteWmsFallbackFactory.java | 12 + .../entity/ExecutionOutMaterialDetail.java | 5 +- .../entity/ExecutionStockOutOrder.java | 5 +- .../entity/ReservationStockOutOrder.java | 17 ++ .../po/ReservationStockOutOrderPO.java | 17 ++ .../todo/ReservationStockOutOrderDO.java | 15 ++ .../todo/ReservationStockOutOrderDTO.java | 17 ++ ...vationStockOutOrderApplicationService.java | 8 + ...ReservationStockOutOrderDomainService.java | 126 +++++++++- .../ReservationStockOutOrderApi.java | 11 + .../ReservationStockOutOrderMapper.xml | 18 +- .../HandoverTaskOrderApplicationService.java | 8 + .../PickingOrderApplicationService.java | 11 +- .../ReviewOrderApplicationService.java | 21 ++ .../StockOutOrderApplicationService.java | 17 +- .../entity/HandoverTaskOrder.java | 5 +- .../repository/po/HandoverTaskOrderPO.java | 5 +- .../repository/todo/HandoverTaskOrderDO.java | 5 +- .../HandoverTaskOrderDomainService.java | 85 +++++++ .../entity/OutMaterialDetail.java | 5 +- .../entity/OutOrderAbnormal.java | 8 +- .../repository/po/OutOrderAbnormalPO.java | 8 +- .../repository/todo/OutOrderAbnormalDO.java | 8 +- .../entity/PickingMaterialDetail.java | 5 +- .../pickingOrder/entity/PickingOrder.java | 5 +- .../facade/IPickingOrderService.java | 5 + .../repository/mapper/PickingOrderMapper.java | 10 + .../persistence/PickingOrderImpl.java | 17 ++ .../repository/po/PickingOrderPO.java | 5 +- .../repository/todo/PickingOrderDO.java | 5 +- .../service/PickingOrderDomainService.java | 28 +++ .../entity/ReviewMaterialDetail.java | 5 +- .../reviewOrder/entity/ReviewOrder.java | 4 + .../repository/mapper/ReviewOrderMapper.java | 10 + .../repository/po/ReviewOrderPO.java | 3 + .../repository/todo/ReviewOrderDO.java | 3 + .../stockOutOrder/entity/StockOutOrder.java | 5 +- .../repository/po/StockOutOrderPO.java | 5 +- .../repository/todo/StockOutOrderDO.java | 5 +- .../service/StockOutOrderDomainService.java | 215 ++++++++++++++++++ .../HandoverTaskOrderDTO.java | 5 +- .../outOrderAbnormal/OutOrderAbnormalDTO.java | 8 +- .../dto/pickingOrder/PickingOrderDTO.java | 5 +- .../dto/reviewOrder/ReviewOrderDTO.java | 3 + .../dto/stockOutOrder/StockOutOrderDTO.java | 5 +- .../HandoverTaskOrderApi.java | 10 + .../pickingOrder/PickingOrderApi.java | 9 + .../facadeApi/reviewOrder/ReviewOrderApi.java | 9 + .../stockOutOrder/StockOutOrderApi.java | 21 ++ .../HandoverTaskOrderMapper.xml | 5 +- .../pickingOrder/PickingOrderMapper.xml | 24 +- .../mapper/reviewOrder/ReviewOrderMapper.xml | 27 ++- .../stockOutOrder/StockOutOrderMapper.xml | 5 +- ...ms_reservation_stock_out_order_reverse.sql | 28 +++ ...8_reverse_flag_out_order_reverse_audit.sql | 55 +++++ 56 files changed, 970 insertions(+), 44 deletions(-) create mode 100644 sql/20260908_alter_table_szwl_oms_reservation_stock_out_order_reverse.sql create mode 100644 sql/20260908_reverse_flag_out_order_reverse_audit.sql diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java index ceaf3780b..14ed16445 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java @@ -21,7 +21,7 @@ import java.util.Map; * @description: TODO * @date 2024/5/10 8:58 **/ -@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,url = "http://10.33.0.109:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE,fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) public interface WmsServiceFeign { /** @@ -133,6 +133,27 @@ public interface WmsServiceFeign { @PostMapping(value = "/stockInOrderApi/omsCancelInOrder") public AjaxResult omsCancelInOrder(@RequestBody StockInOrder stockInOrder); + /** + * oms出库执行单反审(已出库/已复核单据客户通知回退场景):WMS侧还原实物库存并推送OMS库存、 + * 逻辑删除出库链路单据、生成1条出库异常【反审记录】;反审原因经 remark 透传。 + * 已产生下游不可逆数据时返回错误,OMS据此整体回滚。 + */ + @ApiOperation("oms出库执行单反审WMS回退") + @PostMapping(value = "/stockOutOrderApi/omsReverseExecutionOrder") + public AjaxResult omsReverseExecutionOrder(@RequestBody StockOutOrder stockOutOrder); + + /** + * oms入库业务单反审:WMS侧一个事务内回退已入库/收货中/上架中单据—— + * 校验未产生出库(按入库单号+动作"分配库存/出库"查库存调整记录>0即有出库) -> + * 按库存行整行回退库存扣减 -> 软删W入库单/W收货单/W上架单全链并打已反审标记 + * (各页面【已反审】tab按"已软删+已反审"查询归档数据)-> 写1条入库异常【反审记录】(type=3)。 + * 入参: inOrderNumber=执行入库单号, remark=业务单号+反审原因, updateBy/updateByName=反审人; + * WMS无该单数据时幂等返回成功(未下发单反审不产生WMS数据)。 + */ + @ApiOperation("oms入库单反审WMS回退") + @PostMapping(value = "/stockInOrderApi/omsReverseInOrder") + public AjaxResult omsReverseInOrder(@RequestBody StockInOrder stockInOrder); + @ApiOperation("oms查询物料列表") @GetMapping("/materialBaseInfoApi/queryList") public TableDataInfo getMaterialBaseInfoList(MaterialInfoDTO materialInfoDTO); diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java index daddb00ab..4f48a4cea 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java @@ -82,6 +82,12 @@ public class RemoteWmsFallbackFactory implements FallbackFactory().lambda() + boolean updateResult; + LambdaUpdateWrapper auditUpdateWrapper = new UpdateWrapper().lambda() .set(ReservationStockOutOrder::getReservationAuditId, loginUser.getUserid()) .set(ReservationStockOutOrder::getReservationAuditName, userRealName) .set(ReservationStockOutOrder::getReservationAuditTime, new Date()) @@ -417,7 +422,12 @@ public class ReservationStockOutOrderDomainService { .set(ReservationStockOutOrder::getUpdateByName, userRealName) .set(ReservationStockOutOrder::getUpdateTime, new Date()) .set(ReservationStockOutOrder::getIssueStatus, issueStatus) - .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds()); + // 重新审核通过时复位反审标记: 单据离开【已反审】页签回到正常流转 + if (issueStatus == 2) { + auditUpdateWrapper.set(ReservationStockOutOrder::getReverseStatus, 0); + } + updateResult = stockOutOrderService.update(null, auditUpdateWrapper); //审核通过时同步线路/车次到关联的运输业务单 if (issueStatus == 2) { @@ -662,6 +672,118 @@ public class ReservationStockOutOrderDomainService { return update; } + /** + * @description 反审出库业务单(按前端展示字段 issueStatus 判断可反审范围: 2-已审核(未出库) / 4-已出库 均可反审; + * 0-已创建无需反审、3-已驳回可直接编辑; status 字段在出库完成后不一定同步为9, 故不作为判断依据, + * 仅兜底排除 10-已取消/11-已关闭)。 + * 反审将单据回退到最原始状态(1-已创建, issueStatus=0)并打上反审标记: + * WMS 侧按出库单实际状态分支还原库存(已出库: 实物库存还原+推OMS; 未出库: 仅还原分配/冻结占用)、 + * 清理执行单据(出库单/明细/拣货/复核/交接/配送, 软删+reverseFlag=1 划归【已反审】tab)、 + * 每个执行出库单生成1条出库异常记录【反审记录】(out_order_abnormal, abnormalType=3); + * OMS 侧软删执行出库单及明细、软删预约库存调整记录。 + * 反审后单据进入【已反审】页签(status=1 且 reverse_status=1), 可继续编辑/审核/撤销; + * 重新审核通过时 reverse_status 自动复位 0(见 auditState)。 + * @date 2026/9/8 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean reverseAudit(ReservationStockOutOrderDO stockOutOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + List outOrderIds = stockOutOrderDO.getOutOrderIds(); + if (outOrderIds == null || outOrderIds.isEmpty()) { + throw new ServiceException("请选择需要反审的出库单"); + } + String reverseRemark = stockOutOrderDO.getReverseRemark(); + + for (Long outOrderId : outOrderIds) { + ReservationStockOutOrder byId = stockOutOrderService.getById(outOrderId); + if (byId == null) { + throw new ServiceException("出库单不存在, outOrderId=" + outOrderId); + } + Integer status = byId.getStatus(); + if (status != null && (status == 10 || status == 11)) { + throw new ServiceException("出库单[" + byId.getOutOrderNumber() + "]已取消/已关闭, 不能反审"); + } + // 反审条件按前端展示字段 issueStatus 判断: 2-已审核(未出库) / 4-已出库 均可反审 + Integer issueStatus = byId.getIssueStatus(); + if (!Integer.valueOf(2).equals(issueStatus) && !Integer.valueOf(4).equals(issueStatus)) { + throw new ServiceException("出库单[" + byId.getOutOrderNumber() + "]当前状态(issueStatus=" + issueStatus + + ")不支持反审, 仅已审核/已出库状态可反审"); + } + // 逐个执行出库单调 WMS 反审: 还原实物库存+推送OMS库存、清理WMS单据、生成反审异常记录; + // 任一失败抛异常整体回滚, 避免单边反审 + List executionOrders = executionStockOutOrderService.list(new QueryWrapper().lambda() + .eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, byId.getOutOrderNumber()) + .eq(ExecutionStockOutOrder::getDelFlag, 1)); + for (ExecutionStockOutOrder executionStockOutOrder : executionOrders) { + String executionOutOrderNumber = executionStockOutOrder.getOutOrderNumber(); + StockOutOrder wmsOutOrder = new StockOutOrder(); + wmsOutOrder.setOutOrderNumber(executionOutOrderNumber); + // 反审原因经 remark 透传 WMS, 记入反审异常记录备注 + wmsOutOrder.setRemark("业务单号:" + byId.getOutOrderNumber() + + (reverseRemark != null && !reverseRemark.isEmpty() ? ",反审原因:" + reverseRemark : "")); + AjaxResult wmsResult = wmsServiceFeign.omsReverseExecutionOrder(wmsOutOrder); + if (wmsResult == null || !"200".equals(String.valueOf(wmsResult.get("code")))) { + throw new ServiceException("执行出库单[" + executionOutOrderNumber + "]WMS反审失败:" + + (wmsResult == null ? "WMS服务不可用" : wmsResult.get("msg"))); + } + // 软删执行出库单明细 + 执行出库单(与取消下发 cancelIssueOrder 一致) + List materialDetails = executionOutMaterialDetailService.list(new QueryWrapper().lambda() + .eq(ExecutionOutMaterialDetail::getOutOrderNumber, executionOutOrderNumber) + .eq(ExecutionOutMaterialDetail::getDelFlag, 1)); + materialDetails.forEach(executionOutMaterialDetail -> { + executionOutMaterialDetailService.update(null, new UpdateWrapper().lambda() + .set(ExecutionOutMaterialDetail::getDelFlag, 2) + .set(ExecutionOutMaterialDetail::getReverseFlag, 1) + .eq(ExecutionOutMaterialDetail::getMaterialDetailId, executionOutMaterialDetail.getMaterialDetailId())); + }); + executionStockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getDelFlag, 2) + .set(ExecutionStockOutOrder::getReverseFlag, 1) + .eq(ExecutionStockOutOrder::getOutOrderNumber, executionOutOrderNumber)); + // 软删预约库存调整记录(下发分配时生成): 仅软删留痕, 库存数量由 WMS omsEdit 推送还原 + inventoryAdjustmentRecordMapper.update(null, new UpdateWrapper().lambda() + .set(ReservationInventoryAdjustmentRecord::getDelFlag, 2) + .eq(ReservationInventoryAdjustmentRecord::getExecutionOrderNumber, executionOutOrderNumber) + .eq(ReservationInventoryAdjustmentRecord::getDelFlag, 1)); + } + } + + // 主单回退到已创建并打反审标记; 更新条件带 issueStatus in (2,4) + 排除已取消/已关闭 兜底防并发重复反审 + // issueStatus 回退到 0-已创建(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库) + return stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockOutOrder::getStatus, 1) + .set(ReservationStockOutOrder::getIssueStatus, 0) + .set(ReservationStockOutOrder::getIssueId, null) + .set(ReservationStockOutOrder::getIssueName, null) + .set(ReservationStockOutOrder::getIssueTime, null) + .set(ReservationStockOutOrder::getReservationAuditId, null) + .set(ReservationStockOutOrder::getReservationAuditName, null) + .set(ReservationStockOutOrder::getReservationAuditTime, null) + .set(ReservationStockOutOrder::getAllocationQuantity, BigDecimal.ZERO) + .set(ReservationStockOutOrder::getAlreadyAllocationQuantity, BigDecimal.ZERO) + .set(ReservationStockOutOrder::getPickingQuantity, BigDecimal.ZERO) + .set(ReservationStockOutOrder::getCheckQuantity, BigDecimal.ZERO) + .set(ReservationStockOutOrder::getCheckStatus, 1) + .set(ReservationStockOutOrder::getCheckTaskDistribution, 2) + .set(ReservationStockOutOrder::getCompleteTime, null) + .set(ReservationStockOutOrder::getOutboundTime, null) + .set(ReservationStockOutOrder::getReverseStatus, 1) + .set(ReservationStockOutOrder::getReverseBy, loginUser.getUserid()) + .set(ReservationStockOutOrder::getReverseByName, userRealName) + .set(ReservationStockOutOrder::getReverseTime, new Date()) + .set(ReservationStockOutOrder::getReverseRemark, reverseRemark) + .set(ReservationStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockOutOrder::getUpdateByName, userRealName) + .set(ReservationStockOutOrder::getUpdateTime, new Date()) + .in(ReservationStockOutOrder::getOutOrderId, outOrderIds) + .in(ReservationStockOutOrder::getIssueStatus, 2, 4) + .notIn(ReservationStockOutOrder::getStatus, 10, 11)); + } + @Transactional(rollbackFor = Exception.class) public Boolean executeAndIssue(ReservationStockOutOrderDO stockOutOrderDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java index 28114c62b..ee912d037 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReservationStockOutOrder/ReservationStockOutOrderApi.java @@ -159,6 +159,17 @@ public class ReservationStockOutOrderApi extends BaseController { return AjaxResult.success(stockOutOrderApplicationService.cancelIssueOrder(stockOutOrderDO)); } + /** + * 反审出库单: 已出库/已复核(issueStatus=2已审核)的单据回退到已创建并打反审标记, + * WMS还原实物库存并生成出库异常记录【反审记录】, 单据划归【已反审】页签 + */ + @ApiOperation("反审出库单") + @PostMapping(value = "/reverseAudit") + public AjaxResult reverseAudit(@RequestBody ReservationStockOutOrderDTO stockOutOrderDTO) { + ReservationStockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO); + return AjaxResult.success(stockOutOrderApplicationService.reverseAudit(stockOutOrderDO)); + } + @ApiOperation("下发出库单") @PostMapping(value = "/executeAndIssue") public AjaxResult executeAndIssue(@RequestBody ReservationStockOutOrderDTO stockOutOrderDTO) { diff --git a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml index ad3073c4f..a95ebedbb 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml @@ -117,6 +117,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -136,7 +141,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.tms_order_number, a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.RESERVATION_ORDER_SOURCE,a.OUTBOUND_TIME,a.RETURN_QUANTITY,a.DELIVERY_NAME,a.CUSTOMER_NUMBER,a.INVOICE_NUMBER,a.RETURN_ORDER_NUMBER,a.TOTAL_AMOUNT, a.ROUTE,a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_out_order_number,a.LINE_CODE,a.LINE_NAME,a.SHUTTLE_NO, - a.TOTAL_WAREHOUSE_RENT,a.BUSINESS_CHARGE_TYPE,a.BUSINESS_PRICE_WAY,a.DISCOUNT + a.TOTAL_WAREHOUSE_RENT,a.BUSINESS_CHARGE_TYPE,a.BUSINESS_PRICE_WAY,a.DISCOUNT, + a.REVERSE_STATUS,a.REVERSE_BY,a.REVERSE_BY_NAME,a.REVERSE_TIME,a.REVERSE_REMARK @@ -178,11 +184,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.status IN (3, 4, 5, 6, 7, 8) + + + and a.status = 1 and a.reverse_status = 1 + + + and a.status = 1 and (a.reverse_status is null or a.reverse_status = 0) + and a.status = #{status} + + and a.reverse_status = #{reverseStatus} + and a.status > #{gtStatus} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java index f9a22003e..fe9c17096 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/handoverTaskOrder/HandoverTaskOrderApplicationService.java @@ -157,6 +157,14 @@ public class HandoverTaskOrderApplicationService { return handoverTaskOrderDomainService.getInfo(outTaskOrderId); } + /** + * 获取交接作业单归档详情(已反审): 反审时交接单已软删, 供【已反审】tab 查看归档详情 + */ + public HandoverTaskOrderPO getReverseInfo(Long outTaskOrderId) + { + return handoverTaskOrderDomainService.getReverseInfo(outTaskOrderId); + } + /** * 按作业单号获取交接作业单详细信息(PDA 端) * 用于下发任务(taskType=7)中 trackingNumber 对应交接作业单的 taskNumber diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java index d0c1d6e14..38a13922b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/pickingOrder/PickingOrderApplicationService.java @@ -282,11 +282,18 @@ public class PickingOrderApplicationService { setMaterialMoreDetailListRecursively(pickingMaterialDetailPOList, batchDetailMap); pickingOrderPO.setMaterialDetailList(pickingMaterialDetailPOList); - log.info("返回拣货单信息,pickingOrderId={}, materialDetailList大小={}", - pickingOrderPO.getPickingOrderId(), + log.info("返回拣货单信息,pickingOrderId={}, materialDetailList大小={}", + pickingOrderPO.getPickingOrderId(), pickingMaterialDetailPOList != null ? pickingMaterialDetailPOList.size() : 0); return pickingOrderPO; } + + /** + * 获取拣货单归档详情(已反审): 反审时拣货单已软删(del_flag=2), 供【已反审】tab 查看归档详情 + */ + public PickingOrderPO getReverseInfoByIdAndType(Long pickingOrderId, Integer type) { + return pickingOrderDomainService.getReverseInfoByIdAndType(pickingOrderId, type); + } /** * 递归为物料明细设置更多属性 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java index 23427cd72..ef40b67d0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java @@ -186,6 +186,27 @@ public class ReviewOrderApplicationService { header.setMaterialDetailList(details); return header; } + + /** + * 获取复核单归档详情(已反审): 反审时复核单/明细均已软删(del_flag=2), 供【已反审】tab 查看归档详情 + */ + public ReviewOrderPO getReverseDetailByReviewOrderId(Long reviewOrderId) { + if (reviewOrderId == null) { + throw new ServiceException("复核单ID不能为空"); + } + ReviewOrderPO header = reviewOrderMapper.selectHeaderByReviewOrderIdReverse(reviewOrderId); + if (header == null) { + throw new ServiceException("复核单不存在"); + } + List details = reviewOrderMapper.queryDetailByReviewOrderIdReverse(reviewOrderId); + fillDisplayQtyFields(details); + Map> batchDetailMap = loadDisplayBatchDetailMap(details); + fillDynamicBatchDisplayFields(details, batchDetailMap); + buildReviewMaterialMoreDetailListLikeShelf(details, batchDetailMap); + fillHeaderSummary(header, details); + header.setMaterialDetailList(details); + return header; + } public ReviewOrderPO getDetailByReviewOrderNumber(String reviewOrderNumber) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java index d3fc80599..b209f10ee 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockOutOrder/StockOutOrderApplicationService.java @@ -500,7 +500,15 @@ public class StockOutOrderApplicationService { return stockOutOrderPO; } - + + /** + * 获取出库单归档详情(已反审): 反审时单据已软删, 供【已反审】tab 查看归档详情 + */ + public StockOutOrderPO getReverseInfoChildren(Long outOrderId) + { + return stockOutOrderDomainService.getReverseInfoChildren(outOrderId); + } + /** * 出库交接场景:递归过滤 pickingQuantity 为 0 的明细(与交接详情一致) * @param detailList 物料明细树 @@ -1950,6 +1958,13 @@ public class StockOutOrderApplicationService { stockOutOrderDomainService.cancelExecutionOrder(stockOutOrder); } + /** + * oms出库执行单反审(已出库单据回退): 还原实物库存并推送OMS、清理单据、生成反审异常记录 + */ + public void reverseExecutionOrder(StockOutOrder stockOutOrder){ + stockOutOrderDomainService.reverseExecutionOrder(stockOutOrder); + } + public void omsOrderAddDetail(List outMaterialDetails){ stockOutOrderDomainService.omsOrderAddDetail(outMaterialDetails); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/entity/HandoverTaskOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/entity/HandoverTaskOrder.java index 9946e65a7..848486e28 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/entity/HandoverTaskOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/entity/HandoverTaskOrder.java @@ -144,4 +144,7 @@ public class HandoverTaskOrder extends BaseVOEntity { private String operatorsName; @ApiModelProperty("计费信息") private String billingJson; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/po/HandoverTaskOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/po/HandoverTaskOrderPO.java index 73042d160..69fd1232d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/po/HandoverTaskOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/po/HandoverTaskOrderPO.java @@ -146,4 +146,7 @@ public class HandoverTaskOrderPO extends BaseVOEntity { private List materialDetailList; @ApiModelProperty("计费信息") private String billingJson; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/todo/HandoverTaskOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/todo/HandoverTaskOrderDO.java index ddc6af7d6..bd1a4f1af 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/todo/HandoverTaskOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/todo/HandoverTaskOrderDO.java @@ -146,4 +146,7 @@ public class HandoverTaskOrderDO extends BaseVOEntity { private String pictureApp; private String billingJson; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index c2a27a982..13b14ea91 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -44,6 +44,7 @@ import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryM import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; +import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; import com.mhd.wms.domain.pickingMaterialDetail.repository.mapper.PickingMaterialDetailMapper; import com.mhd.wms.domain.pickingMaterialDetail.repository.po.PickingMaterialDetailPO; import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO; @@ -242,6 +243,90 @@ public class HandoverTaskOrderDomainService { return handoverTaskOrderPO; } + /** + * 获取交接作业单归档详情(已反审): 出库单反审时交接单及关联出库明细均已软删(del_flag=2), + * 本方法镜像 getInfo 按 del_flag=2 查归档数据, 供交接单【已反审】tab 查看详情。 + */ + public HandoverTaskOrderPO getReverseInfo(Long outTaskOrderId) + { + HandoverTaskOrderPO handoverTaskOrderPO = handoverTaskOrderService.getInfo(outTaskOrderId); + if (handoverTaskOrderPO == null) { + return null; + } + String orderNumber = handoverTaskOrderPO.getOrderNumber(); + if (orderNumber != null && !orderNumber.trim().isEmpty()) { + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, orderNumber) + .eq(StockOutOrder::getDelFlag, 2)); + Integer review = stockOutOrder != null ? stockOutOrder.getReview() : null; + // 归档明细: 出库明细已随反审软删, 按 del_flag=2 查 + LambdaQueryWrapper omdQuery = new QueryWrapper().lambda() + .eq(OutMaterialDetail::getOutOrderNumber, orderNumber) + .eq(OutMaterialDetail::getDelFlag, 2); + List outMaterialDetailList = outMaterialDetailMapper.selectList(omdQuery); + List materialDetailList = new ArrayList<>(); + for (OutMaterialDetail omd : outMaterialDetailList) { + BigDecimal handoverQuantity; + BigDecimal pickQty; + if (Integer.valueOf(1).equals(review)) { + // 需要复核时:仅限复核单上的明细(picking_material_detail 有拣货的 unique_id) + List pmdList = pickingMaterialDetailMapper.selectList(new QueryWrapper().lambda() + .eq(PickingMaterialDetail::getOutUniqueId, omd.getUniqueId()) + .eq(PickingMaterialDetail::getDelFlag, 2) + .gt(PickingMaterialDetail::getPickingQuantity, BigDecimal.ZERO)); + if (pmdList == null || pmdList.isEmpty()) { + continue; + } + if (omd.getCheckQuantity() == null || omd.getCheckQuantity().compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + PickingMaterialDetailPO pickingSummary = pickingMaterialDetailMapper.queryTotalsByOutNumberAndBaseId(omd.getUniqueId()); + pickQty = (pickingSummary != null && pickingSummary.getPickingQuantity() != null) ? pickingSummary.getPickingQuantity() : BigDecimal.ZERO; + if (pickQty.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + handoverQuantity = omd.getCheckQuantity(); + } else { + BigDecimal qty = omd.getPickingQuantity() != null ? omd.getPickingQuantity() : omd.getQuantity(); + if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + pickQty = qty; + handoverQuantity = qty; + } + TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO(); + detail.setMaterialDetailId(omd.getMaterialDetailId()); + detail.setUniqueId(omd.getUniqueId()); + detail.setTaskNumber(handoverTaskOrderPO.getTaskNumber()); + detail.setOrganizationId(omd.getOrganizationId()); + detail.setOrganizationName(omd.getOrganizationName()); + detail.setTopOrganizationId(omd.getTopOrganizationId()); + detail.setMaterialBaseInfoId(omd.getMaterialBaseInfoId()); + detail.setMaterialCode(omd.getMaterialCode() != null ? omd.getMaterialCode() : omd.getMaterialNo()); + detail.setMaterialName(omd.getMaterialName() != null ? omd.getMaterialName() : omd.getCommodityName()); + detail.setBarCode(omd.getBarCode()); + detail.setWeightLimit(omd.getWeightLimit()); + detail.setVolumeLimit(omd.getVolumeLimit()); + detail.setQuantity(omd.getQuantity()); + detail.setPickingQuantity(pickQty); + detail.setCheckQuantity(handoverQuantity); + detail.setPackId(omd.getPackId()); + detail.setPackCode(omd.getPackCode()); + detail.setPackName(omd.getPackName()); + detail.setPackDetailId(omd.getPackDetailId() != null ? String.valueOf(omd.getPackDetailId()) : null); + detail.setUnitCode(omd.getUnitCode()); + detail.setUnitName(omd.getUnitName()); + detail.setUnitNumber(omd.getUnitNumber()); + detail.setMaterialWarehouseControlId(omd.getMaterialWarehouseControlId()); + detail.setSerialNumberManage(omd.getSerialNumberManage()); + detail.setRemark(omd.getRemark()); + materialDetailList.add(detail); + } + handoverTaskOrderPO.setMaterialDetailList(materialDetailList); + } + return handoverTaskOrderPO; + } + /** * @description 分配月台 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java index 830f67c50..cb2547da6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/entity/OutMaterialDetail.java @@ -541,4 +541,7 @@ public class OutMaterialDetail extends BaseVOEntity { @ApiModelProperty("出库数量") @Excel(name = "出库数量") private BigDecimal outQuantity; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/entity/OutOrderAbnormal.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/entity/OutOrderAbnormal.java index c3a97fdf7..92e3305b8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/entity/OutOrderAbnormal.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/entity/OutOrderAbnormal.java @@ -53,8 +53,8 @@ public class OutOrderAbnormal extends BaseVOEntity { @Excel(name = "拣货作业单号") private String outTaskOrderNumber; - @ApiModelProperty("类型:1-拣货 2-复核") - @Excel(name = "类型:1-拣货 2-复核") + @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录") + @Excel(name = "类型:1-拣货 2-复核 3-反审记录") private Integer type; @ApiModelProperty("计划数量") @@ -69,8 +69,8 @@ public class OutOrderAbnormal extends BaseVOEntity { @Excel(name = "异常数量 = 作业数量 - 计划数量") private BigDecimal abnormalActualQuantity; - @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") - @Excel(name = "异常类型: 1-拣货异常 2-复核异常") + @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录") + @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录") private Integer abnormalType; @ApiModelProperty("异常原因") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java index d3e8b18f3..4d0ae6aef 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/po/OutOrderAbnormalPO.java @@ -53,8 +53,8 @@ public class OutOrderAbnormalPO extends BaseVOEntity { @Excel(name = "拣货作业单号") private String outTaskOrderNumber; - @ApiModelProperty("类型:1-拣货 2-复核") - @Excel(name = "类型:1-拣货 2-复核") + @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录") + @Excel(name = "类型:1-拣货 2-复核 3-反审记录") private Integer type; @ApiModelProperty("计划数量:拣货异常=分配数量;复核异常=拣货数量") @@ -69,8 +69,8 @@ public class OutOrderAbnormalPO extends BaseVOEntity { @Excel(name = "异常数量 = 作业数量 - 计划数量") private BigDecimal abnormalActualQuantity; - @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") - @Excel(name = "异常类型: 1-拣货异常 2-复核异常") + @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录") + @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录") private Integer abnormalType; @ApiModelProperty("异常原因") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/todo/OutOrderAbnormalDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/todo/OutOrderAbnormalDO.java index 6c9328db7..d83fe037d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/todo/OutOrderAbnormalDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outOrderAbnormal/repository/todo/OutOrderAbnormalDO.java @@ -51,8 +51,8 @@ public class OutOrderAbnormalDO extends BaseVOEntity { @Excel(name = "拣货作业单号") private String outTaskOrderNumber; - @ApiModelProperty("类型:1-拣货 2-复核") - @Excel(name = "类型:1-拣货 2-复核") + @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录") + @Excel(name = "类型:1-拣货 2-复核 3-反审记录") private Integer type; @ApiModelProperty("计划数量") @@ -67,8 +67,8 @@ public class OutOrderAbnormalDO extends BaseVOEntity { @Excel(name = "异常数量 = 作业数量 - 计划数量") private BigDecimal abnormalActualQuantity; - @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") - @Excel(name = "异常类型: 1-拣货异常 2-复核异常") + @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录") + @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录") private Integer abnormalType; @ApiModelProperty("异常原因") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/entity/PickingMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/entity/PickingMaterialDetail.java index 667c63419..5a0384d29 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/entity/PickingMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingMaterialDetail/entity/PickingMaterialDetail.java @@ -321,4 +321,7 @@ public class PickingMaterialDetail extends BaseVOEntity { private String bondInvtNoGw; private String whNoGw; private String seatNoGw; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/entity/PickingOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/entity/PickingOrder.java index 4db8b013b..8b2693564 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/entity/PickingOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/entity/PickingOrder.java @@ -133,4 +133,7 @@ public class PickingOrder extends BaseVOEntity { private String pushByName; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/facade/IPickingOrderService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/facade/IPickingOrderService.java index 98ea9a016..6cc9e3a25 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/facade/IPickingOrderService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/facade/IPickingOrderService.java @@ -58,6 +58,11 @@ public interface IPickingOrderService extends IService */ public PickingOrderPO getInfoByIdAndType(Long pickingOrderId, Integer type); + /** + * @description 根据id和类型获取指定拣货单信息(归档: 已反审软删 del_flag=2, 供【已反审】tab 详情) + */ + public PickingOrderPO getInfoByIdAndTypeReverse(Long pickingOrderId, Integer type); + /** * @description 根据单号和类型获取指定拣货单信息 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/mapper/PickingOrderMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/mapper/PickingOrderMapper.java index 241a7513f..6ae3ffd54 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/mapper/PickingOrderMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/mapper/PickingOrderMapper.java @@ -25,12 +25,22 @@ public interface PickingOrderMapper extends BaseMapper */ public PickingOrderPO queryOutOrderById(Long pickingOrderId); + /** + * 根据Id关联出库单查询(归档: 已反审软删 del_flag=2, 供【已反审】tab 详情) + */ + public PickingOrderPO queryOutOrderByIdReverse(Long pickingOrderId); + /** * 根据Id关联波次单查询 */ public PickingOrderPO queryWaveOrderById(Long pickingOrderId); + /** + * 根据Id关联波次单查询(归档: 已反审软删 del_flag=2) + */ + public PickingOrderPO queryWaveOrderByIdReverse(Long pickingOrderId); + /** * 根据单号关联出库单查询 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/persistence/PickingOrderImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/persistence/PickingOrderImpl.java index 85a562eea..02187ecf7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/persistence/PickingOrderImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/repository/persistence/PickingOrderImpl.java @@ -146,6 +146,23 @@ public class PickingOrderImpl extends ServiceImpl pickingMaterialDetailPOList = pickingMaterialDetailService.queryList(pickingMaterialDetailDO); + for (PickingMaterialDetailPO pickingMaterialDetailPO : pickingMaterialDetailPOList) { + Long materialBaseInfoId = pickingMaterialDetailPO.getMaterialBaseInfoId(); + MaterialBaseInfo materialBaseInfo = materialBaseInfoMapper.selectById(materialBaseInfoId); + if(materialBaseInfo!=null){ + pickingMaterialDetailPO.setMaterialCode(materialBaseInfo.getMaterialCode()); + pickingMaterialDetailPO.setMaterialName(materialBaseInfo.getMaterialName()); + pickingMaterialDetailPO.setCopyCode(materialBaseInfo.getCopyCode()); + } + } + copyCodeReferenceDomainService.fillWeightListOnPickingMaterialDetails(pickingMaterialDetailPOList); + pickingOrderPO.setMaterialDetailList(pickingMaterialDetailPOList); + return pickingOrderPO; + } + /** * @description 整单下发 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java index c491d51f6..752c61705 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewMaterialDetail.java @@ -120,4 +120,7 @@ public class ReviewMaterialDetail extends BaseVOEntity { @ApiModelProperty("包装详情id") @Excel(name = "包装详情id") private String packDetailId; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java index 70e507384..461fb3bca 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/entity/ReviewOrder.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @@ -58,4 +59,7 @@ public class ReviewOrder extends BaseVOEntity { private Date receiveTime; private String remark; + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/mapper/ReviewOrderMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/mapper/ReviewOrderMapper.java index 7b566a279..de063e2dd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/mapper/ReviewOrderMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/mapper/ReviewOrderMapper.java @@ -24,6 +24,16 @@ public interface ReviewOrderMapper extends BaseMapper { */ ReviewOrderPO selectHeaderByReviewOrderId(@Param("reviewOrderId") Long reviewOrderId); + /** + * 详情-主表(按主键,归档: 已反审软删 del_flag=2,供【已反审】tab 详情) + */ + ReviewOrderPO selectHeaderByReviewOrderIdReverse(@Param("reviewOrderId") Long reviewOrderId); + + /** + * 详情-明细行(按复核单主键,归档: 已反审软删 del_flag=2) + */ + List queryDetailByReviewOrderIdReverse(@Param("reviewOrderId") Long reviewOrderId); + /** * 详情-主表(按复核单号) */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java index 719ac71c3..221343da7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/po/ReviewOrderPO.java @@ -106,4 +106,7 @@ public class ReviewOrderPO extends BaseVOEntity { /** 详情与上架单一致:头字段扁平 + 明细列表 */ @ApiModelProperty("复核明细") private List materialDetailList; + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java index ee8f2ff20..37d83e50c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java @@ -86,4 +86,7 @@ public class ReviewOrderDO extends BaseVOEntity { */ @ApiModelProperty("仅已接收:1-是(receive_time 非空)") private Integer onlyReceived; + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java index acd99ede4..8b3955914 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/entity/StockOutOrder.java @@ -461,4 +461,7 @@ public class StockOutOrder extends BaseVOEntity { @ApiModelProperty("签名备注") private String signatureRemark; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java index f1d09b638..7390071ab 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/po/StockOutOrderPO.java @@ -497,4 +497,7 @@ public class StockOutOrderPO extends BaseVOEntity { @ApiModelProperty("签名备注") private String signatureRemark; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 0-无 1-已反审(反审时软删del_flag=2并打标记)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java index 6a53cc15b..c724ce735 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java @@ -538,4 +538,7 @@ public class StockOutOrderDO extends BaseVOEntity { /** PDA出库签名列表专用:作业任务人员模糊查询字段 */ @ApiModelProperty("作业任务人员模糊查询") private String workUserNameLike; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index ac01e100e..d99a8ffd5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -48,6 +48,7 @@ import com.mhd.wms.domain.materialInventory.entity.MaterialInventory; import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper; import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO; +import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO; import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO; import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService; import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO; @@ -63,6 +64,7 @@ import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService; +import com.mhd.wms.domain.outOrderAbnormal.entity.OutOrderAbnormal; import com.mhd.wms.domain.outOrderAbnormal.repository.todo.OutOrderAbnormalBaseDO; import com.mhd.wms.domain.pickingMaterialDetail.entity.PickingMaterialDetail; import com.mhd.wms.domain.pickingMaterialDetail.repository.facade.IPickingMaterialDetailService; @@ -888,6 +890,34 @@ public class StockOutOrderDomainService { return stockOutOrderPO; } + /** + * 获取出库单归档详情(已反审): 出库单反审时主表/明细均已软删(del_flag=2), + * 主表 getInfo 走 getById 不滤 del_flag, 明细通过 DO.delFlag=2 查归档数据 + * (out_material_detail queryList XML 支持 delFlag 参数), 供【已反审】tab 查看详情。 + */ + public StockOutOrderPO getReverseInfoChildren(Long outOrderId) { + StockOutOrderPO stockOutOrderPO = stockOutOrderService.getInfo(outOrderId); + if (stockOutOrderPO == null || stockOutOrderPO.getOutOrderNumber() == null) { + throw new ServiceException("出库单不存在"); + } + OutMaterialDetailDO outMaterialDetailDO = new OutMaterialDetailDO(); + outMaterialDetailDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber()); + outMaterialDetailDO.setDelFlag(2); + List materialDetailPOList = outMaterialDetailService.queryListChildren(outMaterialDetailDO); + for (OutMaterialDetailPO outMaterialDetailPO : materialDetailPOList) { + String materialNo = outMaterialDetailPO.getMaterialNo(); + List materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper().lambda().eq(MaterialBaseInfo::getMaterialCode, materialNo)); + if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) { + outMaterialDetailPO.setCommodityName(materialBaseInfos.get(0).getMaterialName()); + outMaterialDetailPO.setMaterialCode(materialBaseInfos.get(0).getMaterialCode()); + outMaterialDetailPO.setMaterialName(materialBaseInfos.get(0).getMaterialName()); + outMaterialDetailPO.setCopyCode(materialBaseInfos.get(0).getCopyCode()); + } + } + stockOutOrderPO.setMaterialDetailList(materialDetailPOList); + return stockOutOrderPO; + } + /** * 获取出库单详细信息(PDA复核管理查询详情) * 复核场景下与PC端getCheckInfo保持一致,返回拣货下发时的完整数据(树形结构、拣货汇总、批次属性等) @@ -2625,6 +2655,191 @@ public class StockOutOrderDomainService { } } + /** + * @description oms出库执行单反审(业务单反审时逐执行单调用; 业务单侧仅允许"已审核未出库"单据反审): + * 按WMS出库单状态分支还原库存: + * 1.未出库(状态非9, 常规场景): 还原分配占用(可用+、冻结-, 与 cancelExecutionOrder 取消分配同口径), + * 不动实物库存、不推OMS——实物未被扣减, 加回会虚增库存; 软删库存调整记录。 + * 2.已出库(状态9, 防御分支, 业务单侧已拦截): 镜像交接扣减 doStockOutDeduct(实物/可用加回, 冻结不动), + * 生成库存调整记录【出库反审】并 omsEdit 推送还原OMS预约库存。 + * 3.逻辑删除出库链路单据(软删+reverseFlag=1, 划归【已反审】tab): 配送明细/出库明细/出库单/拣货单及明细/复核单及明细/交接作业单。 + * 4.生成1条出库异常记录【反审记录】(abnormalType=3), 单号前缀 FSYC, 供记录跟踪。 + * 反审原因经入参 remark 透传(OMS侧拼接业务单号+反审原因)。 + * @date 2026/9/8 + */ + @Transactional(rollbackFor = Exception.class) + public void reverseExecutionOrder(StockOutOrder stockOutOrder) { + String outOrderNumber = stockOutOrder.getOutOrderNumber(); + StockOutOrder stockOutOrderDB = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1)); + if (stockOutOrderDB == null) { + // 幂等: OMS普通「下发」生成的执行单不推WMS(仅「执行并下发」才推), WMS无此单属正常场景, + // 直接返回成功(无数据可清), 由OMS侧完成OMS侧清理——与入库侧反审"WMS无数据时幂等成功"同口径 + log.info("出库反审幂等:WMS无活动出库单[{}],无需清理", outOrderNumber); + return; + } + // OMS经Feign调用时可能无登录上下文(SecurityUtils会抛异常), 容错获取, 兜底用出库单创建人 + LoginUser loginUser; + try { + loginUser = SecurityUtils.getLoginUser(); + } catch (Exception e) { + loginUser = new LoginUser(); + loginUser.setUserid(stockOutOrderDB.getCreateBy() != null ? stockOutOrderDB.getCreateBy() : 0L); + loginUser.setUsername(stockOutOrderDB.getCreateByName() != null ? stockOutOrderDB.getCreateByName() : "system"); + } + String reverseRemark = stockOutOrder.getRemark(); + //逻辑删除配送明细(所有清理路径统一先清, 与 cancelExecutionOrder 一致) + deliveryDetailsLinkService.update(new UpdateWrapper().lambda() + .set(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 2) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getOrderNumber, outOrderNumber) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 1)); + List materialDetails = outMaterialDetailService.list(new LambdaQueryWrapper() + .eq(OutMaterialDetail::getOutOrderNumber, outOrderNumber) + .eq(OutMaterialDetail::getDelFlag, 1)); + // 出库/未出库分支: 未出库单据(WMS状态非9)实物库存未被扣减, 只还原分配占用(可用+冻结-), + // 不做实物还原也不推OMS——否则会虚增库存; 已出库(9)分支还原实物并推OMS(防御保留, 业务单反审已拦截已出库单) + boolean shipped = stockOutOrderDB.getStatus() != null && stockOutOrderDB.getStatus() == 9; + for (OutMaterialDetail materialDetail : materialDetails) { + MaterialInventory materialInventory = materialInventoryMapper.selectById(materialDetail.getMaterialInventoryId()); + if (!shipped) { + // ===== 未出库: 还原分配占用(与 cancelExecutionOrder 的取消分配同口径) ===== + BigDecimal allocationQuantity = materialDetail.getAllocationQuantity(); + if (materialInventory != null && allocationQuantity != null && allocationQuantity.compareTo(BigDecimal.ZERO) > 0) { + materialInventory.setAllocationQuantity((materialInventory.getAllocationQuantity() == null ? BigDecimal.ZERO : materialInventory.getAllocationQuantity()).add(allocationQuantity)); + materialInventory.setFreezeQuantity((materialInventory.getFreezeQuantity() == null ? BigDecimal.ZERO : materialInventory.getFreezeQuantity()).subtract(allocationQuantity)); + materialInventory.setUpdateTime(new Date()); + materialInventoryMapper.updateById(materialInventory); + } + //逻辑删除库存调整记录 + Long uniqueId = materialDetail.getUniqueId(); + String relateNo = outOrderNumber + "#" + uniqueId; + inventoryAdjustmentRecordService.update(new InventoryAdjustmentRecord(), new LambdaUpdateWrapper() + .set(InventoryAdjustmentRecord::getDelFlag, 2) + .eq(InventoryAdjustmentRecord::getRelateNo, relateNo)); + } else { + // ===== 已出库: 还原实物库存并推送OMS(防御分支) ===== + //还原数量与交接扣减一致: 需复核取复核数量, 否则取拣货数量(为空取计划数量), 见 doStockOutDeduct + BigDecimal effectiveQuantity = Integer.valueOf(1).equals(stockOutOrderDB.getReview()) + ? materialDetail.getCheckQuantity() + : (materialDetail.getPickingQuantity() != null ? materialDetail.getPickingQuantity() : materialDetail.getQuantity()); + Long materialInventoryId = materialDetail.getMaterialInventoryId(); + if (materialInventoryId == null || effectiveQuantity == null || effectiveQuantity.compareTo(BigDecimal.ZERO) <= 0) { + //无可还原库存(未交接或漏传), 仍继续清理单据 + materialDetail.setDelFlag(2); + materialDetail.setReverseFlag(1); + outMaterialDetailService.updateById(materialDetail); + continue; + } + if (materialInventory != null && !"yang_pin_chu_ku".equals(stockOutOrderDB.getBusinessType())) { + //样品出库交接不扣库存(与 doStockOutDeduct 一致), 反审同样跳过还原 + BigDecimal area = materialDetail.getCheckArea() != null ? materialDetail.getCheckArea() : BigDecimal.ZERO; + BigDecimal volume = materialDetail.getCheckVolume() != null ? materialDetail.getCheckVolume() : BigDecimal.ZERO; + BigDecimal grossWeight = materialDetail.getCheckGrossWeight() != null ? materialDetail.getCheckGrossWeight() : BigDecimal.ZERO; + BigDecimal netWeight = materialDetail.getCheckNetWeight() != null ? materialDetail.getCheckNetWeight() : BigDecimal.ZERO; + MaterialInventoryParamDO restoreParam = new MaterialInventoryParamDO(); + restoreParam.setMaterialInventoryId(materialInventoryId); + restoreParam.setMaterialBaseInfoId(materialInventory.getMaterialBaseInfoId()); + restoreParam.setOrganizationId(materialInventory.getOrganizationId()); + restoreParam.setOrganizationName(materialInventory.getOrganizationName()); + restoreParam.setTopOrganizationId(materialInventory.getTopOrganizationId()); + restoreParam.setWarehouseId(materialInventory.getWarehouseId()); + restoreParam.setWarehouseCode(materialInventory.getWarehouseCode()); + restoreParam.setWarehouseName(materialInventory.getWarehouseName()); + restoreParam.setQuantity(effectiveQuantity); + restoreParam.setArea(area); + restoreParam.setVolume(volume); + restoreParam.setGrossWeight(grossWeight); + restoreParam.setNetWeight(netWeight); + restoreParam.setLotNumber(materialInventory.getLotNumber()); + restoreParam.setBatchNumber(materialInventory.getBatchNumber()); + restoreParam.setInOrderNumber(materialInventory.getInOrderNumber()); + restoreParam.setProductionDate(materialInventory.getProductionDate()); + restoreParam.setExpiryDate(materialInventory.getExpiryDate()); + //库存调整记录【出库反审】(kctzjl 内部取调整前快照, 与交接扣减先记录后改库存的顺序一致) + restoreParam.setRelateNo(outOrderNumber + "#" + materialDetail.getUniqueId()); + materialInventoryService.kctzjl(restoreParam, "出库反审", loginUser); + //type=1 上架还原: 实物库存/可用数量加回, 冻结数量不动 + restoreParam.setType("1"); + materialInventoryService.xgkc(restoreParam); + //推送OMS还原预约库存(type=1: OMS侧实物/可用加回, 与交接 omsEdit 扣减互逆) + MaterialInventoryOmsParamDO omsParam = new MaterialInventoryOmsParamDO(); + BeanUtils.copyProperties(restoreParam, omsParam); + omsParam.setKctzType("出库反审"); + omsParam.setLoginUser(loginUser); + omsServiceFeign.omsEdit(omsParam); + } + } + //逻辑删除出库单明细 + materialDetail.setDelFlag(2); + materialDetail.setReverseFlag(1); + outMaterialDetailService.updateById(materialDetail); + } + //逻辑删除出库单(用按单号查出的DB对象更新: 传入对象无主键, 直接updateById不生效, 与 cancelExecutionOrder 一致) + stockOutOrderDB.setDelFlag(2); + stockOutOrderDB.setReverseFlag(1); + stockOutOrderService.updateById(stockOutOrderDB); + //逻辑删除拣货单及拣货明细 + PickingOrder pickingOrder = pickingOrderService.getOne(new LambdaQueryWrapper() + .eq(PickingOrder::getDelFlag, 1) + .eq(PickingOrder::getOrderNumber, outOrderNumber)); + if (pickingOrder != null) { + String pickingOrderNumber = pickingOrder.getPickingOrderNumber(); + List pickingDetails = pickingMaterialDetailService.list(new LambdaQueryWrapper() + .eq(PickingMaterialDetail::getPickingOrderNumber, pickingOrderNumber) + .eq(PickingMaterialDetail::getDelFlag, 1)); + for (PickingMaterialDetail pickingMaterialDetail : pickingDetails) { + pickingMaterialDetail.setDelFlag(2); + pickingMaterialDetail.setReverseFlag(1); + pickingMaterialDetailService.updateById(pickingMaterialDetail); + } + pickingOrder.setDelFlag(2); + pickingOrder.setReverseFlag(1); + pickingOrderService.updateById(pickingOrder); + } + //逻辑删除复核单及复核明细(已复核单据反审时存在) + List reviewOrders = reviewOrderMapper.selectList(new LambdaQueryWrapper() + .eq(ReviewOrder::getDelFlag, 1) + .eq(ReviewOrder::getOutOrderNumber, outOrderNumber)); + for (ReviewOrder reviewOrder : reviewOrders) { + reviewMaterialDetailMapper.update(null, new LambdaUpdateWrapper() + .set(ReviewMaterialDetail::getDelFlag, 2) + .set(ReviewMaterialDetail::getReverseFlag, 1) + .eq(ReviewMaterialDetail::getReviewOrderId, reviewOrder.getReviewOrderId()) + .eq(ReviewMaterialDetail::getDelFlag, 1)); + reviewOrder.setDelFlag(2); + reviewOrder.setReverseFlag(1); + reviewOrderMapper.updateById(reviewOrder); + } + //逻辑删除交接作业单(不需复核单据出库完成时生成) + List handoverTaskOrders = handoverTaskOrderService.list(new LambdaQueryWrapper() + .eq(HandoverTaskOrder::getDelFlag, 1) + .eq(HandoverTaskOrder::getOrderNumber, outOrderNumber)); + for (HandoverTaskOrder handoverTaskOrder : handoverTaskOrders) { + handoverTaskOrder.setDelFlag(2); + handoverTaskOrder.setReverseFlag(1); + handoverTaskOrderService.updateById(handoverTaskOrder); + } + //生成1条出库异常记录【反审记录】, 供记录跟踪 + OutOrderAbnormal reverseAbnormal = new OutOrderAbnormal(); + reverseAbnormal.setOrganizationId(stockOutOrderDB.getOrganizationId()); + reverseAbnormal.setOrganizationName(stockOutOrderDB.getOrganizationName()); + reverseAbnormal.setTopOrganizationId(stockOutOrderDB.getTopOrganizationId()); + reverseAbnormal.setAbnormalNumber(OrderSequence.getOrderCode("FSYC")); + reverseAbnormal.setOutOrderNumber(outOrderNumber); + reverseAbnormal.setType(3); + reverseAbnormal.setAbnormalType(3); + reverseAbnormal.setQuantity(stockOutOrderDB.getQuantity()); + reverseAbnormal.setActualQuantity(stockOutOrderDB.getPickingQuantity()); + reverseAbnormal.setAbnormalActualQuantity(BigDecimal.ZERO); + reverseAbnormal.setAbnormalReason("出库单反审"); + reverseAbnormal.setRemark(reverseRemark); + reverseAbnormal.setCreateBy(loginUser.getUserid()); + reverseAbnormal.setCreateByName(loginUser.getUsername()); + reverseAbnormal.setCreateTime(new Date()); + outOrderAbnormalService.save(reverseAbnormal); + } + @Transactional(rollbackFor = Exception.class) public void omsOrderAddDetail(List outMaterialDetails) { if (CollectionUtils.isEmpty(outMaterialDetails)) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/handoverTaskOrder/HandoverTaskOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/handoverTaskOrder/HandoverTaskOrderDTO.java index dfe630a13..ee8013dc8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/handoverTaskOrder/HandoverTaskOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/handoverTaskOrder/HandoverTaskOrderDTO.java @@ -174,4 +174,7 @@ public class HandoverTaskOrderDTO extends BaseVOEntity { private String pictureApp; private String billingJson; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outOrderAbnormal/OutOrderAbnormalDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outOrderAbnormal/OutOrderAbnormalDTO.java index 30f15c850..7a0d775d9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outOrderAbnormal/OutOrderAbnormalDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outOrderAbnormal/OutOrderAbnormalDTO.java @@ -50,8 +50,8 @@ public class OutOrderAbnormalDTO extends BaseVOEntity { @Excel(name = "拣货作业单号") private String outTaskOrderNumber; - @ApiModelProperty("类型:1-拣货 2-复核") - @Excel(name = "类型:1-拣货 2-复核") + @ApiModelProperty("类型:1-拣货 2-复核 3-反审记录") + @Excel(name = "类型:1-拣货 2-复核 3-反审记录") private Integer type; @ApiModelProperty("计划数量") @@ -66,8 +66,8 @@ public class OutOrderAbnormalDTO extends BaseVOEntity { @Excel(name = "异常数量 = 作业数量 - 计划数量") private BigDecimal abnormalActualQuantity; - @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常") - @Excel(name = "异常类型: 1-拣货异常 2-复核异常") + @ApiModelProperty("异常类型: 1-拣货异常 2-复核异常 3-反审记录") + @Excel(name = "异常类型: 1-拣货异常 2-复核异常 3-反审记录") private Integer abnormalType; @ApiModelProperty("异常原因") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/pickingOrder/PickingOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/pickingOrder/PickingOrderDTO.java index ec6e70228..07571fd3a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/pickingOrder/PickingOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/pickingOrder/PickingOrderDTO.java @@ -196,4 +196,7 @@ public class PickingOrderDTO extends BaseVOEntity { @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTimeTo; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java index 623a64d74..3beb8961e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/reviewOrder/ReviewOrderDTO.java @@ -86,4 +86,7 @@ public class ReviewOrderDTO extends BaseVOEntity { private Integer tabType; + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java index 3f4377b96..dc29ee6d8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java @@ -513,4 +513,7 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO { /** PDA出库签名列表专用:作业任务人员模糊查询字段 */ @ApiModelProperty("作业任务人员(模糊查询)") private String workUserNameLike; -} \ No newline at end of file + + @ApiModelProperty("反审标记: 1-已反审(查询【已反审】tab时与delFlag=2一起传入)") + private Integer reverseFlag; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/handoverTaskOrder/HandoverTaskOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/handoverTaskOrder/HandoverTaskOrderApi.java index 75c444212..798a11e4d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/handoverTaskOrder/HandoverTaskOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/handoverTaskOrder/HandoverTaskOrderApi.java @@ -92,6 +92,16 @@ public class HandoverTaskOrderApi extends BaseController { return AjaxResult.success(handoverTaskOrderApplicationService.getInfo(outTaskOrderId)); } + /** + * 获取交接作业单归档详情(已反审): 反审时交接单已软删(del_flag=2), 供【已反审】tab 查看归档详情 + */ + @ApiOperation("获取交接作业单归档详情(已反审)") + @GetMapping(value = "/getReverseInfo/{outTaskOrderId}") + public AjaxResult getReverseInfo(@PathVariable("outTaskOrderId") Long outTaskOrderId) + { + return AjaxResult.success(handoverTaskOrderApplicationService.getReverseInfo(outTaskOrderId)); + } + @ApiOperation("分配月台") @PostMapping("/allocationPlatform") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/pickingOrder/PickingOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/pickingOrder/PickingOrderApi.java index ac12e34c6..d671fc454 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/pickingOrder/PickingOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/pickingOrder/PickingOrderApi.java @@ -80,6 +80,15 @@ public class PickingOrderApi extends BaseController { return AjaxResult.success(pickingOrderApplicationService.getInfoByIdAndType(pickingOrderId, type)); } + /** + * 获取拣货单归档详情(已反审): 反审时拣货单已软删(del_flag=2), 供【已反审】tab 查看归档详情 + */ + @ApiOperation("获取拣货单归档详情(已反审)") + @GetMapping(value = "/getReverseInfoByIdAndType/{pickingOrderId}/{type}") + public AjaxResult getReverseInfoByIdAndType(@PathVariable("pickingOrderId") Long pickingOrderId, @PathVariable("type") Integer type) { + return AjaxResult.success(pickingOrderApplicationService.getReverseInfoByIdAndType(pickingOrderId, type)); + } + @ApiOperation("整单下发") @PostMapping("/allDistribution") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/reviewOrder/ReviewOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/reviewOrder/ReviewOrderApi.java index 2c4e97188..e98818258 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/reviewOrder/ReviewOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/reviewOrder/ReviewOrderApi.java @@ -52,6 +52,15 @@ public class ReviewOrderApi extends BaseController { return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId)); } + /** + * 获取复核单归档详情(已反审): 反审时复核单已软删(del_flag=2), 供【已反审】tab 查看归档详情 + */ + @ApiOperation("获取复核单归档详情(已反审)") + @GetMapping(value = "/getReverseInfo/{reviewOrderId}") + public AjaxResult getReverseInfo(@PathVariable("reviewOrderId") Long reviewOrderId) { + return AjaxResult.success(reviewOrderApplicationService.getReverseDetailByReviewOrderId(reviewOrderId)); + } + @ApiOperation("根据复核单号获取复核单详情") @GetMapping(value = "/getInfoReviewOrderNumber") public AjaxResult getInfoReviewOrderNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index 80cd2ccba..58c10f37a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -200,6 +200,16 @@ public class StockOutOrderApi extends BaseController { return AjaxResult.success(stockOutOrderApplicationService.getInfoChildren(outOrderId)); } + /** + * 获取出库单归档详情(已反审): 反审时单据已软删(del_flag=2), 常规详情查不到, + * 本接口不滤主表 del_flag 且明细查 del_flag=2 归档数据, 供【已反审】tab 使用 + */ + @ApiOperation("获取出库单归档详情(已反审)") + @GetMapping(value = "/getReverseInfo/{outOrderId}") + public AjaxResult getReverseInfo(@PathVariable("outOrderId") Long outOrderId) { + return AjaxResult.success(stockOutOrderApplicationService.getReverseInfoChildren(outOrderId)); + } + /** * 根据出库单号获取出库单详细信息 */ @@ -561,6 +571,17 @@ public class StockOutOrderApi extends BaseController { return AjaxResult.success(); } + /** + * oms出库执行单反审(已出库单据回退): 还原实物库存并推送OMS、 + * 逻辑删除出库单/明细/拣货/复核/交接/配送链路数据、生成出库异常记录【反审记录】 + */ + @ApiOperation("oms出库执行单反审") + @PostMapping(value = "/omsReverseExecutionOrder") + public AjaxResult omsReverseExecutionOrder(@RequestBody StockOutOrder stockOutOrder) { + stockOutOrderApplicationService.reverseExecutionOrder(stockOutOrder); + return AjaxResult.success(); + } + /** * oms下发单配送明细保存 */ diff --git a/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml b/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml index 197871c3d..e01a2e528 100644 --- a/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/handoverTaskOrder/HandoverTaskOrderMapper.xml @@ -39,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -49,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.platform_code, a.platform_name, a.platform_use_time_id, a.platform_use_start_time, a.platform_use_end_time, a.platform_use_status, a.order_type_code, a.order_type_name, a.expect_time, a.warehouse_id, a.warehouse_code, a.warehouse_name, a.shipper_id, a.shipper_name, a.order_number, a.picking_order_number, a.remark, a.task_distribution, a.task_distribution_time, a.create_time, a.create_by, a.create_by_name, a.update_time, - a.update_by, a.update_by_name, a.del_flag, a.picture_app,a.billing_json + a.update_by, a.update_by_name, a.del_flag, a.reverse_flag, a.picture_app,a.billing_json @@ -138,6 +139,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.del_flag = #{delFlag} and a.del_flag = 1 + + and a.reverse_flag = #{reverseFlag} + + + + + + + + + + + Date: Wed, 9 Sep 2026 15:38:21 +0800 Subject: [PATCH 06/27] =?UTF-8?q?feat(oms,wms):=20=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=8F=8D=E5=AE=A1=E2=80=94=E2=80=94?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=8D=95=E6=94=B9=E5=B7=B2=E9=A9=B3=E5=9B=9E?= =?UTF-8?q?+=E5=B7=B2=E5=8F=8D=E5=AE=A1tab=EF=BC=8C=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=8D=95/W=E5=85=A5=E5=BA=93/=E6=94=B6=E8=B4=A7/=E4=B8=8A?= =?UTF-8?q?=E6=9E=B6=E8=BD=AF=E5=88=A0=E6=89=93=E6=A0=87=E5=BD=92=E6=A1=A3?= =?UTF-8?q?=EF=BC=8C=E5=BA=93=E5=AD=98=E8=BF=98=E5=8E=9F=E6=89=A3=E5=87=8F?= =?UTF-8?q?=EF=BC=8CW=E5=85=A5=E5=BA=93=E5=BC=82=E5=B8=B8=E5=8F=8D?= =?UTF-8?q?=E5=AE=A1=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【需求】已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态。反审入口在 OMS-入库业务单页面【反審單據】按钮,一次操作全链路回退。 【反审规则】 1. 按页面状态 issueStatus 判断:进行中(1)/已审核(2)/已入库(4)/部分完成(5) 可反审;已创建(0)无需反审、已驳回(3)可直接编辑;已取消/已关闭(status 6/7)兜底拦截 2. 已推送关务/NC(pushStatus=3)直接拦截,避免关务与仓内数据不一致 3. W入库单有出库记录就不能反审:按入库单号+动作(分配库存/出库)查询库存调整记录>0 即拦截,另校验库存冻结量>0 4. WMS无该单数据时幂等成功(未下发单反审),反审失败可安全重试 【反审动作】 1. 入库业务单:状态改为已驳回(issueStatus=3,与审核不通过同语义,可编辑→重新审核→重新下发),打已反审标记落入【已反审】tab;清空入库数量/入库时间/执行单号,明细 INBOUND_ITEMS/TOTAL_NET_WEIGHT 归零 2. 入库执行单+物料明细:软删(del_flag=2)+打已反审标记,【已反审】tab 按「已软删+已反审」查询归档数据,避免归档单被误审核/下发 3. WMS侧(逐执行单Feign omsReverseInOrder):库存还原扣减(校验库存行合计=已完成上架量后整行对称扣回,GREATEST(x-n,0)兜底)→ W入库单/W收货单/W上架单及明细、收货/上架作业单/任务/质检单整链软删+打已反审标记 → 写1条入库异常【反审记录】(type=3/abnormalType=6,FSYC单号)用于记录跟踪 【接口】 - POST /reservationStockInOrderApi/reverseAudit 反审(inOrderIds + reverseAuditRemark,支持批量) - 已反审tab:/reservationStockInOrderApi/list?reverseAuditStatus=1(执行单/W入库单/W收货单/W上架单同参数,后端固定限定 del_flag=2+标记=1 归档数据) - 归档详情:/executionStockInOrderApi、/stockInOrderApi、/stockReceiptOrderApi、/stockShelfOrderApi 各增 getReverseAuditInfo/{id}(原 getInfo 行为不变) - 反审记录筛选:/inOrderAbnormalApi/list?abnormalType=6 【DDL】sql/20260908_oms_inbound_reverse_audit.sql:RESERVATION_STOCK_IN_ORDER / EXECUTION_STOCK_IN_ORDER / STOCK_IN_ORDER / STOCK_RECEIPT_ORDER / STOCK_SHELF_ORDER 各新增 REVERSE_AUDIT_STATUS/REMARK/BY/BY_NAME/TIME 五列,发服务前先执行 【其他】 - 库存扣减走 batchSubtractInventoryQuantity 并显式传更新人,规避 Feign 链路无登录态时 SecurityUtils 抛异常 - omsReverseInOrder 的 Feign 方法与降级已随出库反审提交(715883f1)入库,本次不再重复提交 - 归档行只读,详情走 getReverseAuditInfo;正常数据与归档数据互不干扰 --- .../entity/ExecutionStockInOrder.java | 17 + .../po/ExecutionStockInOrderPO.java | 17 + .../todo/ExecutionStockInOrderDO.java | 17 + .../todo/ExecutionStockInOrderDTO.java | 17 + ...ecutionStockInOrderApplicationService.java | 19 +- .../ExecutionStockInOrderDomainService.java | 17 + .../entity/ReservationStockInOrder.java | 17 + .../po/ReservationStockInOrderPO.java | 17 + .../todo/ReservationStockInOrderDO.java | 17 + .../todo/ReservationStockInOrderDTO.java | 17 + ...rvationStockInOrderApplicationService.java | 12 +- .../ReservationStockInOrderDomainService.java | 162 ++++++++ .../ExecutionStockInOrderApi.java | 10 + .../ReservationStockInOrderApi.java | 13 + .../ExecutionStockInOrderMapper.xml | 23 +- .../ReservationStockInOrderMapper.xml | 16 +- .../StockInOrderApplicationService.java | 27 +- .../entity/InOrderAbnormal.java | 8 +- .../facade/IInOrderAbnormalService.java | 7 + .../persistence/InOrderAbnormalImpl.java | 19 + .../stockInOrder/entity/StockInOrder.java | 17 + .../repository/po/StockInOrderPO.java | 17 + .../repository/todo/StockInOrderDO.java | 17 + .../service/StockInOrderDomainService.java | 346 +++++++++++++++++- .../entity/StockReceiptOrder.java | 17 + .../repository/po/StockReceiptOrderPO.java | 17 + .../repository/todo/StockReceiptOrderDO.java | 17 + .../entity/StockShelfOrder.java | 17 + .../repository/po/StockShelfOrderPO.java | 17 + .../repository/todo/StockShelfOrderDO.java | 17 + .../dto/stockInOrder/StockInOrderDTO.java | 3 + .../StockReceiptOrderDTO.java | 3 + .../stockShelfOrder/StockShelfOrderDTO.java | 3 + .../stockInOrder/StockInOrderApi.java | 21 ++ .../stockInOrder/StockInOrderMapper.xml | 23 +- .../StockReceiptOrderMapper.xml | 21 +- .../stockShelfOrder/StockShelfOrderMapper.xml | 19 +- sql/20260908_oms_inbound_reverse_audit.sql | 93 +++++ 38 files changed, 1127 insertions(+), 27 deletions(-) create mode 100644 sql/20260908_oms_inbound_reverse_audit.sql diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java index a632a9046..87e18b112 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/entity/ExecutionStockInOrder.java @@ -459,4 +459,21 @@ public class ExecutionStockInOrder extends BaseVOEntity { @ApiModelProperty("通知单备注") private String noticeRemark; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java index 304015586..f1c276df9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/po/ExecutionStockInOrderPO.java @@ -482,4 +482,21 @@ public class ExecutionStockInOrderPO extends BaseVOEntity { private String khdm; @ApiModelProperty("通知单备注") private String noticeRemark; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java index 9da4e4dd7..4f0851406 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDO.java @@ -513,4 +513,21 @@ public class ExecutionStockInOrderDO extends BaseVOEntity { private String businessPriceWay; @ApiModelProperty("通知单备注") private String noticeRemark; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java index 2957ed604..ca947d339 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/todo/ExecutionStockInOrderDTO.java @@ -510,4 +510,21 @@ public class ExecutionStockInOrderDTO extends ExecutionStockInOrderBaseDTO { private String businessPriceWay; @ApiModelProperty("通知单备注") private String noticeRemark; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java index 46a751e43..0491c2d66 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderApplicationService.java @@ -263,7 +263,16 @@ public class ExecutionStockInOrderApplicationService { */ public ExecutionStockInOrderPO getInfo(Long inOrderId) { - ExecutionStockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId); + return getInfo(inOrderId, false); + } + + /** + * 获取入库执行单详情(getReverseAuditInfo 归档详情复用) + * @param archive true-查询【已反审】tab 归档数据 + */ + public ExecutionStockInOrderPO getInfo(Long inOrderId, boolean archive) + { + ExecutionStockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId, archive); String userNcCode = reservationStockInOrderMapper.getUserNcCode(info.getShipperId()); info.setKhdm(userNcCode); List materialDetailList = info.getMaterialDetailList(); @@ -276,6 +285,14 @@ public class ExecutionStockInOrderApplicationService { return info; } + /** + * 查询入库执行单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + public ExecutionStockInOrderPO getReverseAuditInfo(Long inOrderId) + { + return getInfo(inOrderId, true); + } + /** diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java index b6a8e0209..3758a733e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java @@ -314,14 +314,31 @@ public class ExecutionStockInOrderDomainService { * 获取入库单详细信息 */ public ExecutionStockInOrderPO getInfo(Long inOrderId) + { + return getInfo(inOrderId, false); + } + + /** + * 获取入库执行单详情 + * @param archive true-查询【已反审】tab 归档数据(主单须为已软删+已反审标记,明细放行软删行) + */ + public ExecutionStockInOrderPO getInfo(Long inOrderId, boolean archive) { ExecutionStockInOrderPO stockInOrderPO = stockInOrderService.getInfo(inOrderId); + if (archive && (stockInOrderPO.getDelFlag() == null || stockInOrderPO.getDelFlag() != 2 + || !Integer.valueOf(1).equals(stockInOrderPO.getReverseAuditStatus()))) { + throw new ServiceException("入库执行单非已反审归档数据,无法查看归档详情"); + } ExecutionInMaterialDetailDO inMaterialDetailDO = new ExecutionInMaterialDetailDO(); String inOrderNumber = stockInOrderPO.getInOrderNumber(); List businessDocumentOrders = businessDocumentOrderMapper.selectList(new LambdaQueryWrapper().eq(BusinessDocumentOrder::getInOrderNumber, inOrderNumber).notIn(BusinessDocumentOrder::getOrderStatus,4,5)); stockInOrderPO.setBusinessDocumentOrderDOList(businessDocumentOrders); inMaterialDetailDO.setInOrderNumber(inOrderNumber); inMaterialDetailDO.setLevel(1); + if (archive) { + //归档明细已随主单软删(del_flag=2),放行软删明细行 + inMaterialDetailDO.setDelFlag(2); + } List inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO); // 先通过入库单号查询收货单列表 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/entity/ReservationStockInOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/entity/ReservationStockInOrder.java index f61291f28..eede5606f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/entity/ReservationStockInOrder.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/entity/ReservationStockInOrder.java @@ -456,4 +456,21 @@ public class ReservationStockInOrder extends BaseVOEntity { @ApiModelProperty("业务计价方式") private String businessPriceWay; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java index 932142c33..782df5252 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/po/ReservationStockInOrderPO.java @@ -502,4 +502,21 @@ public class ReservationStockInOrderPO extends BaseVOEntity { @ApiModelProperty("业务计价方式") private String businessPriceWay; private String khdm; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDO.java index fe2eb7cc2..e5e31f27b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDO.java @@ -513,4 +513,21 @@ public class ReservationStockInOrderDO extends BaseVOEntity { @ApiModelProperty("业务计价方式") private String businessPriceWay; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDTO.java index fb0ff4f6f..bf269c011 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/todo/ReservationStockInOrderDTO.java @@ -507,4 +507,21 @@ public class ReservationStockInOrderDTO extends ReservationStockInOrderBaseDTO { @ApiModelProperty("业务计价方式") private String businessPriceWay; + + @ApiModelProperty("反审状态: 0-无 1-已反审") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java index 9e5049c8f..19c8cdfba 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderApplicationService.java @@ -282,8 +282,7 @@ public class ReservationStockInOrderApplicationService { * @return Boolean */ public Boolean auditState(ReservationStockInOrderDO stockInOrderDO){ - Boolean b = stockInOrderDomainService.auditState(stockInOrderDO); -// List inOrderIds = stockInOrderDO.getInOrderIds(); + Boolean b = stockInOrderDomainService.auditState(stockInOrderDO);// List inOrderIds = stockInOrderDO.getInOrderIds(); // if (inOrderIds != null && !inOrderIds.isEmpty()) { // ReservationStockInOrder stockInOrder = reservationStockInOrderMapper.selectById(inOrderIds.get(0)); // Integer needCustomsDeclaration = stockInOrder.getNeedCustomsDeclaration(); @@ -302,6 +301,15 @@ public class ReservationStockInOrderApplicationService { return b; } + /** + * 反审入库业务单:业务单状态改为已驳回(issueStatus=3)并打已反审标记落入【已反审】tab, + * 入库执行单+明细逻辑删除,WMS侧整链回退(库存扣减+单据清理+反审异常记录), + * W入库单有出库记录时WMS侧拦截,已推送关务直接拦截 + */ + public Boolean reverseAudit(ReservationStockInOrderDO stockInOrderDO){ + return stockInOrderDomainService.reverseAudit(stockInOrderDO); + } + /** * @description 下发入库单 * @author ZhouGY diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index f327fda66..396935fef 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -13,6 +13,9 @@ import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import com.mhd.oms.domain.electronicSignature.entity.ElectronicSignature; +import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureMaterialDetailService; +import com.mhd.oms.domain.electronicSignature.repository.facade.IElectronicSignatureService; import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; import com.mhd.oms.domain.executionInMaterialDetail.repository.facade.IExecutionInMaterialDetailService; import com.mhd.oms.domain.executionStockInOrder.entity.ExecutionStockInOrder; @@ -91,6 +94,10 @@ public class ReservationStockInOrderDomainService { private ExecutionStockInOrderMapper executionStockInOrderMapper; @Autowired private ReserveStockInOrderMapper reserveStockInOrderMapper; + @Autowired + private IElectronicSignatureService electronicSignatureService; + @Autowired + private IElectronicSignatureMaterialDetailService electronicSignatureMaterialDetailService; /** * 分页查询入库单列表 @@ -767,6 +774,161 @@ public class ReservationStockInOrderDomainService { } } + /** + * 反审入库业务单(需求:已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态): + * 页面状态列按 issueStatus(0-已创建 1-进行中 2-已审核 3-已驳回 4-已入库 5-部分完成)展示, + * 反审条件按 issueStatus 判断——进行中(1)/已审核(2)/已入库(4)/部分完成(5)可反审, + * 已创建(0)无需反审、已驳回(3)可直接编辑;已取消/已关闭(status 6/7)兜底拦截。 + * 反审动作("审核不通过"同语义 + 全链路回退,补齐 auditState 审核不通过缺失的下游联动): + *
    + *
  • 业务单状态改为"已驳回"(issueStatus=3),打已反审标记(REVERSE_AUDIT_STATUS=1)落入【已反审】tab, + * 之后可「编辑」→重新「审核」→重新「下发」生成全新执行单
  • + *
  • 入库执行单+物料明细软删(del_flag=2)并打已反审标记——执行单【已反审】tab按 + * "已软删+已反审"查询归档数据;软删后不出现在正常tab,避免归档单被误「审核/下发」
  • + *
  • 清空WMS完成上架跨库回写的完成数据(业务单 IN_QUANTITY/STORAGE_TIME、明细 INBOUND_ITEMS/TOTAL_NET_WEIGHT)
  • + *
  • WMS侧逐执行单回退(omsReverseInOrder):W入库单有出库记录则拦截(按入库单号+动作"分配库存/出库" + * 查库存调整记录>0)→ 库存还原扣减 → W入库单/W收货单/W上架单整链软删并打已反审标记 + * (数据划归W入库单/W收货单/W上架单【已反审】tab归档)→ + * 写1条W入库异常【反审记录】用于记录跟踪
  • + *
+ * 已推送关务(pushStatus=3)直接拦截。WMS回退幂等,反审失败可安全重试。 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean reverseAudit(ReservationStockInOrderDO stockInOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) + String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); + + List inOrderIds = stockInOrderDO.getInOrderIds(); + if (inOrderIds == null || inOrderIds.isEmpty()) { + throw new ServiceException("未选择反审的入库业务单"); + } + Date now = new Date(); + for (Long inOrderId : inOrderIds) { + ReservationStockInOrder businessOrder = stockInOrderService.getById(inOrderId); + if (businessOrder == null + || (businessOrder.getDelFlag() != null && businessOrder.getDelFlag() != 1)) { + throw new ServiceException("入库业务单不存在或已被删除,无法反审"); + } + String businessNumber = businessOrder.getInOrderNumber(); + Integer issueStatus = businessOrder.getIssueStatus(); + if (issueStatus == null || issueStatus == 0) { + throw new ServiceException("入库业务单[" + businessNumber + "]为已创建状态,无需反审"); + } + if (issueStatus == 3) { + throw new ServiceException("入库业务单[" + businessNumber + "]已驳回,无需反审,可直接编辑后重新提交审核"); + } + if (issueStatus != 1 && issueStatus != 2 && issueStatus != 4 && issueStatus != 5) { + throw new ServiceException("入库业务单[" + businessNumber + "]仅进行中/已审核/已入库状态可反审,当前状态值:" + issueStatus); + } + if (businessOrder.getStatus() != null && (businessOrder.getStatus() == 6 || businessOrder.getStatus() == 7)) { + throw new ServiceException("入库业务单[" + businessNumber + "]已取消/已关闭,无法反审"); + } + if (businessOrder.getPushStatus() != null && businessOrder.getPushStatus() == 3) { + throw new ServiceException("入库业务单[" + businessNumber + "]已推送关务/NC,无法反审,请先在关务侧处理"); + } + + //该业务单下全部有效执行单:逐张调WMS回退后软删并打已反审标记 + List executionOrders = executionStockInOrderService.list( + new LambdaQueryWrapper() + .eq(ExecutionStockInOrder::getBusinessInOrderNumber, businessNumber) + .eq(ExecutionStockInOrder::getDelFlag, 1)); + for (ExecutionStockInOrder executionOrder : executionOrders) { + String executionNumber = executionOrder.getInOrderNumber(); + if (executionOrder.getPushStatus() != null && executionOrder.getPushStatus() == 3) { + throw new ServiceException("执行入库单[" + executionNumber + "]已推送关务/NC,无法反审,请先在关务侧处理"); + } + //WMS侧回退(对称收货/上架完成链路,见 WMS StockInOrderDomainService.reverseExecutionOrder): + //有出库/库存已被分配时WMS报错,此处抛错整体回滚;WMS无数据时幂等成功(未下发执行单反审) + StockInOrder reverseParam = new StockInOrder(); + reverseParam.setInOrderNumber(executionNumber); + reverseParam.setRemark("业务单号:" + businessNumber + + (StringUtils.isNotEmpty(stockInOrderDO.getReverseAuditRemark()) + ? ",反审原因:" + stockInOrderDO.getReverseAuditRemark() : "")); + reverseParam.setUpdateBy(loginUser.getUserid()); + reverseParam.setUpdateByName(userRealName); + AjaxResult reverseResult = wmsServiceFeign.omsReverseInOrder(reverseParam); + if (reverseResult == null || !"200".equals(String.valueOf(reverseResult.get("code")))) { + throw new ServiceException("反审失败:执行入库单[" + executionNumber + "]WMS回退失败:" + + (reverseResult == null ? "WMS服务不可用或已降级" : reverseResult.get("msg"))); + } + //清理下发自动审核生成的待签名电子签名记录(signatureStatus=1,已签名记录保留作凭证) + cancelPendingSignature(executionNumber); + //执行单+物料明细软删(del_flag=2)并打已反审标记: + //执行单【已反审】tab按"已软删+已反审"(del_flag=2 and REVERSE_AUDIT_STATUS=1)查询归档数据; + //软删后不出现在正常tab,避免归档单被误「审核/下发」;业务单重新下发时生成全新执行单 + executionInMaterialDetailService.update(new UpdateWrapper().lambda() + .set(ExecutionInMaterialDetail::getDelFlag, 2) + .set(ExecutionInMaterialDetail::getUpdateBy, loginUser.getUserid()) + .set(ExecutionInMaterialDetail::getUpdateByName, userRealName) + .set(ExecutionInMaterialDetail::getUpdateTime, now) + .eq(ExecutionInMaterialDetail::getInOrderNumber, executionNumber) + .eq(ExecutionInMaterialDetail::getDelFlag, 1)); + executionStockInOrderService.update(new UpdateWrapper().lambda() + .set(ExecutionStockInOrder::getDelFlag, 2) + .set(ExecutionStockInOrder::getReverseAuditStatus, 1) + .set(ExecutionStockInOrder::getReverseAuditRemark, stockInOrderDO.getReverseAuditRemark()) + .set(ExecutionStockInOrder::getReverseAuditBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getReverseAuditByName, userRealName) + .set(ExecutionStockInOrder::getReverseAuditTime, now) + .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, now) + .eq(ExecutionStockInOrder::getInOrderId, executionOrder.getInOrderId()) + .eq(ExecutionStockInOrder::getDelFlag, 1)); + } + + //清空WMS完成上架跨库回写的业务单明细入库数量(INBOUND_ITEMS/TOTAL_NET_WEIGHT 上架时按上架量覆写过) + materialDetailService.update(new UpdateWrapper().lambda() + .set(ReservationInMaterialDetail::getInboundQuantity, BigDecimal.ZERO) + .set(ReservationInMaterialDetail::getTotalNetWeight, BigDecimal.ZERO) + .eq(ReservationInMaterialDetail::getInOrderNumber, businessNumber) + .eq(ReservationInMaterialDetail::getDelFlag, 1)); + } + + //业务单状态改为"已驳回"(与审核不通过同语义)+ 已反审标记落入【已反审】tab + 清空完成回写数据 + return stockInOrderService.update(null, new UpdateWrapper().lambda() + .set(ReservationStockInOrder::getIssueStatus, 3) + .set(ReservationStockInOrder::getInQuantity, BigDecimal.ZERO) + .set(ReservationStockInOrder::getStorageTime, null) + .set(ReservationStockInOrder::getExecutionInOrderNumber, null) + //反审标记与反审痕迹(【已反审】tab 按 reverseAuditStatus=1 过滤;业务单本身不软删,保持可编辑重新下发) + .set(ReservationStockInOrder::getReverseAuditStatus, 1) + .set(ReservationStockInOrder::getReverseAuditRemark, stockInOrderDO.getReverseAuditRemark()) + .set(ReservationStockInOrder::getReverseAuditBy, loginUser.getUserid()) + .set(ReservationStockInOrder::getReverseAuditByName, userRealName) + .set(ReservationStockInOrder::getReverseAuditTime, now) + .set(ReservationStockInOrder::getUpdateBy, loginUser.getUserid()) + .set(ReservationStockInOrder::getUpdateByName, userRealName) + .set(ReservationStockInOrder::getUpdateTime, now) + .in(ReservationStockInOrder::getInOrderId, inOrderIds)); + } + + /** + * 反审时清理下发自动审核生成的待签名电子签名记录(signatureStatus=1)及其明细, + * 已签名记录保留作凭证;清理失败仅记日志不阻断反审主流程(同取消下发) + */ + private void cancelPendingSignature(String inOrderNumber) { + try { + List signatures = electronicSignatureService.list( + new LambdaQueryWrapper() + .eq(ElectronicSignature::getOrderNumber, inOrderNumber) + .eq(ElectronicSignature::getOrderType, "IN") + .eq(ElectronicSignature::getSignatureStatus, 1) + .eq(ElectronicSignature::getDelFlag, 1)); + for (ElectronicSignature signature : signatures) { + electronicSignatureMaterialDetailService.deleteBySignatureId(signature.getSignatureId()); + electronicSignatureService.update(new UpdateWrapper().lambda() + .set(ElectronicSignature::getDelFlag, 2) + .eq(ElectronicSignature::getSignatureId, signature.getSignatureId())); + } + } catch (Exception e) { + log.error("反审清理电子签名记录失败,入库单号:{}", inOrderNumber, e); + } + } + @Transactional(rollbackFor = Exception.class) public Boolean executeAndIssue(ReservationStockInOrderDO stockInOrderDO) { // 防重复执行校验(与 issueOrder 的防重逻辑对齐):issueTime 有值表示已下发/执行过。 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java index 6406a2472..68469eecf 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockInOrder/ExecutionStockInOrderApi.java @@ -93,6 +93,16 @@ public class ExecutionStockInOrderApi extends BaseController { return AjaxResult.success(stockInOrderApplicationService.getInfo(inOrderId)); } + /** + * 查询入库执行单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + @ApiOperation("查询入库执行单已反审归档详情") + @GetMapping(value = "/getReverseAuditInfo/{inOrderId}") + public AjaxResult getReverseAuditInfo(@PathVariable("inOrderId") Long inOrderId) + { + return AjaxResult.success(stockInOrderApplicationService.getReverseAuditInfo(inOrderId)); + } + /** * 导入入库单 */ diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java index 5e497d56c..cd6a3701e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationStockInOrder/ReservationStockInOrderApi.java @@ -122,6 +122,19 @@ public class ReservationStockInOrderApi extends BaseController { return AjaxResult.success(stockInOrderApplicationService.auditState(stockInOrderDO)); } + /** + * 反审入库业务单:已入库/已出库的单子客户通知需要回退的场景,单子回退到最原始状态—— + * 业务单状态改为"已驳回"(issueStatus=3,与审核不通过同语义,可编辑→重新审核→重新下发) + * 并打已反审标记落入【已反审】tab;入库执行单+明细软删并打已反审标记; + * W入库单有出库记录时WMS侧拦截不允许反审;已推送关务(pushStatus=3)直接拦截 + */ + @ApiOperation("反审入库业务单") + @PostMapping(value = "/reverseAudit") + public AjaxResult reverseAudit(@RequestBody ReservationStockInOrderDTO stockInOrderDTO) { + ReservationStockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO); + return AjaxResult.success(stockInOrderApplicationService.reverseAudit(stockInOrderDO)); + } + /** * 下发入库单 */ diff --git a/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml index e241f6801..e321f8670 100644 --- a/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionStockInOrder/ExecutionStockInOrderMapper.xml @@ -108,6 +108,11 @@ + + + + + @@ -145,7 +150,8 @@ a.WAREHOUSE_DATE, a.COMPLETION_TIME, a.ORDER_DATE,a.reservation_audit_time,a.reservation_audit_name ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.RESERVATION_ORDER_SOURCE,a.tms_order_number ,a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.STORAGE_TIME,a.in_quantity, - a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME + a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME, + a.REVERSE_AUDIT_STATUS,a.REVERSE_AUDIT_REMARK,a.REVERSE_AUDIT_BY,a.REVERSE_AUDIT_BY_NAME,a.REVERSE_AUDIT_TIME @@ -288,7 +294,7 @@ and a.order_type_code = #{orderTypeCode}
- and (a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) + and (a.ORDER_TYPE_NAME like concat('%', #{orderTypeName}, '%') or a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) and a.supplier_id = #{supplierId} @@ -501,9 +507,18 @@ ) + - and a.del_flag = #{delFlag} - and a.del_flag = 1 + + and a.REVERSE_AUDIT_STATUS = #{reverseAuditStatus} + and a.del_flag = 2 + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index 7d5ab84a6..505b00c03 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -109,6 +109,11 @@ + + + + + @@ -155,7 +160,8 @@ a.WAREHOUSE_DATE, a.COMPLETION_TIME, a.ORDER_DATE,a.reservation_audit_time,a.reservation_audit_name ,a.reservation_audit_id,a.issue_name,a.issue_id,a.issue_time,a.issue_status,a.RESERVATION_ORDER_SOURCE,a.tms_order_number ,a.DIRECTOR_NAME ,a.DIRECTOR_PHONE,a.DIRECTOR_ID,a.STORAGE_TIME,a.in_quantity, - a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_in_order_number + a.PUSH_TIME,a.PUSH_STATUS,a.PUSH_BY,a.PUSH_BY_NAME,a.execution_in_order_number, + a.REVERSE_AUDIT_STATUS,a.REVERSE_AUDIT_REMARK,a.REVERSE_AUDIT_BY,a.REVERSE_AUDIT_BY_NAME,a.REVERSE_AUDIT_TIME @@ -239,7 +245,7 @@ and a.notice_number = #{noticeNumber} - and a.in_order_number = #{inOrderNumber} + and a.in_order_number like concat('%', #{inOrderNumber}, '%') and a.status = #{status} @@ -274,6 +280,10 @@ and a.issue_status = #{issueStatus} + + + and a.REVERSE_AUDIT_STATUS = #{reverseAuditStatus} + and a.warehouse_id = #{warehouseId} @@ -293,7 +303,7 @@ and a.order_type_code = #{orderTypeCode} - and (a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) + and (a.ORDER_TYPE_NAME like concat('%', #{orderTypeName}, '%') or a.BUSINESS_TYPE like concat('%', #{orderTypeName}, '%') or a.ORDER_TYPE_CODE like concat('%', #{orderTypeName}, '%')) and a.supplier_id = #{supplierId} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index 03d02de33..042799783 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -667,7 +667,16 @@ public class StockInOrderApplicationService { */ public StockInOrderPO getInfo(Long inOrderId) { - StockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId); + return getInfo(inOrderId, false); + } + + /** + * 获取入库单详情 + * @param archive true-查询【已反审】tab 归档数据(已软删+已反审标记,明细放行软删行) + */ + public StockInOrderPO getInfo(Long inOrderId, boolean archive) + { + StockInOrderPO info = stockInOrderDomainService.getInfo(inOrderId, archive); String userNcCode = stockOutOrderMapper.getUserNcCode(info.getShipperId()); info.setKhdm(userNcCode); List materialDetailList = info.getMaterialDetailList(); @@ -762,6 +771,14 @@ public class StockInOrderApplicationService { return info; } + /** + * 查询入库单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细/收货单/上架单) + */ + public StockInOrderPO getReverseAuditInfo(Long inOrderId) + { + return getInfo(inOrderId, true); + } + /** @@ -955,6 +972,14 @@ public class StockInOrderApplicationService { stockInOrderDomainService.cancelExecutionOrder(stockInOrder); } + /** + * OMS入库业务单反审:WMS侧回退已完成单据(出库拦截 -> 回退库存 -> + * 逻辑删除收货/上架链路 -> 写入库异常【反审记录】),已产生出库则报错拦截 + */ + public void omsReverseInOrder(StockInOrder stockInOrder){ + stockInOrderDomainService.reverseExecutionOrder(stockInOrder); + } + /** * @description 取消入库单 * @author ZhouGY diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/entity/InOrderAbnormal.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/entity/InOrderAbnormal.java index abc6692c8..8316f0ebd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/entity/InOrderAbnormal.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/entity/InOrderAbnormal.java @@ -53,8 +53,8 @@ public class InOrderAbnormal extends BaseVOEntity { @Excel(name = "上架单号") private String shelfOrderNumber; - @ApiModelProperty("类型:1-收货 2-上架") - @Excel(name = "类型:1-收货 2-上架") + @ApiModelProperty("类型:1-收货 2-上架 3-反审") + @Excel(name = "类型:1-收货 2-上架 3-反审") private Integer type; @ApiModelProperty("计划数量") @@ -73,8 +73,8 @@ public class InOrderAbnormal extends BaseVOEntity { @Excel(name = "异常数量") private BigDecimal abnormalActualQuantity; - @ApiModelProperty("异常类型: 1-上架异常 2-收货异常 3-收货异常(允许超收没超出超收比例) 4-收货异常(不允许超收)5-收货异常(允许超收但超出超收比例)") - @Excel(name = "异常类型: 1-上架异常 2-收货异常 3-收货异常", readConverterExp = "允=许超收但不允许超出超收比例") + @ApiModelProperty("异常类型: 1-上架异常 2-收货异常 3-收货异常(允许超收没超出超收比例) 4-收货异常(不允许超收)5-收货异常(允许超收但超出超收比例) 6-反审记录") + @Excel(name = "异常类型: 1-上架异常 2-收货异常 6-反审记录", readConverterExp = "允=许超收但不允许超出超收比例") private Integer abnormalType; @ApiModelProperty("异常原因") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/facade/IInOrderAbnormalService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/facade/IInOrderAbnormalService.java index ea1f1768c..c4381ded8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/facade/IInOrderAbnormalService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/facade/IInOrderAbnormalService.java @@ -51,4 +51,11 @@ public interface IInOrderAbnormalService extends IService * @return Boolean */ Boolean genInOrderAbnormal(InOrderAbnormalBaseDO inOrderAbnormalBaseDO, Integer type); + + /** + * 生成入库异常【反审记录】(入库业务单反审时调用,用于记录跟踪) + * 单号自动生成(FSYC 前缀,与出库反审记录一致),固定 type=3(反审)、abnormalType=6(反审记录), + * 其余字段(inOrderNumber/abnormalReason/quantity/remark/createBy 等)由调用方填充 + */ + Boolean genReverseAuditAbnormal(InOrderAbnormal inOrderAbnormal); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java index b0cda6088..e6d13bec3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java @@ -174,6 +174,25 @@ public class InOrderAbnormalImpl extends ServiceImpl inMaterialDetailPOList = materialDetailService.queryList(inMaterialDetailDO); - + // 先通过入库单号查询收货单列表 StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO(); stockReceiptOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); + if (archive) { + stockReceiptOrderDO.setDelFlag(2); + } List stockReceiptOrderPOList = stockReceiptOrderDomainService.queryList(stockReceiptOrderDO); - + // 先通过入库单号查询上架单列表 StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); stockShelfOrderDO.setInOrderNumber(stockInOrderPO.getInOrderNumber()); + if (archive) { + stockShelfOrderDO.setDelFlag(2); + } List stockShelfOrderPOList = stockShelfOrderDomainService.queryList(stockShelfOrderDO); - + // 查询收货单明细,用于填充收货数量和更新毛重、净重、面积、体积 List receiptMaterialDetailPOList = new ArrayList<>(); if (!CollectionUtils.isEmpty(stockReceiptOrderPOList)) { @@ -548,10 +595,13 @@ public class StockInOrderDomainService { if (!CollectionUtils.isEmpty(receiptOrderNumberList)) { ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); receiptMaterialDetailDO.setReceiptOrderNumberList(receiptOrderNumberList); + if (archive) { + receiptMaterialDetailDO.setDelFlag(2); + } receiptMaterialDetailPOList = receiptMaterialDetailService.queryList(receiptMaterialDetailDO); } } - + // 查询上架单明细,用于填充上架数量 List shelfMaterialDetailPOList = new ArrayList<>(); if (!CollectionUtils.isEmpty(stockShelfOrderPOList)) { @@ -559,6 +609,9 @@ public class StockInOrderDomainService { if (StringUtils.isNotBlank(stockShelfOrderPO.getShelfOrderNumber())) { ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO(); shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); + if (archive) { + shelfMaterialDetailDO.setDelFlag(2); + } List shelfDetails = shelfMaterialDetailService.queryList(shelfMaterialDetailDO); if (!CollectionUtils.isEmpty(shelfDetails)) { shelfMaterialDetailPOList.addAll(shelfDetails); @@ -844,6 +897,291 @@ public class StockInOrderDomainService { .eq(StockInOrder::getDelFlag, 1)); } + /** + * OMS入库业务单反审:WMS侧一个事务内把已完成单据回退到最原始状态(供 Feign /stockInOrderApi/omsReverseInOrder 调用)。 + * + *

与 {@link #cancelExecutionOrder(StockInOrder)}(取消下发,仅限未开始收货)不同,本方法处理 + * 已开始收货/上架/已入库(status>=3)的单据,回退动作与"完成收货/完成上架"链路对称:

+ *
    + *
  • 出库拦截:按"入库单号+动作(分配库存/出库)"查库存调整记录>0 即有出库记录;另校验库存冻结量 + * (入库单有出库就不能反审)
  • + *
  • 回退库存:按本单库存行整行扣回(上架时 inventory_quantity 与 allocation_quantity 同量增加、 + * 重量体积一并累加,此处对称扣回,复用统一扣减服务 GREATEST(x-n,0) 兜底); + * 扣减前校验"库存行合计=已上架完成量",不一致说明发生过库存合并/人工调整,拦截人工核实
  • + *
  • W入库单/W收货单/W上架单整链软删(del_flag=2)并打已反审标记(REVERSE_AUDIT_STATUS=1), + * 各页面【已反审】tab按"已软删+已反审"(del_flag=2 and reverse_audit_status=1)查询归档数据; + * 物料明细/作业单/任务/质检单一并软删留痕,台账节点物理删除保持与回退后库存一致
  • + *
  • 写1条入库异常【反审记录】(in_order_abnormal type=3/abnormalType=6) 用于记录跟踪
  • + *
+ *

WMS无该单数据时幂等返回成功(OMS未下发单反审不产生WMS数据);任何校验失败抛错经 + * Feign 返回,OMS侧整体回滚。反审可重试,本方法幂等。

+ */ + @Transactional(rollbackFor = Exception.class) + public void reverseExecutionOrder(StockInOrder stockInOrder) { + String inOrderNumber = stockInOrder.getInOrderNumber(); + if (StringUtils.isEmpty(inOrderNumber)) { + throw new ServiceException("反审失败:入库单号为空"); + } + //反审原因/反审人由OMS经Feign传入(不依赖Feign链路的登录上下文) + String reverseReason = stockInOrder.getRemark(); + String reverseByName = stockInOrder.getUpdateByName(); + + List stockInOrders = stockInOrderService.list(new LambdaQueryWrapper() + .eq(StockInOrder::getInOrderNumber, inOrderNumber) + .eq(StockInOrder::getDelFlag, 1)); + if (CollectionUtils.isEmpty(stockInOrders)) { + //幂等:WMS无该单数据(未下发单反审或已反审过),直接成功,保证OMS反审可重试 + return; + } + StockInOrder wmsOrder = stockInOrders.get(0); + + // ========== 1. 出库拦截:入库单有出库就不能反审 ========== + //按"入库单号+动作(分配库存/出库)"查询库存调整记录:出库分配/交接出库时都会写入调整记录, + //>0 即证明该入库单的库存已发生出库流转;取消分配时调整记录随之软删,不会误拦 + List outboundRecords = inventoryAdjustmentRecordService.list( + new LambdaQueryWrapper() + .eq(InventoryAdjustmentRecord::getInOrderNumber, inOrderNumber) + .in(InventoryAdjustmentRecord::getAdjustAction, "分配库存", "出库") + .eq(InventoryAdjustmentRecord::getDelFlag, 1)); + if (!CollectionUtils.isEmpty(outboundRecords)) { + throw new ServiceException("入库单[" + inOrderNumber + "]已产生出库记录,无法反审"); + } + //本单库存行(反审要扣回的库存) + List inventoryRows = materialInventoryService.list(new LambdaQueryWrapper() + .eq(MaterialInventory::getInOrderNumber, inOrderNumber)); + for (MaterialInventory row : inventoryRows) { + if (row.getFreezeQuantity() != null && row.getFreezeQuantity().compareTo(BigDecimal.ZERO) > 0) { + throw new ServiceException("入库单[" + inOrderNumber + "]库存已被出库分配,无法反审"); + } + } + + // ========== 2. 回退库存(对称"完成上架"写入) ========== + List shelfOrders = stockShelfOrderService.list(new LambdaQueryWrapper() + .eq(StockShelfOrder::getInOrderNumber, inOrderNumber) + .eq(StockShelfOrder::getDelFlag, 1)); + List shelfOrderNumbers = shelfOrders.stream() + .map(StockShelfOrder::getShelfOrderNumber) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + BigDecimal inventoryTotal = inventoryRows.stream() + .map(row -> row.getInventoryQuantity() == null ? BigDecimal.ZERO : row.getInventoryQuantity()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + if (inventoryTotal.compareTo(BigDecimal.ZERO) > 0) { + //扣减前校验:库存行合计必须等于"已完成上架单"的上架量,否则整行扣回会误伤合并进来的其他来源库存。 + //只统计已完成(status=3)的上架单——库存只在完成上架时写入,上架中未完成的单不产生库存 + BigDecimal shelfDoneTotal = BigDecimal.ZERO; + List doneShelfOrderNumbers = shelfOrders.stream() + .filter(shelfOrder -> shelfOrder.getStatus() != null && shelfOrder.getStatus() == 3) + .map(StockShelfOrder::getShelfOrderNumber) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + if (!doneShelfOrderNumbers.isEmpty()) { + List shelfDetails = shelfMaterialDetailService.list(new LambdaQueryWrapper() + .in(ShelfMaterialDetail::getShelfOrderNumber, doneShelfOrderNumbers) + .eq(ShelfMaterialDetail::getDelFlag, 1)); + for (ShelfMaterialDetail shelfDetail : shelfDetails) { + BigDecimal shelved = shelfDetail.getAlreadyShelvesQuantity() != null + ? shelfDetail.getAlreadyShelvesQuantity() + : (shelfDetail.getShelvesQuantity() != null ? shelfDetail.getShelvesQuantity() : BigDecimal.ZERO); + shelfDoneTotal = shelfDoneTotal.add(shelved); + } + } + if (shelfDoneTotal.compareTo(BigDecimal.ZERO) <= 0 || inventoryTotal.compareTo(shelfDoneTotal) != 0) { + throw new ServiceException("入库单[" + inOrderNumber + "]库存(" + inventoryTotal.stripTrailingZeros().toPlainString() + + ")与上架完成量(" + shelfDoneTotal.stripTrailingZeros().toPlainString() + + ")不一致,可能已发生出库或库存合并,请人工核实后再反审"); + } + List subtractList = new ArrayList<>(); + for (MaterialInventory row : inventoryRows) { + if (row.getInventoryQuantity() == null || row.getInventoryQuantity().compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + MaterialInventoryDO subtractDO = new MaterialInventoryDO(); + subtractDO.setMaterialInventoryId(row.getMaterialInventoryId()); + subtractDO.setInventoryQuantity(row.getInventoryQuantity()); + //SQL按 GREATEST(x-#{item.n},0) 扣减,DM/Oracle下 GREATEST 遇 null 返回 null,数值字段一律兜底0 + subtractDO.setNetWeight(row.getNetWeight() == null ? BigDecimal.ZERO : row.getNetWeight()); + subtractDO.setGrossWeight(row.getGrossWeight() == null ? BigDecimal.ZERO : row.getGrossWeight()); + subtractDO.setVolume(row.getVolume() == null ? BigDecimal.ZERO : row.getVolume()); + subtractDO.setArea(row.getArea() == null ? BigDecimal.ZERO : row.getArea()); + subtractList.add(subtractDO); + } + if (!CollectionUtils.isEmpty(subtractList)) { + //直接走统一批量扣减(GREATEST(x-n,0)兜底)并显式传更新人:不经 updateMaterialInventoryInfo, + //其内部 subtractMaterialInventory 取 SecurityUtils 登录上下文,OMS经Feign调用时可能无登录态(会抛异常) + MaterialInventoryParentDO subtractParent = new MaterialInventoryParentDO(); + subtractParent.setMaterialInventoryDOList(subtractList); + subtractParent.setUpdateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy()); + subtractParent.setUpdateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName); + subtractParent.setUpdateTime(new Date()); + materialInventoryService.batchSubtractInventoryQuantity(subtractParent); + } + } + + // ========== 3. 软删下游全链 + W入库单/W收货单/W上架单打"已反审"标记 ========== + //三单软删(del_flag=2)并打已反审标记(REVERSE_AUDIT_STATUS=1),各页面【已反审】tab按 + //"已软删+已反审"(del_flag=2 and reverse_audit_status=1)查询归档数据; + //物料明细/收货上架作业单/任务/质检单/台账一并软删留痕,重新下发时生成全新数据 + String reverseRemarkForWms = StringUtils.isEmpty(reverseReason) ? "入库单反审" : "入库单反审:" + reverseReason; + Long reverseAuditUserId = stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy(); + String reverseAuditUserName = StringUtils.isEmpty(reverseByName) ? "system" : reverseByName; + Date reverseAuditDate = new Date(); + //收货单(含历史重复下发产生的多张同号收货单,全部查出统一清理,避免按单号取一条漏删/报错) + List receiptOrders = stockReceiptOrderService.list(new LambdaQueryWrapper() + .eq(StockReceiptOrder::getInOrderNumber, inOrderNumber) + .eq(StockReceiptOrder::getDelFlag, 1)); + List receiptOrderNumbers = receiptOrders.stream() + .map(StockReceiptOrder::getReceiptOrderNumber) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + //收货/上架作业单(type=1收货 type=2上架;上架作业单兜底按上架单号再查一道防 in_order_number 为空) + //上架单复用第2节已查出的 shelfOrders/shelfOrderNumbers + List taskOrders = stockInTaskOrderService.list(new LambdaQueryWrapper() + .eq(StockInTaskOrder::getInOrderNumber, inOrderNumber) + .eq(StockInTaskOrder::getDelFlag, 1)); + if (!shelfOrderNumbers.isEmpty()) { + Set existTaskNumbers = taskOrders.stream() + .map(StockInTaskOrder::getTaskNumber) + .collect(Collectors.toSet()); + List shelfTaskOrders = stockInTaskOrderService.list(new LambdaQueryWrapper() + .in(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumbers) + .eq(StockInTaskOrder::getDelFlag, 1)); + for (StockInTaskOrder shelfTaskOrder : shelfTaskOrders) { + if (shelfTaskOrder.getTaskNumber() != null && !existTaskNumbers.contains(shelfTaskOrder.getTaskNumber())) { + taskOrders.add(shelfTaskOrder); + } + } + } + List taskNumbers = taskOrders.stream() + .map(StockInTaskOrder::getTaskNumber) + .filter(StringUtils::isNotEmpty) + .distinct() + .collect(Collectors.toList()); + //1.收货/上架作业单明细 + if (!taskNumbers.isEmpty()) { + taskReceiptMaterialDetailService.update(new UpdateWrapper().lambda() + .set(TaskReceiptMaterialDetail::getDelFlag, 2) + .in(TaskReceiptMaterialDetail::getTaskNumber, taskNumbers) + .eq(TaskReceiptMaterialDetail::getDelFlag, 1)); + taskShelfMaterialDetailService.update(new UpdateWrapper().lambda() + .set(TaskShelfMaterialDetail::getDelFlag, 2) + .in(TaskShelfMaterialDetail::getTaskNumber, taskNumbers) + .eq(TaskShelfMaterialDetail::getDelFlag, 1)); + } + //2.收货/上架作业单 + if (!taskNumbers.isEmpty()) { + stockInTaskOrderService.update(new UpdateWrapper().lambda() + .set(StockInTaskOrder::getDelFlag, 2) + .eq(StockInTaskOrder::getInOrderNumber, inOrderNumber) + .eq(StockInTaskOrder::getDelFlag, 1)); + if (!shelfOrderNumbers.isEmpty()) { + stockInTaskOrderService.update(new UpdateWrapper().lambda() + .set(StockInTaskOrder::getDelFlag, 2) + .in(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumbers) + .eq(StockInTaskOrder::getDelFlag, 1)); + } + } + //3.收货/上架任务(tracking_number=收货/上架单号;补"RV-"+入库单号兜底历史同号收货单) + if (!receiptOrderNumbers.isEmpty() || !shelfOrderNumbers.isEmpty()) { + Set trackingNumbers = new HashSet<>(receiptOrderNumbers); + trackingNumbers.addAll(shelfOrderNumbers); + trackingNumbers.add("RV-" + inOrderNumber); + deliveTaskService.update(new UpdateWrapper().lambda() + .set(DeliveTask::getDelFlag, 2) + .in(DeliveTask::getTrackingNumber, trackingNumbers) + .in(DeliveTask::getTaskType, 1, 2) + .eq(DeliveTask::getDelFlag, 1)); + } + //4.质检单 + qualityInspectionService.update(new UpdateWrapper().lambda() + .set(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getDelFlag, 2) + .eq(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getInOrderNumber, inOrderNumber) + .eq(com.mhd.wms.domain.qualityInspection.entity.QualityInspection::getDelFlag, 1)); + //5.收货单明细 + if (!receiptOrderNumbers.isEmpty()) { + receiptMaterialDetailService.update(new UpdateWrapper().lambda() + .set(ReceiptMaterialDetail::getDelFlag, 2) + .in(ReceiptMaterialDetail::getReceiptOrderNumber, receiptOrderNumbers) + .eq(ReceiptMaterialDetail::getDelFlag, 1)); + } + //6.收货单(软删+打已反审标记,收货单【已反审】tab 可查归档数据) + stockReceiptOrderService.update(new UpdateWrapper().lambda() + .set(StockReceiptOrder::getDelFlag, 2) + .set(StockReceiptOrder::getReverseAuditStatus, 1) + .set(StockReceiptOrder::getReverseAuditRemark, reverseRemarkForWms) + .set(StockReceiptOrder::getReverseAuditBy, reverseAuditUserId) + .set(StockReceiptOrder::getReverseAuditByName, reverseAuditUserName) + .set(StockReceiptOrder::getReverseAuditTime, reverseAuditDate) + .set(StockReceiptOrder::getUpdateBy, reverseAuditUserId) + .set(StockReceiptOrder::getUpdateByName, reverseAuditUserName) + .set(StockReceiptOrder::getUpdateTime, reverseAuditDate) + .eq(StockReceiptOrder::getInOrderNumber, inOrderNumber) + .eq(StockReceiptOrder::getDelFlag, 1)); + //7.上架单明细 + if (!shelfOrderNumbers.isEmpty()) { + shelfMaterialDetailService.update(new UpdateWrapper().lambda() + .set(ShelfMaterialDetail::getDelFlag, 2) + .in(ShelfMaterialDetail::getShelfOrderNumber, shelfOrderNumbers) + .eq(ShelfMaterialDetail::getDelFlag, 1)); + } + //8.上架单(软删+打已反审标记,上架单【已反审】tab 可查归档数据) + stockShelfOrderService.update(new UpdateWrapper().lambda() + .set(StockShelfOrder::getDelFlag, 2) + .set(StockShelfOrder::getReverseAuditStatus, 1) + .set(StockShelfOrder::getReverseAuditRemark, reverseRemarkForWms) + .set(StockShelfOrder::getReverseAuditBy, reverseAuditUserId) + .set(StockShelfOrder::getReverseAuditByName, reverseAuditUserName) + .set(StockShelfOrder::getReverseAuditTime, reverseAuditDate) + .set(StockShelfOrder::getUpdateBy, reverseAuditUserId) + .set(StockShelfOrder::getUpdateByName, reverseAuditUserName) + .set(StockShelfOrder::getUpdateTime, reverseAuditDate) + .eq(StockShelfOrder::getInOrderNumber, inOrderNumber) + .eq(StockShelfOrder::getDelFlag, 1)); + //9.收货/上架节点库存台账(trackingNumber=收货/上架单号;台账无逻辑删除标志,物理删除保持台账与回退后库存一致) + Set standingTrackingNumbers = new HashSet<>(receiptOrderNumbers); + standingTrackingNumbers.addAll(shelfOrderNumbers); + if (!standingTrackingNumbers.isEmpty()) { + inventoryStandingDetailService.remove(new LambdaQueryWrapper() + .in(InventoryStandingDetail::getTrackingNumber, standingTrackingNumbers) + .in(InventoryStandingDetail::getNodeStatus, 1, 2)); + } + //10.入库单明细 + materialDetailService.update(new UpdateWrapper().lambda() + .set(InMaterialDetail::getDelFlag, 2) + .eq(InMaterialDetail::getInOrderNumber, inOrderNumber) + .eq(InMaterialDetail::getDelFlag, 1)); + //11.入库单(软删+打已反审标记,入库单【已反审】tab 可查归档数据) + stockInOrderService.update(new UpdateWrapper().lambda() + .set(StockInOrder::getDelFlag, 2) + .set(StockInOrder::getReverseAuditStatus, 1) + .set(StockInOrder::getReverseAuditRemark, reverseRemarkForWms) + .set(StockInOrder::getReverseAuditBy, reverseAuditUserId) + .set(StockInOrder::getReverseAuditByName, reverseAuditUserName) + .set(StockInOrder::getReverseAuditTime, reverseAuditDate) + .set(StockInOrder::getUpdateBy, reverseAuditUserId) + .set(StockInOrder::getUpdateByName, reverseAuditUserName) + .set(StockInOrder::getUpdateTime, reverseAuditDate) + .eq(StockInOrder::getInOrderNumber, inOrderNumber) + .eq(StockInOrder::getDelFlag, 1)); + + // ========== 4. 写1条入库异常【反审记录】用于记录跟踪 ========== + InOrderAbnormal reverseAbnormal = new InOrderAbnormal(); + reverseAbnormal.setOrganizationId(wmsOrder.getOrganizationId()); + reverseAbnormal.setOrganizationName(wmsOrder.getOrganizationName()); + reverseAbnormal.setTopOrganizationId(wmsOrder.getTopOrganizationId()); + reverseAbnormal.setInOrderNumber(inOrderNumber); + reverseAbnormal.setAbnormalReason(StringUtils.isEmpty(reverseReason) ? "入库业务单反审" : "入库业务单反审:" + reverseReason); + reverseAbnormal.setQuantity(inventoryTotal); + reverseAbnormal.setRemark("入库业务单反审:回退库存" + inventoryTotal.stripTrailingZeros().toPlainString() + + ",清理收货/上架链路数据"); + reverseAbnormal.setCreateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy()); + reverseAbnormal.setCreateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName); + inOrderAbnormalService.genReverseAuditAbnormal(reverseAbnormal); + } + /** * OMS下发入库单明细保存后自动审核通过(生成收货单并更新审核状态) */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java index 9450425eb..256aadd92 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java @@ -164,5 +164,22 @@ public class StockReceiptOrder extends BaseVOEntity { @Excel(name = "业务单号") private String batchNo; + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/po/StockReceiptOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/po/StockReceiptOrderPO.java index c3a4730b7..c17b0b614 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/po/StockReceiptOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/po/StockReceiptOrderPO.java @@ -194,4 +194,21 @@ public class StockReceiptOrderPO extends StockInOrderBasePO { @ApiModelProperty("批次号") @Excel(name = "批次号") private String batchNo; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/todo/StockReceiptOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/todo/StockReceiptOrderDO.java index ed83f5dcf..ba1773edd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/todo/StockReceiptOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/repository/todo/StockReceiptOrderDO.java @@ -203,4 +203,21 @@ public class StockReceiptOrderDO extends StockInOrderBaseDO { @ApiModelProperty("是否需要报关") @Excel(name = "是否需要报关") private Integer needCustomsDeclaration; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/entity/StockShelfOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/entity/StockShelfOrder.java index db1fd2b5f..439af484c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/entity/StockShelfOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/entity/StockShelfOrder.java @@ -118,4 +118,21 @@ public class StockShelfOrder extends BaseVOEntity { @Excel(name = "批次号") private String batchNo; + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/po/StockShelfOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/po/StockShelfOrderPO.java index 4598df5fc..008a1d073 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/po/StockShelfOrderPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/po/StockShelfOrderPO.java @@ -153,4 +153,21 @@ public class StockShelfOrderPO extends StockInOrderBasePO { @DateTimeFormat(pattern = "yyyy-MM-dd") @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") private Date completionTime; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/todo/StockShelfOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/todo/StockShelfOrderDO.java index b4a947b3e..23c283f17 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/todo/StockShelfOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/repository/todo/StockShelfOrderDO.java @@ -173,4 +173,21 @@ public class StockShelfOrderDO extends StockInOrderBaseDO { @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTimeTo; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; + + @ApiModelProperty("反审原因") + private String reverseAuditRemark; + + @ApiModelProperty("反审人id") + private Long reverseAuditBy; + + @ApiModelProperty("反审人姓名") + private String reverseAuditByName; + + @ApiModelProperty("反审时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date reverseAuditTime; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java index c1588f31d..cfd15b170 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java @@ -468,4 +468,7 @@ public class StockInOrderDTO extends StockInOrderBaseDTO { */ @ApiModelProperty("作业任务人员(模糊查询)") private String workUserNameLike; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockReceiptOrder/StockReceiptOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockReceiptOrder/StockReceiptOrderDTO.java index 03e53fd5d..c2861c763 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockReceiptOrder/StockReceiptOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockReceiptOrder/StockReceiptOrderDTO.java @@ -171,4 +171,7 @@ public class StockReceiptOrderDTO extends StockInOrderBaseDTO { @ApiModelProperty("业务单号") @Excel(name = "业务单号") private String batchNo; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockShelfOrder/StockShelfOrderDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockShelfOrder/StockShelfOrderDTO.java index 9f2cc0c2d..8e4009454 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockShelfOrder/StockShelfOrderDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockShelfOrder/StockShelfOrderDTO.java @@ -162,4 +162,7 @@ public class StockShelfOrderDTO extends StockInOrderBaseDTO { @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTimeTo; + + @ApiModelProperty("反审状态: 0-无 1-已反审(已反审tab过滤)") + private Integer reverseAuditStatus; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java index 860c279dd..7ff3edcb7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockInOrder/StockInOrderApi.java @@ -147,6 +147,16 @@ public class StockInOrderApi extends BaseController { return AjaxResult.success(stockInOrderApplicationService.getInfo(inOrderId)); } + /** + * 查询入库单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细/收货单/上架单) + */ + @ApiOperation("查询入库单已反审归档详情") + @GetMapping(value = "/getReverseAuditInfo/{inOrderId}") + public AjaxResult getReverseAuditInfo(@PathVariable("inOrderId") Long inOrderId) + { + return AjaxResult.success(stockInOrderApplicationService.getReverseAuditInfo(inOrderId)); + } + /** * 导入入库单 */ @@ -329,6 +339,17 @@ public class StockInOrderApi extends BaseController { return AjaxResult.success(); } + /** + * oms入库业务单反审:WMS侧回退已完成单据(出库拦截 -> 回退库存 -> + * 逻辑删除收货/上架链路 -> 写入库异常【反审记录】),已产生出库则报错拦截 + */ + @ApiOperation("oms入库单反审WMS回退") + @PostMapping(value = "/omsReverseInOrder") + public AjaxResult omsReverseInOrder(@RequestBody StockInOrder stockInOrder) { + stockInOrderApplicationService.omsReverseInOrder(stockInOrder); + return AjaxResult.success(); + } + @ApiOperation("查询入库信息(通过入库单号)") @PostMapping("/queryInStockInfo") public AjaxResult queryInStockInfo(@RequestBody StockInOrderDTO stockInOrderDTO) { diff --git a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml index 5ff496b02..888ac6bb3 100644 --- a/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockInOrder/StockInOrderMapper.xml @@ -110,6 +110,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -144,7 +149,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.CUSTOMS_BROKER_INFO, a.DELIVERY_ADDRESS, a.ENTRY_EXIT_CUSTOMS, a.ORIGIN_DESTINATION_COUNTRY, a.CARRIER, a.CONTAINER_NO, a.TRANSPORT_METHOD, a.SUPERVISION_METHOD, a.CUSTOMS_INSPECTION, a.NEED_CUSTOMS_DECLARATION, a.NEED_TRANSPORT, a.WAREHOUSE_DATE, a.COMPLETION_TIME, a.ORDER_DATE,a.stock_in_order,a.business_order_no,a.WORK_USER_ID,a.WORK_TASK_RECEIVE_STATUS,a.TASK_ISSUE_USER_ID,a.WORK_USER_NAME, - a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.EVIDENCE_PICS, a.SIGNATURE_REMARK + a.SIGNATURE_STATUS, a.SIGNATURE_TIME, a.SIGNATURE_PIC, a.EVIDENCE_PICS, a.SIGNATURE_REMARK, + a.REVERSE_AUDIT_STATUS, a.REVERSE_AUDIT_REMARK, a.REVERSE_AUDIT_BY, a.REVERSE_AUDIT_BY_NAME, a.REVERSE_AUDIT_TIME @@ -483,9 +489,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) + + + and a.REVERSE_AUDIT_STATUS = #{reverseAuditStatus} + - and a.del_flag = #{delFlag} - and a.del_flag = 1 + + and a.del_flag = 2 + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + +
diff --git a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml index 9509d5da5..3987b65d0 100644 --- a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml @@ -45,6 +45,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -54,7 +59,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.status, a.platform_id, a.platform_code, a.platform_name, a.platform_use_time_id, a.platform_use_start_time, a.platform_use_end_time, a.platform_use_status, a.quantity, a.receipt_quantity, a.receipt_material_quantity, a.material_quantity, a.abnormal, a.task_distribution, a.task_distribution_time, a.operators_by, a.operators_name, a.remark, a.create_time, a.create_by, a.create_by_name, - a.update_time, a.update_by, a.update_by_name, a.del_flag, a.billing_json,a.business_order_no,a.batch_no + a.update_time, a.update_by, a.update_by_name, a.del_flag, a.billing_json,a.business_order_no,a.batch_no, + a.REVERSE_AUDIT_STATUS, a.REVERSE_AUDIT_REMARK, a.REVERSE_AUDIT_BY, a.REVERSE_AUDIT_BY_NAME, a.REVERSE_AUDIT_TIME @@ -140,9 +146,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and date_format(a.create_time,'%Y-%m-%d') <= #{createTimeEnd} + - and a.del_flag = #{delFlag} - and a.del_flag = 1 + + and a.REVERSE_AUDIT_STATUS = #{reverseAuditStatus} + and a.del_flag = 2 + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + diff --git a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml index c28664856..00f904ba3 100644 --- a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml @@ -31,6 +31,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -40,6 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.shelves_material_quantity, a.abnormal,a.task_distribution, a.task_distribution_time, a.operators_by, a.remark, a.create_time, a.create_by, a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag ,a.push_status,a.push_time,a.push_by,a.push_by_name, + a.REVERSE_AUDIT_STATUS, a.REVERSE_AUDIT_REMARK, a.REVERSE_AUDIT_BY, a.REVERSE_AUDIT_BY_NAME, a.REVERSE_AUDIT_TIME, (SELECT m.goods_type FROM shelf_material_detail d JOIN material_base_info m ON d.material_base_info_id = m.material_base_info_id WHERE d.shelf_order_number = a.shelf_order_number AND d.level = 1 @@ -125,9 +131,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.PUSH_STATUS = #{pushStatus} + - and a.del_flag = #{delFlag} - and a.del_flag = 1 + + and a.REVERSE_AUDIT_STATUS = #{reverseAuditStatus} + and a.del_flag = 2 + + + + and a.del_flag = #{delFlag} + and a.del_flag = 1 + + diff --git a/sql/20260908_oms_inbound_reverse_audit.sql b/sql/20260908_oms_inbound_reverse_audit.sql new file mode 100644 index 000000000..27d04a73e --- /dev/null +++ b/sql/20260908_oms_inbound_reverse_audit.sql @@ -0,0 +1,93 @@ +-- ============================================================================= +-- OMS 入库业务单「反审」功能 —— 反审标记字段(业务单/执行单/WMS三单) +-- 日期: 2026-09-08 版本: v3 +-- 数据库: 达梦(DM8), 兼容 Oracle 语法, 表名/字段名统一大写 +-- 模式: NGWL_TEST_OMS (mhd_oms) / NGWL_TEST_WMS (mhd_wms) +-- 需求: +-- 入库单「反审」: 已入库/已出库的单子客户通知需要回退的场景, 单子回退到最原始状态。 +-- 反审入口在 OMS-入库业务单页面, 点击【反審單據】后: +-- 1. 入库业务单状态改为"已驳回"(issueStatus=3) + 已反审标记, 落【已反审】tab, +-- 可编辑→重新审核→重新下发 +-- 2. 入库执行单 改为"已反审"(状态回退已创建+已反审标记), 物料明细保留 +-- 3. W入库单/W收货单/W上架单 状态回退到"已创建"+已反审标记, +-- 数据划归到各自页面【已反审】tab页签, 可继续点击「编辑」or「审核」or「撤销」 +-- 4. W库存还原扣减(按入库单号定位库存行整行扣回) +-- 5. 生成1条W入库异常【反审记录】(in_order_abnormal type=3)用于记录跟踪 +-- 拦截: W入库单有出库记录就不能反审——按入库单号+动作("分配库存"/"出库") +-- 查询库存调整记录(inventory_adjustment_record)>0 即有出库; +-- 已推送关务(pushStatus=3)拦截。 +-- ============================================================================= + +-- 执行前检查(确认列不存在, 避免重复执行报错; DM 数据字典标识符按大写存储) +-- SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS +-- WHERE COLUMN_NAME = 'REVERSE_AUDIT_STATUS' +-- AND TABLE_NAME IN ('RESERVATION_STOCK_IN_ORDER','EXECUTION_STOCK_IN_ORDER', +-- 'STOCK_IN_ORDER','STOCK_RECEIPT_ORDER','STOCK_SHELF_ORDER'); + +-- ============ 一、OMS 业务单 RESERVATION_STOCK_IN_ORDER ============ +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_STATUS NUMBER(1) DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER".REVERSE_AUDIT_STATUS IS '反审状态: 0-无 1-已反审'; +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_REMARK VARCHAR2(500); +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER".REVERSE_AUDIT_REMARK IS '反审原因'; +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY NUMBER(20); +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER".REVERSE_AUDIT_BY IS '反审人id'; +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY_NAME VARCHAR2(64); +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER".REVERSE_AUDIT_BY_NAME IS '反审人姓名'; +ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_TIME DATE; +COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_STOCK_IN_ORDER".REVERSE_AUDIT_TIME IS '反审时间'; + +-- ============ 二、OMS 执行单 EXECUTION_STOCK_IN_ORDER ============ +ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_STATUS NUMBER(1) DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER".REVERSE_AUDIT_STATUS IS '反审状态: 0-无 1-已反审'; +ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_REMARK VARCHAR2(500); +COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER".REVERSE_AUDIT_REMARK IS '反审原因'; +ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY NUMBER(20); +COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER".REVERSE_AUDIT_BY IS '反审人id'; +ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY_NAME VARCHAR2(64); +COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER".REVERSE_AUDIT_BY_NAME IS '反审人姓名'; +ALTER TABLE "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_TIME DATE; +COMMENT ON COLUMN "NGWL_TEST_OMS"."EXECUTION_STOCK_IN_ORDER".REVERSE_AUDIT_TIME IS '反审时间'; + +-- ============ 三、WMS 入库单 STOCK_IN_ORDER ============ +ALTER TABLE "NGWL_TEST_WMS"."STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_STATUS NUMBER(1) DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_IN_ORDER".REVERSE_AUDIT_STATUS IS '反审状态: 0-无 1-已反审(已反审tab过滤)'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_REMARK VARCHAR2(500); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_IN_ORDER".REVERSE_AUDIT_REMARK IS '反审原因'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY NUMBER(20); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_IN_ORDER".REVERSE_AUDIT_BY IS '反审人id'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_BY_NAME VARCHAR2(64); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_IN_ORDER".REVERSE_AUDIT_BY_NAME IS '反审人姓名'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_IN_ORDER" ADD COLUMN REVERSE_AUDIT_TIME DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_IN_ORDER".REVERSE_AUDIT_TIME IS '反审时间'; + +-- ============ 四、WMS 收货单 STOCK_RECEIPT_ORDER ============ +ALTER TABLE "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER" ADD COLUMN REVERSE_AUDIT_STATUS NUMBER(1) DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER".REVERSE_AUDIT_STATUS IS '反审状态: 0-无 1-已反审(已反审tab过滤)'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER" ADD COLUMN REVERSE_AUDIT_REMARK VARCHAR2(500); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER".REVERSE_AUDIT_REMARK IS '反审原因'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER" ADD COLUMN REVERSE_AUDIT_BY NUMBER(20); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER".REVERSE_AUDIT_BY IS '反审人id'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER" ADD COLUMN REVERSE_AUDIT_BY_NAME VARCHAR2(64); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER".REVERSE_AUDIT_BY_NAME IS '反审人姓名'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER" ADD COLUMN REVERSE_AUDIT_TIME DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_RECEIPT_ORDER".REVERSE_AUDIT_TIME IS '反审时间'; + +-- ============ 五、WMS 上架单 STOCK_SHELF_ORDER ============ +ALTER TABLE "NGWL_TEST_WMS"."STOCK_SHELF_ORDER" ADD COLUMN REVERSE_AUDIT_STATUS NUMBER(1) DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_SHELF_ORDER".REVERSE_AUDIT_STATUS IS '反审状态: 0-无 1-已反审(已反审tab过滤)'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_SHELF_ORDER" ADD COLUMN REVERSE_AUDIT_REMARK VARCHAR2(500); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_SHELF_ORDER".REVERSE_AUDIT_REMARK IS '反审原因'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_SHELF_ORDER" ADD COLUMN REVERSE_AUDIT_BY NUMBER(20); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_SHELF_ORDER".REVERSE_AUDIT_BY IS '反审人id'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_SHELF_ORDER" ADD COLUMN REVERSE_AUDIT_BY_NAME VARCHAR2(64); +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_SHELF_ORDER".REVERSE_AUDIT_BY_NAME IS '反审人姓名'; +ALTER TABLE "NGWL_TEST_WMS"."STOCK_SHELF_ORDER" ADD COLUMN REVERSE_AUDIT_TIME DATE; +COMMENT ON COLUMN "NGWL_TEST_WMS"."STOCK_SHELF_ORDER".REVERSE_AUDIT_TIME IS '反审时间'; + +-- 存量数据无需回填: 历史单据 REVERSE_AUDIT_STATUS 默认 0(无), 只影响新反审操作。 + +-- ============================================================================= +-- 回滚(发布前执行了需回退时, 按表名对应 DROP 上述列即可) +-- 发布顺序: 先执行本 DDL 再发布服务(实体带新字段而表无列, MyBatis-Plus 查询/更新会报错); +-- mhd_wms 与 mhd_oms 同时发布。 +-- ============================================================================= From e58b6cb9ce66542bbc57b10067d4ac82614a84e1 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 9 Sep 2026 15:49:09 +0800 Subject: [PATCH 07/27] =?UTF-8?q?feat(oms/wms):=20=E5=87=BA=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E6=98=8E=E7=BB=86=E6=9F=A5=E8=AF=A2-=E5=B7=B2?= =?UTF-8?q?=E5=85=A5=E5=BA=93/=E5=B7=B2=E5=87=BA=E5=BA=93=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E8=BF=87=E6=BB=A4=E3=80=81WMS=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E6=98=8E=E7=BB=86=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8F=8A=E4=B8=93=E7=94=A8=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一、OMS 入库/出库明细查询(修复+导出) - 出库明细SQL状态过滤由=9改为in(9,12,13):已出库/已复核/已交接均算已出库,与出库排名统计口径一致 - 入库明细SQL固定只统计已入库(status=5)单据 - 入/出库明细SQL新增实际入仓/出仓日期区间过滤(IFNULL(实际日期,建档时间)兜底),支持统计当天 - 新增Excel导出接口 /executionInMaterialDetailApi/exportWithOrder、/executionOutMaterialDetailApi/exportWithOrder(全量不分页) - 退货回仓统计:通过入库单类型 inOrderTypeCode=tui_huo_ru_ku(退货入库)过滤 二、WMS 新增入库/出库明细查询页面 - 入库明细查询:GET /materialDetailApi/listWithOrder(明细关联入库单,固定已入库(5),level=1防父子行重复计数) - 出库明细查询:GET /outMaterialDetailApi/listWithOrder(新建OutMaterialDetailApi,关联出库单,固定in(9,12,13)) - 返回单头字段:单据状态/审核状态/货主/供应商/客户/单据类型/实际入仓出仓日期/保额/货物类型等 - 入库客户编号/名称/客户预约名称经通知单号关联notice_order取得(入库单表无客户字段) 三、WMS 明细导出专用列集 - 出库导出/exportWithOrder:按客户要求30列导出,含出库单号/出库日期/客户信息/LOT号/费用组(单价、总价、折扣、仓租、合同收费)等 - 入库导出/exportWithOrder:按客户要求30列导出,含客户信息/入库日期/每件保额/收费标准/有效期等 - 单据状态、货物种类导出时自动转文字;导出列顺序与客户清单一致 - 火险保费、入库单件净重(KG)暂无数据来源,导出空列占位,待确认数据来源后补充 四、其他 - 查询条件不传日期时默认查全部日期,统计当天由前端传当天日期区间实现 - 数据权限:非平台超管按登录人一级组织过滤 --- .../ExecutionInMaterialDetailWithOrderPO.java | 8 + .../ExecutionInMaterialDetailQueryDTO.java | 6 + .../todo/QueryOrderOverStockDO.java | 6 + ...ExecutionOutMaterialDetailWithOrderPO.java | 9 + .../ExecutionOutMaterialDetailQueryDTO.java | 6 + .../todo/QueryOrderOverStockDO.java | 6 + .../ExecutionInMaterialDetailApi.java | 23 ++ .../ExecutionOutMaterialDetailApi.java | 22 ++ .../executionInMaterialDetailMapper.xml | 12 +- .../ExecutionOutMaterialDetailMapper.xml | 12 +- .../InMaterialDetailApplicationService.java | 38 ++++ .../OutMaterialDetailApplicationService.java | 54 +++++ .../facade/IInMaterialDetailService.java | 12 ++ .../mapper/InMaterialDetailMapper.java | 12 ++ .../persistence/InMaterialDetailImpl.java | 18 ++ .../po/InMaterialDetailExportPO.java | 109 ++++++++++ .../po/InMaterialDetailWithOrderPO.java | 41 ++++ .../InMaterialDetailDomainService.java | 17 ++ .../facade/IOutMaterialDetailService.java | 12 ++ .../mapper/OutMaterialDetailMapper.java | 12 ++ .../persistence/OutMaterialDetailImpl.java | 18 ++ .../po/OutMaterialDetailExportPO.java | 108 ++++++++++ .../po/OutMaterialDetailWithOrderPO.java | 55 +++++ .../OutMaterialDetailDomainService.java | 17 ++ .../todo/QueryOrderOverStockDO.java | 12 ++ .../InMaterialDetailAssembler.java | 12 ++ .../OutMaterialDetailAssembler.java | 39 ++++ .../InMaterialDetailQueryDTO.java | 58 +++++ .../OutMaterialDetailQueryDTO.java | 58 +++++ .../inMaterialDetail/InMaterialDetailApi.java | 41 ++++ .../OutMaterialDetailApi.java | 69 ++++++ .../OutMaterialDetailMapper.xml | 201 ++++++++++++++++++ .../InMaterialDetailMapper.xml | 197 +++++++++++++++++ 33 files changed, 1314 insertions(+), 6 deletions(-) create mode 100644 mhd_wms/src/main/java/com/mhd/wms/application/service/outMaterialDetail/OutMaterialDetailApplicationService.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailExportPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailWithOrderPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailWithOrderPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outMaterialDetail/OutMaterialDetailAssembler.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inMaterialDetail/InMaterialDetailQueryDTO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outMaterialDetail/OutMaterialDetailApi.java diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailWithOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailWithOrderPO.java index 3bb849e16..8b1e53786 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailWithOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/po/ExecutionInMaterialDetailWithOrderPO.java @@ -1,5 +1,7 @@ package com.mhd.oms.domain.executionInMaterialDetail.repository.po; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,20 +18,26 @@ public class ExecutionInMaterialDetailWithOrderPO extends ExecutionInMaterialDet private static final long serialVersionUID = 1L; @ApiModelProperty("入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") + @Excel(name = "入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") private Integer inOrderStatus; @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") private Integer inOrderAuditStatus; @ApiModelProperty("货主ID") private Long orderShipperId; @ApiModelProperty("货主编码") + @Excel(name = "货主编码") private String orderShipperCode; @ApiModelProperty("货主名称") + @Excel(name = "货主名称") private String orderShipperName; @ApiModelProperty("入库日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") private Date warehouseDate; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailQueryDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailQueryDTO.java index b48723a4f..bc082e42f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailQueryDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/ExecutionInMaterialDetailQueryDTO.java @@ -66,4 +66,10 @@ public class ExecutionInMaterialDetailQueryDTO extends BaseVOEntity { @ApiModelProperty("物料名称") private String materialName; + + @ApiModelProperty("实际入仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateStart; + + @ApiModelProperty("实际入仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateEnd; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java index df2f48055..4c6cedc24 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/repository/todo/QueryOrderOverStockDO.java @@ -137,4 +137,10 @@ public class QueryOrderOverStockDO extends BaseVOEntity { @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") private Integer overStockStatus; + + @ApiModelProperty("实际入仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateStart; + + @ApiModelProperty("实际入仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateEnd; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailWithOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailWithOrderPO.java index 8534f26b5..cf87264db 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailWithOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/po/ExecutionOutMaterialDetailWithOrderPO.java @@ -1,6 +1,7 @@ package com.mhd.oms.domain.executionOutMaterialDetail.repository.po; import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -19,33 +20,41 @@ public class ExecutionOutMaterialDetailWithOrderPO extends ExecutionOutMaterialD private static final long serialVersionUID = 1L; @ApiModelProperty("出库单状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") + @Excel(name = "出库单状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") private Integer outOrderStatus; @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") private Integer outOrderAuditStatus; @ApiModelProperty("货主ID") private Long orderShipperId; @ApiModelProperty("货主编码") + @Excel(name = "货主编码") private String orderShipperCode; @ApiModelProperty("货主名称") + @Excel(name = "货主名称") private String orderShipperName; @ApiModelProperty("出仓日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") private Date orderOutboundDate; @ApiModelProperty("出库时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "出库时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date orderOutboundTime; @ApiModelProperty("保额") + @Excel(name = "保额") private BigDecimal insureAmount; @ApiModelProperty("货物类型:0-物料 1-半成品 2-成品") + @Excel(name = "货物类型: 0-物料 1-半成品 2-成品") private Integer goodsType; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java index e21050c93..8d51f6774 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java @@ -66,4 +66,10 @@ public class ExecutionOutMaterialDetailQueryDTO extends BaseVOEntity { @ApiModelProperty("物料名称") private String materialName; + + @ApiModelProperty("实际出仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateStart; + + @ApiModelProperty("实际出仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateEnd; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java index 3310cedd1..332e32915 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java @@ -137,4 +137,10 @@ public class QueryOrderOverStockDO extends BaseVOEntity { @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") private Integer overStockStatus; + + @ApiModelProperty("实际出仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateStart; + + @ApiModelProperty("实际出仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateEnd; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java index 56546052e..b466834d4 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java @@ -3,6 +3,7 @@ package com.mhd.oms.interfaces.facade.executionInMaterialDetail; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailPO; import com.mhd.oms.domain.executionInMaterialDetail.repository.po.ExecutionInMaterialDetailWithOrderPO; import com.mhd.oms.domain.executionInMaterialDetail.repository.todo.ExecutionInMaterialDetailDO; @@ -16,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; import java.util.List; /** @@ -96,4 +99,24 @@ public class ExecutionInMaterialDetailApi extends BaseController { return getDataTable(list); } + /** + * 导出入库明细查询Excel(关联入库执行单,全量不分页; + * SQL固定只统计已入库(5)单据,可按单据类型(如退货入库tui_huo_ru_ku)与实际入仓日期区间过滤) + */ + @ApiOperation("导出入库明细查询Excel") + @GetMapping("/exportWithOrder") + public void exportWithOrder(HttpServletResponse response, ExecutionInMaterialDetailQueryDTO queryDTO) throws Exception + { + //转换实体(不分页,导出全量) + QueryOrderOverStockDO queryDO = inMaterialDetailAssembler.toQueryDO(queryDTO); + List list = inMaterialDetailApplicationService.queryInOrderDetailList(queryDO); + + String fileName = URLEncoder.encode("入库明细查询", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelUtil util = new ExcelUtil<>(ExecutionInMaterialDetailWithOrderPO.class); + util.exportExcel(response, list, "入库明细查询"); + } + } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionOutMaterialDetail/ExecutionOutMaterialDetailApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionOutMaterialDetail/ExecutionOutMaterialDetailApi.java index dc8e1a808..7ffdd719f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionOutMaterialDetail/ExecutionOutMaterialDetailApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionOutMaterialDetail/ExecutionOutMaterialDetailApi.java @@ -2,6 +2,7 @@ package com.mhd.oms.interfaces.facade.executionOutMaterialDetail; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.oms.domain.executionOutMaterialDetail.repository.po.ExecutionOutMaterialDetailWithOrderPO; import com.mhd.oms.domain.executionOutMaterialDetail.repository.todo.ExecutionOutMaterialDetailQueryDTO; import com.mhd.oms.domain.executionOutMaterialDetail.service.ExecutionOutMaterialDetailApplicationService; @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; import java.util.List; /** @@ -41,4 +44,23 @@ public class ExecutionOutMaterialDetailApi extends BaseController { List list = outMaterialDetailApplicationService.queryOutOrderDetailList(queryDO); return getDataTable(list); } + + /** + * 导出出库明细查询Excel(关联出库执行单,全量不分页; + * SQL固定只统计已出库(9/12/13)单据,可按单据类型与实际出仓日期区间过滤) + */ + @ApiOperation("导出出库明细查询Excel") + @GetMapping("/exportWithOrder") + public void exportWithOrder(HttpServletResponse response, ExecutionOutMaterialDetailQueryDTO queryDTO) throws Exception { + //转换实体(不分页,导出全量) + QueryOrderOverStockDO queryDO = outMaterialDetailAssembler.toQueryDO(queryDTO); + List list = outMaterialDetailApplicationService.queryOutOrderDetailList(queryDO); + + String fileName = URLEncoder.encode("出库明细查询", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelUtil util = new ExcelUtil<>(ExecutionOutMaterialDetailWithOrderPO.class); + util.exportExcel(response, list, "出库明细查询"); + } } diff --git a/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml index 66dc5a801..0c295a199 100644 --- a/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml @@ -450,15 +450,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{inOrderTypeCode} - - and b.status = #{inStatus} - + + and b.status = 5 and b.expect_time >= #{inOrderExpectStartTime} and b.expect_time <= #{inOrderExpectEndTime} + + + and date_format(IFNULL(b.warehouse_date, b.create_time), '%Y-%m-%d') >= #{warehouseDateStart} + + + and date_format(IFNULL(b.warehouse_date, b.create_time), '%Y-%m-%d') <= #{warehouseDateEnd} + and a.del_flag = 1 and b.del_flag = 1 diff --git a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml index 6f7068f7a..c4674e9bd 100644 --- a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml @@ -543,15 +543,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{outOrderTypeCode} - - and b.status = #{outStatus} - + + and b.status in (9, 12, 13) and b.expect_time >= #{outOrderExpectStartTime} and b.expect_time <= #{outOrderExpectEndTime} + + + and date_format(IFNULL(b.OUTBOUND_DATE, b.create_time), '%Y-%m-%d') >= #{outboundDateStart} + + + and date_format(IFNULL(b.OUTBOUND_DATE, b.create_time), '%Y-%m-%d') <= #{outboundDateEnd} + and a.del_flag = 1 and b.del_flag = 1 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java index 4d399367f..ffcb7be66 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java @@ -2,9 +2,12 @@ package com.mhd.wms.application.service.inMaterialDetail; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.inMaterialDetail.service.InMaterialDetailDomainService; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,6 +42,41 @@ public class InMaterialDetailApplicationService { return inMaterialDetailDomainService.queryList(inMaterialDetailDO); } + /** + * 入库明细查询(关联入库单,只统计已入库(5)单据) + */ + public List queryInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null){ + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1){ + queryOrderOverStockDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } + } + return inMaterialDetailDomainService.queryInOrderDetailList(queryOrderOverStockDO); + } + + /** + * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) + */ + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return inMaterialDetailDomainService.exportInOrderDetailList(setDataPermission(queryOrderOverStockDO)); + } + + /** + * 数据权限:非平台超管(1)按登录人一级组织过滤 + */ + private QueryOrderOverStockDO setDataPermission(QueryOrderOverStockDO queryOrderOverStockDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null){ + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1){ + queryOrderOverStockDO.setTopOrganizationId(topOrganizationId); + } + } + return queryOrderOverStockDO; + } + /** * 新增物料明细 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/outMaterialDetail/OutMaterialDetailApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/outMaterialDetail/OutMaterialDetailApplicationService.java new file mode 100644 index 000000000..6ac385f51 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/outMaterialDetail/OutMaterialDetailApplicationService.java @@ -0,0 +1,54 @@ +package com.mhd.wms.application.service.outMaterialDetail; + +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; +import com.mhd.wms.domain.outMaterialDetail.service.OutMaterialDetailDomainService; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库物料明细ApplicationService + * + * @author rcx + * @date 2026-09-09 + */ +@Service +@Slf4j +public class OutMaterialDetailApplicationService { + @Autowired + private OutMaterialDetailDomainService outMaterialDetailDomainService; + + /** + * 出库明细查询(关联出库单,只统计已出库(9/12/13)单据) + */ + public List queryOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailDomainService.queryOutOrderDetailList(setDataPermission(queryOrderOverStockDO)); + } + + /** + * 出库明细导出(专用列集,口径同 queryOutOrderDetailList,不分页) + */ + public List exportOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailDomainService.exportOutOrderDetailList(setDataPermission(queryOrderOverStockDO)); + } + + /** + * 数据权限:非平台超管(1)按登录人一级组织过滤 + */ + private QueryOrderOverStockDO setDataPermission(QueryOrderOverStockDO queryOrderOverStockDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null){ + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1){ + queryOrderOverStockDO.setTopOrganizationId(topOrganizationId); + } + } + return queryOrderOverStockDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java index 6e1e83472..947d987d2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/facade/IInMaterialDetailService.java @@ -2,7 +2,9 @@ package com.mhd.wms.domain.inMaterialDetail.repository.facade; import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; @@ -27,6 +29,16 @@ public interface IInMaterialDetailService extends IService public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + /** + * 入库明细查询(关联入库单,只统计已入库(5)单据) + */ + public List queryInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + + /** + * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) + */ + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + /** * 分页查询物料明细列表 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java index 92a00e1a1..4600f5004 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/mapper/InMaterialDetailMapper.java @@ -2,7 +2,9 @@ package com.mhd.wms.domain.inMaterialDetail.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; @@ -28,6 +30,16 @@ public interface InMaterialDetailMapper extends BaseMapper */ public List queryInOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + /** + * 入库明细查询(关联入库单,只统计已入库(5)单据) + */ + public List queryInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + + /** + * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) + */ + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + /** * 入库列表页:按入库单号批量取去重后的 Invoice No(仅 level=1) */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java index 761c3d6b4..7809a2a6b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/persistence/InMaterialDetailImpl.java @@ -13,7 +13,9 @@ import com.mhd.system.api.model.LoginUser; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService; import com.mhd.wms.domain.inMaterialDetail.repository.mapper.InMaterialDetailMapper; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InStockListMaterialAgg; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailBaseDO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; @@ -72,6 +74,22 @@ public class InMaterialDetailImpl extends ServiceImpl queryInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return inMaterialDetailMapper.queryInOrderDetailList(queryOrderOverStockDO); + } + + /** + * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) + */ + @Override + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return inMaterialDetailMapper.exportInOrderDetailList(queryOrderOverStockDO); + } + /** * 查询物料明细列表 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailExportPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailExportPO.java new file mode 100644 index 000000000..a9a81a591 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailExportPO.java @@ -0,0 +1,109 @@ +package com.mhd.wms.domain.inMaterialDetail.repository.po; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 入库明细导出专用PO(仅含客户要求的导出列,列顺序即导出顺序; + * 火险保费 WMS 库暂无数据来源,先占位导出空列; + * 单件净重(KG) 入库明细表无单件净重列,先占位导出空列) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class InMaterialDetailExportPO { + + @Excel(name = "客户编号", sort = 1) + private String customerCode; + + @Excel(name = "客户名称", sort = 2) + private String customerName; + + @Excel(name = "入库单号", sort = 3) + private String inOrderNumber; + + @Excel(name = "入库日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 4) + private Date warehouseDate; + + @Excel(name = "LOT编号", sort = 5) + private String lotNo; + + @Excel(name = "客户预约名称", sort = 6) + private String customerOrderNumber; + + @Excel(name = "物料名称", sort = 7) + private String materialName; + + @Excel(name = "物料编码", sort = 8) + private String materialCode; + + @Excel(name = "库存单位", sort = 9) + private String unitName; + + @Excel(name = "件数", sort = 10) + private BigDecimal pieceCount; + + @Excel(name = "仓库", sort = 11) + private String warehouseName; + + @Excel(name = "饮用日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 12) + private Date drinkDate; + + @Excel(name = "库位", sort = 13) + private String storageLocationName; + + @Excel(name = "单件净重(KG)", sort = 14) + private BigDecimal netWeight; + + @Excel(name = "单件体积(CBM)", sort = 15) + private BigDecimal singleVolume; + + @Excel(name = "单价", sort = 16) + private BigDecimal unitPrice; + + @Excel(name = "总价", sort = 17) + private BigDecimal totalPrice; + + @Excel(name = "折扣(%)", sort = 18) + private BigDecimal discountRate; + + @Excel(name = "每月仓租", sort = 19) + private BigDecimal monthlyWarehouseFee; + + @Excel(name = "半月仓租", sort = 20) + private BigDecimal halfMonthWhFee; + + @Excel(name = "合同收费", sort = 21) + private BigDecimal contractFee; + + @Excel(name = "火险保费", sort = 22) + private BigDecimal fireInsureFee; + + @Excel(name = "备注", sort = 23) + private String remark; + + @Excel(name = "货物种类", sort = 24, readConverterExp = "0=物料,1=半成品,2=成品") + private Integer goodsType; + + @Excel(name = "总重量", sort = 25) + private BigDecimal totalGrossWeight; + + @Excel(name = "每件保额", sort = 26) + private BigDecimal insureAmount; + + @Excel(name = "仓位/库位", sort = 27) + private String storageName; + + @Excel(name = "收费标准", sort = 28) + private BigDecimal chargeStandard; + + @Excel(name = "有效期", width = 30, dateFormat = "yyyy-MM-dd", sort = 29) + private Date expiryDate; + + @Excel(name = "单据状态", sort = 30, readConverterExp = "5=已入库") + private Integer inOrderStatus; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailWithOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailWithOrderPO.java new file mode 100644 index 000000000..d429210e5 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/repository/po/InMaterialDetailWithOrderPO.java @@ -0,0 +1,41 @@ +package com.mhd.wms.domain.inMaterialDetail.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 入库明细查询结果(关联入库单,只统计已入库单据) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class InMaterialDetailWithOrderPO extends InMaterialDetailPO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") + @Excel(name = "入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 6-已取消 7-已关闭") + private Integer inOrderStatus; + + @ApiModelProperty("入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "入库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer inOrderAuditStatus; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("保额") + @Excel(name = "保额") + private BigDecimal insureAmount; + + @ApiModelProperty("货物类型: 0-物料 1-半成品 2-成品") + @Excel(name = "货物类型: 0-物料 1-半成品 2-成品") + private Integer goodsType; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/service/InMaterialDetailDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/service/InMaterialDetailDomainService.java index c3adc2ffe..e46710cf1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/service/InMaterialDetailDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inMaterialDetail/service/InMaterialDetailDomainService.java @@ -1,8 +1,11 @@ package com.mhd.wms.domain.inMaterialDetail.service; import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,6 +33,20 @@ public class InMaterialDetailDomainService { return materialDetailService.queryList(inMaterialDetailDO); } + /** + * 入库明细查询(关联入库单,只统计已入库(5)单据) + */ + public List queryInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return materialDetailService.queryInOrderDetailList(queryOrderOverStockDO); + } + + /** + * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) + */ + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return materialDetailService.exportInOrderDetailList(queryOrderOverStockDO); + } + /** * 新增物料明细 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java index d562a6faa..3e2f6ebfd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/facade/IOutMaterialDetailService.java @@ -3,7 +3,9 @@ package com.mhd.wms.domain.outMaterialDetail.repository.facade; import com.baomidou.mybatisplus.extension.service.IService; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; @@ -32,6 +34,16 @@ public interface IOutMaterialDetailService extends IService */ public List queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + /** + * 出库明细查询(关联出库单,只统计已出库(9/12/13)单据) + */ + public List queryOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + + /** + * 出库明细导出(专用列集,口径同 queryOutOrderDetailList,不分页) + */ + public List exportOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + public List queryListChildren(OutMaterialDetailDO outMaterialDetailDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java index 2a854e320..6188f8d7c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/mapper/OutMaterialDetailMapper.java @@ -2,7 +2,9 @@ package com.mhd.wms.domain.outMaterialDetail.repository.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; @@ -28,6 +30,16 @@ public interface OutMaterialDetailMapper extends BaseMapper */ public List queryOutOrderList(QueryOrderOverStockDO queryOrderOverStockDO); + /** + * 出库明细查询(关联出库单,只统计已出库(9/12/13)单据) + */ + public List queryOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + + /** + * 出库明细导出(专用列集,口径同 queryOutOrderDetailList,不分页) + */ + public List exportOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO); + /** * @description 批量修改指定物料明细分配数量 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java index a473fa5ed..ca40439a2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/persistence/OutMaterialDetailImpl.java @@ -34,7 +34,9 @@ import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialCheckPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutStockListMaterialAgg; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailBaseDO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; @@ -107,6 +109,22 @@ public class OutMaterialDetailImpl extends ServiceImpl queryOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailMapper.queryOutOrderDetailList(queryOrderOverStockDO); + } + + /** + * 出库明细导出(专用列集,口径同 queryOutOrderDetailList,不分页) + */ + @Override + public List exportOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailMapper.exportOutOrderDetailList(queryOrderOverStockDO); + } + /** * 查询物料明细列表 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java new file mode 100644 index 000000000..a34896773 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java @@ -0,0 +1,108 @@ +package com.mhd.wms.domain.outMaterialDetail.repository.po; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出库明细导出专用PO(仅含客户要求的导出列,列顺序即导出顺序; + * 火险保费 WMS 库暂无数据来源,先占位导出空列) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class OutMaterialDetailExportPO { + + @Excel(name = "出库单号", sort = 1) + private String outOrderNumber; + + @Excel(name = "出库日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 2) + private Date outboundDate; + + @Excel(name = "创建日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 3) + private Date createTime; + + @Excel(name = "客户编号", sort = 4) + private String customerCode; + + @Excel(name = "客户名称", sort = 5) + private String customerName; + + @Excel(name = "LOT编号", sort = 6) + private String lotNo; + + @Excel(name = "客户预约名称", sort = 7) + private String customerOrderNumber; + + @Excel(name = "物料名称", sort = 8) + private String materialName; + + @Excel(name = "物料编码", sort = 9) + private String materialCode; + + @Excel(name = "库存单位", sort = 10) + private String stockUnit; + + @Excel(name = "件数", sort = 11) + private BigDecimal pieceCount; + + @Excel(name = "仓库", sort = 12) + private String warehouseName; + + @Excel(name = "饮用日期", width = 30, dateFormat = "yyyy-MM-dd", sort = 13) + private Date drinkDate; + + @Excel(name = "库位", sort = 14) + private String storageLocationName; + + @Excel(name = "单件净重(KG)", sort = 15) + private BigDecimal weightLimit; + + @Excel(name = "单件体积(CBM)", sort = 16) + private BigDecimal singleVolume; + + @Excel(name = "单价", sort = 17) + private BigDecimal unitPrice; + + @Excel(name = "总价", sort = 18) + private BigDecimal totalPrice; + + @Excel(name = "折扣(%)", sort = 19) + private BigDecimal discountRate; + + @Excel(name = "每月仓租", sort = 20) + private BigDecimal monthlyWarehouseFee; + + @Excel(name = "半月仓租", sort = 21) + private BigDecimal halfMonthWhFee; + + @Excel(name = "合同收费", sort = 22) + private BigDecimal contractFee; + + @Excel(name = "火险保费", sort = 23) + private BigDecimal fireInsureFee; + + @Excel(name = "备注", sort = 24) + private String remark; + + @Excel(name = "总重量(KG)", sort = 25) + private BigDecimal totalGrossWeight; + + @Excel(name = "仓位/库位", sort = 26) + private String storageName; + + @Excel(name = "入库单号", sort = 27) + private String inOrderNumber; + + @Excel(name = "种类", sort = 28, readConverterExp = "0=物料,1=半成品,2=成品") + private Integer goodsType; + + @Excel(name = "总价值", sort = 29) + private BigDecimal totalAmount; + + @Excel(name = "单据状态", sort = 30, readConverterExp = "9=已出库,12=已复核,13=已交接") + private Integer outOrderStatus; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailWithOrderPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailWithOrderPO.java new file mode 100644 index 000000000..794e5252d --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailWithOrderPO.java @@ -0,0 +1,55 @@ +package com.mhd.wms.domain.outMaterialDetail.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出库明细查询结果(关联出库单,只统计已出库单据) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class OutMaterialDetailWithOrderPO extends OutMaterialDetailPO { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("客户id") + @Excel(name = "客户id") + private Long customerId; + + @ApiModelProperty("客户编码") + @Excel(name = "客户编码") + private String customerCode; + + @ApiModelProperty("客户名称") + @Excel(name = "客户名称") + private String customerName; + + @ApiModelProperty("出库单状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + @Excel(name = "出库单状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭 12-已复核 13-已交接") + private Integer outOrderStatus; + + @ApiModelProperty("出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + @Excel(name = "出库单审核状态: 1-未审核 2-审核不通过 3-审核通过") + private Integer outOrderAuditStatus; + + @ApiModelProperty("出仓日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date outboundDate; + + @ApiModelProperty("保额") + @Excel(name = "保额") + private BigDecimal insureAmount; + + @ApiModelProperty("货物类型: 0-物料 1-半成品 2-成品") + @Excel(name = "货物类型: 0-物料 1-半成品 2-成品") + private Integer goodsType; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/service/OutMaterialDetailDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/service/OutMaterialDetailDomainService.java index 7ddef5c48..2e4f8b626 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/service/OutMaterialDetailDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/service/OutMaterialDetailDomainService.java @@ -1,8 +1,11 @@ package com.mhd.wms.domain.outMaterialDetail.service; import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,6 +33,20 @@ public class OutMaterialDetailDomainService { return outMaterialDetailService.queryList(outMaterialDetailDO); } + /** + * 出库明细查询(关联出库单,只统计已出库(9/12/13)单据) + */ + public List queryOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailService.queryOutOrderDetailList(queryOrderOverStockDO); + } + + /** + * 出库明细导出(专用列集,口径同 queryOutOrderDetailList,不分页) + */ + public List exportOutOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + return outMaterialDetailService.exportOutOrderDetailList(queryOrderOverStockDO); + } + /** * 新增物料明细 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/overStock/repository/todo/QueryOrderOverStockDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/overStock/repository/todo/QueryOrderOverStockDO.java index a5ffd9009..fd74d7ab8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/overStock/repository/todo/QueryOrderOverStockDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/overStock/repository/todo/QueryOrderOverStockDO.java @@ -137,4 +137,16 @@ public class QueryOrderOverStockDO extends BaseVOEntity { @ApiModelProperty("越库单状态 0:无状态 1:处理中 2:越库完成") @Excel(name = "越库单状态 0:无状态 1:处理中 2:越库完成") private Integer overStockStatus; + + @ApiModelProperty("实际入仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateStart; + + @ApiModelProperty("实际入仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateEnd; + + @ApiModelProperty("实际出仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateStart; + + @ApiModelProperty("实际出仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateEnd; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inMaterialDetail/InMaterialDetailAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inMaterialDetail/InMaterialDetailAssembler.java index 968243957..aadbb8858 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inMaterialDetail/InMaterialDetailAssembler.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inMaterialDetail/InMaterialDetailAssembler.java @@ -8,7 +8,9 @@ import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; import com.mhd.wms.interfaces.dto.inMaterialDetail.InMaterialDetailDTO; +import com.mhd.wms.interfaces.dto.inMaterialDetail.InMaterialDetailQueryDTO; import org.springframework.stereotype.Component; import java.util.Date; @@ -32,6 +34,16 @@ public class InMaterialDetailAssembler { return inMaterialDetailDO; } + /** + * 入库明细查询(关联入库单)查询参数转换 + */ + public QueryOrderOverStockDO toQueryDO(InMaterialDetailQueryDTO queryDTO) { + QueryOrderOverStockDO queryDO = new QueryOrderOverStockDO(); + // 拷贝 + BeanUtils.copyProperties(queryDTO, queryDO, IgnoreNullUtil.getNullPropertyNames(queryDTO)); + return queryDO; + } + /** * 转换实体 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outMaterialDetail/OutMaterialDetailAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outMaterialDetail/OutMaterialDetailAssembler.java new file mode 100644 index 000000000..33eabfceb --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outMaterialDetail/OutMaterialDetailAssembler.java @@ -0,0 +1,39 @@ +package com.mhd.wms.interfaces.assember.outMaterialDetail; + +import com.mhd.common.core.utils.IgnoreNullUtil; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; +import com.mhd.wms.interfaces.dto.outMaterialDetail.OutMaterialDetailDTO; +import com.mhd.wms.interfaces.dto.outMaterialDetail.OutMaterialDetailQueryDTO; +import org.springframework.stereotype.Component; + +/** + * 出库物料明细Assembler + * + * @author rcx + * @date 2026-09-09 + */ +@Component +public class OutMaterialDetailAssembler { + + /** + * 转换实体 + */ + public OutMaterialDetailDO toDO(OutMaterialDetailDTO outMaterialDetailDTO) { + OutMaterialDetailDO outMaterialDetailDO = new OutMaterialDetailDO(); + // 拷贝 + BeanUtils.copyProperties(outMaterialDetailDTO, outMaterialDetailDO, IgnoreNullUtil.getNullPropertyNames(outMaterialDetailDTO)); + return outMaterialDetailDO; + } + + /** + * 出库明细查询(关联出库单)查询参数转换 + */ + public QueryOrderOverStockDO toQueryDO(OutMaterialDetailQueryDTO queryDTO) { + QueryOrderOverStockDO queryDO = new QueryOrderOverStockDO(); + // 拷贝 + BeanUtils.copyProperties(queryDTO, queryDO, IgnoreNullUtil.getNullPropertyNames(queryDTO)); + return queryDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inMaterialDetail/InMaterialDetailQueryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inMaterialDetail/InMaterialDetailQueryDTO.java new file mode 100644 index 000000000..b32387b5e --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inMaterialDetail/InMaterialDetailQueryDTO.java @@ -0,0 +1,58 @@ +package com.mhd.wms.interfaces.dto.inMaterialDetail; + +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 入库明细查询参数 DTO(关联入库单,只统计已入库单据) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class InMaterialDetailQueryDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("组织表ID") + private Long organizationId; + + @ApiModelProperty("一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("入库单号") + private String inOrderNumber; + + @ApiModelProperty("仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + private Long shipperId; + + @ApiModelProperty("货主名称") + private String shipperName; + + @ApiModelProperty("入库单类型编码(如退货入库 tui_huo_ru_ku)") + private String inOrderTypeCode; + + @ApiModelProperty("物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("实际入仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateStart; + + @ApiModelProperty("实际入仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String warehouseDateEnd; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java new file mode 100644 index 000000000..450819254 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java @@ -0,0 +1,58 @@ +package com.mhd.wms.interfaces.dto.outMaterialDetail; + +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 出库明细查询参数 DTO(关联出库单,只统计已出库单据) + * + * @author rcx + * @date 2026-09-09 + */ +@Data +public class OutMaterialDetailQueryDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("组织表ID") + private Long organizationId; + + @ApiModelProperty("一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("出库单号") + private String outOrderNumber; + + @ApiModelProperty("仓库id") + private Long warehouseId; + + @ApiModelProperty("仓库编码") + private String warehouseCode; + + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("货主id") + private Long shipperId; + + @ApiModelProperty("货主名称") + private String shipperName; + + @ApiModelProperty("出库单类型编码") + private String outOrderTypeCode; + + @ApiModelProperty("物料基础信息id") + private Long materialBaseInfoId; + + @ApiModelProperty("物料编码") + private String materialCode; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("实际出仓日期 开始(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateStart; + + @ApiModelProperty("实际出仓日期 结束(yyyy-MM-dd,为空按建档时间兜底)") + private String outboundDateEnd; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inMaterialDetail/InMaterialDetailApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inMaterialDetail/InMaterialDetailApi.java index 0a756e040..8959bd5f1 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inMaterialDetail/InMaterialDetailApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inMaterialDetail/InMaterialDetailApi.java @@ -1,18 +1,25 @@ package com.mhd.wms.interfaces.facadeApi.inMaterialDetail; +import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; import com.mhd.wms.application.service.inMaterialDetail.InMaterialDetailApplicationService; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailExportPO; import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailPO; +import com.mhd.wms.domain.inMaterialDetail.repository.po.InMaterialDetailWithOrderPO; import com.mhd.wms.domain.inMaterialDetail.repository.todo.InMaterialDetailDO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; import com.mhd.wms.interfaces.assember.inMaterialDetail.InMaterialDetailAssembler; import com.mhd.wms.interfaces.dto.inMaterialDetail.InMaterialDetailDTO; +import com.mhd.wms.interfaces.dto.inMaterialDetail.InMaterialDetailQueryDTO; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; import java.util.List; /** @@ -43,6 +50,40 @@ public class InMaterialDetailApi extends BaseController { return getDataTable(list); } + /** + * 入库明细查询(关联入库单,只统计已入库(5)单据; + * 退货回仓按入库单类型 inOrderTypeCode=退货入库(tui_huo_ru_ku) 过滤) + */ + @ApiOperation("入库明细查询(关联入库单)") + @GetMapping("/listWithOrder") + public TableDataInfo listWithOrder(InMaterialDetailQueryDTO queryDTO) + { + //转换实体 + QueryOrderOverStockDO queryDO = inMaterialDetailAssembler.toQueryDO(queryDTO); + startPage(); + List list = inMaterialDetailApplicationService.queryInOrderDetailList(queryDO); + return getDataTable(list); + } + + /** + * 导出入库明细查询Excel(专用列集,全量不分页,只统计已入库(5)单据) + */ + @ApiOperation("导出入库明细查询Excel") + @GetMapping("/exportWithOrder") + public void exportWithOrder(HttpServletResponse response, InMaterialDetailQueryDTO queryDTO) throws Exception + { + //转换实体(不分页,导出全量) + QueryOrderOverStockDO queryDO = inMaterialDetailAssembler.toQueryDO(queryDTO); + List list = inMaterialDetailApplicationService.exportInOrderDetailList(queryDO); + + String fileName = URLEncoder.encode("入库明细查询", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelUtil util = new ExcelUtil<>(InMaterialDetailExportPO.class); + util.exportExcel(response, list, "入库明细查询"); + } + /** * 编辑物料明细 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outMaterialDetail/OutMaterialDetailApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outMaterialDetail/OutMaterialDetailApi.java new file mode 100644 index 000000000..998684da2 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outMaterialDetail/OutMaterialDetailApi.java @@ -0,0 +1,69 @@ +package com.mhd.wms.interfaces.facadeApi.outMaterialDetail; + +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.wms.application.service.outMaterialDetail.OutMaterialDetailApplicationService; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailExportPO; +import com.mhd.wms.domain.outMaterialDetail.repository.po.OutMaterialDetailWithOrderPO; +import com.mhd.wms.domain.overStock.repository.todo.QueryOrderOverStockDO; +import com.mhd.wms.interfaces.assember.outMaterialDetail.OutMaterialDetailAssembler; +import com.mhd.wms.interfaces.dto.outMaterialDetail.OutMaterialDetailQueryDTO; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.List; + +/** + * 出库物料明细Api + * + * @author rcx + * @date 2026-09-09 + */ +@RestController +@RequestMapping("/outMaterialDetailApi") +public class OutMaterialDetailApi extends BaseController { + @Autowired + private OutMaterialDetailApplicationService outMaterialDetailApplicationService; + @Resource + private OutMaterialDetailAssembler outMaterialDetailAssembler; + + /** + * 出库明细查询(关联出库单,只统计已出库(9/12/13)单据) + */ + @ApiOperation("出库明细查询(关联出库单)") + @GetMapping("/listWithOrder") + public TableDataInfo listWithOrder(OutMaterialDetailQueryDTO queryDTO) + { + //转换实体 + QueryOrderOverStockDO queryDO = outMaterialDetailAssembler.toQueryDO(queryDTO); + startPage(); + List list = outMaterialDetailApplicationService.queryOutOrderDetailList(queryDO); + return getDataTable(list); + } + + /** + * 导出出库明细查询Excel(专用列集,全量不分页,只统计已出库(9/12/13)单据) + */ + @ApiOperation("导出出库明细查询Excel") + @GetMapping("/exportWithOrder") + public void exportWithOrder(HttpServletResponse response, OutMaterialDetailQueryDTO queryDTO) throws Exception + { + //转换实体(不分页,导出全量) + QueryOrderOverStockDO queryDO = outMaterialDetailAssembler.toQueryDO(queryDTO); + List list = outMaterialDetailApplicationService.exportOutOrderDetailList(queryDO); + + String fileName = URLEncoder.encode("出库明细查询", "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + ExcelUtil util = new ExcelUtil<>(OutMaterialDetailExportPO.class); + util.exportExcel(response, list, "出库明细查询"); + } +} diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index e50a7b25d..ed4d52f07 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -373,6 +373,207 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE out_material_detail diff --git a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml index b671a31eb..9940f961f 100644 --- a/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inMaterialDetail/InMaterialDetailMapper.xml @@ -357,6 +357,203 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select - n.customer_code as customerCode, - n.customer_name as customerName, + b.shipper_code as customerCode, + b.shipper_name as customerName, a.in_order_number as inOrderNumber, b.warehouse_date as warehouseDate, a.lot_no as lotNo, From 260ec1f369354bfa8fb017b5a2dd298dc146378c Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 10 Sep 2026 14:24:43 +0800 Subject: [PATCH 14/27] =?UTF-8?q?fix(oms):=20=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=8F=8D=E5=AE=A1=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=E6=89=A7=E8=A1=8C=E5=8D=95=E5=8F=B7/?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E6=89=A7=E8=A1=8C=E6=97=B6=E9=97=B4=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=8D=E5=AE=A1=E5=90=8E=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=89=A7=E8=A1=8C=E4=BB=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=B7=B2=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...utionInMaterialDetailApplicationService.java | 17 +++++++++++++++++ .../ReservationStockInOrderDomainService.java | 2 ++ .../ReservationStockOutOrderDomainService.java | 5 ++++- .../ExecutionInMaterialDetailApi.java | 2 +- .../InMaterialDetailApplicationService.java | 12 +++++++++++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java index 5e03ad47a..35cb5afe5 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionInMaterialDetail/service/ExecutionInMaterialDetailApplicationService.java @@ -85,4 +85,21 @@ public class ExecutionInMaterialDetailApplicationService { return inMaterialDetailDomainService.queryInOrderDetailList(queryOrderOverStockDO); } + /** + * 入库明细导出(全字段,口径同 queryInOrderDetailList,不分页) + */ + public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { + List list = queryInOrderDetailList(queryOrderOverStockDO); + // 货物种类=挂载分类的父级分类名称:material_classify_name为分类路径(如"食品,饮料"),取倒数第二段; + // 仅一级分类(无父级)时取自身名称 + for (ExecutionInMaterialDetailWithOrderPO po : list) { + String names = po.getMaterialClassifyName(); + if (names != null && names.contains(",")) { + String[] parts = names.split(","); + po.setMaterialClassifyName(parts[parts.length - 2].trim()); + } + } + return list; + } + } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index 396935fef..59e73f023 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -891,6 +891,8 @@ public class ReservationStockInOrderDomainService { //业务单状态改为"已驳回"(与审核不通过同语义)+ 已反审标记落入【已反审】tab + 清空完成回写数据 return stockInOrderService.update(null, new UpdateWrapper().lambda() .set(ReservationStockInOrder::getIssueStatus, 3) + //清空下发/执行时间(前端"是否执行"列按执行时间判断,不清会仍显示已执行,与取消下发 cancelIssueOrder 同口径) + .set(ReservationStockInOrder::getIssueTime, null) .set(ReservationStockInOrder::getInQuantity, BigDecimal.ZERO) .set(ReservationStockInOrder::getStorageTime, null) .set(ReservationStockInOrder::getExecutionInOrderNumber, null) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java index 4d7f0a719..5bcdaafbd 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java @@ -753,10 +753,12 @@ public class ReservationStockOutOrderDomainService { } // 主单回退到已创建并打反审标记; 更新条件带 issueStatus in (2,4) + 排除已取消/已关闭 兜底防并发重复反审 - // issueStatus 回退到 0-已创建(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库) + // issueStatus 回退到 0-已创建(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库); + // 清空执行出库单号——执行单已随反审软删, 前端"是否执行"列由该字段有无值推导, 不清空会仍显示已执行 return stockOutOrderService.update(null, new UpdateWrapper().lambda() .set(ReservationStockOutOrder::getStatus, 1) .set(ReservationStockOutOrder::getIssueStatus, 0) + .set(ReservationStockOutOrder::getExecutionOutOrderNumber, null) .set(ReservationStockOutOrder::getIssueId, null) .set(ReservationStockOutOrder::getIssueName, null) .set(ReservationStockOutOrder::getIssueTime, null) @@ -769,6 +771,7 @@ public class ReservationStockOutOrderDomainService { .set(ReservationStockOutOrder::getCheckQuantity, BigDecimal.ZERO) .set(ReservationStockOutOrder::getCheckStatus, 1) .set(ReservationStockOutOrder::getCheckTaskDistribution, 2) + .set(ReservationStockOutOrder::getCheckTaskDistributionTime, null) .set(ReservationStockOutOrder::getCompleteTime, null) .set(ReservationStockOutOrder::getOutboundTime, null) .set(ReservationStockOutOrder::getReverseStatus, 1) diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java index b466834d4..31cf13e33 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionInMaterialDetail/ExecutionInMaterialDetailApi.java @@ -109,7 +109,7 @@ public class ExecutionInMaterialDetailApi extends BaseController { { //转换实体(不分页,导出全量) QueryOrderOverStockDO queryDO = inMaterialDetailAssembler.toQueryDO(queryDTO); - List list = inMaterialDetailApplicationService.queryInOrderDetailList(queryDO); + List list = inMaterialDetailApplicationService.exportInOrderDetailList(queryDO); String fileName = URLEncoder.encode("入库明细查询", "UTF-8").replaceAll("\\+", "%20"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java index ffcb7be66..d20308824 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/inMaterialDetail/InMaterialDetailApplicationService.java @@ -60,7 +60,17 @@ public class InMaterialDetailApplicationService { * 入库明细导出(专用列集,口径同 queryInOrderDetailList,不分页) */ public List exportInOrderDetailList(QueryOrderOverStockDO queryOrderOverStockDO) { - return inMaterialDetailDomainService.exportInOrderDetailList(setDataPermission(queryOrderOverStockDO)); + List list = inMaterialDetailDomainService.exportInOrderDetailList(setDataPermission(queryOrderOverStockDO)); + // 货物种类=挂载分类的父级分类名称:material_classify_name为分类路径(如"食品,饮料"),取倒数第二段; + // 仅一级分类(无父级)时取自身名称 + for (InMaterialDetailExportPO po : list) { + String names = po.getMaterialClassifyName(); + if (names != null && names.contains(",")) { + String[] parts = names.split(","); + po.setMaterialClassifyName(parts[parts.length - 2].trim()); + } + } + return list; } /** From 0b45ad181f0a413dd8482dc7220788cae464a30b Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 10 Sep 2026 16:18:11 +0800 Subject: [PATCH 15/27] =?UTF-8?q?feat(oms/wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E5=8D=95=E6=8D=AE=E7=B1=BB=E5=9E=8B=E5=9B=9E?= =?UTF-8?q?=E6=98=BE/=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6/=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=88=97=E8=A1=A5=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 出库明细查询新增orderTypeCode(精确)/orderTypeName(模糊)查询条件 - OMS出库明细SQL补查b.order_type_code/name,响应回显orderTypeCode/orderTypeName(原恒为null) - WMS出库明细导出新增"业务单据类型"列(第31列) --- .../todo/ExecutionOutMaterialDetailQueryDTO.java | 6 ++++++ .../repository/todo/QueryOrderOverStockDO.java | 6 ++++++ .../ExecutionOutMaterialDetailMapper.xml | 10 ++++++++++ .../repository/po/OutMaterialDetailExportPO.java | 3 +++ .../OutMaterialDetailQueryDTO.java | 6 ++++++ .../OutMaterialDetail/OutMaterialDetailMapper.xml | 15 ++++++++++++++- 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java index 8d51f6774..1611fc6be 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionOutMaterialDetail/repository/todo/ExecutionOutMaterialDetailQueryDTO.java @@ -45,6 +45,12 @@ public class ExecutionOutMaterialDetailQueryDTO extends BaseVOEntity { @ApiModelProperty("出库单类型编码") private String outOrderTypeCode; + @ApiModelProperty("出库单类型编码(与outOrderTypeCode同义)") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称(模糊查询)") + private String orderTypeName; + @ApiModelProperty("出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-拣货中 6-波次中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭") private Integer outStatus; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java index 332e32915..bb55c5bae 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationInMaterialDetail/repository/todo/QueryOrderOverStockDO.java @@ -102,6 +102,12 @@ public class QueryOrderOverStockDO extends BaseVOEntity { @Excel(name = "出库单类型编码") private String outOrderTypeCode; + @ApiModelProperty("出库单类型编码(与outOrderTypeCode同义)") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称") + private String orderTypeName; + @ApiModelProperty("出库单类型名称") @Excel(name = "出库单类型名称") private String outOrderTypeName; diff --git a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml index 83b4ad5ba..b03103e99 100644 --- a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml @@ -456,6 +456,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -501,6 +503,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.shipper_id as order_shipper_id, b.shipper_code as order_shipper_code, b.shipper_name as order_shipper_name, + b.order_type_code, + b.order_type_name, b.OUTBOUND_DATE as order_outbound_date, b.OUTBOUND_TIME as order_outbound_time, b.status as out_order_status, @@ -546,6 +550,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{outOrderTypeCode} + + and b.order_type_code = #{orderTypeCode} + + + and b.order_type_name like concat('%', #{orderTypeName}, '%') + and b.issue_status = 4 diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java index 78a955ca1..aad0e5b0d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outMaterialDetail/repository/po/OutMaterialDetailExportPO.java @@ -105,4 +105,7 @@ public class OutMaterialDetailExportPO { @Excel(name = "单据状态", sort = 30, readConverterExp = "9=已出库,12=已复核,13=已交接") private Integer outOrderStatus; + + @Excel(name = "业务单据类型", sort = 31) + private String orderTypeName; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java index 450819254..30044e59d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outMaterialDetail/OutMaterialDetailQueryDTO.java @@ -41,6 +41,12 @@ public class OutMaterialDetailQueryDTO extends BaseVOEntity { @ApiModelProperty("出库单类型编码") private String outOrderTypeCode; + @ApiModelProperty("出库单类型编码(与outOrderTypeCode同义)") + private String orderTypeCode; + + @ApiModelProperty("出库单类型名称(模糊查询)") + private String orderTypeName; + @ApiModelProperty("物料基础信息id") private Long materialBaseInfoId; diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index 2ae53ff48..ea10d3357 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -466,6 +466,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{outOrderTypeCode} + + and b.order_type_code = #{orderTypeCode} + + + and b.order_type_name like concat('%', #{orderTypeName}, '%') + and b.status in (9, 12, 13) @@ -523,7 +529,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.in_order_number as inOrderNumber, c.material_classify_name as materialClassifyName, CAST(NULL AS DECIMAL) as totalAmount, - b.status as outOrderStatus + b.status as outOrderStatus, + b.order_type_name as orderTypeName from out_material_detail a join stock_out_order b on a.out_order_number = b.out_order_number left join material_base_info c on a.material_base_info_id = c.material_base_info_id @@ -565,6 +572,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{outOrderTypeCode} + + and b.order_type_code = #{orderTypeCode} + + + and b.order_type_name like concat('%', #{orderTypeName}, '%') + and b.status in (9, 12, 13) and date_format(IFNULL(b.outbound_date, b.create_time), '%Y-%m-%d') >= #{outboundDateStart} From e2da7177f06c7fd39382730f640beef97c71ecc9 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 10 Sep 2026 16:38:34 +0800 Subject: [PATCH 16/27] =?UTF-8?q?fix(oms/wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E5=87=BA=E5=BA=93=E6=97=B6=E9=97=B4=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E4=B8=A5=E6=A0=BC=E6=8C=89=E5=87=BA=E4=BB=93=E6=97=A5?= =?UTF-8?q?=E6=9C=9Foutbound=5Fdate=EF=BC=88=E5=8E=BB=E9=99=A4=E5=BB=BA?= =?UTF-8?q?=E6=A1=A3=E6=97=B6=E9=97=B4=E5=85=9C=E5=BA=95=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E6=89=80=E8=A7=81=E5=8D=B3=E6=89=80=E7=AD=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExecutionOutMaterialDetailMapper.xml | 6 +++--- .../OutMaterialDetail/OutMaterialDetailMapper.xml | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml index b03103e99..d1ef3d9f6 100644 --- a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml @@ -565,12 +565,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.expect_time <= #{outOrderExpectEndTime} - + - and date_format(IFNULL(b.OUTBOUND_TIME, IFNULL(b.OUTBOUND_DATE, b.create_time)), '%Y-%m-%d') >= #{outboundDateStart} + and date_format(b.OUTBOUND_DATE, '%Y-%m-%d') >= #{outboundDateStart} - and date_format(IFNULL(b.OUTBOUND_TIME, IFNULL(b.OUTBOUND_DATE, b.create_time)), '%Y-%m-%d') <= #{outboundDateEnd} + and date_format(b.OUTBOUND_DATE, '%Y-%m-%d') <= #{outboundDateEnd} and a.del_flag = 1 and b.del_flag = 1 diff --git a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml index ea10d3357..0a76a1efb 100644 --- a/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml +++ b/mhd_wms/src/main/resources/mapper/OutMaterialDetail/OutMaterialDetailMapper.xml @@ -404,7 +404,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 出库明细查询(关联出库单): 口径:仅已出库及后续完成状态(b.status in (9,12,13):已出库/已复核/已交接,与出库排名统计同口径); 仅取 level=1 主行防父子行重复计数; - 实际出仓日期筛选 IFNULL(b.outbound_date, b.create_time); + 实际出仓日期筛选 b.outbound_date; 注意:达梦数据库分页包裹查询不允许重复列名,单头列需与明细表 a 列名错开 (b.out_order_number、b.warehouse_*、b.quantity 等与明细同名的列不重复查,明细行自带) --> @@ -474,12 +474,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.status in (9, 12, 13) - + - and date_format(IFNULL(b.outbound_date, b.create_time), '%Y-%m-%d') >= #{outboundDateStart} + and date_format(b.outbound_date, '%Y-%m-%d') >= #{outboundDateStart} - and date_format(IFNULL(b.outbound_date, b.create_time), '%Y-%m-%d') <= #{outboundDateEnd} + and date_format(b.outbound_date, '%Y-%m-%d') <= #{outboundDateEnd} and a.level = 1 and a.del_flag = 1 @@ -580,10 +580,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.status in (9, 12, 13) - and date_format(IFNULL(b.outbound_date, b.create_time), '%Y-%m-%d') >= #{outboundDateStart} + and date_format(b.outbound_date, '%Y-%m-%d') >= #{outboundDateStart} - and date_format(IFNULL(b.outbound_date, b.create_time), '%Y-%m-%d') <= #{outboundDateEnd} + and date_format(b.outbound_date, '%Y-%m-%d') <= #{outboundDateEnd} and a.level = 1 and a.del_flag = 1 From cae62e83a5201da07211e36619562812eb474d28 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 10 Sep 2026 17:25:07 +0800 Subject: [PATCH 17/27] =?UTF-8?q?fix(oms,wms):=20=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=B7=B2=E5=8F=8D?= =?UTF-8?q?=E5=AE=A1tab=E5=88=97=E8=A1=A8=E6=9F=A5=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E3=80=81=E6=9C=AA=E4=B8=8B=E5=8F=91=E5=8D=95?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E8=A1=A5=E5=86=99=E5=8F=8D=E5=AE=A1=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. W收货单/W上架单【已反审】tab查不到数据:queryList 的 LEFT JOIN stock_in_order 固定带 a/b.DEL_FLAG=1,归档数据(反审后双方均已软删del_flag=2)关联不上b表,仓库/货主等基于b表的过滤条件把行全部过滤掉;改为按是否查反审归档动态切换关联条件(归档按del_flag=2关联,正常列表行为不变) 2. 未下发WMS的执行单反审不产生反审记录:reverseExecutionOrder 幂等跳过分支直接return导致入库异常无留痕;现补写1条反审记录(abnormalType=6,回退库存0,备注未下发WMS),同单号已有有效记录时防重,重试/重复反审幂等 3. OMS反审Feign参数透传组织三字段(organizationId/organizationName/topOrganizationId),供WMS跳过分支写反审记录使用(该场景无W入库单可取组织信息) --- .../ReservationStockInOrderDomainService.java | 4 ++ .../service/StockInOrderDomainService.java | 54 ++++++++++++++----- .../StockReceiptOrderMapper.xml | 12 ++++- .../stockShelfOrder/StockShelfOrderMapper.xml | 12 ++++- 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index 59e73f023..c42c28519 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -847,6 +847,10 @@ public class ReservationStockInOrderDomainService { reverseParam.setRemark("业务单号:" + businessNumber + (StringUtils.isNotEmpty(stockInOrderDO.getReverseAuditRemark()) ? ",反审原因:" + stockInOrderDO.getReverseAuditRemark() : "")); + //组织三字段:WMS幂等跳过分支(未下发单反审)写反审记录时取不到W入库单,需经Feign透传 + reverseParam.setOrganizationId(executionOrder.getOrganizationId()); + reverseParam.setOrganizationName(executionOrder.getOrganizationName()); + reverseParam.setTopOrganizationId(executionOrder.getTopOrganizationId()); reverseParam.setUpdateBy(loginUser.getUserid()); reverseParam.setUpdateByName(userRealName); AjaxResult reverseResult = wmsServiceFeign.omsReverseInOrder(reverseParam); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index bfe95a855..c12e66767 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -913,7 +913,7 @@ public class StockInOrderDomainService { * 物料明细/作业单/任务/质检单一并软删留痕,台账节点物理删除保持与回退后库存一致 *
  • 写1条入库异常【反审记录】(in_order_abnormal type=3/abnormalType=6) 用于记录跟踪
  • * - *

    WMS无该单数据时幂等返回成功(OMS未下发单反审不产生WMS数据);任何校验失败抛错经 + *

    WMS无该单数据时幂等返回成功(OMS未下发单反审仅落1条反审记录留痕,不产生其他WMS数据);任何校验失败抛错经 * Feign 返回,OMS侧整体回滚。反审可重试,本方法幂等。

    */ @Transactional(rollbackFor = Exception.class) @@ -930,7 +930,9 @@ public class StockInOrderDomainService { .eq(StockInOrder::getInOrderNumber, inOrderNumber) .eq(StockInOrder::getDelFlag, 1)); if (CollectionUtils.isEmpty(stockInOrders)) { - //幂等:WMS无该单数据(未下发单反审或已反审过),直接成功,保证OMS反审可重试 + //幂等:WMS无该单数据(未下发单反审或已反审过/重试),直接成功,保证OMS反审可重试; + //反审记录仍落一条留痕(入库异常页面可查),同单号已有反审记录时不再重复写(重试幂等) + saveReverseAuditAbnormalIfAbsent(stockInOrder, BigDecimal.ZERO, "未下发WMS,无WMS链路数据需回退"); return; } StockInOrder wmsOrder = stockInOrders.get(0); @@ -1167,18 +1169,46 @@ public class StockInOrderDomainService { .eq(StockInOrder::getInOrderNumber, inOrderNumber) .eq(StockInOrder::getDelFlag, 1)); - // ========== 4. 写1条入库异常【反审记录】用于记录跟踪 ========== + // ========== 4. 写1条入库异常【反审记录】用于记录跟踪(组织信息取自W入库单) ========== + StockInOrder abnormalParam = new StockInOrder(); + abnormalParam.setInOrderNumber(inOrderNumber); + abnormalParam.setOrganizationId(wmsOrder.getOrganizationId()); + abnormalParam.setOrganizationName(wmsOrder.getOrganizationName()); + abnormalParam.setTopOrganizationId(wmsOrder.getTopOrganizationId()); + abnormalParam.setRemark(reverseReason); + abnormalParam.setUpdateBy(stockInOrder.getUpdateBy()); + abnormalParam.setUpdateByName(reverseByName); + saveReverseAuditAbnormalIfAbsent(abnormalParam, inventoryTotal, + "回退库存" + inventoryTotal.stripTrailingZeros().toPlainString() + ",清理收货/上架链路数据"); + } + + /** + * 写入库异常【反审记录】(type=3/abnormalType=6,FSYC单号)。 + * 同单号已存在有效反审记录时跳过,保证"OMS重试/重复反审"不产生重复记录(幂等)。 + * + * @param stockInOrder 载荷:入库单号/反审原因(remark)/操作人(updateBy,updateByName)/组织三字段 + * @param quantity 本次反审回退的库存量(未下发WMS无库存回退时传0) + * @param sceneRemark 场景补充说明,拼入记录备注 + */ + private void saveReverseAuditAbnormalIfAbsent(StockInOrder stockInOrder, BigDecimal quantity, String sceneRemark) { + long existing = inOrderAbnormalService.count(new LambdaQueryWrapper() + .eq(InOrderAbnormal::getInOrderNumber, stockInOrder.getInOrderNumber()) + .eq(InOrderAbnormal::getAbnormalType, 6) + .eq(InOrderAbnormal::getDelFlag, 1)); + if (existing > 0) { + return; + } InOrderAbnormal reverseAbnormal = new InOrderAbnormal(); - reverseAbnormal.setOrganizationId(wmsOrder.getOrganizationId()); - reverseAbnormal.setOrganizationName(wmsOrder.getOrganizationName()); - reverseAbnormal.setTopOrganizationId(wmsOrder.getTopOrganizationId()); - reverseAbnormal.setInOrderNumber(inOrderNumber); - reverseAbnormal.setAbnormalReason(StringUtils.isEmpty(reverseReason) ? "入库业务单反审" : "入库业务单反审:" + reverseReason); - reverseAbnormal.setQuantity(inventoryTotal); - reverseAbnormal.setRemark("入库业务单反审:回退库存" + inventoryTotal.stripTrailingZeros().toPlainString() - + ",清理收货/上架链路数据"); + reverseAbnormal.setOrganizationId(stockInOrder.getOrganizationId()); + reverseAbnormal.setOrganizationName(stockInOrder.getOrganizationName()); + reverseAbnormal.setTopOrganizationId(stockInOrder.getTopOrganizationId()); + reverseAbnormal.setInOrderNumber(stockInOrder.getInOrderNumber()); + reverseAbnormal.setAbnormalReason(StringUtils.isEmpty(stockInOrder.getRemark()) + ? "入库业务单反审" : "入库业务单反审:" + stockInOrder.getRemark()); + reverseAbnormal.setQuantity(quantity == null ? BigDecimal.ZERO : quantity); + reverseAbnormal.setRemark("入库业务单反审:" + (StringUtils.isEmpty(sceneRemark) ? "" : sceneRemark)); reverseAbnormal.setCreateBy(stockInOrder.getUpdateBy() == null ? 0L : stockInOrder.getUpdateBy()); - reverseAbnormal.setCreateByName(StringUtils.isEmpty(reverseByName) ? "system" : reverseByName); + reverseAbnormal.setCreateByName(StringUtils.isEmpty(stockInOrder.getUpdateByName()) ? "system" : stockInOrder.getUpdateByName()); inOrderAbnormalService.genReverseAuditAbnormal(reverseAbnormal); } diff --git a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml index 3987b65d0..ef2f4463b 100644 --- a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml @@ -167,7 +167,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from stock_receipt_order a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + + + and a.DEL_FLAG = 2 and b.DEL_FLAG = 2 + + + and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + + diff --git a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml index 00f904ba3..108b25ec3 100644 --- a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml @@ -158,7 +158,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from stock_shelf_order a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + + + and a.DEL_FLAG = 2 and b.DEL_FLAG = 2 + + + and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + + From a65cca1cfae117e0ae80e5fdfee0f7d21cc90ab0 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 11 Sep 2026 09:41:21 +0800 Subject: [PATCH 18/27] =?UTF-8?q?fix(oms,wms):=20=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E4=B8=89=E9=A1=B9=E4=BF=AE=E5=A4=8D=EF=BC=9A?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E8=AE=B0=E5=BD=95=E4=B8=8D=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E3=80=81=E5=8F=8D=E5=AE=A1=E5=90=8E=E9=87=8D=E6=96=B0=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E6=97=A0=E6=B3=95=E6=94=B6=E8=B4=A7=E3=80=81=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=88=97=E8=A1=A8JOIN=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 入库异常三个生成器(收货异常/上架异常/反审记录)插入时未显式设置delFlag,MyBatis-Plus insert不含该列,列无默认值落库为NULL,被列表del_flag=1过滤导致反审记录永远不可见;现显式setDelFlag(1) 2. 反审重置业务单status=1:首轮完成上架经WMS回传把业务单status写成5(已入库),不重置则重新下发时copy给执行单→W入库单→收货单,收货单带已完成状态导致前端不给收货按钮 3. 入库异常列表LEFT JOIN stock_in_order固定b.DEL_FLAG=1,反审记录关联的入库单已软删导致匹配不上,仓库等基于b表的过滤把行全部过滤掉、列表恒为空;改为按a.TYPE切换关联状态(type=3关联已软删入库单);收货/上架已反审tab同号多张入库单JOIN出重复行,限定只关联同状态最新一张(IN_ORDER_ID取max) --- .../service/ReservationStockInOrderDomainService.java | 4 ++++ .../repository/persistence/InOrderAbnormalImpl.java | 6 ++++++ .../mapper/inOrderAbnormal/InOrderAbnormalMapper.xml | 11 ++++++++++- .../stockReceiptOrder/StockReceiptOrderMapper.xml | 5 +++++ .../mapper/stockShelfOrder/StockShelfOrderMapper.xml | 5 +++++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index c42c28519..7bb51daf1 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -897,6 +897,10 @@ public class ReservationStockInOrderDomainService { .set(ReservationStockInOrder::getIssueStatus, 3) //清空下发/执行时间(前端"是否执行"列按执行时间判断,不清会仍显示已执行,与取消下发 cancelIssueOrder 同口径) .set(ReservationStockInOrder::getIssueTime, null) + //入库进度状态(1-已创建 2-已审核 3-收货中 4-上架中 5-已入库):首轮"完成上架"会经WMS回传写成5, + //不重置的话重新下发时copy给执行单→W入库单→收货单,收货单带着"已完成"状态导致前端不给收货按钮; + //重置为1(已创建),与手工新单首次下发链路一致(W入库单/收货单起点=1-待收货) + .set(ReservationStockInOrder::getStatus, 1) .set(ReservationStockInOrder::getInQuantity, BigDecimal.ZERO) .set(ReservationStockInOrder::getStorageTime, null) .set(ReservationStockInOrder::getExecutionInOrderNumber, null) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java index e6d13bec3..af61aeb41 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inOrderAbnormal/repository/persistence/InOrderAbnormalImpl.java @@ -187,6 +187,8 @@ public class InOrderAbnormalImpl extends ServiceImpl from in_order_abnormal a - LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + + LEFT JOIN stock_in_order b ON a.in_order_number = b.in_order_number + and a.DEL_FLAG = 1 + and b.DEL_FLAG = (case when a.TYPE = 3 then 2 else 1 end) + and b.IN_ORDER_ID = (select max(c.IN_ORDER_ID) from stock_in_order c + where c.IN_ORDER_NUMBER = a.in_order_number + and c.DEL_FLAG = (case when a.TYPE = 3 then 2 else 1 end)) diff --git a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml index ef2f4463b..e63fab53f 100644 --- a/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockReceiptOrder/StockReceiptOrderMapper.xml @@ -173,9 +173,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.DEL_FLAG = 2 and b.DEL_FLAG = 2 + + and b.IN_ORDER_ID = (select max(c.IN_ORDER_ID) from stock_in_order c + where c.IN_ORDER_NUMBER = a.in_order_number and c.DEL_FLAG = 2) and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + and b.IN_ORDER_ID = (select max(c.IN_ORDER_ID) from stock_in_order c + where c.IN_ORDER_NUMBER = a.in_order_number and c.DEL_FLAG = 1) diff --git a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml index 108b25ec3..3b468716c 100644 --- a/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml +++ b/mhd_wms/src/main/resources/mapper/stockShelfOrder/StockShelfOrderMapper.xml @@ -164,9 +164,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.DEL_FLAG = 2 and b.DEL_FLAG = 2 + + and b.IN_ORDER_ID = (select max(c.IN_ORDER_ID) from stock_in_order c + where c.IN_ORDER_NUMBER = a.in_order_number and c.DEL_FLAG = 2) and a.DEL_FLAG = 1 and b.DEL_FLAG = 1 + and b.IN_ORDER_ID = (select max(c.IN_ORDER_ID) from stock_in_order c + where c.IN_ORDER_NUMBER = a.in_order_number and c.DEL_FLAG = 1) From 788bae9a1690c17b884a3bd0742e8497d19ec9bf Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 11 Sep 2026 11:42:42 +0800 Subject: [PATCH 19/27] =?UTF-8?q?fix(oms,wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E8=A1=A5=E5=85=A8=E2=80=94=E2=80=94=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E4=B8=8B=E5=8F=91=E8=87=AA=E6=84=88/=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E4=BF=A1=E6=81=AF=E6=9C=AC=E5=9C=B0=E5=85=9C=E5=BA=95?= =?UTF-8?q?/=E8=BF=90=E8=BE=93=E9=93=BE=E8=B7=AF=E5=8F=8D=E5=AE=A1?= =?UTF-8?q?=E8=81=94=E5=8A=A8/=E5=BD=92=E6=A1=A3=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 反审后 issueStatus 置 3-已驳回(与入库侧同口径), 清空执行单号/货源单号 - 反审/取消下发软删执行明细时置空 uniqueId, 修复重新下发撞唯一约束 - 新增 WarehouseInfoApplicationService(Feign优先+本地跨库兜底), 出库侧8处调用点接入 - 反审联动软删运输链路: 运输业务单/执行单本地软删 + TMS deleteChainByExecuteOrderNumber - WMS归档查询修复: 交接归档详情丢行/拣货归档数量恒0/复核列表归档汇总/OMS执行单已反审tab --- .../com/mhd/system/api/WlhyServiceFeign.java | 7 +++ .../factory/RemoteWlhyFallbackFactory.java | 6 ++ .../WarehouseInfoApplicationService.java | 58 +++++++++++++++++++ .../OutEntrustOrderApplicationService.java | 11 ++-- .../po/ExecutionStockOutOrderPO.java | 2 + .../todo/ExecutionStockOutOrderDO.java | 3 + .../todo/ExecutionStockOutOrderDTO.java | 3 + ...cutionStockOutOrderApplicationService.java | 9 ++- .../ExecutionStockOutOrderDomainService.java | 20 ++----- .../mapper/ReservationStockInOrderMapper.java | 6 ++ ...vationStockOutOrderApplicationService.java | 9 ++- ...eserveStockOutOrderApplicationService.java | 9 ++- .../ExecutionStockOutOrderMapper.xml | 5 +- .../ReservationStockInOrderMapper.xml | 12 ++++ .../mapper/PickingMaterialDetailMapper.java | 6 ++ .../PickingMaterialDetailMapper.xml | 15 +++++ .../pickingOrder/PickingOrderMapper.xml | 6 +- .../mapper/reviewOrder/ReviewOrderMapper.xml | 3 +- 18 files changed, 151 insertions(+), 39 deletions(-) create mode 100644 mhd_oms/src/main/java/com/mhd/oms/application/service/WarehouseInfoApplicationService.java diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index ba9a45148..aa3f1f09b 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -539,6 +539,13 @@ public interface WlhyServiceFeign { @GetMapping("/feign/order/cancelIssueDocuments") public AjaxResult cancelIssueDocuments(@RequestParam(name="executeOrderId") String executeOrderId); + /** + * OMS出库业务单反审联动: 按执行单货源编号软删TMS整条链路(货源单->运单->运输作业单, is_delete=1), 幂等, + * 与 cancelIssueDocuments(仅关闭货源单且有有效运单即拒绝)不同, 反审口径不留TMS数据 + */ + @PostMapping("/feign/order/deleteChainByExecuteOrderNumber") + public AjaxResult deleteChainByExecuteOrderNumber(@RequestParam(name="executeOrderNumber") String executeOrderNumber); + @GetMapping(value = "/ntocc/tmsSettlementExchangeRate/queryList") public AjaxResult queryList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java index 489e8e221..7b401a6ad 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java @@ -551,6 +551,12 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory queryList(Integer pageNo, Integer pageSize, String pushStatus, String organizationId) { return AjaxResult.error(cause.getMessage()); diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/WarehouseInfoApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/WarehouseInfoApplicationService.java new file mode 100644 index 000000000..0fa4c737d --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/WarehouseInfoApplicationService.java @@ -0,0 +1,58 @@ +package com.mhd.oms.application.service; + +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.domain.WarehouseFeignPO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 仓库信息获取(带本地兜底): 下发/下单冻结/保存等流程原先直接 Feign 调 system 服务取仓库信息, + * system 服务未启动/降级/返回非200时整个流程被"获取仓库信息失败"阻断。 + * 本组件统一收口: 优先 Feign, 失败时回退本地跨库直查 "NGWL_TEST_SYSTEM".WAREHOUSE(与 Feign 同库同表, OMS 库账号可读), + * 两侧都取不到才抛错并带出 Feign 真实返回原因。 + * + * @date 2026/9/11 + */ +@Slf4j +@Service +public class WarehouseInfoApplicationService { + + @Autowired + private SystemServiceFeign systemServiceFeign; + @Autowired + private ReservationStockInOrderMapper reservationStockInOrderMapper; + + /** + * 获取仓库信息: Feign 优先, 失败走本地兜底; 两边都取不到抛 ServiceException + * + * @param warehouseId 仓库id + * @return 仓库信息(含编码/名称/单号生成规则/库存锁定模式等) + */ + public WarehouseFeignPO getWarehouseInfo(Long warehouseId) { + if (warehouseId == null) { + throw new ServiceException("仓库ID不能为空"); + } + AjaxResult ajaxResult = null; + try { + ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); + } catch (Exception e) { + log.warn("获取仓库信息Feign调用异常, 走本地兜底查询, warehouseId={}, error={}", warehouseId, e.getMessage()); + } + if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) { + return com.alibaba.fastjson.JSON.parseObject( + com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + } + String remoteMsg = ajaxResult == null ? "Feign调用异常" : String.valueOf(ajaxResult.get("msg")); + log.warn("获取仓库信息Feign失败(返回: {}), 走本地兜底查询, warehouseId={}", remoteMsg, warehouseId); + WarehouseFeignPO local = reservationStockInOrderMapper.getWarehouseInfoFallback(warehouseId); + if (local == null) { + throw new ServiceException("获取仓库信息失败(Feign返回:" + remoteMsg + "), 且本地未查到仓库[warehouseId=" + + warehouseId + "], 请检查仓库是否存在/已启用"); + } + return local; + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java index 6dd2abf2e..bcdfacb14 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java @@ -46,6 +46,9 @@ public class OutEntrustOrderApplicationService { @Resource private SystemServiceFeign systemServiceFeign; + @Resource + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; + @Resource private WmsServiceFeign wmsServiceFeign; @@ -352,14 +355,10 @@ public class OutEntrustOrderApplicationService { } /** - * 仓库信息校验并回填编码/名称 + * 仓库信息校验并回填编码/名称 (Feign失败走本地跨库兜底) */ private void setWarehouseInfo(OutEntrustOrderDO outEntrustOrderDO) { - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(outEntrustOrderDO.getWarehouseId()); - if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败,请检查仓库是否有效"); - } - WarehouseFeignPO warehouseFeignPO = JSONUtil.toBean(JSONUtil.toJsonStr(ajaxResult.get("data")), WarehouseFeignPO.class); + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(outEntrustOrderDO.getWarehouseId()); if (warehouseFeignPO == null || Objects.isNull(warehouseFeignPO.getWarehouseId())) { throw new ServiceException("仓库不存在,请重新选择"); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java index 58f120900..1801bf6eb 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/po/ExecutionStockOutOrderPO.java @@ -29,6 +29,8 @@ public class ExecutionStockOutOrderPO extends BaseVOEntity { @ApiModelProperty("出库单id") private Long outOrderId; + @ApiModelProperty("反审标记: 1-已反审(反审软删归档, 【已反审】tab按 delFlag=2+reverseFlag=1 查询)") + private Integer reverseFlag; @ApiModelProperty("总价") @Excel(name = "总价") private BigDecimal amount; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java index b8317cf1c..8dbda715e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDO.java @@ -29,6 +29,9 @@ public class ExecutionStockOutOrderDO extends BaseVOEntity { @ApiModelProperty("出库单id") private Long outOrderId; + @ApiModelProperty("反审标记查询: 1-已反审(与delFlag=2成对传, 查【已反审】tab归档数据)") + private Integer reverseFlag; + @ApiModelProperty("组织表ID") @Excel(name = "组织表ID") private Long organizationId; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java index 0b2033f43..a140f238b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/repository/todo/ExecutionStockOutOrderDTO.java @@ -27,6 +27,9 @@ public class ExecutionStockOutOrderDTO extends ExecutionStockOutOrderBaseDTO { @ApiModelProperty("出库单id") private Long outOrderId; + @ApiModelProperty("反审标记查询: 1-已反审(与delFlag=2成对传, 查【已反审】tab归档数据)") + private Integer reverseFlag; + @ApiModelProperty("组织表ID") @Excel(name = "组织表ID") private Long organizationId; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java index f28d93192..320fa25fa 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderApplicationService.java @@ -66,6 +66,8 @@ import java.util.stream.Collectors; public class ExecutionStockOutOrderApplicationService { @Autowired private ExecutionStockOutOrderDomainService stockOutOrderDomainService; + @Autowired + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; // @Autowired // private ExecutionOutMaterialDetailDomainService outMaterialDetailDomainService; // @Autowired @@ -862,11 +864,8 @@ public class ExecutionStockOutOrderApplicationService { if (stockOutOrderDO.getWarehouseId() == null) { throw new ServiceException("仓库ID不能为空"); } - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockOutOrderDO.getWarehouseId()); - if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ - throw new ServiceException("获取仓库信息失败"); - } - WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + // Feign失败走本地跨库兜底, 避免保存被"获取仓库信息失败"阻断 + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(stockOutOrderDO.getWarehouseId()); stockOutOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); stockOutOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java index 5d57783ba..4e33c7a29 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java @@ -71,6 +71,8 @@ public class ExecutionStockOutOrderDomainService { @Autowired private IExecutionStockOutOrderService stockOutOrderService; @Autowired + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; + @Autowired private IExecutionOutMaterialDetailService outMaterialDetailService; @Autowired private IReservationDeliveryDetailsLinkService deliveryDetailsLinkService; @@ -148,14 +150,9 @@ public class ExecutionStockOutOrderDomainService { public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { //建单校验:明细数量必须大于0(0数量单下发WMS后自动分配必失败,出库单会卡死在已审核状态) validateMaterialDetailQuantity(stockOutOrderDO.getMaterialDetailList()); - //设置单号 + //设置单号(仓库信息: Feign优先, system服务失败/降级时本地跨库兜底) Long warehouseId = stockOutOrderDO.getWarehouseId(); - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); - if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败"); - } - //仓库信息 - WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(warehouseId); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String prefix = warehouseFeignPO.getOutOrderNoPrefix(); if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) { @@ -218,14 +215,9 @@ public class ExecutionStockOutOrderDomainService { @Transactional(rollbackFor = Exception.class) public Boolean batchInsert(List stockOutOrderDOList) { for (ExecutionStockOutOrderDO stockOutOrderDO : stockOutOrderDOList){ - //设置单号 + //设置单号(仓库信息: Feign优先, system服务失败/降级时本地跨库兜底) Long warehouseId = stockOutOrderDO.getWarehouseId(); - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); - if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败"); - } - //仓库信息 - WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(warehouseId); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String prefix = warehouseFeignPO.getOutOrderNoPrefix(); if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) { diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java index 16e7e43d2..d43721560 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/mapper/ReservationStockInOrderMapper.java @@ -54,6 +54,12 @@ public interface ReservationStockInOrderMapper extends BaseMapper queryNoticePrint(ReservationStockInOrderDO stockInOrderDO); List queryNoticePrintDetail(ReservationStockInOrderDO stockInOrderDO); public void updateByTransportationNumber(@Param("transportationNumber") String transportationNumber); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java index 18185988e..e10484acd 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderApplicationService.java @@ -85,6 +85,8 @@ import java.util.stream.Collectors; public class ReservationStockOutOrderApplicationService { @Autowired private ReservationStockOutOrderDomainService stockOutOrderDomainService; + @Autowired + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; // @Autowired // private ReservationOutMaterialDetailDomainService outMaterialDetailDomainService; // @Autowired @@ -913,11 +915,8 @@ public class ReservationStockOutOrderApplicationService { if (stockOutOrderDO.getWarehouseId() == null) { throw new ServiceException("仓库ID不能为空"); } - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockOutOrderDO.getWarehouseId()); - if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ - throw new ServiceException("获取仓库信息失败"); - } - WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + // Feign失败走本地跨库兜底, 避免新增/编辑保存被"获取仓库信息失败"阻断 + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(stockOutOrderDO.getWarehouseId()); stockOutOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); stockOutOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java index 210afd106..720c3a76c 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderApplicationService.java @@ -68,6 +68,8 @@ import java.util.concurrent.ThreadLocalRandom; public class ReserveStockOutOrderApplicationService { @Autowired private ReserveStockOutOrderDomainService stockOutOrderDomainService; + @Autowired + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; // @Autowired // private ReserveOutMaterialDetailDomainService outMaterialDetailDomainService; // @Autowired @@ -895,11 +897,8 @@ public class ReserveStockOutOrderApplicationService { if (stockOutOrderDO.getWarehouseId() == null) { throw new ServiceException("仓库ID不能为空"); } - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(stockOutOrderDO.getWarehouseId()); - if(!"200".equals(String.valueOf(ajaxResult.get("code")))){ - throw new ServiceException("获取仓库信息失败"); - } - WarehouseFeignPO warehouseFeignPO = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + // Feign失败走本地跨库兜底, 避免保存被"获取仓库信息失败"阻断 + WarehouseFeignPO warehouseFeignPO = warehouseInfoApplicationService.getWarehouseInfo(stockOutOrderDO.getWarehouseId()); stockOutOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); stockOutOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); } diff --git a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml index 631d9f187..ced13d638 100644 --- a/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionStockOutOrder/ExecutionStockOutOrderMapper.xml @@ -52,6 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -127,7 +128,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.cancel_time, a.close_order, a.close_remark, a.close_by, a.close_by_name, a.close_time, a.check_status,a.BUSINESS_ORDER_NO, a.check_task_distribution, a.check_task_distribution_time, a.check_operators_by, a.check_operators_name, a.mobilize_code, a.remark, a.create_time, a.create_by, a.create_by_name,a.business_number,a.train_no,a.amount,a.business_out_order_number, - a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,a."TO", + a.update_time, a.update_by, a.update_by_name, a.del_flag, a.reverse_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,a."TO", a.CONTACT_PERSON,a.VEHICLE_MODEL_PLATE,a.ENTRUST_NO,a.TEL,a.DRIVER_SIGN,a.FAX,a.DECLARE_CUSTOMS,a.MANUFACTURER, a.CUSTOMS_DECLARER_INFO,a.DELIVERY_ADDR,a.ENTRY_EXIT_CUSTOMS,a.DEPARTURE_ARRIVAL_COUNTRY,a.CARRIER,a.CONTAINER_NO,a.CONTAINER_NO_NAME,a.OUTBOUND_DATE, a.COMPLETE_TIME,a.ORDER_DATE,a.TRANSPORT_MODE_CODE,a.TRANSPORT_MODE_NAME,a.SUPERVISION_MODE_CODE,a.SUPERVISION_MODE_NAME, @@ -401,6 +402,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.del_flag = #{delFlag} and a.del_flag = 1 + + and a.reverse_flag = #{reverseFlag} + + + + SELECT + COALESCE(SUM(b.PICKING_QUANTITY), 0) AS picking_quantity, + COALESCE(SUM(b.TOTAL_AREA), 0) AS total_area, + COALESCE(SUM(b.TOTAL_VOLUME), 0) AS total_volume, + COALESCE(SUM(b.TOTAL_NET_WEIGHT), 0) AS total_net_weight, + COALESCE(SUM(b.TOTAL_GROSS_WEIGHT), 0) AS total_gross_weight + FROM + PICKING_MATERIAL_DETAIL b + WHERE + b.OUT_UNIQUE_ID = #{outUniqueId} + AND b.DEL_FLAG = 2 + + select WAREHOUSE_CODE as warehouseCode, WAREHOUSE_NAME as warehouseName, ORDER_NO_GENERATE_RULE as orderNoGenerateRule, OUT_ORDER_NO_PREFIX as outOrderNoPrefix, - SAMPLE_OUT_ORDER_NO_PREFIX as sampleOutOrderNoPrefix, - STOCK_LOCK_MODE as stockLockMode + SAMPLE_OUT_ORDER_NO_PREFIX as sampleOutOrderNoPrefix from "NGWL_TEST_SYSTEM".WAREHOUSE where 1 = 1 and DEL_FLAG = 1 and WAREHOUSE_ID = #{id} limit 1 From f9a50ae35350186a6658882d6755c233e2c4cb10 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 11 Sep 2026 14:17:17 +0800 Subject: [PATCH 21/27] =?UTF-8?q?fix(oms):=20=E5=87=BA=E5=BA=93=E5=8F=8D?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E5=BF=83=E6=94=B9=E5=8A=A8(=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E8=87=AA=E6=84=88/=E8=BF=90=E8=BE=93=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E8=BD=AF=E5=88=A0/issueStatus=E5=B7=B2=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E/uniqueId=E7=BD=AE=E7=A9=BA/=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E5=88=87=E6=8D=A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ReservationStockOutOrderDomainService.java | 169 ++++++++++++++++-- 1 file changed, 150 insertions(+), 19 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java index 5bcdaafbd..25a541758 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java @@ -18,6 +18,10 @@ import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.facade.IBusines import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.mapper.BusinessDeliveryDetailsLinkMapper; import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import com.mhd.oms.domain.businessDocumentCargoMulti.entity.BusinessDocumentCargoMulti; +import com.mhd.oms.domain.businessDocumentCargoMulti.repository.mapper.BusinessDocumentCargoMultiMapper; +import com.mhd.oms.domain.businessDocumentAddressMulti.entity.BusinessDocumentAddressMulti; +import com.mhd.oms.domain.businessDocumentAddressMulti.repository.mapper.BusinessDocumentAddressMultiMapper; import com.mhd.oms.domain.executeOrder.entity.ExecuteOrder; import com.mhd.oms.domain.executeOrder.repository.mapper.ExecuteOrderMapper; import com.mhd.oms.domain.executionInMaterialDetail.entity.ExecutionInMaterialDetail; @@ -57,6 +61,7 @@ import com.mhd.oms.domain.reservationStockOutOrder.repository.todo.ReservationSt import com.mhd.oms.domain.reserveStockOutOrder.repository.mapper.ReserveStockOutOrderMapper; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.WmsServiceFeign; +import com.mhd.system.api.WlhyServiceFeign; import com.mhd.system.api.domain.*; import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; @@ -122,6 +127,14 @@ public class ReservationStockOutOrderDomainService { private MaterialBaseInfoResolveService materialBaseInfoResolveService; @Resource private ReservationInventoryAdjustmentRecordMapper inventoryAdjustmentRecordMapper; + @Resource + private WlhyServiceFeign wlhyServiceFeign; + @Autowired + private BusinessDocumentCargoMultiMapper businessDocumentCargoMultiMapper; + @Autowired + private BusinessDocumentAddressMultiMapper businessDocumentAddressMultiMapper; + @Autowired + private com.mhd.oms.application.service.WarehouseInfoApplicationService warehouseInfoApplicationService; /** * 分页查询出库单列表 @@ -491,6 +504,122 @@ public class ReservationStockOutOrderDomainService { } } + /** + * 重新下发前自愈清理: 历史版本反审/取消下发软删的执行明细(del_flag=2)仍占用unique_id + * (EXECUTION_OUT_MATERIAL_DETAIL 唯一约束不含del_flag), 重新下发从预留明细复制同一unique_id会撞键; + * 归档行的unique_id无功能用途(仅活动明细展示反查批号用到), 统一置空释放键位, 幂等可重复执行 + */ + private void releaseArchivedDetailUniqueId(String businessOutOrderNumber) { + List executionOrderNumbers = executionStockOutOrderService.list(new QueryWrapper().lambda() + .eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, businessOutOrderNumber)) + .stream() + .map(ExecutionStockOutOrder::getOutOrderNumber) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (executionOrderNumbers.isEmpty()) { + return; + } + executionOutMaterialDetailService.update(null, new UpdateWrapper().lambda() + .set(ExecutionOutMaterialDetail::getUniqueId, null) + .eq(ExecutionOutMaterialDetail::getDelFlag, 2) + .in(ExecutionOutMaterialDetail::getOutOrderNumber, executionOrderNumbers)); + } + + /** + * 反审联动软删运输链路(编辑"是否运输"=是 且审核通过后生成的链): + * 运输业务单(business_document_order) -> 运输执行单(execute_order) -> TMS货源单/运单/运输作业单(wlhy外部服务)。 + * 定位: 出库单.businessNumber(货源单号) + business_delivery_details_link.invoiceNumber=出库单号(orderId/拆单subOrderId); + * 执行单逐个调 TMS deleteChainByExecuteOrderNumber 软删TMS侧整链(未下发过则TMS无数据, 幂等空操作), 失败抛异常整批回滚; + * 本地软删执行单/运输业务单及其货品/地址明细/配送明细链; 无关联运输单时直接跳过。 + */ + private void reverseTransportChain(ReservationStockOutOrder byId) { + String outOrderNumber = byId.getOutOrderNumber(); + Set transportOrderIds = new HashSet<>(); + if (StringUtils.isNotBlank(byId.getBusinessNumber())) { + businessDocumentOrderMapper.selectList(new LambdaQueryWrapper() + .eq(BusinessDocumentOrder::getGoodsNumber, byId.getBusinessNumber()) + .eq(BusinessDocumentOrder::getDelFlag, 1)) + .forEach(order -> transportOrderIds.add(order.getId())); + } + for (BusinessDeliveryDetailsLink link : businessDeliveryDetailsLinkService.list(new LambdaQueryWrapper() + .eq(BusinessDeliveryDetailsLink::getInvoiceNumber, outOrderNumber) + .eq(BusinessDeliveryDetailsLink::getDelFlag, 1))) { + if (link.getOrderId() != null) { + transportOrderIds.add(link.getOrderId()); + } + if (StringUtils.isNotBlank(link.getSubOrderId())) { + try { + transportOrderIds.add(Long.valueOf(link.getSubOrderId())); + } catch (NumberFormatException ignore) { + //拆单子单id非纯数字的历史脏数据, 忽略 + } + } + } + if (transportOrderIds.isEmpty()) { + return; + } + for (Long transportOrderId : transportOrderIds) { + BusinessDocumentOrder transportOrder = businessDocumentOrderMapper.selectById(transportOrderId); + if (transportOrder == null) { + continue; + } + // 1. 执行单: 先软删TMS侧整链(货源单->运单->作业单), 再软删本地执行单 + // (运输业务单已被手工删除时其执行单/TMS链可能仍存活, 同样需要清理) + List executeOrders = executeOrderMapper.selectList(new LambdaQueryWrapper() + .eq(ExecuteOrder::getBusinessDocumentId, transportOrderId) + .eq(ExecuteOrder::getDelFlag, 1)); + for (ExecuteOrder executeOrder : executeOrders) { + if (StringUtils.isNotBlank(executeOrder.getGoodsNumber())) { + AjaxResult tmsResult = wlhyServiceFeign.deleteChainByExecuteOrderNumber(executeOrder.getGoodsNumber()); + if (tmsResult == null || !"200".equals(String.valueOf(tmsResult.get("code")))) { + throw new ServiceException("出库单[" + outOrderNumber + "]反审失败: 运输执行单货源单号[" + + executeOrder.getGoodsNumber() + "]TMS链路软删失败: " + + (tmsResult == null ? "TMS服务不可用" : tmsResult.get("msg"))); + } + } + executeOrder.setDelFlag(2); + executeOrderMapper.updateById(executeOrder); + } + // 2. 软删运输业务单及其货品/地址明细(已软删的跳过更新) + if (!Integer.valueOf(2).equals(transportOrder.getDelFlag())) { + transportOrder.setDelFlag(2); + businessDocumentOrderMapper.updateById(transportOrder); + businessDocumentCargoMultiMapper.update(null, new LambdaUpdateWrapper() + .set(BusinessDocumentCargoMulti::getDelFlag, 2) + .eq(BusinessDocumentCargoMulti::getOrderId, String.valueOf(transportOrderId)) + .eq(BusinessDocumentCargoMulti::getDelFlag, 1)); + businessDocumentAddressMultiMapper.update(null, new LambdaUpdateWrapper() + .set(BusinessDocumentAddressMulti::getDelFlag, 2) + .eq(BusinessDocumentAddressMulti::getOrderId, String.valueOf(transportOrderId)) + .eq(BusinessDocumentAddressMulti::getDelFlag, 1)); + } + } + // 3. 配送明细链软删(仅限指向本次删除的运输业务单, 保留指向其他运输单的链路) + List transportOrderIdStrings = transportOrderIds.stream().map(String::valueOf).collect(Collectors.toList()); + businessDeliveryDetailsLinkService.update(null, new LambdaUpdateWrapper() + .set(BusinessDeliveryDetailsLink::getDelFlag, 2) + .eq(BusinessDeliveryDetailsLink::getInvoiceNumber, outOrderNumber) + .and(wrapper -> wrapper.in(BusinessDeliveryDetailsLink::getOrderId, transportOrderIds) + .or().in(BusinessDeliveryDetailsLink::getSubOrderId, transportOrderIdStrings)) + .eq(BusinessDeliveryDetailsLink::getDelFlag, 1)); + } + + /** + * 获取仓库信息(Feign优先, system服务失败/降级时本地跨库兜底), 统一委托共享组件 + */ + private WarehouseFeignPO getWarehouseInfoWithFallback(Long warehouseId) { + return warehouseInfoApplicationService.getWarehouseInfo(warehouseId); + } + + /** + * 获取仓库单号生成规则(下发生成执行单号用): 优先 Feign 调 system 服务; + * Feign 异常/降级/返回非200时回退本地跨库直查 NGWL_TEST_SYSTEM.WAREHOUSE(同库同表, 与 getWarehouseCode 等查询同数据源), + * 避免 system 服务抖动阻断下发; 两侧都取不到才报错并带出 Feign 真实返回原因。 + */ + private WarehouseFeignPO getWarehouseOrderNoRule(Long warehouseId) { + return getWarehouseInfoWithFallback(warehouseId); + } + /** * @description 审核出库单 * @author ZhouGY @@ -531,6 +660,8 @@ public class ReservationStockOutOrderDomainService { if (activeExecutionCount > 0) { throw new ServiceException("出库单[" + inOrderNumber + "]已下发,请勿重复下发;如需重新下发请先取消下发"); } + // 自愈: 历史版本反审/取消下发的归档明细可能仍占用unique_id, 先置空释放键位再重新下发 + releaseArchivedDetailUniqueId(inOrderNumber); List executionInOrderNumbers = new ArrayList<>(); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber)); @@ -566,14 +697,8 @@ public class ReservationStockOutOrderDomainService { reservationStockInOrder.setBusinessOutOrderNumber(inOrderNumber); // reservationStockInOrder.setOutOrderNumber(generateExecutionOrderNumber(warehouseCode)); - //设置单号 - Long warehouseId1 = reservationStockInOrder.getWarehouseId(); - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId1); - if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败"); - } - //仓库信息 - WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + //设置单号(仓库单号规则: Feign优先, system服务失败/降级时本地跨库兜底) + WarehouseFeignPO warehouseFeignPO = getWarehouseOrderNoRule(reservationStockInOrder.getWarehouseId()); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String prefix = warehouseFeignPO.getOutOrderNoPrefix(); if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) { @@ -662,6 +787,8 @@ public class ReservationStockOutOrderDomainService { materialDetails.forEach(executionOutMaterialDetail -> { executionOutMaterialDetailService.update(null, new UpdateWrapper().lambda() .set(ExecutionOutMaterialDetail::getDelFlag, 2) + // 归档行置空uniqueId: 明细表唯一约束不含del_flag, 保留原值会与重新下发时从预留明细复制的同一uniqueId撞键 + .set(ExecutionOutMaterialDetail::getUniqueId, null) .eq(ExecutionOutMaterialDetail::getMaterialDetailId, executionOutMaterialDetail.getMaterialDetailId())); }); executionStockOutOrderService.update(null, new UpdateWrapper().lambda() @@ -676,7 +803,8 @@ public class ReservationStockOutOrderDomainService { * @description 反审出库业务单(按前端展示字段 issueStatus 判断可反审范围: 2-已审核(未出库) / 4-已出库 均可反审; * 0-已创建无需反审、3-已驳回可直接编辑; status 字段在出库完成后不一定同步为9, 故不作为判断依据, * 仅兜底排除 10-已取消/11-已关闭)。 - * 反审将单据回退到最原始状态(1-已创建, issueStatus=0)并打上反审标记: + * 反审将单据回退到已创建(status=1)且审核状态置为已驳回(issueStatus=3, 与入库侧反审同口径, 可编辑→重新审核→重新下发) + * 并打上反审标记: * WMS 侧按出库单实际状态分支还原库存(已出库: 实物库存还原+推OMS; 未出库: 仅还原分配/冻结占用)、 * 清理执行单据(出库单/明细/拣货/复核/交接/配送, 软删+reverseFlag=1 划归【已反审】tab)、 * 每个执行出库单生成1条出库异常记录【反审记录】(out_order_abnormal, abnormalType=3); @@ -738,6 +866,8 @@ public class ReservationStockOutOrderDomainService { executionOutMaterialDetailService.update(null, new UpdateWrapper().lambda() .set(ExecutionOutMaterialDetail::getDelFlag, 2) .set(ExecutionOutMaterialDetail::getReverseFlag, 1) + // 归档行置空uniqueId: 明细表唯一约束不含del_flag, 保留原值会与重新下发时从预留明细复制的同一uniqueId撞键 + .set(ExecutionOutMaterialDetail::getUniqueId, null) .eq(ExecutionOutMaterialDetail::getMaterialDetailId, executionOutMaterialDetail.getMaterialDetailId())); }); executionStockOutOrderService.update(null, new UpdateWrapper().lambda() @@ -750,15 +880,20 @@ public class ReservationStockOutOrderDomainService { .eq(ReservationInventoryAdjustmentRecord::getExecutionOrderNumber, executionOutOrderNumber) .eq(ReservationInventoryAdjustmentRecord::getDelFlag, 1)); } + // 反审联动: 软删关联运输链路(运输业务单/运输执行单/TMS货源单-运单-作业单), 无关联运输单时跳过 + reverseTransportChain(byId); } // 主单回退到已创建并打反审标记; 更新条件带 issueStatus in (2,4) + 排除已取消/已关闭 兜底防并发重复反审 - // issueStatus 回退到 0-已创建(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库); + // issueStatus 回退到 3-已驳回(前端展示映射: 0-已创建 2-已审核 3-已驳回 4-已出库; 与入库侧反审同口径, + // 已驳回态可编辑→重新审核→重新下发, 重新审核通过时 reverse_status 自动复位 0 离开已反审tab); // 清空执行出库单号——执行单已随反审软删, 前端"是否执行"列由该字段有无值推导, 不清空会仍显示已执行 return stockOutOrderService.update(null, new UpdateWrapper().lambda() .set(ReservationStockOutOrder::getStatus, 1) - .set(ReservationStockOutOrder::getIssueStatus, 0) + .set(ReservationStockOutOrder::getIssueStatus, 3) .set(ReservationStockOutOrder::getExecutionOutOrderNumber, null) + // 运输业务单已随反审软删, 货源单号一并清空, 重新审核后重建运输链路时自动回填 + .set(ReservationStockOutOrder::getBusinessNumber, null) .set(ReservationStockOutOrder::getIssueId, null) .set(ReservationStockOutOrder::getIssueName, null) .set(ReservationStockOutOrder::getIssueTime, null) @@ -816,6 +951,8 @@ public class ReservationStockOutOrderDomainService { String warehouseCode1 = byId.getWarehouseCode(); String warehouseName1 = byId.getWarehouseName(); String inOrderNumber = byId.getOutOrderNumber(); + // 自愈: 历史版本反审/取消下发的归档明细可能仍占用unique_id, 先置空释放键位再重新下发 + releaseArchivedDetailUniqueId(inOrderNumber); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber)); // 按照 warehouseId 分组 @@ -890,14 +1027,8 @@ public class ReservationStockOutOrderDomainService { reservationStockInOrder.setBusinessOutOrderNumber(inOrderNumber); - //设置单号 -// Long warehouseId1 = reservationStockInOrder.getWarehouseId(); - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); - if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败"); - } - //仓库信息 - WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); + //设置单号(仓库单号规则: Feign优先, system服务失败/降级时本地跨库兜底) + WarehouseFeignPO warehouseFeignPO = getWarehouseOrderNoRule(warehouseId); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String prefix = warehouseFeignPO.getOutOrderNoPrefix(); if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) { From 796bb99a8b9ed861cfd8656c6c0ddaea66b0985f Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 11 Sep 2026 14:28:55 +0800 Subject: [PATCH 22/27] =?UTF-8?q?fix(wms):=20=E5=87=BA=E5=BA=93=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=88=97=E8=A1=A8=E4=B8=8D=E5=86=8D=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=B7=B2=E8=BD=AF=E5=88=A0=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=8D=95,=20=E5=8F=8D=E5=AE=A1=E7=94=9F=E6=88=90=E7=9A=84?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=AE=B0=E5=BD=95=E5=8F=AF=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml b/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml index 0a3c003a5..6c33ec34b 100644 --- a/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml +++ b/mhd_wms/src/main/resources/mapper/outOrderAbnormal/OutOrderAbnormalMapper.xml @@ -101,10 +101,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and b.order_type_code = #{orderTypeCode} - - and b.del_flag = #{delFlag} - and b.del_flag = 1 - + + and b.del_flag = #{delFlag} - + SELECT goods_number FROM business_document_order WHERE goods_number LIKE concat(#{prefix}, '%') AND LENGTH(goods_number) <= 12 From e60f22979cf7a2420387c6bb950e7b2e237bdfc4 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Sat, 12 Sep 2026 11:21:33 +0800 Subject: [PATCH 27/27] =?UTF-8?q?fix(wms):=20=E8=A1=A5=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=94=B6=E8=B4=A7/=E4=B8=8A=E6=9E=B6=E5=8D=95=E5=B7=B2?= =?UTF-8?q?=E5=8F=8D=E5=AE=A1=E5=BD=92=E6=A1=A3=E8=AF=A6=E6=83=85=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=88=E6=AD=A4=E5=89=8D=E9=81=97=E6=BC=8F=E6=9C=AA?= =?UTF-8?q?=E5=85=A5=E5=BA=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getInfo 增加 archive 重载(归档主单已软删用getById放行+校验已反审标记,明细放行软删行)+ getReverseAuditInfo 接口,补齐对接文档承诺的4个归档详情接口中缺失的收货/上架两个;随附上架默认库位注释微调 --- .../StockReceiptOrderApplicationService.java | 23 +++++++++++++++- .../StockShelfOrderApplicationService.java | 19 ++++++++----- .../StockReceiptOrderDomainService.java | 21 ++++++++++++++- .../service/StockShelfOrderDomainService.java | 27 ++++++++++++++++++- .../StockReceiptOrderApi.java | 10 +++++++ .../stockShelfOrder/StockShelfOrderApi.java | 10 +++++++ 6 files changed, 101 insertions(+), 9 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java index 1dd52dac3..3760dfd7d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockReceiptOrder/StockReceiptOrderApplicationService.java @@ -201,9 +201,22 @@ public class StockReceiptOrderApplicationService { */ public StockReceiptOrderPO getInfo(Long receiptOrderId) { - StockReceiptOrderPO stockReceiptOrderPO = stockReceiptOrderDomainService.getInfo(receiptOrderId); + return getInfo(receiptOrderId, false); + } + + /** + * 获取收货单详情 + * @param archive true-查询【已反审】tab 归档数据(已软删+已反审标记,明细放行软删行) + */ + public StockReceiptOrderPO getInfo(Long receiptOrderId, boolean archive) + { + StockReceiptOrderPO stockReceiptOrderPO = stockReceiptOrderDomainService.getInfo(receiptOrderId, archive); ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO(); receiptMaterialDetailDO.setReceiptOrderNumber(stockReceiptOrderPO.getReceiptOrderNumber()); + if (archive) { + //归档明细已随主单软删,放行软删行 + receiptMaterialDetailDO.setDelFlag(2); + } List receiptMaterialDetailPOList = receiptMaterialDetailDomainService.queryListChildren(receiptMaterialDetailDO); // 性能优化:批量获取批次属性,避免N+1查询问题 @@ -306,6 +319,14 @@ public class StockReceiptOrderApplicationService { totalNetWeight, totalGrossWeight, totalVolume, totalArea); return stockReceiptOrderPO; } + + /** + * 查询收货单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + public StockReceiptOrderPO getReverseAuditInfo(Long receiptOrderId) + { + return getInfo(receiptOrderId, true); + } /** * 根据物料基础信息ID获取批次属性(更多属性),只返回isDisplay=1的属性 diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java index 039377518..9d5f81782 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockShelfOrder/StockShelfOrderApplicationService.java @@ -134,12 +134,12 @@ public class StockShelfOrderApplicationService { private static final String VERIFY = "ESLuxAmB6VXCgbqP1eFzxTPVRagkQ62BUkfhElrgQ6XmE/g2reHVflY/SiCSU7JD"; /** 仅这些仓库的上架单在PC上传页默认填充上架库位(按仓库名匹配;需放开其他仓库时在此追加)。 - * 生产环境:维他奶仓(warehouseId=14,已对照线上库位树验证:库区id=20,库位id=33);测试环境为 青洲仓(warehouseId=13),需测试时切换 */ - private static final Set DEFAULT_STORAGE_LOCATION_WAREHOUSE_NAMES = new HashSet<>(Collections.singletonList("维他奶仓")); - /** 默认上架库位:指定库区名→库位名(精确匹配,须与基础资料名称完全一致,注意含繁体字)。 - * 生产环境:維他奶2层冷凍A區 → 2层冷凍A區A01;测试环境为 4楼A区 → 4A-01-01,需测试时切换 */ - private static final String DEFAULT_SHELF_STORAGE_NAME = "維他奶2层冷凍A區"; - private static final String DEFAULT_SHELF_STORAGE_LOCATION_NAME = "2层冷凍A區A01"; + * 测试环境:青洲仓(warehouseId=13);生产环境为 维他奶仓(warehouseId=14,已对照线上库位树验证:库区id=20,库位id=33),发版前需切换 */ + private static final Set DEFAULT_STORAGE_LOCATION_WAREHOUSE_NAMES = new HashSet<>(Collections.singletonList("青洲仓")); + /** 默认上架库位:指定库区名→库位名(精确匹配,须与基础资料名称完全一致)。 + * 测试环境:4楼A区 → 4A-01-01;生产环境为 維他奶2层冷凍A區 → 2层冷凍A區A01(含繁体字),发版前需切换 */ + private static final String DEFAULT_SHELF_STORAGE_NAME = "4楼A区"; + private static final String DEFAULT_SHELF_STORAGE_LOCATION_NAME = "4A-01-01"; /** 仅这些组织的上架单在PC上传页默认填充上架库位(按组织id精确匹配;测试与生产均为 谷丰=2842,若不一致需按环境切换) */ private static final Set DEFAULT_STORAGE_LOCATION_ORGANIZATION_IDS = new HashSet<>(Collections.singletonList(2842L)); @@ -243,6 +243,13 @@ public class StockShelfOrderApplicationService { return getInfo(shelfOrderId, false); } + /** + * 查询上架单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + public StockShelfOrderPO getReverseAuditInfo(Long shelfOrderId) { + return stockShelfOrderDomainService.getInfo(shelfOrderId, true); + } + /** * 获取上架单详细信息 * diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index 43519937c..08a53a153 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -261,7 +261,26 @@ public class StockReceiptOrderDomainService { * 获取收货单详细信息 */ public StockReceiptOrderPO getInfo(Long receiptOrderId) { - return stockReceiptOrderService.getInfo(receiptOrderId); + return getInfo(receiptOrderId, false); + } + + /** + * 获取收货单详情 + * @param archive true-查询【已反审】tab 归档数据(已软删+已反审标记) + */ + public StockReceiptOrderPO getInfo(Long receiptOrderId, boolean archive) { + if (!archive) { + return stockReceiptOrderService.getInfo(receiptOrderId); + } + //归档主单已软删,用 MP getById(不过滤 del_flag)并校验已反审标记 + StockReceiptOrder order = stockReceiptOrderService.getById(receiptOrderId); + if (order == null || order.getDelFlag() == null || order.getDelFlag() != 2 + || !Integer.valueOf(1).equals(order.getReverseAuditStatus())) { + throw new ServiceException("收货单非已反审归档数据,无法查看归档详情"); + } + StockReceiptOrderPO po = new StockReceiptOrderPO(); + org.springframework.beans.BeanUtils.copyProperties(order, po); + return po; } /** diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 0e07bbf81..a374b66ba 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -243,9 +243,34 @@ public class StockShelfOrderDomainService { */ public StockShelfOrderPO getInfo(Long shelfOrderId) { - StockShelfOrderPO stockShelfOrderPO = stockShelfOrderService.getInfo(shelfOrderId); + return getInfo(shelfOrderId, false); + } + + /** + * 获取上架单详情 + * @param archive true-查询【已反审】tab 归档数据(已软删+已反审标记,明细放行软删行) + */ + public StockShelfOrderPO getInfo(Long shelfOrderId, boolean archive) + { + StockShelfOrderPO stockShelfOrderPO; + if (archive) { + //归档主单已软删,用 MP getById(不过滤 del_flag)并校验已反审标记 + StockShelfOrder order = stockShelfOrderService.getById(shelfOrderId); + if (order == null || order.getDelFlag() == null || order.getDelFlag() != 2 + || !Integer.valueOf(1).equals(order.getReverseAuditStatus())) { + throw new ServiceException("上架单非已反审归档数据,无法查看归档详情"); + } + stockShelfOrderPO = new StockShelfOrderPO(); + org.springframework.beans.BeanUtils.copyProperties(order, stockShelfOrderPO); + } else { + stockShelfOrderPO = stockShelfOrderService.getInfo(shelfOrderId); + } ShelfMaterialDetailDO shelfMaterialDetailDO = new ShelfMaterialDetailDO(); shelfMaterialDetailDO.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber()); + if (archive) { + //归档明细已随主单软删,放行软删行 + shelfMaterialDetailDO.setDelFlag(2); + } List inMaterialDetailPOList = shelfMaterialDetailService.queryListChildren(shelfMaterialDetailDO); stockShelfOrderPO.setMaterialDetailList(inMaterialDetailPOList); return stockShelfOrderPO; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockReceiptOrder/StockReceiptOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockReceiptOrder/StockReceiptOrderApi.java index 56baaf263..1216fecaa 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockReceiptOrder/StockReceiptOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockReceiptOrder/StockReceiptOrderApi.java @@ -64,6 +64,16 @@ public class StockReceiptOrderApi extends BaseController { return AjaxResult.success(stockReceiptOrderApplicationService.getInfo(receiptOrderId)); } + /** + * 查询收货单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + @ApiOperation("查询收货单已反审归档详情") + @GetMapping(value = "/getReverseAuditInfo/{receiptOrderId}") + public AjaxResult getReverseAuditInfo(@PathVariable("receiptOrderId") Long receiptOrderId) + { + return AjaxResult.success(stockReceiptOrderApplicationService.getReverseAuditInfo(receiptOrderId)); + } + @ApiOperation("分配月台") @PostMapping("/allocationPlatform") public AjaxResult allocationPlatform(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockShelfOrder/StockShelfOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockShelfOrder/StockShelfOrderApi.java index 2930c47d2..85f90eb32 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockShelfOrder/StockShelfOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockShelfOrder/StockShelfOrderApi.java @@ -64,6 +64,16 @@ public class StockShelfOrderApi extends BaseController { return AjaxResult.success(stockShelfOrderApplicationService.getInfo(shelfOrderId, false)); } + /** + * 查询上架单【已反审】tab 归档详情(已软删+已反审标记的数据,含软删明细) + */ + @ApiOperation("查询上架单已反审归档详情") + @GetMapping(value = "/getReverseAuditInfo/{shelfOrderId}") + public AjaxResult getReverseAuditInfo(@PathVariable("shelfOrderId") Long shelfOrderId) + { + return AjaxResult.success(stockShelfOrderApplicationService.getReverseAuditInfo(shelfOrderId)); + } + @ApiOperation("任务下发") @PostMapping("/taskDistribution") public AjaxResult taskDistribution(@RequestBody StockShelfOrderDTO stockShelfOrderDTO) {