From 0be73e9bfeb7e56cc6bc6ba7fd2137bdb7c2202e Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 26 Aug 2026 15:49:38 +0800 Subject: [PATCH 001/101] =?UTF-8?q?fix(oms):=20=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E8=81=94=E5=90=88=E5=88=97=E8=A1=A8(inAndOutList)=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9D=A1=E4=BB=B6=E4=BF=AE=E5=A4=8D=E4=B8=8E=E8=A1=A5?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复 ReflectionException:mapper XML 引用 inOrOut/orderNumber 但 DO 无对应字段, DO/DTO 新增 inOrOut、orderNumber 查询字段(BeanUtils 同名自动拷贝,前端参数直达 mapper) 2. inOrOut 排除空串与 'all'(前端"全部"约定值),避免拼出 ="all" 查空 3. orderNumber 排除空串并改为 like 模糊匹配(与出库单列表单号搜索口径一致) 4. status 新增精确筛选(0 为有效条件值,按前端约定直传,"全部"时不传) --- .../repository/todo/ReserveStockInOrderDO.java | 6 ++++++ .../repository/todo/ReserveStockInOrderDTO.java | 6 ++++++ .../reserveStockInOrder/ReserveStockInOrderMapper.xml | 11 +++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDO.java index 39fef8510..6346fc9d7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDO.java @@ -446,4 +446,10 @@ public class ReserveStockInOrderDO extends BaseVOEntity { @ApiModelProperty("客户名称") @Excel(name = "客户名称") private String customerName; + + @ApiModelProperty("出入库方向(inAndOutList查询条件): in-入库 out-出库 all/空-全部") + private String inOrOut; + + @ApiModelProperty("出入库单号(inAndOutList查询条件,模糊匹配,出库out_order_number/入库in_order_number)") + private String orderNumber; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDTO.java index 8e24361b6..92b59c131 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/repository/todo/ReserveStockInOrderDTO.java @@ -443,4 +443,10 @@ public class ReserveStockInOrderDTO extends ReserveStockInOrderBaseDTO { @ApiModelProperty("客户名称") @Excel(name = "客户名称") private String customerName; + + @ApiModelProperty("出入库方向(inAndOutList查询条件): in-入库 out-出库 all/空-全部") + private String inOrOut; + + @ApiModelProperty("出入库单号(inAndOutList查询条件,模糊匹配,出库out_order_number/入库in_order_number)") + private String orderNumber; } \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/reserveStockInOrder/ReserveStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reserveStockInOrder/ReserveStockInOrderMapper.xml index c7f95902f..ce164c569 100644 --- a/mhd_oms/src/main/resources/mapper/reserveStockInOrder/ReserveStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reserveStockInOrder/ReserveStockInOrderMapper.xml @@ -558,7 +558,7 @@ + + + \ No newline at end of file From 5e3a0d86d0b6c358fcca5486531c0721b6d3dd22 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 27 Aug 2026 14:21:23 +0800 Subject: [PATCH 010/101] =?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_oms/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 8cc8bfd57..0d65c89a1 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129: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 4ef3bed80..8a7006304 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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 1fe69a003..7fbd7dd9b 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 509644885..9fd21ae67 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 8c86ae1ad..376500b1c 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_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..88471e390 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From e3058d8eb14d52f4dd9931873b10a670d198d701 Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Thu, 27 Aug 2026 14:24:58 +0800 Subject: [PATCH 011/101] =?UTF-8?q?fix(oms):=E6=98=8E=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionInMaterialDetailMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml index cb7efac12..66dc5a801 100644 --- a/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionInMaterialDetail/executionInMaterialDetailMapper.xml @@ -412,7 +412,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.warehouse_date from execution_in_material_detail a left join execution_stock_in_order b on a.in_order_number = b.in_order_number - left join material_base_info c on a.material_base_info_id = c.material_base_info_id + left join NGWL_TEST_WMS.material_base_info c on a.material_base_info_id = c.material_base_info_id and a.organization_id = #{organizationId} From 7b0d08a132cc8ace450270917a1c4bd3af08a226 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 27 Aug 2026 16:33:43 +0800 Subject: [PATCH 012/101] =?UTF-8?q?=E5=8F=9130?= 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_oms/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 0d65c89a1..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 8a7006304..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4: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 ba9a45148..de19e469b 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.33.0.129:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 7fbd7dd9b..26a92624c 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, url = "http://10.102.192.3: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 beba5b1af..12571141a 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.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.4: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 9fd21ae67..6238639f6 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.33.0.129:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.30: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 376500b1c..ca93d3312 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.33.0.129:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 88471e390..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 5127123236f3baaf46c5dcac6d62f098d6b91f63 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 27 Aug 2026 16:38:33 +0800 Subject: [PATCH 013/101] =?UTF-8?q?=E5=8F=9131?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d976fcc98 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 627376da076341191546c657218a87081008b609 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 09:13:10 +0800 Subject: [PATCH 014/101] =?UTF-8?q?feat(sys):=E8=B4=B9=E7=94=A8=E7=A7=91?= =?UTF-8?q?=E7=9B=AE=E5=A2=9E=E5=8A=A0=E5=A4=8D=E5=88=B6=E3=80=81=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、新增 POST /expenseAccountApi/copy 复制接口(回显式,清空主键及科目编码) 2、新增 GET/POST /expenseAccountApi/export 导出接口(按列表查询条件+数据权限全量导出) 3、新增 ExpenseAccountExportVO 导出对象(27列业务字段) --- .../ExpenseAccountApplicationService.java | 51 +++++++++++++++++++ .../expenseAccount/ExpenseAccountApi.java | 45 ++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java index 6bfb55e13..11dddd5a9 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java @@ -13,6 +13,7 @@ import com.mhd.basic.application.service.contractManage.ContractManageApplicatio import com.mhd.basic.domain.expenseAccount.service.ExpenseAccountDomainService; import com.mhd.basic.infrastructure.feign.vo.SysDictDataVo; import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountDTO; +import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountExportVO; import com.mhd.basic.interfaces.dto.expenseAccount.SearchExpenseAccountDTO; import com.mhd.common.core.enums.DictCode; import com.mhd.common.core.exception.ServiceException; @@ -27,6 +28,7 @@ import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.model.LoginUser; import com.mhd.common.core.domain.po.UserPo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -378,6 +380,55 @@ public class ExpenseAccountApplicationService { return expenseAccountDomainService.getInfo(expenseAccountId); } + /** + * 复制费用科目-获取原科目数据供前端回显 + *

前端拿到数据后回显到新增弹窗,用户填写新科目编码后通过 /edit 接口(id 为空走新增)提交保存。 + * 清空科目编码是为了避免直接复制出重复编码(费用科目编码无唯一性校验)。

+ */ + public ExpenseAccountPO copy(ExpenseAccountDTO expenseAccountDTO) { + if (expenseAccountDTO == null || expenseAccountDTO.getExpenseAccountId() == null) { + throw new ServiceException("原费用科目id不能为空"); + } + // 获取原费用科目信息 + ExpenseAccountPO original = expenseAccountDomainService.getInfo(expenseAccountDTO.getExpenseAccountId()); + if (null == original) { + throw new ServiceException("原费用科目信息未找到"); + } + // 清空主键,前端提交时走新增 + original.setExpenseAccountId(null); + // 清空科目编码,强制用户输入新编码,避免编码重复 + original.setSubjectCode(null); + // 清空审计字段,新增时由 ExpenseAccountAssembler 重新生成 + original.setCreateBy(null); + original.setCreateByName(null); + original.setCreateTime(null); + original.setUpdateBy(null); + original.setUpdateByName(null); + original.setUpdateTime(null); + original.setDelFlag(null); + // 清空非表字段 + original.setUnit(null); + original.setExpenseAccountPOList(null); + return original; + } + + /** + * 构建费用科目导出数据(不分页全量,按列表页查询条件 + 数据权限过滤) + */ + public List buildExportList(ExpenseAccountDO expenseAccountDO) { + List exportList = new ArrayList<>(); + List list = this.queryList(expenseAccountDO); + if (list == null || list.isEmpty()) { + return exportList; + } + for (ExpenseAccountPO po : list) { + ExpenseAccountExportVO vo = new ExpenseAccountExportVO(); + BeanUtils.copyProperties(po, vo); + exportList.add(vo); + } + return exportList; + } + /** * 修改状态 * @param expenseAccountDTO diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java index 8c22cd084..655fe1446 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java @@ -1,5 +1,7 @@ package com.mhd.basic.interfaces.facade.expenseAccount; +import java.io.IOException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @@ -13,9 +15,11 @@ import com.mhd.basic.domain.expenseAccount.repository.todo.SearchExpenseAccountD import com.mhd.basic.domain.sysMultistageDict.repository.po.SysMultistageDictPo; import com.mhd.basic.interfaces.assember.expenseAccount.ExpenseAccountAssembler; import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountDTO; +import com.mhd.basic.interfaces.dto.expenseAccount.ExpenseAccountExportVO; import com.mhd.basic.interfaces.dto.expenseAccount.SearchExpenseAccountDTO; import com.mhd.common.core.constant.HttpStatus; import com.mhd.common.core.domain.entity.R; +import com.mhd.common.core.utils.poi.ExcelUtil; import com.sun.org.apache.bcel.internal.generic.NEW; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang.StringUtils; @@ -26,6 +30,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; @@ -336,5 +341,45 @@ public class ExpenseAccountApi extends BaseController{ return AjaxResult.success(expenseAccountPO.getUnit()); } + /** + * 复制费用科目 + * 返回原科目数据(已清空主键、科目编码等字段)供前端回显到新增弹窗,用户填写新科目编码后通过 /edit 接口提交新增 + */ + @ApiOperation("复制费用科目-获取原科目数据用于回显") + @PostMapping("/copy") + public AjaxResult copy(@RequestBody ExpenseAccountDTO expenseAccountDTO) + { + try { + ExpenseAccountPO expenseAccountPO = expenseAccountApplicationService.copy(expenseAccountDTO); + return AjaxResult.success(expenseAccountPO); + }catch (Exception e){ + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 导出费用科目 + * 按列表页当前查询条件 + 数据权限过滤,不分页全量导出 + */ + @ApiOperation("导出费用科目") + @RequestMapping(value = "/export", method = {RequestMethod.GET, RequestMethod.POST}, + produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public void export(ExpenseAccountDTO expenseAccountDTO, HttpServletResponse response) throws IOException + { + //转换实体(不用Assembler,避免其自动填充createByName/updateByName干扰查询条件,与/list一致) + ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO(); + BeanUtils.copyProperties(expenseAccountDTO, expenseAccountDO); + //查询全量(不分页),并转换为导出对象 + List list = expenseAccountApplicationService.buildExportList(expenseAccountDO); + + //设置下载头,防止浏览器乱码 + 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<>(ExpenseAccountExportVO.class); + util.exportExcel(response, list, "费用科目"); + } } \ No newline at end of file From afa502eeafc817ef7c53db90ebe8801b903596f5 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 09:14:03 +0800 Subject: [PATCH 015/101] =?UTF-8?q?feat(system):=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E7=AE=A1=E7=90=86-=E5=BA=93=E4=BD=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 需求:库位管理列表增加复制功能,快速复用已有库位配置新建库位。 实现(仿照bms复制账单copyBill的回显式复制): 一、新增接口 POST /storageLocationApi/copyStorageLocation(StorageLocationApi): id判空+try-catch兜底,异常返回"复制库单失败:xxx" 二、StorageLocationApplicationService新增copyStorageLocation: 取原库位PO后清空唯一性字段(storageLocationId不清空会误走修改分支覆盖原库位、 storageLocationCode同组织同仓库唯一须用户重填、locationBarCode物理唯一)、 清空审计字段(提交时Assembler按登录人重写)、状态重置初始值 (status=1空/openingUp=1启用/nullify=1未作废);其余业务字段保留回显 三、前端拿PO回显到新增页,用户改编码后走现有edit接口(id为空即新增)提交, 天然复用编码唯一性校验、仓库/库区/库位组回填、库位组计数+1,Domain层零改动 --- .../StorageLocationApplicationService.java | 34 +++++++++++++++++++ .../storageLocation/StorageLocationApi.java | 19 +++++++++++ 2 files changed, 53 insertions(+) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java index 566c37e41..7bd6df9fa 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/storageLocation/StorageLocationApplicationService.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON; import com.mhd.basic.domain.storageLocation.repository.po.StorageLocationPO; import com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO; import com.mhd.basic.domain.storageLocation.service.StorageLocationDomainService; +import com.mhd.basic.interfaces.dto.storageLocation.StorageLocationDTO; import com.mhd.basic.domain.storageSection.repository.todo.StorageSectionDO; import com.mhd.basic.infrastructure.feign.vo.SysDictDataVo; import com.mhd.common.core.domain.po.UserPo; @@ -207,6 +208,39 @@ public class StorageLocationApplicationService { return storageLocationDomainService.getInfo(storageLocationId); } + /** + * 复制库位-获取原库位数据供前端回显 + * 前端拿到数据后跳转到新增库位页面,用户修改编码后通过edit接口提交新增 + */ + public StorageLocationPO copyStorageLocation(StorageLocationDTO storageLocationDTO) { + if (storageLocationDTO.getStorageLocationId() == null) { + throw new ServiceException("原库位id不能为空"); + } + // 获取原库位信息 + StorageLocationPO originalStorageLocation = storageLocationDomainService.getInfo(storageLocationDTO.getStorageLocationId()); + if (null == originalStorageLocation) { + throw new ServiceException("原库位信息未找到"); + } + // 清空唯一性字段:库位id不清空会导致提交后走修改分支覆盖原库位; + // 库位编码同组织同仓库唯一,须由用户重新填写;条码为物理唯一标识,一并清空 + originalStorageLocation.setStorageLocationId(null); + originalStorageLocation.setStorageLocationCode(null); + originalStorageLocation.setLocationBarCode(null); + // 状态重置为初始值:新库位无库存(空)、启用、未作废 + originalStorageLocation.setStatus(1); + originalStorageLocation.setOpeningUp(1); + originalStorageLocation.setNullify(1); + // 清空审计字段,提交新增时由Assembler按当前登录人重新生成 + originalStorageLocation.setCreateBy(null); + originalStorageLocation.setCreateByName(null); + originalStorageLocation.setCreateTime(null); + originalStorageLocation.setUpdateBy(null); + originalStorageLocation.setUpdateByName(null); + originalStorageLocation.setUpdateTime(null); + // 其余业务字段(仓库/库区/库位组、分类/种类/混放策略、限制、长宽高、坐标、备注)保留回显 + return originalStorageLocation; + } + public int getStorageLocationCount(StorageLocationDO storageLocationDO) { return storageLocationDomainService.getStorageLocationCount(storageLocationDO); diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java index 6f071de45..2c211ae5d 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facadeApi/storageLocation/StorageLocationApi.java @@ -19,6 +19,7 @@ import com.mhd.basic.domain.storageLocation.repository.todo.StorageLocationDO; import com.mhd.basic.domain.storageLocation.repository.po.StorageLocationPO; import com.mhd.basic.application.service.storageLocation.StorageLocationApplicationService; import com.mhd.basic.interfaces.assember.storageLocation.StorageLocationAssembler; +import com.mhd.common.core.exception.ServiceException; import javax.annotation.Resource; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; @@ -127,6 +128,24 @@ public class StorageLocationApi extends BaseController{ { return AjaxResult.success(storageLocationApplicationService.getInfo(storageLocationId)); } + + /** + * 复制库位-获取原库位数据用于回显 + */ + @ApiOperation("复制库位-获取原库位数据用于回显") + @PostMapping("/copyStorageLocation") + public AjaxResult copyStorageLocation(@RequestBody StorageLocationDTO storageLocationDTO) + { + if(storageLocationDTO.getStorageLocationId() == null){ + throw new ServiceException("原库位id不能为空"); + } + try { + StorageLocationPO result = storageLocationApplicationService.copyStorageLocation(storageLocationDTO); + return AjaxResult.success(result); + }catch (Exception e){ + return AjaxResult.error("复制库位失败:"+e.getMessage()); + } + } @ApiOperation("获取库位总数") @PostMapping(value = "/getStorageLocationCount") public AjaxResult getStorageLocationCount(@RequestBody StorageLocationDTO storageLocationDTO) From 6349181cc304c6a89aabe6599480f09a8d50b15d Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 09:20:11 +0800 Subject: [PATCH 016/101] =?UTF-8?q?feat(sys):=E8=B4=B9=E7=94=A8=E7=A7=91?= =?UTF-8?q?=E7=9B=AE=E5=AF=BC=E5=87=BA=E5=A2=9E=E5=8A=A0=E6=96=B0vo?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=20=E6=96=B0=E5=A2=9E=20ExpenseAccountExportV?= =?UTF-8?q?O=20=E5=AF=BC=E5=87=BA=E5=AF=B9=E8=B1=A1=EF=BC=8827=E5=88=97?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=AD=97=E6=AE=B5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpenseAccountExportVO.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java new file mode 100644 index 000000000..a7d59ebaf --- /dev/null +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java @@ -0,0 +1,98 @@ +package com.mhd.basic.interfaces.dto.expenseAccount; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 费用科目导出对象 expense_account + * + * @author rcx + * @date 2026-08-28 + */ +@Data +public class ExpenseAccountExportVO { + + @Excel(name = "组织名称") + private String organizationName; + + @Excel(name = "科目编码") + private String subjectCode; + + @Excel(name = "科目名称") + private String subjectName; + + @Excel(name = "显示顺序") + private Integer showSeq; + + @Excel(name = "计费属性") + private String billingAttributes; + + @Excel(name = "所属模块") + private String belongModule; + + @Excel(name = "是否一级科目", readConverterExp = "1=是,2=否") + private Integer firstSubjectFlag; + + @Excel(name = "上级科目编码") + private String upperSubjectCode; + + @Excel(name = "上级科目名称") + private String upperSubject; + + @Excel(name = "科目类型", readConverterExp = "1=系统科目,2=非系统科目") + private Integer accountType; + + @Excel(name = "收支类型", readConverterExp = "1=收入,2=支出") + private Integer accountExpenseType; + + @Excel(name = "服务项编码") + private String serviceItemsCode; + + @Excel(name = "服务项名称") + private String serviceItemsName; + + @Excel(name = "服务项税率") + private BigDecimal taxRate; + + @Excel(name = "费率") + private BigDecimal rate; + + @Excel(name = "启用状态", readConverterExp = "1=启用,2=停用") + private Integer status; + + @Excel(name = "自有车辆固定显示", readConverterExp = "1=是,2=否") + private Integer ownStatus; + + @Excel(name = "社会车辆固定显示", readConverterExp = "1=是,2=否") + private Integer societyStatus; + + @Excel(name = "创建订单固定显示", readConverterExp = "0=否,1=是") + private Integer fixedOrderDisplay; + + @Excel(name = "入库单固定显示", readConverterExp = "0=否,1=是") + private Integer inOrderDisplay; + + @Excel(name = "出库单固定显示", readConverterExp = "0=否,1=是") + private Integer outOrderDisplay; + + @Excel(name = "计费单位") + private String billingUnit; + + @Excel(name = "计费单位2") + private String billingUnit2; + + @Excel(name = "NC科目编码") + private String ncSubjectCode; + + @Excel(name = "备注") + private String remark; + + @Excel(name = "创建人") + private String createByName; + + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} From d0773a40d2461dd0c988c474322c2c014e651bf9 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 16:12:56 +0800 Subject: [PATCH 017/101] =?UTF-8?q?feat(transport):=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=95=B0=E6=8D=AE-=E8=BF=90=E8=90=A5=E6=95=B0=E6=8D=AE-?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 /vehicle/export 导出接口(GET/POST,兼容前端 download 工具), 复用列表查询条件与数据权限,不分页导出全量数据为 xlsx; 新增 VehicleExportVO 导出对象(40列,状态字段转中文)。 --- .../vehicle/VehicleApplicationService.java | 28 +++ .../dto/vehicle/VehicleExportVO.java | 178 ++++++++++++++++++ .../interfaces/facade/vehicle/VehicleApi.java | 32 ++++ 3 files changed, 238 insertions(+) create mode 100644 mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java index b3e4d2147..5f306f16d 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java @@ -32,6 +32,7 @@ import com.linke.transport.interfaces.assemble.vehicle.VehicleAssembler; import com.mhd.common.core.constant.Constants; import com.mhd.common.core.domain.dto.SyncTmsVehicleDTO; import com.linke.transport.interfaces.dto.vehicle.VehicleDto; +import com.linke.transport.interfaces.dto.vehicle.VehicleExportVO; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueField; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueMethod; import com.mhd.common.core.constant.NoticeConstants; @@ -238,6 +239,33 @@ public class VehicleApplicationService { return vehiclePos; } + /** + * 构建车辆管理导出数据(不分页,按列表查询条件导出) + * + * @param vehiclePo 查询条件 + * @param dataPermission 数据权限 + * @return 导出数据 + */ + public List buildExportList(VehiclePo vehiclePo, DataPermission dataPermission) { + List vehiclePos = selectVehicleList(vehiclePo, dataPermission); + List exportList = new ArrayList<>(); + if (CollUtil.isEmpty(vehiclePos)) { + return exportList; + } + for (VehiclePo po : vehiclePos) { + VehicleExportVO vo = new VehicleExportVO(); + BeanUtils.copyProperties(po, vo); + // 司机名称集合拼接为字符串(List与String类型不匹配,copyProperties不会复制,需手动设置) + if (CollUtil.isNotEmpty(po.getDriverNames())) { + vo.setDriverNames(String.join(",", po.getDriverNames())); + } + // 所属组织与归属组织一致 + vo.setBelongOrganizationName(po.getOrganizationName()); + exportList.add(vo); + } + return exportList; + } + /** * 查询未绑定车辆列表 * diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java new file mode 100644 index 000000000..b98554e7c --- /dev/null +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleExportVO.java @@ -0,0 +1,178 @@ +package com.linke.transport.interfaces.dto.vehicle; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 车辆管理导出对象(基础数据-运营数据-车辆管理列表,列顺序与页面列表一致) + * + * @author gen + */ +@Data +@ApiModel(value = "车辆管理导出对象", description = "车辆管理导出对象") +public class VehicleExportVO implements Serializable +{ + private static final long serialVersionUID = 1L; + + @Excel(name = "车辆主体", readConverterExp = "1=主车,2=挂车") + @ApiModelProperty(name = "车辆主体(1-主车,2-挂车)") + private Integer vehicleBody; + + @Excel(name = "车牌号码") + @ApiModelProperty(name = "车牌号码") + private String vehicleLicensePlateNumber; + + @Excel(name = "跨境车牌") + @ApiModelProperty(name = "跨境车牌") + private String crossPlate; + + @Excel(name = "车辆类型") + @ApiModelProperty(name = "车辆类型") + private String vehicleTypeName; + + @Excel(name = "类型", readConverterExp = "0=自由车辆,1=社会车辆") + @ApiModelProperty(name = "类型(车辆来源)") + private Integer vehicleSource; + + @Excel(name = "部门") + @ApiModelProperty(name = "部门") + private String departmentName; + + @Excel(name = "车辆认证", readConverterExp = "0=无状态,1=未认证,2=等待审核,3=已通过,4=已驳回") + @ApiModelProperty(name = "车辆认证状态") + private Integer authenticationStatus; + + @Excel(name = "司机姓名") + @ApiModelProperty(name = "司机姓名(多个以逗号分隔)") + private String driverNames; + + @Excel(name = "副驾1") + @ApiModelProperty(name = "副驾1") + private String pilot1; + + @Excel(name = "副驾2") + @ApiModelProperty(name = "副驾2") + private String pilot2; + + @Excel(name = "车队名称") + @ApiModelProperty(name = "车队名称") + private String motorcadeName; + + @Excel(name = "年检有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "年检有效期") + private Date annualValidityPeriod; + + @Excel(name = "保险有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "保险有效期") + private Date insuranceValidityPeriod; + + @Excel(name = "运载状态", readConverterExp = "0=无状态,1=空载,2=负载") + @ApiModelProperty(name = "运载状态") + private Integer carryStatus; + + @Excel(name = "使用性质") + @ApiModelProperty(name = "使用性质") + private String vehicleUseNature; + + @Excel(name = "总质量(kg)") + @ApiModelProperty(name = "总质量(kg)") + private BigDecimal vehicleTotalMass; + + @Excel(name = "核定载质量(kg)") + @ApiModelProperty(name = "核定载质量(kg)") + private BigDecimal vehicleApprovedLoadQuantity; + + @Excel(name = "车轴数") + @ApiModelProperty(name = "车轴数") + private String otherAxlesNumberName; + + @Excel(name = "车长(米)") + @ApiModelProperty(name = "车长(米)") + private String otherCarLengthName; + + @Excel(name = "容积(方)") + @ApiModelProperty(name = "容积(方)") + private String otherVehicleVolumeName; + + @Excel(name = "车牌颜色") + @ApiModelProperty(name = "车牌颜色") + private String otherLicensePlateColorName; + + @Excel(name = "行驶证有效期限", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "行驶证有效期限") + private Date vehicleCheckoutPeriodValidity; + + @Excel(name = "道路运输证号") + @ApiModelProperty(name = "道路运输证号") + private String roadTransportCertificateNo; + + @Excel(name = "道路运输证有效期限", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "道路运输证有效期限") + private Date roadTransportCertificateExpireDate; + + @Excel(name = "道路运输证校验状态", readConverterExp = "0=无状态,1=未核验,2=核验通过,3=核验失败") + @ApiModelProperty(name = "道路运输证校验状态") + private Integer roadTransportCertificateCheckoutStatus; + + @Excel(name = "经营许可证号") + @ApiModelProperty(name = "经营许可证号") + private String businessLicenseNumber; + + @Excel(name = "经营许可证业户名称") + @ApiModelProperty(name = "经营许可证业户名称") + private String specializedHouseholdsName; + + @Excel(name = "道路运输经营许可证有效期", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "道路运输经营许可证有效期(截止日期)") + private Date businessLicenseExpireEndDate; + + @Excel(name = "经营许可证校验状态", readConverterExp = "0=无状态,1=未核验,2=核验通过,3=核验失败") + @ApiModelProperty(name = "经营许可证校验状态") + private Integer businessLicenseCheckoutStatus; + + @Excel(name = "入网校验状态", readConverterExp = "0=无状态,1=未核验,2=已入网,3=未入网") + @ApiModelProperty(name = "入网校验状态") + private Integer netInStatus; + + @Excel(name = "入网查询时间", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "入网查询时间") + private Date netInDate; + + @Excel(name = "使用状态", readConverterExp = "0=无状态,1=正常,2=黑名单") + @ApiModelProperty(name = "使用状态") + private Integer useStatus; + + @Excel(name = "归属组织") + @ApiModelProperty(name = "归属组织") + private String organizationName; + + @Excel(name = "添加人员") + @ApiModelProperty(name = "添加人员") + private String createByName; + + @Excel(name = "添加时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(name = "添加时间") + private Date createTime; + + @Excel(name = "审核人员") + @ApiModelProperty(name = "审核人员") + private String checkoutPersonName; + + @Excel(name = "审核时间", width = 20, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(name = "审核时间") + private Date checkoutDate; + + @Excel(name = "更新时间", width = 25, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(name = "更新时间") + private Date updateTime; + + @Excel(name = "所属组织") + @ApiModelProperty(name = "所属组织(与归属组织一致)") + private String belongOrganizationName; +} diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java index 661c393d5..cbd1f33b7 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java @@ -9,6 +9,7 @@ import com.linke.transport.domain.vehicle.repository.po.VehiclePo; import com.linke.transport.interfaces.assemble.vehicle.VehicleAssembler; import com.mhd.common.core.domain.dto.SyncTmsVehicleDTO; import com.linke.transport.interfaces.dto.vehicle.VehicleDto; +import com.linke.transport.interfaces.dto.vehicle.VehicleExportVO; import com.mhd.common.core.domain.dto.StatisticalMattersDTO; import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.domain.todo.StatisticalMattersDo; @@ -16,6 +17,7 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; import com.mhd.common.core.utils.IgnoreNullUtil; import com.mhd.common.core.utils.bean.BeanUtils; +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; @@ -28,6 +30,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; import java.util.List; /** @@ -65,6 +70,33 @@ public class VehicleApi extends BaseController return getDataTable(list); } + /** + * 导出车辆管理列表 + */ + @Log(title = "车辆管理-导出", description = "导出车辆管理列表", businessType = BusinessType.EXPORT) + @ApiOperation("导出车辆管理列表") + // 同时支持 GET(query 参数)与 POST(form 表单,兼容前端 this.download() 工具) + @RequestMapping(value = "/export", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + public void export(VehicleDto vehicleDto, HttpServletResponse response) throws IOException + { + VehiclePo vehiclePo = new VehiclePo(); + //转换实体 + BeanUtils.copyProperties(vehicleDto, vehiclePo); + //判断当前登录人数据权限 + DataPermission dataPermission = commonApplicationService.dataPermission(vehiclePo.getPermissionMenuId()); + //查询全量(不分页) + List list = vehicleApplicationService.buildExportList(vehiclePo, dataPermission); + + //设置下载头,防止浏览器乱码 + 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<>(VehicleExportVO.class); + util.exportExcel(response, list, "车辆管理数据"); + } + /** * 车辆绑定副驾 */ From 7a01315ca8510bffca30199219f88d02a9f86d58 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 28 Aug 2026 16:17:48 +0800 Subject: [PATCH 018/101] =?UTF-8?q?feat(sys)=EF=BC=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=BC=98=E5=8C=96=E4=B8=8E=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpenseAccountExportVO.java | 93 +++++++------------ 1 file changed, 32 insertions(+), 61 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java index a7d59ebaf..31f09e3fc 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountExportVO.java @@ -15,53 +15,30 @@ import java.util.Date; @Data public class ExpenseAccountExportVO { - @Excel(name = "组织名称") - private String organizationName; - - @Excel(name = "科目编码") - private String subjectCode; - - @Excel(name = "科目名称") - private String subjectName; - - @Excel(name = "显示顺序") - private Integer showSeq; - - @Excel(name = "计费属性") - private String billingAttributes; - - @Excel(name = "所属模块") - private String belongModule; - - @Excel(name = "是否一级科目", readConverterExp = "1=是,2=否") - private Integer firstSubjectFlag; - - @Excel(name = "上级科目编码") - private String upperSubjectCode; - - @Excel(name = "上级科目名称") - private String upperSubject; - - @Excel(name = "科目类型", readConverterExp = "1=系统科目,2=非系统科目") - private Integer accountType; - - @Excel(name = "收支类型", readConverterExp = "1=收入,2=支出") - private Integer accountExpenseType; - - @Excel(name = "服务项编码") - private String serviceItemsCode; - - @Excel(name = "服务项名称") + /** 费用类别(关联服务项名称) */ + @Excel(name = "费用类别") private String serviceItemsName; - @Excel(name = "服务项税率") + @Excel(name = "上级科目") + private String upperSubject; + + @Excel(name = "费用代码") + private String subjectCode; + + @Excel(name = "费用名称") + private String subjectName; + + @Excel(name = "税率") private BigDecimal taxRate; - @Excel(name = "费率") - private BigDecimal rate; + @Excel(name = "创建订单固定显示", readConverterExp = "0=否,1=是") + private Integer fixedOrderDisplay; - @Excel(name = "启用状态", readConverterExp = "1=启用,2=停用") - private Integer status; + @Excel(name = "入库显示", readConverterExp = "0=否,1=是") + private Integer inOrderDisplay; + + @Excel(name = "出库显示", readConverterExp = "0=否,1=是") + private Integer outOrderDisplay; @Excel(name = "自有车辆固定显示", readConverterExp = "1=是,2=否") private Integer ownStatus; @@ -69,30 +46,24 @@ public class ExpenseAccountExportVO { @Excel(name = "社会车辆固定显示", readConverterExp = "1=是,2=否") private Integer societyStatus; - @Excel(name = "创建订单固定显示", readConverterExp = "0=否,1=是") - private Integer fixedOrderDisplay; - - @Excel(name = "入库单固定显示", readConverterExp = "0=否,1=是") - private Integer inOrderDisplay; - - @Excel(name = "出库单固定显示", readConverterExp = "0=否,1=是") - private Integer outOrderDisplay; - - @Excel(name = "计费单位") - private String billingUnit; - - @Excel(name = "计费单位2") - private String billingUnit2; - - @Excel(name = "NC科目编码") - private String ncSubjectCode; - - @Excel(name = "备注") + @Excel(name = "备注信息") private String remark; + @Excel(name = "状态", readConverterExp = "1=启用,2=停用") + private Integer status; + @Excel(name = "创建人") private String createByName; @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date createTime; + + @Excel(name = "更新人") + private String updateByName; + + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @Excel(name = "所属组织") + private String organizationName; } From 06cf5ce8619b8ff3e8a8dd5974d191eea09834de Mon Sep 17 00:00:00 2001 From: zhaoqing <3160641494@qq.com> Date: Fri, 28 Aug 2026 16:22:28 +0800 Subject: [PATCH 019/101] =?UTF-8?q?fix(oms):=E6=98=8E=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po/ExecutionOutMaterialDetailWithOrderPO.java | 7 +++++++ .../ExecutionOutMaterialDetailMapper.xml | 4 ++++ 2 files changed, 11 insertions(+) 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 6cc1c9823..8534f26b5 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 @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import java.math.BigDecimal; import java.util.Date; /** @@ -41,4 +42,10 @@ public class ExecutionOutMaterialDetailWithOrderPO extends ExecutionOutMaterialD @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date orderOutboundTime; + + @ApiModelProperty("保额") + private BigDecimal insureAmount; + + @ApiModelProperty("货物类型:0-物料 1-半成品 2-成品") + private Integer goodsType; } diff --git a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml index 8fd4090a8..6f7068f7a 100644 --- a/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml +++ b/mhd_oms/src/main/resources/mapper/executionOutMaterialDetail/ExecutionOutMaterialDetailMapper.xml @@ -459,6 +459,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + select IFNULL(SUM(a.storage_region), 0) + from storage_section a + LEFT JOIN warehouse w ON a.warehouse_id = w.warehouse_id AND w.del_flag = 1 + + \ No newline at end of file From 8a9bbb3cef503e8af64f8bc043732a5312619a4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Mon, 31 Aug 2026 09:33:58 +0800 Subject: [PATCH 024/101] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-auth/src/main/resources/bootstrap.yml | 8 ++++---- mhd-gateway/src/main/resources/bootstrap.yml | 8 ++++---- .../mhd-system/src/main/resources/bootstrap.yml | 8 ++++---- mhd-user-center/src/main/resources/bootstrap.yml | 10 ++++------ mhd_bms/src/main/resources/bootstrap.yml | 10 ++++------ mhd_finance/src/main/resources/bootstrap.yml | 10 ++++------ mhd_product/src/main/resources/bootstrap.yml | 8 ++++---- mhd_thrid_party/src/main/resources/bootstrap.yml | 10 ++++------ mhd_transport/src/main/resources/bootstrap.yml | 10 ++++------ 9 files changed, 36 insertions(+), 46 deletions(-) diff --git a/mhd-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index cc317d58e..82b5aa50d 100644 --- a/mhd-auth/src/main/resources/bootstrap.yml +++ b/mhd-auth/src/main/resources/bootstrap.yml @@ -12,10 +12,10 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # 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 #线上正式环境 @@ -23,8 +23,8 @@ spring: # username: nacos # password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 - server-addr: 10.102.192.31:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.31:6848 # 测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 5a4743585..65f8dd835 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -13,15 +13,15 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - server-addr: 10.102.192.30:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.30:6848 # server-addr: 10.33.0.129:6010 username: nacos password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index b1b1ca982..dc450c4ce 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -13,17 +13,17 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index dd13bfba5..a66be4688 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -18,17 +18,15 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # 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 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # 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 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd_bms/src/main/resources/bootstrap.yml b/mhd_bms/src/main/resources/bootstrap.yml index 1b1edd68f..72c069a36 100644 --- a/mhd_bms/src/main/resources/bootstrap.yml +++ b/mhd_bms/src/main/resources/bootstrap.yml @@ -16,17 +16,15 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # 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 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # 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 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 diff --git a/mhd_finance/src/main/resources/bootstrap.yml b/mhd_finance/src/main/resources/bootstrap.yml index cf943f83f..db668125b 100644 --- a/mhd_finance/src/main/resources/bootstrap.yml +++ b/mhd_finance/src/main/resources/bootstrap.yml @@ -18,17 +18,15 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 -# 线上测试环境配置 容器名+端口号 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 521cfaa6f..8e302d143 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -18,18 +18,18 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # 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.33.0.129:6010 # config: -# server-addr: 127.0.0.1:8848 + server-addr: 127.0.0.1:8848 # 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 #线上正式环境 diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index e93b1f240..bdc9a37f6 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/src/main/resources/bootstrap.yml @@ -18,16 +18,14 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 127.0.0.1:8848 +# server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 127.0.0.1:8848 +# server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 diff --git a/mhd_transport/src/main/resources/bootstrap.yml b/mhd_transport/src/main/resources/bootstrap.yml index 99a170008..1bdedb7d4 100644 --- a/mhd_transport/src/main/resources/bootstrap.yml +++ b/mhd_transport/src/main/resources/bootstrap.yml @@ -18,10 +18,9 @@ spring: cloud: nacos: discovery: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置使用ip+端口号 + server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -31,9 +30,8 @@ spring: #线上正式环境 # server-addr: 10.102.192.105:6848 config: -# server-addr: 127.0.0.1:8848 - # 线上测试环境配置使用ip+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 127.0.0.1:8848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 2781f0d8d9b2b09e07505b8e154dbe7393e0edb6 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Mon, 31 Aug 2026 10:17:53 +0800 Subject: [PATCH 025/101] =?UTF-8?q?feat(oms):=E5=BA=93=E5=AD=98=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=AF=BC=E5=87=BA=E6=96=B0=E5=A2=9E=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=B8=BA0=E6=98=AF=E5=90=A6=E5=AF=BC=E5=87=BA=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20/reservationMaterialInventoryApi/list=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8F=AF=E9=80=89=E5=8F=82=E6=95=B0=20excludeZeroInve?= =?UTF-8?q?ntoryQuantity=EF=BC=8C=E5=89=8D=E7=AB=AF"=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E4=B8=BA0=E6=98=AF=E5=90=A6=E5=AF=BC=E5=87=BA"=E9=80=89"?= =?UTF-8?q?=E6=98=AF"=E6=97=B6=E4=BC=A0=20true=EF=BC=8CSQL=20=E4=BB=A5=20H?= =?UTF-8?q?AVING=20IFNULL(SUM(inventory=5Fquantity),0)>0=20=E6=8E=92?= =?UTF-8?q?=E9=99=A4=E6=B1=87=E6=80=BB=E5=BA=93=E5=AD=98=E4=B8=BA0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=EF=BC=9B=E6=89=80=E6=9C=89=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=BB=B4=E5=BA=A6(all/hz/wl/kw/wlkw/wlExpiry)?= =?UTF-8?q?=E5=85=B16=E6=9D=A1=E6=9F=A5=E8=AF=A2=E5=9C=A8=20GROUP=20BY=20?= =?UTF-8?q?=E5=90=8E=E7=BB=9F=E4=B8=80=E6=8C=82=E8=BD=BD=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E7=89=87=E6=AE=B5=20excludeZeroInventoryHaving=EF=BC=8C?= =?UTF-8?q?=E4=B8=8E=20sort=5Forder=20=E5=AF=B90=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E5=AE=9A=E4=B9=89=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= =?UTF-8?q?=EF=BC=9B=E4=B8=8D=E4=BC=A0=E5=8F=82=E6=95=B0=E6=97=B6=20SQL=20?= =?UTF-8?q?=E4=B8=8D=E6=8B=BC=E6=8E=A5=E6=9D=A1=E4=BB=B6=EF=BC=8C=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E4=B8=8E=E5=8E=9F=E6=9D=A5=E5=AE=8C=E5=85=A8=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/ReservationMaterialInventoryDO.java | 3 +++ .../ReservationMaterialInventoryApi.java | 6 +++++- .../MaterialInventoryMapper.xml | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java index c31872418..c3985e908 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java @@ -258,4 +258,7 @@ public class ReservationMaterialInventoryDO extends MaterialBaseDO { @ApiModelProperty("导出按到期日分组排序标识:仅 queryRule=wlExpiry 时生效,true-到期日倒序(日期近的在前、空值最后、0库存靠后);不传-保持原有排序") private Boolean orderByExpiryDate; + + @ApiModelProperty("导出排除库存为0标识:true-排除库存数量汇总为0的数据(所有查询维度 queryRule 均生效);不传-不过滤") + private Boolean excludeZeroInventoryQuantity; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java index 7d1368cf8..8e124d521 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java @@ -47,12 +47,13 @@ public class ReservationMaterialInventoryApi extends BaseController { /** * 分页查询物料库存列表 */ - @ApiOperation("查询物料库存列表") + @ApiOperation(value = "查询物料库存列表", notes = "导出复用本接口,任意查询维度(queryRule)下:前端\"库存为0是否导出\"选\"是\"时传 excludeZeroInventoryQuantity=true 排除库存为0的数据,不传或 false 导出全部(含库存为0);orderByExpiryDate=true 时按到期日分组排序") @GetMapping("/list") public TableDataInfo list(ReservationMaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName, @RequestParam(value = "expiryDateStart", required = false) String expiryDateStart, @RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd, + @RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity, @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate) { // 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配) @@ -86,6 +87,9 @@ public class ReservationMaterialInventoryApi extends BaseController { // 导出场景:queryRule=wlExpiry + orderByExpiryDate=true 时 SQL 按到期日倒序分组 // (日期近的在前、空值最后、0库存靠后、同到期日按更新时间倒序) materialInventoryDO.setOrderByExpiryDate(orderByExpiryDate); + // 导出场景:前端"库存为0是否导出"选"是"时传 excludeZeroInventoryQuantity=true, + // SQL 用 HAVING 排除汇总库存为0的数据(与 WMS 同名参数语义一致) + materialInventoryDO.setExcludeZeroInventoryQuantity(excludeZeroInventoryQuantity); startPage(); // 使用带批次属性的查询方法,批次属性值从库存表中获取 List list = materialInventoryApplicationService.queryListWithBatchAttributes(materialInventoryDO); diff --git a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml index 0297f8a29..10b846bf0 100644 --- a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml @@ -282,6 +282,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ + + + HAVING IFNULL(SUM(a.inventory_quantity), 0) > 0 + + + @@ -369,6 +381,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.MATERIAL_BASE_INFO_ID, a.EXPIRY_DATE, a.shipper_id, a.shipper_code, a.shipper_name, a.organization_id, a.organization_name, a.top_organization_id, b.material_code, b.material_name + @@ -394,6 +407,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
GROUP BY a.SHIPPER_ID + From 2d1e4b5912355a42d51eca45f21be8648d7e08bf Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Mon, 31 Aug 2026 11:15:41 +0800 Subject: [PATCH 026/101] =?UTF-8?q?feat(oms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=8C=89=E7=BC=96=E5=8F=B7=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=90=8D=E7=A7=B0=E5=B9=B6=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=AE=A2=E6=88=B7/=E7=89=A9=E6=96=99=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E6=A8=A1=E6=9D=BF=E5=88=97=E4=BD=8D=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8A=A8=E6=80=81=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 需求:①入库业务单导入模板只填物料编号+客户编号,物料名称/客户名称按编号自动匹配库中数据 ②③出库导入校验客户/物料是否已存在,不存在提示"进行维护" ④库中查询结果为空(确无数据)时报错 一、入库导入(ReservationStockInOrderImpl.parseStockInExcel): 1. 物料逐编号查库,缺失料号收集后一次性报错"物料[xx]不存在,请先维护物料信息后再导入" 2. 明细新增客户编号:去重后查库,为空报错"客户[编号]不存在,请先维护客户信息后再导入"; 查到则以该客户为单据货主并自动匹配名称;与物料归属货主不一致时拦截并提示两者编号 3. 明细回填库中物料名称;未填客户编号时维持原"货主取自物料"逻辑,兼容老模板 二、出库导入(parseExcelFile): 1. 物料/客户校验前移到落库前(原为先落库后查客户,报错会留半截数据) 2. 物料查不到收集后报错维护提示;客户查不到报错维护提示,客户ID/名称改取库中匹配值 (替换仅返回id且查不到时静默存null的queryShipperId) 3. 產品編號/客户編号漏填的行直接报错提示补全 三、模板解析改为按列头文字动态定位列(繁简体归一化),列/行顺序调整不影响解析, 识别不到时回落老模板固定列位,老模板行为不变: 1. StockInExcelListener(入库):以產品編號为锚点识别列头行,新增客戶編號列支持 2. DynamicDeliveryExcelListener(出库):左右分栏各自锚点识别;送货日期/线号/车次/ 发票张数/小计/纪录合共改按标签文字定位,行号列号不再写死 四、Mapper:ReservationStockOutOrderMapper新增queryCustomerByCode(按组织查询, USER_MEMBER_CODE或USER_SHIPPER.CUSTOMER_NC_CODE任一命中),删除queryShipperId --- .../DynamicDeliveryExcelListener.java | 517 ++++++++++++------ .../listener/StockInExcelListener.java | 246 +++++++-- .../ReservationStockInOrderImpl.java | 184 +++++-- .../repository/vo/StockInHeader.java | 20 + .../repository/vo/StockInProductDetail.java | 14 +- .../ReservationStockOutOrderMapper.java | 8 +- .../ReservationStockOutOrderMapper.xml | 12 +- 7 files changed, 751 insertions(+), 250 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java index 9b898afb5..07ae79d33 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java @@ -21,20 +21,47 @@ import java.util.Map; /** * 维他奶出库Excel解析监听器(新模板版) * 新模板特点:货品明细与客户配送明细左右分栏展示 - * 核心功能: - * 1. 左侧栏:第1-3行解析表头(送货日期/送货线号/车次),第5行解析纪录合共,第7行起解析货品明细 - * 2. 右侧栏:第2行解析发票张数/小计,第4行起解析客户配送明细 - * 3. 自动处理文本型数字转换(String→Integer/BigDecimal) - * 4. 完整的异常处理和日志记录 + * 核心功能(行列位置均不写死,模板调整行/列顺序不影响解析): + * 1. 表头标签(送货日期/送货线号/车次/发票张数/小计/纪录合共):按标签文字定位标签所在列,取右侧相邻列的值 + * 2. 货品明细:按列头文字(貨品編號/簡稱/箱/支等,繁简体归一化)定位各列,列头行之后的行按数据解析 + * 3. 客户配送明细:按列头文字(類别/發票編號/客户編號/名稱/箱/包/金額等)定位各列 + * 4. 列头行识别失败时兜底:按老模板固定布局(左栏A-D列、右栏F-L列、行号1-7)解析,保证老模板不受影响 + * 5. 自动处理文本型数字转换(String→Integer/BigDecimal) */ public class DynamicDeliveryExcelListener extends AnalysisEventListener> { // 日志实例 private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDeliveryExcelListener.class); - // 关键字定义(Excel标签匹配) - private static final String KEYWORD_TOTAL_RECORD = "紀錄合共"; - private static final String KEYWORD_INVOICE_COUNT = "發票張數"; - private static final String KEYWORD_SUBTOTAL = "小計"; + // ---------------------- 关键字/列头别名定义(归一化后匹配,兼容简繁体) ---------------------- + // 表头标签关键字 + private static final String[] KEYWORD_DELIVERY_DATE = {"送货日期"}; + private static final String[] KEYWORD_DELIVERY_LINE = {"送货线号", "送货线路"}; + private static final String[] KEYWORD_TRAIN = {"车次"}; + private static final String[] KEYWORD_TOTAL_RECORD = {"纪录合共"}; + private static final String[] KEYWORD_INVOICE_COUNT = {"发票张数"}; + private static final String[] KEYWORD_SUBTOTAL = {"小计"}; + + // 货品明细列头别名 + private static final String[] PRODUCT_CODE_ALIASES = {"货品编号", "产品编号", "物料编号", "货品编码", "产品编码", "物料编码", "料号"}; + private static final String[] PRODUCT_NAME_ALIASES = {"简称", "货品名称", "产品名称", "物料名称", "品名", "名称"}; + private static final String[] PRODUCT_BOX_ALIASES = {"箱数", "箱"}; + private static final String[] PRODUCT_PIECE_ALIASES = {"支数", "件数", "支"}; + + // 客户配送明细列头别名 + private static final String[] CATEGORY_ALIASES = {"类别"}; + private static final String[] INVOICE_NO_ALIASES = {"发票编号", "发票号", "发票"}; + private static final String[] CUSTOMER_CODE_ALIASES = {"客户编号", "客户编码", "客户代码"}; + private static final String[] CUSTOMER_NAME_ALIASES = {"客户名称", "名称"}; + private static final String[] CUSTOMER_BOX_ALIASES = {"箱数", "箱"}; + private static final String[] CUSTOMER_PACKAGE_ALIASES = {"包数", "包"}; + private static final String[] CUSTOMER_AMOUNT_ALIASES = {"金额", "总额"}; + + // 列头行认定门槛:锚点列(编号列)必须识别到,且识别列总数达标,防止数据行误判为列头行 + private static final int HEADER_MIN_MATCH_COUNT = 2; + // 老模板兜底:货品明细数据固定从第7行、客户配送明细数据固定从第4行开始(列头未识别到时启用固定列位) + private static final int PRODUCT_DATA_START_ROW = 7; + private static final int CUSTOMER_DATA_START_ROW = 4; + // 支持的日期格式(String转Date) private static final String[] SUPPORTED_DATE_FORMATS = {"yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "yyyy-MM-dd HH:mm:ss"}; @@ -43,6 +70,26 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener productDetailList = new ArrayList<>(); private final List customerDeliveryDetailList = new ArrayList<>(); + // 货品明细列索引(-1表示未识别该列) + private int productCodeCol = -1; + private int productNameCol = -1; + private int productBoxCol = -1; + private int productPieceCol = -1; + private boolean productColumnsResolved = false; + + // 客户配送明细列索引(-1表示未识别该列) + private int categoryCol = -1; + private int invoiceNoCol = -1; + private int customerCodeCol = -1; + private int customerNameCol = -1; + private int customerBoxCol = -1; + private int customerPackageCol = -1; + private int customerAmountCol = -1; + private boolean customerColumnsResolved = false; + + // 发票张数/小计行是否已解析 + private boolean invoiceRowParsed = false; + // 当前行号(1-based,与Excel行号一致) private int currentRowNum = 0; @@ -53,10 +100,10 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data) { - switch (currentRowNum) { - case 1: - // 第1行:送货日期(A列=标签,B列=值) - parseDeliveryDate(data); - break; - case 2: - // 第2行:送货线号(A列=标签,B列=值) - parseDeliveryLineNo(data); - break; - case 3: - // 第3行:车次(A列=标签,B列=值) - parseTrainNumber(data); - break; - case 4: - // 第4行:货品明细标题行,无需解析 - LOGGER.debug("第{}行:货品明细标题行,跳过", currentRowNum); - break; - case 5: - // 第5行:纪录合共(A列=标签,B列=总记录数,D列=总箱数,E列=总支数) - parseTotalRecord(data); - break; - case 6: - // 第6行:货品明细列标题(貨品編號/簡稱/箱/支),跳过 - LOGGER.debug("第{}行:货品明细列标题行,跳过", currentRowNum); - break; - default: - // 第7行起:货品明细数据行(遇到空行自动结束) - if (currentRowNum >= 7 && isValidProductDetailRow(data)) { - parseProductDetail(data, currentRowNum); - } - break; + // 1. 表头标签:送货日期/送货线号/车次(按标签文字定位,行位置不限) + parseHeaderLabels(data); + // 2. 纪录合共(按标签文字定位,行位置不限) + parseTotalRecord(data); + // 3. 货品明细:列布局已确定时按数据行解析 + if (productColumnsResolved) { + if (isValidProductDetailRow(data)) { + parseProductDetail(data, currentRowNum); + } + return; + } + // 4. 尝试识别货品明细列头行;识别成功则本行即列头行,跳过数据解析 + if (tryResolveProductColumns(data)) { + return; + } + // 5. 超过老模板数据起始行仍未识别到列头行:启用固定列位兜底,从当前行开始按数据行解析 + if (currentRowNum >= PRODUCT_DATA_START_ROW) { + applyProductFallbackColumns(); + if (isValidProductDetailRow(data)) { + parseProductDetail(data, currentRowNum); + } } } // ---------------------- 右侧区域解析(客户配送相关信息) ---------------------- private void parseRightSection(Map data) { - switch (currentRowNum) { - case 1: - // 第1行:客户配送明细标题行,无需解析 - LOGGER.debug("第{}行:客户配送明细标题行,跳过", currentRowNum); - break; - case 2: - // 第2行:发票张数/小计(F列=發票張數标签,G列=数值;J列=小計标签,K/L/M列=数值) - parseInvoiceCount(data); - break; - case 3: - // 第3行:客户配送明细列标题(類别/發票編號/客户編號/名稱/箱/包/金額),跳过 - LOGGER.debug("第{}行:客户配送明细列标题行,跳过", currentRowNum); - break; - default: - // 第4行起:客户配送明细数据行(遇到空行自动结束) - if (currentRowNum >= 4 && isValidCustomerDetailRow(data)) { - parseCustomerDeliveryDetail(data, currentRowNum); - } - break; + // 1. 发票张数/小计(按标签文字定位,行位置不限,解析成功后不再重复解析) + if (!invoiceRowParsed) { + parseInvoiceRow(data); + } + // 2. 客户配送明细:列布局已确定时按数据行解析 + if (customerColumnsResolved) { + if (isValidCustomerDetailRow(data)) { + parseCustomerDeliveryDetail(data, currentRowNum); + } + return; + } + // 3. 尝试识别客户配送明细列头行;识别成功则本行即列头行,跳过数据解析 + if (tryResolveCustomerColumns(data)) { + return; + } + // 4. 超过老模板数据起始行仍未识别到列头行:启用固定列位兜底,从当前行开始按数据行解析 + if (currentRowNum >= CUSTOMER_DATA_START_ROW) { + applyCustomerFallbackColumns(); + if (isValidCustomerDetailRow(data)) { + parseCustomerDeliveryDetail(data, currentRowNum); + } } } // ---------------------- 解析完成回调 ---------------------- @Override public void doAfterAllAnalysed(AnalysisContext context) { + // 小计标签始终未识别到时保持与原逻辑一致:小计相关字段置0 + if (deliveryHeader.getSubtotalAmount() == null) { + LOGGER.warn("未找到【小计】标签,小计信息置空"); + deliveryHeader.setSubtotalBoxCount(0); + deliveryHeader.setSubtotalPieceCount(0); + deliveryHeader.setSubtotalAmount(BigDecimal.ZERO); + } LOGGER.info("Excel解析全部完成!最终统计结果:"); LOGGER.info("1. 表头信息:送货日期={},送货线号={},车次={},发票张数={},总记录数={},小计金额={}", deliveryHeader.getDeliveryDate(), @@ -144,47 +190,52 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data) { - Object value = getValueSafely(data, 1); // B列 - if (value != null) { - Date deliveryDate = convertToDate(value); - deliveryHeader.setDeliveryDate(deliveryDate); - LOGGER.debug("第{}行:送货日期解析完成,值={}", currentRowNum, deliveryDate); + // ---------------------- 左侧:表头信息解析(标签定位,行位置不限) ---------------------- + private void parseHeaderLabels(Map data) { + // 送货日期 + if (deliveryHeader.getDeliveryDate() == null) { + Integer keywordIndex = findKeywordIndex(data, KEYWORD_DELIVERY_DATE); + if (keywordIndex != null) { + Date deliveryDate = convertToDate(getValueSafely(data, keywordIndex + 1)); + if (deliveryDate != null) { + deliveryHeader.setDeliveryDate(deliveryDate); + LOGGER.debug("第{}行:送货日期解析完成,值={}", currentRowNum, deliveryDate); + } + } + } + // 送货线号 + if (deliveryHeader.getDeliveryLineNo() == null || deliveryHeader.getDeliveryLineNo().trim().isEmpty()) { + Integer keywordIndex = findKeywordIndex(data, KEYWORD_DELIVERY_LINE); + if (keywordIndex != null) { + Object value = getValueSafely(data, keywordIndex + 1); + if (value != null && !value.toString().trim().isEmpty()) { + deliveryHeader.setDeliveryLineNo(value.toString().trim()); + LOGGER.debug("第{}行:送货线号解析完成,值={}", currentRowNum, deliveryHeader.getDeliveryLineNo()); + } + } + } + // 车次 + if (deliveryHeader.getTrainNumber() == null) { + Integer keywordIndex = findKeywordIndex(data, KEYWORD_TRAIN); + if (keywordIndex != null) { + deliveryHeader.setTrainNumber(convertToInteger(getValueSafely(data, keywordIndex + 1))); + LOGGER.debug("第{}行:车次解析完成,值={}", currentRowNum, deliveryHeader.getTrainNumber()); + } } } - private void parseDeliveryLineNo(Map data) { - Object value = getValueSafely(data, 1); // B列 - if (value != null) { - String deliveryLineNo = value.toString().trim(); - deliveryHeader.setDeliveryLineNo(deliveryLineNo); - LOGGER.debug("第{}行:送货线号解析完成,值={}", currentRowNum, deliveryLineNo); - } - } - - private void parseTrainNumber(Map data) { - Object value = getValueSafely(data, 1); // B列 - Integer trainNumber = convertToInteger(value); - deliveryHeader.setTrainNumber(trainNumber); - LOGGER.debug("第{}行:车次解析完成,值={}", currentRowNum, trainNumber); - } - - // ---------------------- 左侧:纪录合共解析 ---------------------- + // ---------------------- 左侧:纪录合共解析(标签定位,行位置不限) ---------------------- /** - * 第5行:纪录合共 - * 列对应关系:0=A列=紀錄合共标签,1=B列=总记录数,3=D列=总箱数,4=E列=总支数 + * 纪录合共:标签右侧第1列=总记录数,第3列=总箱数,第4列=总支数(与老模板B/D/E列偏移一致) */ private void parseTotalRecord(Map data) { - Object totalRecordLabel = getValueSafely(data, 0); - if (totalRecordLabel == null || !totalRecordLabel.toString().trim().contains(KEYWORD_TOTAL_RECORD)) { - LOGGER.warn("第{}行:不是纪录合共行,跳过解析,第一列内容:{}", currentRowNum, totalRecordLabel); + Integer keywordIndex = findKeywordIndex(data, KEYWORD_TOTAL_RECORD); + if (keywordIndex == null) { return; } - - Integer totalRecordCount = convertToInteger(getValueSafely(data, 1)); // B列 - Integer totalBoxCount = convertToInteger(getValueSafely(data, 3)); // D列 - Integer totalPieceCount = convertToInteger(getValueSafely(data, 4)); // E列 + Integer totalRecordCount = convertToInteger(getValueSafely(data, keywordIndex + 1)); + Integer totalBoxCount = convertToInteger(getValueSafely(data, keywordIndex + 3)); + Integer totalPieceCount = convertToInteger(getValueSafely(data, keywordIndex + 4)); deliveryHeader.setTotalRecordCount(totalRecordCount); deliveryHeader.setTotalBoxCount(totalBoxCount); @@ -194,27 +245,66 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data) { - Object productCode = getValueSafely(data, 0); // A列 - return productCode != null - && !productCode.toString().trim().isEmpty() - && !"貨品編號".equals(productCode.toString().trim()); + private boolean tryResolveProductColumns(Map data) { + int codeCol = findColumnByAliases(data, PRODUCT_CODE_ALIASES); + if (codeCol < 0) { + return false; + } + int nameCol = findColumnByAliases(data, PRODUCT_NAME_ALIASES); + int boxCol = findColumnByAliases(data, PRODUCT_BOX_ALIASES); + int pieceCol = findColumnByAliases(data, PRODUCT_PIECE_ALIASES); + int matched = 1 + (nameCol >= 0 ? 1 : 0) + (boxCol >= 0 ? 1 : 0) + (pieceCol >= 0 ? 1 : 0); + if (matched < HEADER_MIN_MATCH_COUNT) { + return false; + } + productCodeCol = codeCol; + productNameCol = nameCol; + productBoxCol = boxCol; + productPieceCol = pieceCol; + productColumnsResolved = true; + LOGGER.info("第{}行识别为货品明细列头行,列映射:货品编号={},名称={},箱={},支={}", + currentRowNum, productCodeCol, productNameCol, productBoxCol, productPieceCol); + return true; } /** - * 解析货品明细(第7行起) - * 列对应关系:0=A列=貨品編號,1=B列=簡稱,2=C列=箱,3=D列=支 + * 兜底列位:老模板货品明细固定布局(0=A列=貨品編號,1=B列=簡稱,2=C列=箱,3=D列=支) + */ + private void applyProductFallbackColumns() { + productCodeCol = 0; + productNameCol = 1; + productBoxCol = 2; + productPieceCol = 3; + productColumnsResolved = true; + LOGGER.warn("第{}行前未识别到货品明细列头行,启用老模板固定列位兜底解析", currentRowNum); + } + + /** + * 校验货品明细行是否有效(排除列头行和空行) + */ + private boolean isValidProductDetailRow(Map data) { + Object productCode = getValueSafely(data, productCodeCol); + if (productCode == null || productCode.toString().trim().isEmpty()) { + return false; + } + // 列头文字本身不算数据行(防止列头行被当作数据重复解析) + String text = normalizeHeaderText(productCode); + return !matchesAny(text, PRODUCT_CODE_ALIASES); + } + + /** + * 解析货品明细(列头行之后的行) */ private void parseProductDetail(Map data, int rowNum) { ProductDetail productDetail = new ProductDetail(); - productDetail.setProductCode(convertToString(getValueSafely(data, 0))); - productDetail.setProductName(convertToString(getValueSafely(data, 1))); - productDetail.setBoxCount(convertToInteger(getValueSafely(data, 2))); - productDetail.setPieceCount(convertToInteger(getValueSafely(data, 3))); + productDetail.setProductCode(convertToString(getValueSafely(data, productCodeCol))); + productDetail.setProductName(convertToString(getValueSafely(data, productNameCol))); + productDetail.setBoxCount(convertToInteger(getValueSafely(data, productBoxCol))); + productDetail.setPieceCount(convertToInteger(getValueSafely(data, productPieceCol))); productDetailList.add(productDetail); LOGGER.debug("第{}行:解析货品明细完成,货品编号={},名称={},箱数={},支数={}", @@ -222,67 +312,105 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data) { - // 1. 定位并解析发票张数 - Integer invoiceCount = findValueAfterKeyword(data, KEYWORD_INVOICE_COUNT); - if (invoiceCount != null) { - deliveryHeader.setInvoiceCount(invoiceCount); + // ---------------------- 右侧:发票张数与小计解析(标签定位,行位置不限) ---------------------- + private void parseInvoiceRow(Map data) { + // 1. 发票张数:标签右侧相邻列 + Integer invoiceIndex = findKeywordIndex(data, KEYWORD_INVOICE_COUNT); + if (invoiceIndex != null) { + deliveryHeader.setInvoiceCount(convertToInteger(getValueSafely(data, invoiceIndex + 1))); } - // 2. 定位并解析小计(标签右侧第1列=箱,第2列=支,第3列=金额) - Integer subtotalStartIndex = findKeywordIndex(data, KEYWORD_SUBTOTAL); - if (subtotalStartIndex != null && subtotalStartIndex >= 0) { - Integer subtotalBoxCount = convertToInteger(getValueSafely(data, subtotalStartIndex + 1)); - Integer subtotalPieceCount = convertToInteger(getValueSafely(data, subtotalStartIndex + 2)); - BigDecimal subtotalAmount = convertToBigDecimal(getValueSafely(data, subtotalStartIndex + 3)); + // 2. 小计:标签右侧第1列=箱,第2列=支,第3列=金额 + Integer subtotalIndex = findKeywordIndex(data, KEYWORD_SUBTOTAL); + if (subtotalIndex != null && subtotalIndex >= 0) { + Integer subtotalBoxCount = convertToInteger(getValueSafely(data, subtotalIndex + 1)); + Integer subtotalPieceCount = convertToInteger(getValueSafely(data, subtotalIndex + 2)); + BigDecimal subtotalAmount = convertToBigDecimal(getValueSafely(data, subtotalIndex + 3)); deliveryHeader.setSubtotalBoxCount(subtotalBoxCount); deliveryHeader.setSubtotalPieceCount(subtotalPieceCount); deliveryHeader.setSubtotalAmount(subtotalAmount); + invoiceRowParsed = true; - LOGGER.debug("第{}行:解析小计完成,箱数={},支数={},金额={}", - currentRowNum, subtotalBoxCount, subtotalPieceCount, subtotalAmount); - } else { - LOGGER.warn("第{}行:未找到小计标签,小计信息置空", currentRowNum); - deliveryHeader.setSubtotalBoxCount(0); - deliveryHeader.setSubtotalPieceCount(0); - deliveryHeader.setSubtotalAmount(BigDecimal.ZERO); + LOGGER.debug("第{}行:解析发票张数行完成,发票张数={},小计箱数={},支数={},金额={}", + currentRowNum, deliveryHeader.getInvoiceCount(), subtotalBoxCount, subtotalPieceCount, subtotalAmount); } - - LOGGER.debug("第{}行:解析发票张数行完成,发票张数={},小计金额={}", - currentRowNum, deliveryHeader.getInvoiceCount(), deliveryHeader.getSubtotalAmount()); } - // ---------------------- 右侧:客户配送明细解析 ---------------------- + // ---------------------- 右侧:客户配送明细列头识别与数据解析 ---------------------- /** - * 校验客户配送明细行是否有效(排除表头和空行) + * 尝试将当前行识别为客户配送明细列头行:以客户编号列为锚点,按列头文字(简繁归一化)匹配各列 + */ + private boolean tryResolveCustomerColumns(Map data) { + int codeCol = findColumnByAliases(data, CUSTOMER_CODE_ALIASES); + if (codeCol < 0) { + return false; + } + int categoryColTmp = findColumnByAliases(data, CATEGORY_ALIASES); + int invoiceNoColTmp = findColumnByAliases(data, INVOICE_NO_ALIASES); + int nameColTmp = findColumnByAliases(data, CUSTOMER_NAME_ALIASES); + int boxColTmp = findColumnByAliases(data, CUSTOMER_BOX_ALIASES); + int packageColTmp = findColumnByAliases(data, CUSTOMER_PACKAGE_ALIASES); + int amountColTmp = findColumnByAliases(data, CUSTOMER_AMOUNT_ALIASES); + int matched = 1 + (categoryColTmp >= 0 ? 1 : 0) + (invoiceNoColTmp >= 0 ? 1 : 0) + (nameColTmp >= 0 ? 1 : 0) + + (boxColTmp >= 0 ? 1 : 0) + (packageColTmp >= 0 ? 1 : 0) + (amountColTmp >= 0 ? 1 : 0); + if (matched < HEADER_MIN_MATCH_COUNT) { + return false; + } + categoryCol = categoryColTmp; + invoiceNoCol = invoiceNoColTmp; + customerCodeCol = codeCol; + customerNameCol = nameColTmp; + customerBoxCol = boxColTmp; + customerPackageCol = packageColTmp; + customerAmountCol = amountColTmp; + customerColumnsResolved = true; + LOGGER.info("第{}行识别为客户配送明细列头行,列映射:类别={},发票编号={},客户编号={},名称={},箱={},包={},金额={}", + currentRowNum, categoryCol, invoiceNoCol, customerCodeCol, customerNameCol, customerBoxCol, customerPackageCol, customerAmountCol); + return true; + } + + /** + * 兜底列位:老模板客户配送明细固定布局(5=F列=類别,6=G列=發票編號,7=H列=客户編號,8=I列=名稱, + * 9=J列=箱,10=K列=包,11=L列=金額) + */ + private void applyCustomerFallbackColumns() { + categoryCol = 5; + invoiceNoCol = 6; + customerCodeCol = 7; + customerNameCol = 8; + customerBoxCol = 9; + customerPackageCol = 10; + customerAmountCol = 11; + customerColumnsResolved = true; + LOGGER.warn("第{}行前未识别到客户配送明细列头行,启用老模板固定列位兜底解析", currentRowNum); + } + + /** + * 校验客户配送明细行是否有效(排除列头行和空行) */ private boolean isValidCustomerDetailRow(Map data) { - Object category = getValueSafely(data, 5); // F列 - return category != null - && !category.toString().trim().isEmpty() - && !"類别".equals(category.toString().trim()); + Object category = getValueSafely(data, categoryCol); + if (category == null || category.toString().trim().isEmpty()) { + return false; + } + // 列头文字本身不算数据行(防止列头行被当作数据重复解析) + String text = normalizeHeaderText(category); + return !matchesAny(text, CATEGORY_ALIASES); } /** - * 解析客户配送明细(第4行起) - * 列对应关系:5=F列=類别,6=G列=發票編號,7=H列=客户編號,8=I列=名稱, - * 9=J列=箱,10=K列=包,11=L列=金額 + * 解析客户配送明细(列头行之后的行) */ private void parseCustomerDeliveryDetail(Map data, int rowNum) { CustomerDeliveryDetail customerDetail = new CustomerDeliveryDetail(); - customerDetail.setCategory(convertToString(getValueSafely(data, 5))); - customerDetail.setInvoiceNo(convertToString(getValueSafely(data, 6))); - customerDetail.setCustomerCode(convertToString(getValueSafely(data, 7))); - customerDetail.setCustomerName(convertToString(getValueSafely(data, 8))); - customerDetail.setBoxCount(convertToInteger(getValueSafely(data, 9))); - customerDetail.setPackageCount(convertToInteger(getValueSafely(data, 10))); - customerDetail.setAmount(convertToBigDecimal(getValueSafely(data, 11))); + customerDetail.setCategory(convertToString(getValueSafely(data, categoryCol))); + customerDetail.setInvoiceNo(convertToString(getValueSafely(data, invoiceNoCol))); + customerDetail.setCustomerCode(convertToString(getValueSafely(data, customerCodeCol))); + customerDetail.setCustomerName(convertToString(getValueSafely(data, customerNameCol))); + customerDetail.setBoxCount(convertToInteger(getValueSafely(data, customerBoxCol))); + customerDetail.setPackageCount(convertToInteger(getValueSafely(data, customerPackageCol))); + customerDetail.setAmount(convertToBigDecimal(getValueSafely(data, customerAmountCol))); customerDeliveryDetailList.add(customerDetail); LOGGER.debug("第{}行:解析客户配送明细完成,类别={},发票编号={},客户编号={},名称={},箱数={},包数={},金额={}", @@ -299,7 +427,7 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data, int columnIndex) { - if (data == null || data.isEmpty()) { + if (columnIndex < 0 || data == null || data.isEmpty()) { return null; } @@ -333,9 +461,9 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data, String keyword) { - if (data == null || data.isEmpty() || keyword == null) { + private Integer findKeywordIndex(Map data, String[] keywords) { + if (data == null || data.isEmpty() || keywords == null) { return null; } for (Object keyObj : data.keySet()) { Object value = data.get(keyObj); - if (value != null && value.toString().trim().contains(keyword)) { + if (value == null) { + continue; + } + String text = normalizeHeaderText(value); + if (text.isEmpty()) { + continue; + } + if (matchesAny(text, keywords)) { try { return Integer.parseInt(keyObj.toString()); } catch (NumberFormatException e) { - // key不是数字(可能是表头文本如"客户配送明细"),跳过,不打印警告避免日志刷屏 - LOGGER.debug("第{}行:关键字'{}'所在列key不是数字,key={},跳过", - currentRowNum, keyword, keyObj); + // key不是数字(可能是表头文本),跳过,不打印警告避免日志刷屏 + LOGGER.debug("第{}行:关键字所在列key不是数字,key={},跳过", currentRowNum, keyObj); } } } @@ -366,15 +500,64 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener data, String keyword) { - Integer keywordIndex = findKeywordIndex(data, keyword); - if (keywordIndex == null) { - LOGGER.warn("第{}行:未找到关键字'{}'", currentRowNum, keyword); - return null; + private int findColumnByAliases(Map data, String[] aliases) { + if (data == null || data.isEmpty() || aliases == null) { + return -1; } - return convertToInteger(getValueSafely(data, keywordIndex + 1)); + for (Object keyObj : data.keySet()) { + Object value = data.get(keyObj); + if (value == null) { + continue; + } + String text = normalizeHeaderText(value); + if (text.isEmpty()) { + continue; + } + if (matchesAny(text, aliases)) { + try { + return Integer.parseInt(keyObj.toString()); + } catch (NumberFormatException e) { + // key不是数字(可能是表头文本),跳过 + LOGGER.debug("第{}行:列头所在列key不是数字,key={},跳过", currentRowNum, keyObj); + } + } + } + return -1; + } + + /** + * 列头/标签文字归一化:去空格/冒号/括号等符号、转小写、繁体转简体(覆盖模板常见用字) + */ + private String normalizeHeaderText(Object value) { + if (value == null) { + return ""; + } + String s = value.toString().trim().toLowerCase(); + s = s.replace(":", "").replace(":", "") + .replace(" ", "").replace(" ", "") + .replace("(", "").replace(")", "") + .replace("(", "").replace(")", "") + .replace("/", "").replace("\\", ""); + s = s.replace('貨', '货').replace('編', '编').replace('號', '号').replace('稱', '称') + .replace('數', '数').replace('飲', '饮').replace('規', '规').replace('戶', '户') + .replace('紀', '纪').replace('錄', '录').replace('張', '张').replace('計', '计') + .replace('車', '车').replace('線', '线').replace('類', '类').replace('別', '别') + .replace('簡', '简').replace('產', '产').replace('單', '单'); + return s; + } + + /** + * 判断归一化后的文字是否命中任一别名 + */ + private boolean matchesAny(String text, String[] aliases) { + for (String alias : aliases) { + if (text.contains(alias)) { + return true; + } + } + return false; } /** diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java index c7df783b9..f8493da8c 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java @@ -17,7 +17,11 @@ import java.util.Map; /** * 入库单Excel解析监听器 - * 功能:1. 解析第一行表头数据 2. 跳过第二行合计行、第三行列名行 3. 解析第四行开始的产品明细 4. 支持文本型数字转换 + * 功能:1. 解析第一行表头数据(入库日期、OrderNO,按标签定位,位置不敏感) + * 2. 动态定位列头行:扫描前几行,识别出"產品編號"等已知列头文字的行即认定为列头行(行位置不敏感) + * 3. 列按列头文字动态定位(兼容繁体列头:產品編號/客戶編號/件數/飲用日期等),列顺序调整不影响解析 + * 4. 列头无法识别时兜底:按老模板固定列位(0=编号,1=名称,2=规格,3=件数,4=饮用日期) + * 5. 支持文本型数字转换 */ public class StockInExcelListener extends AnalysisEventListener> { private static final Logger LOGGER = LoggerFactory.getLogger(StockInExcelListener.class); @@ -35,6 +39,29 @@ public class StockInExcelListener extends AnalysisEventListener= 4) { - if (isValidProductRow(data)) { - StockInProductDetail detail = parseProductDetail(data); - productDetailList.add(detail); + // 2. 列布局未确定:尝试识别列头行;识别成功则本行即为列头行,跳过数据解析 + else if (!columnResolved) { + if (!tryResolveHeaderRow(data)) { + // 3. 超过老模板列头行位置仍未识别到列头行:启用固定列位兜底,从当前行开始按数据行解析 + if (currentRowNum > FALLBACK_AFTER_ROW_NUM) { + applyFallbackColumns(); + parseDataRow(data); + } + // 否则(合计行Total等):跳过 } } + // 4. 列布局已确定:按数据行解析 + else { + parseDataRow(data); + } } catch (ExcelDataConvertException e) { // Excel内置转换异常(如日期格式错误) @@ -79,6 +106,16 @@ public class StockInExcelListener extends AnalysisEventListener data) { + if (isValidProductRow(data)) { + StockInProductDetail detail = parseProductDetail(data); + productDetailList.add(detail); + } + } + /** * 解析第一行表头数据 * 模板中标签与值相邻,分别搜索"入库日期"和"OrderNO"标签后一列的值,兼容位置调整 @@ -86,15 +123,17 @@ public class StockInExcelListener extends AnalysisEventListener data) { // 入库日期:查找包含"入库日期"标签的下一个值 Object stockInDateObj = getValueAfterLabel(data, "入庫日期:"); + if (stockInDateObj == null) { + stockInDateObj = getValueAfterLabel(data, "入库日期"); + } if (stockInDateObj != null) { Date stockInDate = convertToDate(stockInDateObj); stockInHeader.setStockInDate(stockInDate); LOGGER.debug("第1行:入库日期解析完成,值:{}", stockInDate); } - // OrderNO:优先查找"OrderNO"标签后的值(老模板布局,标签与值相邻); - // 新模板第1行无"OrderNO"标签,单号值直接放在单元格中(如E1), - // 此时取第1行中除标签、入库日期以外的第一个非空字符串值 + // OrderNO:优先查找"OrderNO"标签后的值(标签与值相邻); + // 新模板第1行无"OrderNO"标签时,取第1行中除标签、入库日期以外的第一个非空字符串值 Object orderNoObj = getValueAfterLabel(data, "OrderNO"); if (orderNoObj == null) { for (Object value : data.values()) { @@ -103,7 +142,7 @@ public class StockInExcelListener extends AnalysisEventListener data) { + if (data == null || data.isEmpty()) { + return false; + } + int tmpProductCodeCol = -1; + int tmpProductNameCol = -1; + int tmpCustomerCodeCol = -1; + int tmpDrinkDateCol = -1; + int tmpPieceCountCol = -1; + int tmpSpecCol = -1; + int matched = 0; + + for (Object keyObj : data.keySet()) { + Object value = data.get(keyObj); + if (value == null) { + continue; + } + String text = normalizeHeaderText(value); + if (text.isEmpty()) { + continue; + } + int colIndex; + try { + colIndex = Integer.parseInt(keyObj.toString()); + } catch (NumberFormatException e) { + // key不是数字(如表头文本),跳过 + continue; + } + // 按组依次匹配(先具体后一般,避免同一列头命中多组别名时归属错乱) + if (tmpProductCodeCol < 0 && matchesAny(text, PRODUCT_CODE_ALIASES)) { + tmpProductCodeCol = colIndex; + matched++; + } else if (tmpCustomerCodeCol < 0 && matchesAny(text, CUSTOMER_CODE_ALIASES)) { + tmpCustomerCodeCol = colIndex; + matched++; + } else if (tmpProductNameCol < 0 && matchesAny(text, PRODUCT_NAME_ALIASES)) { + tmpProductNameCol = colIndex; + matched++; + } else if (tmpDrinkDateCol < 0 && matchesAny(text, DRINK_DATE_ALIASES)) { + tmpDrinkDateCol = colIndex; + matched++; + } else if (tmpPieceCountCol < 0 && matchesAny(text, PIECE_COUNT_ALIASES)) { + tmpPieceCountCol = colIndex; + matched++; + } else if (tmpSpecCol < 0 && matchesAny(text, SPEC_ALIASES)) { + tmpSpecCol = colIndex; + matched++; + } + } + + // 产品编号列是数据解析的锚点,必须识别到;且识别总数达标才认定为列头行 + if (tmpProductCodeCol < 0 || matched < HEADER_MIN_MATCH_COUNT) { + return false; + } + + productCodeCol = tmpProductCodeCol; + productNameCol = tmpProductNameCol; + customerCodeCol = tmpCustomerCodeCol; + drinkDateCol = tmpDrinkDateCol; + pieceCountCol = tmpPieceCountCol; + specCol = tmpSpecCol; + columnResolved = true; + LOGGER.info("第{}行识别为列头行,列映射:产品编号={},产品名称={},客户编号={},规格={},件数={},饮用日期={}", + currentRowNum, productCodeCol, productNameCol, customerCodeCol, specCol, pieceCountCol, drinkDateCol); + return true; + } + + /** + * 兜底列位:老模板固定布局(0=编号,1=名称,2=规格,3=件数,4=饮用日期),无客户编号列 + */ + private void applyFallbackColumns() { + productCodeCol = 0; + productNameCol = 1; + customerCodeCol = -1; + specCol = 2; + pieceCountCol = 3; + drinkDateCol = 4; + columnResolved = true; + LOGGER.warn("第{}行前未识别到列头行,启用老模板固定列位兜底解析", currentRowNum); + } + /** * 解析产品明细数据(一行对应一个产品) - * 新模板列顺序:0=产品编号,1=产品名称,2=规格(箱含量),3=件数,4=饮用日期 + * 各列按列头行动态定位的索引取值,未识别的列取null/默认值 */ private StockInProductDetail parseProductDetail(Map data) { StockInProductDetail detail = new StockInProductDetail(); - // 产品编号(第1列,索引0)- 支持文本型数字转换 - detail.setProductCode(convertToString(getValueSafely(data, 0))); - // 产品名称(第2列,索引1) - detail.setProductName(convertToString(getValueSafely(data, 1))); - // 箱含量/规格(第3列,索引2) - detail.setBoxCapacity(convertToInteger(getValueSafely(data, 2))); - // 件数(第4列,索引3) - detail.setPieceCount(convertToInteger(getValueSafely(data, 3))); - // 饮用日期(第5列,索引4) - detail.setDrinkDate(convertToDate(getValueSafely(data, 4))); + // 产品编号(可不填名称,导入时按编号自动匹配库中物料名称) + detail.setProductCode(convertToString(getValueSafely(data, productCodeCol))); + // 产品名称(列头未识别或单元格未填时为空串,由服务端按编号自动匹配覆盖) + detail.setProductName(convertToString(getValueSafely(data, productNameCol))); + // 客户编号(新模板新增列,可不填;填写后由服务端校验客户存在性并自动匹配客户名称) + detail.setCustomerCode(convertToString(getValueSafely(data, customerCodeCol))); + // 箱含量/规格 + detail.setBoxCapacity(convertToInteger(getValueSafely(data, specCol))); + // 件数 + detail.setPieceCount(convertToInteger(getValueSafely(data, pieceCountCol))); + // 饮用日期 + detail.setDrinkDate(convertToDate(getValueSafely(data, drinkDateCol))); - LOGGER.debug("第{}行产品明细解析完成,产品编号:{},产品名称:{}", - currentRowNum, detail.getProductCode(), detail.getProductName()); + LOGGER.debug("第{}行产品明细解析完成,产品编号:{},产品名称:{},客户编号:{}", + currentRowNum, detail.getProductCode(), detail.getProductName(), detail.getCustomerCode()); return detail; } @@ -152,9 +278,6 @@ public class StockInExcelListener extends AnalysisEventListener data) { - // 有效条件:产品编号不为空 + 不是合计行 - Object productCodeObj = getValueSafely(data, 0); - // 排除合计行(整行包含"Total"字样) if (containsAnyValue(data, "Total")) { LOGGER.debug("第{}行是合计行,跳过解析", currentRowNum); @@ -162,6 +285,7 @@ public class StockInExcelListener extends AnalysisEventListener data, int columnIndex) { - if (data == null || data.isEmpty()) { + if (columnIndex < 0 || data == null || data.isEmpty()) { return null; } + String strIndex = String.valueOf(columnIndex); + // 1. 直接按key查找(key为String或Integer,跳过非数字key) + for (Object keyObj : data.keySet()) { + if (keyObj != null && strIndex.equals(keyObj.toString())) { + return data.get(keyObj); + } + } + + // 2. 兜底:按顺序位置查找 int index = 0; for (Object value : data.values()) { if (index == columnIndex) { @@ -193,7 +328,7 @@ public class StockInExcelListener extends AnalysisEventListener getProductDetailList() { return productDetailList; } -} \ No newline at end of file +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 5116ef9b0..2503b839f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -172,10 +172,10 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); + // ====== 物料存在性校验(落库前):查询结果为空说明库中没有该物料,收集全部缺失料号后一次性提示维护 ====== + Map materialCache = new LinkedHashMap<>(); + List missingMaterials = new ArrayList<>(); for (ProductDetail productDetail : productDetailList) { - MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode(),loginUser.getUserPo().getOrganizationId()); - if (materialBaseInfoPO != null && materialBaseInfoPO.getShipperId() != null) { - Long shipperId = materialBaseInfoPO.getShipperId(); - if (processedShipperIds.add(shipperId)) { - Map shipper = new HashMap<>(); - shipper.put("shipperId", shipperId); - shipper.put("shipperName", materialBaseInfoPO.getShipperName()); - shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); - shipperIds.add(shipper); - } + String productCode = productDetail.getProductCode() == null ? "" : productDetail.getProductCode().trim(); + if (productCode.isEmpty()) { + throw new Exception("出库明细存在未填写產品編號的行,请补全后重新导入"); } + if (materialCache.containsKey(productCode)) { + continue; + } + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productCode, loginUser.getUserPo().getOrganizationId()); + if (materialBaseInfoPO == null) { + missingMaterials.add(productCode); + } else { + materialCache.put(productCode, materialBaseInfoPO); + } + } + if (!missingMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息后再导入"); + } + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", materialBaseInfoPO.getShipperId()); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); + } + } + + // ====== 客户存在性校验(落库前):客户编号在库中查询结果为空说明客户不存在,提示维护后再导入 ====== + Map customerCache = new HashMap<>(); + for (CustomerDeliveryDetail customerDeliveryDetail : customerDeliveryDetailList) { + String customerCode = customerDeliveryDetail.getCustomerCode() == null ? "" : customerDeliveryDetail.getCustomerCode().trim(); + if (customerCode.isEmpty()) { + throw new Exception("客户配送明细存在未填写客户编号的行,请补全后重新导入"); + } + if (customerCache.containsKey(customerCode)) { + continue; + } + UserPo customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); + if (customer == null || customer.getUserId() == null) { + throw new Exception("客户[" + customerCode + "]不存在,请先维护客户信息后再导入"); + } + customerCache.put(customerCode, customer); } // 货品明细不为空时,校验货主信息 @@ -330,7 +364,8 @@ public class ReservationStockInOrderImpl extends ServiceImpl productDetailList = resultDTO.getProductDetailList(); + if (productDetailList == null || productDetailList.isEmpty()) { + throw new ServiceException("未解析到产品明细数据,请检查模板中是否填写了產品編號"); + } + StockInHeader stockInHeader = resultDTO.getStockInHeader(); + // ====== 物料存在性校验:模板只填物料编号即可,物料名称按编号自动匹配库中数据 ====== + // 查询结果为空说明库中没有该物料,收集全部缺失料号后一次性提示维护 + Map materialCache = new LinkedHashMap<>(); + List missingMaterials = new ArrayList<>(); + for (StockInProductDetail productDetail : productDetailList) { + String productCode = productDetail.getProductCode(); + if (materialCache.containsKey(productCode)) { + continue; + } + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productCode, loginUser.getUserPo().getOrganizationId()); + if (materialBaseInfoPO == null) { + missingMaterials.add(productCode); + } else { + materialCache.put(productCode, materialBaseInfoPO); + } + } + if (!missingMaterials.isEmpty()) { + throw new ServiceException("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息后再导入"); + } + // 明细回填库中匹配到的物料名称(自动匹配,模板中的名称列可不填/以库中为准;库中名称为空时保留模板值) + for (StockInProductDetail productDetail : productDetailList) { + String materialName = materialCache.get(productDetail.getProductCode()).getMaterialName(); + if (materialName != null && !materialName.trim().isEmpty()) { + productDetail.setProductName(materialName); + } + } + // ====== 物料归属货主集合(用于客户编号一致性校验,及未填客户编号时的兜底取值) ====== List> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); - for (StockInProductDetail productDetail : productDetailList) { - MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode(),loginUser.getUserPo().getOrganizationId()); - // 物料在当前登录组织下不存在时给出明确提示,避免后续货主取值越界导致500 - if (materialBaseInfoPO == null) { - throw new ServiceException("产品编号[" + productDetail.getProductCode() + "]在当前组织下不存在,请核对产品编号或使用物料所属组织的账号导入"); - } - if (materialBaseInfoPO.getShipperId() != null) { - Long shipperId = materialBaseInfoPO.getShipperId(); - if (processedShipperIds.add(shipperId)) { - Map shipper = new HashMap<>(); - shipper.put("shipperId", shipperId); - shipper.put("shipperName", materialBaseInfoPO.getShipperName()); - shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); - shipperIds.add(shipper); - } + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", materialBaseInfoPO.getShipperId()); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); } } - if (shipperIds.isEmpty()) { - throw new ServiceException("导入的产品均未配置货主,请先在物料档案中维护货主信息"); + if (shipperIds.size() > 1) { + StringBuilder shipperCodeStr = new StringBuilder(); + for (Map shipper : shipperIds) { + if (shipperCodeStr.length() > 0) { + shipperCodeStr.append("、"); + } + shipperCodeStr.append(shipper.get("shipperCode")); + } + throw new ServiceException("导入的物料不属于同一货主(货主编号:" + shipperCodeStr + "),一个入库单只能属于一个货主"); + } + // ====== 客户编号校验与名称自动匹配:模板只填客户编号,客户名称以库中数据为准 ====== + UserPo customer = null; + Set customerCodes = new LinkedHashSet<>(); + for (StockInProductDetail productDetail : productDetailList) { + if (productDetail.getCustomerCode() != null && !productDetail.getCustomerCode().trim().isEmpty()) { + customerCodes.add(productDetail.getCustomerCode().trim()); + } + } + if (customerCodes.size() > 1) { + throw new ServiceException("导入明细中存在多个客户编号(" + String.join("、", customerCodes) + "),一个入库单只能属于一个客户"); + } + if (!customerCodes.isEmpty()) { + String customerCode = customerCodes.iterator().next(); + // 查询结果为空说明库中没有该客户,提示维护后再导入 + customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); + if (customer == null || customer.getUserId() == null) { + throw new ServiceException("客户[" + customerCode + "]不存在,请先维护客户信息后再导入"); + } + // 客户编号与物料归属货主一致性校验(不一致拦截,提示两者编号;货主编码未维护时提示货主名称) + if (!shipperIds.isEmpty() && !customer.getUserId().equals(shipperIds.get(0).get("shipperId"))) { + Object materialShipperCode = shipperIds.get(0).get("shipperCode"); + String materialShipperDisplay = (materialShipperCode != null && !materialShipperCode.toString().trim().isEmpty()) + ? "货主编号[" + materialShipperCode + "]" : "货主[" + shipperIds.get(0).get("shipperName") + "]"; + throw new ServiceException("客户编号[" + customerCode + "]与物料归属" + materialShipperDisplay + "]不一致,请核对后再导入"); + } + stockInHeader.setCustomerCode(customerCode); + stockInHeader.setCustomerName(customer.getUserName()); } ReservationStockInOrderDO reservationStockInOrderDO = new ReservationStockInOrderDO(); - StockInHeader stockInHeader = resultDTO.getStockInHeader(); // 业务单号:优先使用模板自带OrderNO(不做格式规则校验),与系统已有业务单号重复时提示不允许导入; // 入库业务单号(in_order_number)不使用模板单号,统一由系统原本逻辑生成(见insertDomain); // 模板未填单号时保持系统逻辑:业务单号默认=入库业务单号 @@ -515,9 +612,19 @@ public class ReservationStockInOrderImpl extends ServiceImpl queryOutStockNoticePrintDetail(ReservationStockOutOrderDO stockOutOrderDO); - Long queryShipperId(@Param("userMemberCode") String userMemberCode,@Param("organizationId") Long organizationId); + /** + * 按客户编号+组织查询客户(用户表),返回客户ID/编号/名称 + * 客户编号兼容两种编码:USER.USER_MEMBER_CODE(客户编码)或 USER_SHIPPER.CUSTOMER_NC_CODE(NC客户代码/khdm),任一命中即可 + * 用于出入库导入时校验客户是否存在并自动匹配客户名称;结果为空表示库中无该客户 + */ + UserPo queryCustomerByCode(@Param("userMemberCode") String userMemberCode, @Param("organizationId") Long organizationId); int countByOrderNumberPrefix(@Param("prefix") String prefix); diff --git a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml index 68fd934af..a83d8f6e9 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockOutOrder/ReservationStockOutOrderMapper.xml @@ -470,8 +470,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select max(u.user_id) as user_id, max(u.user_name) as user_name, max(u.user_member_code) as user_member_code + from NGWL_TEST_USER."USER" u + left join NGWL_TEST_USER.USER_SHIPPER us + on us.USER_ID = u.USER_ID and us.DEL_FLAG = 1 + where u.ORGANIZATION_ID = #{organizationId} and u.DEL_FLAG = 1 + and (u.USER_MEMBER_CODE = #{userMemberCode} or us.CUSTOMER_NC_CODE = #{userMemberCode}) + + + \ No newline at end of file From a983ae639ecf4079dd09b33a277ff152c701bad7 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Mon, 31 Aug 2026 15:59:54 +0800 Subject: [PATCH 031/101] =?UTF-8?q?fix(wms,oms)=EF=BC=9A=E7=89=A9=E6=96=99?= =?UTF-8?q?/=E8=BF=87=E6=9C=9F=E6=97=A5=E6=9C=9F=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=A1=A5=E6=9F=A5=E5=85=A5=E5=BA=93=E6=97=A5=E6=9C=9F(create?= =?UTF-8?q?=5Ftime)=E4=B8=8E=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=EF=BC=8C?= =?UTF-8?q?=E5=88=86=E7=BB=84=E9=A1=B5=E7=AD=BE=E5=85=A5=E5=BA=93=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=98=BE=E7=A4=BA=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialInventoryMapper.xml | 4 ++++ .../MaterialInventoryMapper.xml | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml index 1bea8b465..200226335 100644 --- a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml @@ -379,6 +379,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(SUM(a.VOLUME), 0) AS VOLUME, MAX(a.unit) AS unit, MAX(a.unit_name) AS unit_name, + MAX(a.create_time) AS create_time, + MAX(a.update_time) AS update_time, MAX(a.production_date) AS production_date, MAX(a.inventory_date) AS inventory_date, MAX(a.purchase_date) AS purchase_date, @@ -386,6 +388,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" MAX(a.bar_code) AS inv_bar_code, MAX(a.in_order_number) AS in_order_number, MAX(a.lot_number) AS lot_number, b.material_code, b.material_name, + MAX(b.material_classify_code) AS material_classify_code, + MAX(b.material_classify_name) AS material_classify_name, CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END AS sort_order from reservation_material_inventory a left join NGWL_TEST_WMS.material_base_info b on a.material_base_info_id = b.material_base_info_id diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 8df558332..3b55cabce 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -416,6 +416,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by a.MATERIAL_INVENTORY_ID order by sort_order, a.update_time desc + + + + + a.del_flag = 1 + and a.level = 1 + and b.del_flag = 1 + and b.status = 5 + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and b.shipper_code like concat('%', #{shipperCode}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(b.warehouse_date,'%Y-%m-%d') >= #{warehouseDateStart} + + + and date_format(b.warehouse_date,'%Y-%m-%d') <= #{warehouseDateEnd} + + + + + from execution_in_material_detail a + join execution_stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 + left join NGWL_TEST_WMS.material_base_info c on a.material_base_info_id = c.material_base_info_id + + + + + + + + diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml new file mode 100644 index 000000000..77fccdc12 --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -0,0 +1,124 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.del_flag = 1 + and b.status = 9 + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.customer_name like concat('%', #{customerName}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and b.line_code like concat('%', #{lineCode}, '%') + + + and b.line_name like concat('%', #{lineName}, '%') + + + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} + + + and date_format(b.create_time,'%Y-%m-%d') <= #{createTimeEnd} + + + + + from execution_out_material_detail a + join execution_stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 + + + + + + + + + + + + + + diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java new file mode 100644 index 000000000..c5a18f4ff --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/inboundRank/InboundRankApplicationService.java @@ -0,0 +1,76 @@ +package com.mhd.wms.application.service.inboundRank; + +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.domain.inboundRank.service.InboundRankDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计应用服务 + * + *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 InboundRankDomainService → InboundRankMapper.xml

+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankApplicationService { + + @Autowired + private InboundRankDomainService inboundRankDomainService; + + /** + * 分页查询商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + fillLoginContext(inboundRankDO); + return inboundRankDomainService.queryMaterialRankList(inboundRankDO); + } + + /** + * 商品入库排名合计(当前筛选条件全量,不分页) + */ + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankDomainService.queryMaterialRankTotal(inboundRankDO); + } + + /** + * 导出商品入库排名(不分页全量) + */ + public List exportMaterialRank(InboundRankDO inboundRankDO) { + fillLoginContext(inboundRankDO); + return inboundRankDomainService.queryMaterialRankList(inboundRankDO); + } + + /** + * 注入登录用户组织隔离与关联仓库,并校验入仓日期区间必填 + */ + private void fillLoginContext(InboundRankDO inboundRankDO) { + if (StringUtils.isEmpty(inboundRankDO.getWarehouseDateStart()) || StringUtils.isEmpty(inboundRankDO.getWarehouseDateEnd())) { + throw new ServiceException("请选择统计日期区间"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + inboundRankDO.setTopOrganizationId(topOrganizationId); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null && associationWarehouseCacheDO.getWarehouseId() != null) { + inboundRankDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java new file mode 100644 index 000000000..3f6d4d267 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java @@ -0,0 +1,100 @@ +package com.mhd.wms.application.service.outboundRank; + +import com.mhd.common.core.utils.StringUtils; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; +import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; +import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.domain.outboundRank.service.OutboundRankDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计应用服务 + * + *

负责登录用户组织隔离注入、日期区间校验,统计逻辑在 OutboundRankDomainService → OutboundRankMapper.xml

+ * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankApplicationService { + + @Autowired + private OutboundRankDomainService outboundRankDomainService; + + /** + * 分页查询商品出库排名列表 + */ + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + } + + /** + * 分页查询线路出库排名列表 + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); + } + + /** + * 商品出库排名合计(当前筛选条件全量,不分页) + */ + public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryMaterialRankTotal(outboundRankDO); + } + + /** + * 线路出库排名合计(当前筛选条件全量,不分页) + */ + public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryLineRankTotal(outboundRankDO); + } + + /** + * 导出商品出库排名(不分页全量) + */ + public List exportMaterialRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + } + + /** + * 导出线路出库排名(不分页全量) + */ + public List exportLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); + } + + /** + * 注入登录用户组织隔离与关联仓库,并校验日期区间必填 + */ + private void fillLoginContext(OutboundRankDO outboundRankDO) { + if (StringUtils.isEmpty(outboundRankDO.getCreateTimeStart()) || StringUtils.isEmpty(outboundRankDO.getCreateTimeEnd())) { + throw new ServiceException("请选择统计日期区间"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + outboundRankDO.setTopOrganizationId(topOrganizationId); + } + AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); + if (associationWarehouseCacheDO != null && associationWarehouseCacheDO.getWarehouseId() != null) { + outboundRankDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); + } + } + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java new file mode 100644 index 000000000..9559e2d5f --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/facade/IInboundRankService.java @@ -0,0 +1,26 @@ +package com.mhd.wms.domain.inboundRank.repository.facade; + +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; + +import java.util.List; + +/** + * 入库排名统计Service接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface IInboundRankService { + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + List queryMaterialRankList(InboundRankDO inboundRankDO); + + /** + * 商品入库排名合计(不分页) + */ + InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java new file mode 100644 index 000000000..5c95d09fa --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java @@ -0,0 +1,26 @@ +package com.mhd.wms.domain.inboundRank.repository.mapper; + +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; + +import java.util.List; + +/** + * 入库排名统计Mapper接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface InboundRankMapper { + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + List queryMaterialRankList(InboundRankDO inboundRankDO); + + /** + * 商品入库排名合计(不分页,当前筛选条件全量合计) + */ + InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java new file mode 100644 index 000000000..519b7cc13 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/persistence/InboundRankImpl.java @@ -0,0 +1,34 @@ +package com.mhd.wms.domain.inboundRank.repository.persistence; + +import com.mhd.wms.domain.inboundRank.repository.facade.IInboundRankService; +import com.mhd.wms.domain.inboundRank.repository.mapper.InboundRankMapper; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计Service业务层处理 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +public class InboundRankImpl implements IInboundRankService { + + @Autowired + private InboundRankMapper inboundRankMapper; + + @Override + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + return inboundRankMapper.queryMaterialRankList(inboundRankDO); + } + + @Override + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankMapper.queryMaterialRankTotal(inboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java new file mode 100644 index 000000000..03567787a --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java @@ -0,0 +1,79 @@ +package com.mhd.wms.domain.inboundRank.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 入库排名统计PO(一行 = 某仓单内某货品的合计,按件数降序排名) + * + *

字段口径:入仓日期=入仓单入仓日期;仓单编号=入库单号;客户编号/存货人=入仓单货主; + * 件数/毛重/体积=仓单内该货品明细合计;毛重(吨)=明细总毛重KG/1000; + * 投保总额=货品档案保额(material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计对象", description = "入库排名统计响应对象") +public class InboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date warehouseDate; + + @ApiModelProperty("仓单编号(入库单号)") + @Excel(name = "仓单编号") + private String inOrderNumber; + + @ApiModelProperty("客户编号") + @Excel(name = "客户编号") + private String shipperCode; + + @ApiModelProperty("存货人(客户名称)") + @Excel(name = "存货人") + private String shipperName; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名/商品名称") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("规格型号") + @Excel(name = "规格型号") + private String specificationModel; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unitName; + + @ApiModelProperty("件数(仓单内该货品合计,排名依据)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)(仓单内该货品合计,KG/1000)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("投保总额(货品档案保额)") + @Excel(name = "投保总额") + private BigDecimal insureAmount; + + @ApiModelProperty("体积(CBM)(仓单内该货品合计)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java new file mode 100644 index 000000000..551bf25d4 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 入库排名统计合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalInsureAmount/totalVolume/totalOrderCount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "入库排名统计合计对象", description = "入库排名统计合计响应对象") +public class InboundRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("投保总额合计(各仓单+货品行保额之和)") + private BigDecimal totalInsureAmount; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("仓单数合计") + private Long totalOrderCount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java new file mode 100644 index 000000000..1cc725242 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/todo/InboundRankDO.java @@ -0,0 +1,50 @@ +package com.mhd.wms.domain.inboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 入库排名统计查询DO + * + *

topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java new file mode 100644 index 000000000..53e948b61 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/service/InboundRankDomainService.java @@ -0,0 +1,39 @@ +package com.mhd.wms.domain.inboundRank.service; + +import com.mhd.wms.domain.inboundRank.repository.facade.IInboundRankService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 入库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class InboundRankDomainService { + + @Autowired + private IInboundRankService inboundRankService; + + /** + * 商品入库排名列表(仓单+货品汇总,按件数降序) + */ + public List queryMaterialRankList(InboundRankDO inboundRankDO) { + return inboundRankService.queryMaterialRankList(inboundRankDO); + } + + /** + * 商品入库排名合计(不分页) + */ + public InboundRankTotalPO queryMaterialRankTotal(InboundRankDO inboundRankDO) { + return inboundRankService.queryMaterialRankTotal(inboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java new file mode 100644 index 000000000..81981ab4b --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java @@ -0,0 +1,37 @@ +package com.mhd.wms.domain.outboundRank.repository.facade; + +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; + +import java.util.List; + +/** + * 出库排名统计Service接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface IOutboundRankService { + + /** + * 商品出库排名列表 + */ + List queryMaterialRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表 + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 商品出库排名合计(不分页) + */ + OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页) + */ + OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java new file mode 100644 index 000000000..40f17acc2 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java @@ -0,0 +1,37 @@ +package com.mhd.wms.domain.outboundRank.repository.mapper; + +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; + +import java.util.List; + +/** + * 出库排名统计Mapper接口 + * + * @author rcx + * @date 2026-08-31 + */ +public interface OutboundRankMapper { + + /** + * 商品出库排名列表(按销售量倒序) + */ + List queryMaterialRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表(按销售量倒序) + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 商品出库排名合计(不分页,当前筛选条件全量合计) + */ + OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页,当前筛选条件全量合计) + */ + OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java new file mode 100644 index 000000000..0acf88572 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java @@ -0,0 +1,45 @@ +package com.mhd.wms.domain.outboundRank.repository.persistence; + +import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; +import com.mhd.wms.domain.outboundRank.repository.mapper.OutboundRankMapper; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计Service业务层处理 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +public class OutboundRankImpl implements IOutboundRankService { + + @Autowired + private OutboundRankMapper outboundRankMapper; + + @Override + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankList(outboundRankDO); + } + + @Override + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankList(outboundRankDO); + } + + @Override + public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankTotal(outboundRankDO); + } + + @Override + public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankTotal(outboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java new file mode 100644 index 000000000..7f5c05c3c --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java @@ -0,0 +1,45 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 线路出库排名PO + * + *

按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); + * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") +public class OutboundLineRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("线路编码") + @Excel(name = "线路编码") + private String lineCode; + + @ApiModelProperty("线路名称") + @Excel(name = "线路名称") + private String lineName; + + @ApiModelProperty("销售量(出库数量合计)") + @Excel(name = "销售量") + private BigDecimal salesQuantity; + + @ApiModelProperty("交易数(出库单据数)") + @Excel(name = "交易数") + private Long tradeCount; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java new file mode 100644 index 000000000..9725d50ab --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java @@ -0,0 +1,52 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品出库排名PO + * + *

按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") +public class OutboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("商品名称") + @Excel(name = "商品名称") + private String materialName; + + @ApiModelProperty("规格") + @Excel(name = "规格") + private String specificationModel; + + @ApiModelProperty("单位") + @Excel(name = "单位") + private String unitName; + + @ApiModelProperty("销售量(出库数量合计)") + @Excel(name = "销售量") + private BigDecimal salesQuantity; + + @ApiModelProperty("交易数(出库单据数)") + @Excel(name = "交易数") + private Long tradeCount; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java new file mode 100644 index 000000000..ea0e9ace9 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java @@ -0,0 +1,32 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 出库排名合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回(totalSalesQuantity/totalTradeCount/totalAmount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名合计对象", description = "出库排名合计响应对象") +public class OutboundRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("销售量合计") + private BigDecimal totalSalesQuantity; + + @ApiModelProperty("交易数合计(去重出库单数)") + private Long totalTradeCount; + + @ApiModelProperty("金额合计") + private BigDecimal totalAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java new file mode 100644 index 000000000..c38c77230 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java @@ -0,0 +1,53 @@ +package com.mhd.wms.domain.outboundRank.repository.todo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 出库排名统计查询DO + * + *

topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填)") + private String createTimeStart; + + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填)") + private String createTimeEnd; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; + + @ApiModelProperty("一级组织表ID(登录用户隔离,非1时注入)") + private Long topOrganizationId; + + @ApiModelProperty("仓库id(按用户关联仓库注入)") + private Long warehouseId; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java new file mode 100644 index 000000000..1d2fe84c2 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java @@ -0,0 +1,54 @@ +package com.mhd.wms.domain.outboundRank.service; + +import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 出库排名统计领域服务 + * + * @author rcx + * @date 2026-08-31 + */ +@Service +@Slf4j +public class OutboundRankDomainService { + + @Autowired + private IOutboundRankService outboundRankService; + + /** + * 商品出库排名列表 + */ + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankList(outboundRankDO); + } + + /** + * 线路出库排名列表 + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankList(outboundRankDO); + } + + /** + * 商品出库排名合计(不分页) + */ + public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankTotal(outboundRankDO); + } + + /** + * 线路出库排名合计(不分页) + */ + public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankTotal(outboundRankDO); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java new file mode 100644 index 000000000..f884e0715 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/inboundRank/InboundRankAssembler.java @@ -0,0 +1,36 @@ +package com.mhd.wms.interfaces.assember.inboundRank; + +import cn.hutool.core.util.ObjectUtil; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.core.utils.IgnoreNullUtil; +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.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.interfaces.dto.inboundRank.InboundRankDTO; +import org.springframework.stereotype.Component; + +/** + * 入库排名统计Assembler + * + * @author rcx + * @date 2026-08-31 + */ +@Component +public class InboundRankAssembler { + + /** + * 转换实体 + */ + public InboundRankDO toDO(InboundRankDTO inboundRankDTO) { + InboundRankDO inboundRankDO = new InboundRankDO(); + // 拷贝 + BeanUtils.copyProperties(inboundRankDTO, inboundRankDO, IgnoreNullUtil.getNullPropertyNames(inboundRankDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + return inboundRankDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java new file mode 100644 index 000000000..8388a919f --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/assember/outboundRank/OutboundRankAssembler.java @@ -0,0 +1,36 @@ +package com.mhd.wms.interfaces.assember.outboundRank; + +import cn.hutool.core.util.ObjectUtil; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.core.utils.IgnoreNullUtil; +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.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; +import org.springframework.stereotype.Component; + +/** + * 出库排名统计Assembler + * + * @author rcx + * @date 2026-08-31 + */ +@Component +public class OutboundRankAssembler { + + /** + * 转换实体 + */ + public OutboundRankDO toDO(OutboundRankDTO outboundRankDTO) { + OutboundRankDO outboundRankDO = new OutboundRankDO(); + // 拷贝 + BeanUtils.copyProperties(outboundRankDTO, outboundRankDO, IgnoreNullUtil.getNullPropertyNames(outboundRankDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + return outboundRankDO; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java new file mode 100644 index 000000000..e7c812636 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java @@ -0,0 +1,45 @@ +package com.mhd.wms.interfaces.dto.inboundRank; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 入库排名统计入参DTO + * + *

按入仓日期区间筛选商品入库量统计排名,统计口径:入仓日期 + 仅已入库状态(5) + 明细仅取 level=1 主行; + * 一行 = 某仓单内某货品的合计,按件数降序排名

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class InboundRankDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("入仓日期-开始 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateStart; + + @ApiModelProperty("入仓日期-结束 yyyy-MM-dd(必填,按入仓单入仓日期筛选)") + private String warehouseDateEnd; + + @ApiModelProperty("仓单编号/入库单号(模糊)") + private String inOrderNumber; + + @ApiModelProperty("客户编号(模糊)") + private String shipperCode; + + @ApiModelProperty("存货人/客户名称(模糊)") + private String shipperName; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("货名/商品名称(模糊)") + private String materialName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java new file mode 100644 index 000000000..eac2c07b5 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java @@ -0,0 +1,43 @@ +package com.mhd.wms.interfaces.dto.outboundRank; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 出库排名统计入参DTO + * + *

按日期区间统计商品/线路出库量排名,统计口径:出库单创建时间 + 已出库及之后状态(9,12,13)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +public class OutboundRankDTO { + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") + private String createTimeStart; + + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") + private String createTimeEnd; + + @ApiModelProperty("商品货号(模糊)") + private String materialCode; + + @ApiModelProperty("商品名称(模糊)") + private String materialName; + + @ApiModelProperty("线路编码(模糊)") + private String lineCode; + + @ApiModelProperty("线路名称(模糊)") + private String lineName; + + @ApiModelProperty("仓库名称(模糊)") + private String warehouseName; + + @ApiModelProperty("客户名称(模糊)") + private String customerName; + + @ApiModelProperty("货主名称(模糊)") + private String shipperName; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java new file mode 100644 index 000000000..b979e988b --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java @@ -0,0 +1,105 @@ +package com.mhd.wms.interfaces.facadeApi.inboundRank; + +import com.github.pagehelper.PageInfo; +import com.mhd.common.core.constant.HttpStatus; +import com.mhd.common.core.utils.PageUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.wms.application.service.inboundRank.InboundRankApplicationService; +import com.mhd.wms.domain.inboundRank.repository.po.InboundMaterialRankPO; +import com.mhd.wms.domain.inboundRank.repository.po.InboundRankTotalPO; +import com.mhd.wms.domain.inboundRank.repository.todo.InboundRankDO; +import com.mhd.wms.interfaces.assember.inboundRank.InboundRankAssembler; +import com.mhd.wms.interfaces.dto.inboundRank.InboundRankDTO; +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.HashMap; +import java.util.List; + +/** + * 入库排名统计Api + * + *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期 + 仅已入库状态(5), + * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 + * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分

+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/inboundRankApi") +public class InboundRankApi { + + @Resource + private InboundRankAssembler inboundRankAssembler; + + @Autowired + private InboundRankApplicationService inboundRankApplicationService; + + /** + * 分页查询商品入库排名列表(含合计行) + */ + @ApiOperation("分页查询商品入库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap queryMaterialRankList(InboundRankDTO inboundRankDTO) { + //转换实体 + InboundRankDO inboundRankDO = inboundRankAssembler.toDO(inboundRankDTO); + startPage(); + List list = inboundRankApplicationService.queryMaterialRankList(inboundRankDO); + InboundRankTotalPO total = inboundRankApplicationService.queryMaterialRankTotal(inboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 导出商品入库排名Excel + */ + @ApiOperation("导出商品入库排名Excel") + @GetMapping("/exportMaterialRank") + public void exportMaterialRank(HttpServletResponse response, InboundRankDTO inboundRankDTO) throws Exception { + //转换实体(不分页,导出全量) + InboundRankDO inboundRankDO = inboundRankAssembler.toDO(inboundRankDTO); + List list = inboundRankApplicationService.exportMaterialRank(inboundRankDO); + + 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<>(InboundMaterialRankPO.class); + util.exportExcel(response, list, "入库排名统计"); + } + + /** + * 分页结果 + 合计行:data/total/code/msg 之外追加 + * totalPieceCount/totalGrossWeightTon/totalInsureAmount/totalVolume/totalOrderCount + */ + private HashMap getDataTableWithTotal(List list, InboundRankTotalPO total) { + HashMap result = new HashMap<>(); + result.put("data", list); + result.put("total", new PageInfo<>(list).getTotal()); + result.put("code", HttpStatus.SUCCESS); + result.put("msg", "查询成功"); + if (total != null) { + result.put("totalPieceCount", total.getTotalPieceCount()); + result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); + result.put("totalInsureAmount", total.getTotalInsureAmount()); + result.put("totalVolume", total.getTotalVolume()); + result.put("totalOrderCount", total.getTotalOrderCount()); + } + return result; + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageUtils.startPage(); + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java new file mode 100644 index 000000000..439dbba78 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java @@ -0,0 +1,134 @@ +package com.mhd.wms.interfaces.facadeApi.outboundRank; + +import com.github.pagehelper.PageInfo; +import com.mhd.common.core.constant.HttpStatus; +import com.mhd.common.core.utils.PageUtils; +import com.mhd.common.core.utils.poi.ExcelUtil; +import com.mhd.wms.application.service.outboundRank.OutboundRankApplicationService; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; +import com.mhd.wms.interfaces.assember.outboundRank.OutboundRankAssembler; +import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; +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.HashMap; +import java.util.List; + +/** + * 出库排名统计Api + * + *

按日期区间筛选,统计商品/线路出库量排名。统计口径:出库单创建时间 + 已出库及之后状态(9,12,13), + * 明细仅取 level=1 主行;销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)

+ * + * @author rcx + * @date 2026-08-31 + */ +@RestController +@RequestMapping("/outboundRankApi") +public class OutboundRankApi { + + @Resource + private OutboundRankAssembler outboundRankAssembler; + + @Autowired + private OutboundRankApplicationService outboundRankApplicationService; + + /** + * 分页查询商品出库排名列表(含合计行) + */ + @ApiOperation("分页查询商品出库排名列表") + @GetMapping("/queryMaterialRankList") + public HashMap queryMaterialRankList(OutboundRankDTO outboundRankDTO) { + //转换实体 + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + startPage(); + List list = outboundRankApplicationService.queryMaterialRankList(outboundRankDO); + OutboundRankTotalPO total = outboundRankApplicationService.queryMaterialRankTotal(outboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 分页查询线路出库排名列表(含合计行) + */ + @ApiOperation("分页查询线路出库排名列表") + @GetMapping("/queryLineRankList") + public HashMap queryLineRankList(OutboundRankDTO outboundRankDTO) { + //转换实体 + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + startPage(); + List list = outboundRankApplicationService.queryLineRankList(outboundRankDO); + OutboundRankTotalPO total = outboundRankApplicationService.queryLineRankTotal(outboundRankDO); + return getDataTableWithTotal(list, total); + } + + /** + * 导出商品出库排名Excel + */ + @ApiOperation("导出商品出库排名Excel") + @GetMapping("/exportMaterialRank") + public void exportMaterialRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { + //转换实体(不分页,导出全量) + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + List list = outboundRankApplicationService.exportMaterialRankList(outboundRankDO); + + 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<>(OutboundMaterialRankPO.class); + util.exportExcel(response, list, "商品出库排名"); + } + + /** + * 导出线路出库排名Excel + */ + @ApiOperation("导出线路出库排名Excel") + @GetMapping("/exportLineRank") + public void exportLineRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { + //转换实体(不分页,导出全量) + OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + List list = outboundRankApplicationService.exportLineRankList(outboundRankDO); + + 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<>(OutboundLineRankPO.class); + util.exportExcel(response, list, "线路出库排名"); + } + + /** + * 分页结果 + 合计行:data/total/code/msg 之外追加 totalSalesQuantity/totalTradeCount/totalAmount + */ + private HashMap getDataTableWithTotal(List list, OutboundRankTotalPO total) { + HashMap result = new HashMap<>(); + result.put("data", list); + result.put("total", new PageInfo<>(list).getTotal()); + result.put("code", HttpStatus.SUCCESS); + result.put("msg", "查询成功"); + if (total != null) { + result.put("totalSalesQuantity", total.getTotalSalesQuantity()); + result.put("totalTradeCount", total.getTotalTradeCount()); + result.put("totalAmount", total.getTotalAmount()); + } + return result; + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageUtils.startPage(); + } +} diff --git a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml new file mode 100644 index 000000000..fc1e6f238 --- /dev/null +++ b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml @@ -0,0 +1,104 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status = 5 + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_id = #{warehouseId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and b.shipper_code like concat('%', #{shipperCode}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + + + and date_format(b.warehouse_date,'%Y-%m-%d') >= #{warehouseDateStart} + + + and date_format(b.warehouse_date,'%Y-%m-%d') <= #{warehouseDateEnd} + + + + + from in_material_detail a + join stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 + left join material_base_info c on a.material_base_info_id = c.material_base_info_id + + + + + + + + diff --git a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml new file mode 100644 index 000000000..54aa7458b --- /dev/null +++ b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml @@ -0,0 +1,126 @@ + + + + + + + a.del_flag = 1 + and a.level = 1 + and b.status in (9, 12, 13) + + and b.top_organization_id = #{topOrganizationId} + + + and b.warehouse_id = #{warehouseId} + + + and b.warehouse_name like concat('%', #{warehouseName}, '%') + + + and b.customer_name like concat('%', #{customerName}, '%') + + + and b.shipper_name like concat('%', #{shipperName}, '%') + + + and b.line_code like concat('%', #{lineCode}, '%') + + + and b.line_name like concat('%', #{lineName}, '%') + + + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} + + + and date_format(b.create_time,'%Y-%m-%d') <= #{createTimeEnd} + + + + + from out_material_detail a + join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 + + + + + + + + + + + + + + From 1300a4e1f8e93cbc2e6c01104091d0d6a24a7547 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 09:10:59 +0800 Subject: [PATCH 033/101] =?UTF-8?q?fix(oms)=EF=BC=9A=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=8E=92=E5=90=8DOMS=E7=AB=AF=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E8=B7=A8=E5=BA=93=E6=9F=A5WMS=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E6=81=92=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OMS库出库单状态从不流转(预约/执行单全部status=1,无"已出库"数据),原SQL按执行出库单status=9过滤导致查不出任何数据;改为跨库取WMS出库表NGWL_TEST_WMS.stock_out_order/out_material_detail(与OMS库存查询跨库join material_base_info同一模式),口径与WMS端/outboundRankApi完全一致:已出库及之后状态(9,12,13)+明细level=1主行+按出库单创建时间筛选,两边页面数字一致;接口路径/参数/返回结构均不变,其余文件仅更新注释中的数据源说明 --- .../po/ExecutionOutboundLineRankPO.java | 2 +- .../po/ExecutionOutboundMaterialRankPO.java | 2 +- .../todo/ExecutionOutboundRankDTO.java | 7 ++-- ...ecutionOutboundRankApplicationService.java | 2 +- .../ExecutionOutboundRankApi.java | 7 +++- .../ExecutionOutboundRankMapper.xml | 37 +++++++++---------- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java index 607e789c6..974944f90 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java @@ -11,7 +11,7 @@ import java.math.BigDecimal; /** * 线路出库排名PO * - *

按日期区间对执行出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); + *

按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)

* * @author rcx diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java index ce1cb867e..c32046d9f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java @@ -11,7 +11,7 @@ import java.math.BigDecimal; /** * 商品出库排名PO * - *

按日期区间对执行出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)

+ *

按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)

* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java index 9b055286f..0637173b7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java @@ -8,7 +8,8 @@ import java.io.Serializable; /** * 出库排名统计入参DTO * - *

按日期区间统计商品/线路出库量排名,数据源为 OMS 执行出库链路(execution_out_material_detail / execution_stock_out_order)

+ *

按日期区间统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), + * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail),与 WMS 端 /outboundRankApi 同口径

* * @author rcx * @date 2026-08-31 @@ -16,10 +17,10 @@ import java.io.Serializable; @Data public class ExecutionOutboundRankDTO { - @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按执行出库单创建时间统计)") + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") private String createTimeStart; - @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按执行出库单创建时间统计)") + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") private String createTimeEnd; @ApiModelProperty("商品货号(模糊)") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java index ef14d18bc..158f2b8c2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java @@ -17,7 +17,7 @@ import java.util.List; /** * 出库排名统计应用服务 * - *

负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml

+ *

负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)

* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java index 07cb22725..f1222e413 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java @@ -27,8 +27,11 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选,统计商品/线路出库量排名。统计口径:执行出库单创建时间 + 已出库状态(9), - * 明细仅取 level=1 主行;销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)

+ *

按日期区间筛选,统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), + * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), + * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致; + * 统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; + * 销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)

* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml index 77fccdc12..f35689979 100644 --- a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -5,16 +5,19 @@ a.del_flag = 1 and a.level = 1 - and b.del_flag = 1 - and b.status = 9 + and b.status in (9, 12, 13) and b.top_organization_id = #{topOrganizationId} @@ -33,6 +36,12 @@ and b.line_name like concat('%', #{lineName}, '%') + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} @@ -42,8 +51,8 @@ - from execution_out_material_detail a - join execution_stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 + from NGWL_TEST_WMS.out_material_detail a + join NGWL_TEST_WMS.stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 @@ -60,12 +69,6 @@ - - and a.material_code like concat('%', #{materialCode}, '%') - - - and a.material_name like concat('%', #{materialName}, '%') - GROUP BY a.material_code order by salesQuantity desc @@ -99,12 +102,6 @@ - - and a.material_code like concat('%', #{materialCode}, '%') - - - and a.material_name like concat('%', #{materialName}, '%') - From a588264849a049eb1620f264ae957d4bb6e0c0bd Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 09:24:20 +0800 Subject: [PATCH 034/101] =?UTF-8?q?fix(wms,oms)=EF=BC=9A=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E6=8E=92=E5=90=8D=E7=BB=9F=E8=AE=A1=E6=9F=A5=E8=AF=A2=E6=81=92?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E4=BF=AE=E5=A4=8D=EF=BC=9AOMS=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=85=A5=E5=BA=93=E5=8D=95=E7=8A=B6=E6=80=81=E4=B8=8D?= =?UTF-8?q?=E5=9B=9E=E4=BC=A0(=E5=85=A8=E5=81=9Cstatus=3D1)=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=8C=89=E5=B7=B2=E5=85=A5=E5=BA=93=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E4=BB=85=E6=8E=92=E9=99=A4=E5=B7=B2?= =?UTF-8?q?=E5=8F=96=E6=B6=88(6)/=E5=B7=B2=E5=85=B3=E9=97=AD(7)(=E4=B8=8E?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=98=8E=E7=BB=86=E6=9F=A5=E8=AF=A2=E9=A1=B5?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E4=B8=80=E8=87=B4)=EF=BC=9B=E5=85=A5?= =?UTF-8?q?=E4=BB=93=E6=97=A5=E6=9C=9F=E4=B8=BA=E7=A9=BA=E7=9A=84=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=8D=95=E7=AD=9B=E9=80=89=E4=B8=8E=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=9D=87=E5=85=9C=E5=BA=95=E5=BB=BA=E6=A1=A3=E6=97=B6=E9=97=B4?= =?UTF-8?q?create=5Ftime(=E4=B8=8E=E5=87=BA=E5=BA=93=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=8F=A3=E5=BE=84=E4=B8=80=E8=87=B4)?= =?UTF-8?q?=EF=BC=9BWMS=E4=BB=8D=E4=BF=9D=E6=8C=81=E4=BB=85=E5=B7=B2?= =?UTF-8?q?=E5=85=A5=E5=BA=93(5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facade/inboundRank/ExecutionInboundRankApi.java | 5 +++-- .../inboundRank/ExecutionInboundRankMapper.xml | 13 +++++++------ .../facadeApi/inboundRank/InboundRankApi.java | 2 +- .../mapper/inboundRank/InboundRankMapper.xml | 8 ++++---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java index 9ff29be10..b7cfd6391 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java @@ -26,8 +26,9 @@ import java.util.List; /** * 入库排名统计Api * - *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期 + 仅已入库状态(5), - * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底); + * OMS 执行入库单状态不回传(长期停留已创建),不按"已入库"过滤,仅排除已取消(6)/已关闭(7), + * 与入库明细查询页面口径一致;明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/executionOutboundRankApi)配对,前端用 tab 页区分

* diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml index 46c335671..0401cc603 100644 --- a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -8,15 +8,16 @@ 入库排名统计公共查询条件(OMS 执行入库链路) 数据源:执行入库明细 execution_in_material_detail(a,仅 level=1 主行防重复) join 执行入仓单 execution_stock_in_order(b) left join NGWL_TEST_WMS.material_base_info(c,跨库取货品档案保额作投保总额) - 口径:b.status = 5已入库(OMS 入库状态枚举 1~7,排除已取消(6)/已关闭(7)及未完成单据); - 日期筛选按执行入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源); + 口径:b.status not in (6已取消,7已关闭)(OMS 执行入库单状态不回传,实际数据长期停留 status=1已创建, + 无法按"已入库5"过滤,与入库明细查询页面口径一致不按状态筛选,仅排除已取消/已关闭); + 日期筛选按执行入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数降序排名 --> a.del_flag = 1 and a.level = 1 and b.del_flag = 1 - and b.status = 5 + and b.status not in (6, 7) and b.top_organization_id = #{topOrganizationId} @@ -39,10 +40,10 @@ and a.material_name like concat('%', #{materialName}, '%')
- and date_format(b.warehouse_date,'%Y-%m-%d') >= #{warehouseDateStart} + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') >= #{warehouseDateStart} - and date_format(b.warehouse_date,'%Y-%m-%d') <= #{warehouseDateEnd} + and date_format(IFNULL(b.warehouse_date, b.create_time),'%Y-%m-%d') <= #{warehouseDateEnd} @@ -56,7 +57,7 @@ select - MAX(b.warehouse_date) AS warehouseDate, + IFNULL(MAX(b.warehouse_date), MAX(b.create_time)) AS warehouseDate, b.in_order_number AS inOrderNumber, MAX(b.shipper_code) AS shipperCode, MAX(b.shipper_name) AS shipperName, From bb3ca932d25147177f6abcf46a44de5c96f64fae Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 09:53:51 +0800 Subject: [PATCH 035/101] =?UTF-8?q?feat(oms):=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AD=98=E5=9C=A8=E6=80=A7=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=94=B6=E9=9B=86=E5=90=8E=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=8F=90=E7=A4=BA(=E7=89=A9=E6=96=99+=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E7=BC=96=E5=8F=B7=E4=B8=80?= =?UTF-8?q?=E6=9D=A1=E6=B6=88=E6=81=AF=E5=B8=A6=E5=85=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整2d1e4b59引入的校验流程(入库parseStockInExcel/出库parseExcelFile统一): 1. 第一步:物料编号存在性校验——逐编号查库,全部不存在的收集到missingMaterials,不立即报错 2. 第二步:客户编号存在性校验——逐编号查库,全部不存在的收集到missingCustomers,不立即报错 3. 第三步:两步全部完成后统一抛出提示,避免修完物料问题重导一次才暴露客户问题: 只缺物料:"物料[A、B]不存在,请先维护物料信息,维护完成后重新导入" 只缺客户:"客户[C]不存在,请先维护客户信息,维护完成后重新导入" 都缺:"物料[A、B]不存在,请先维护物料信息;客户[C、D]不存在,请先维护客户信息,维护完成后重新导入" 4. 存在性全部通过后才继续多货主/多客户编号/客户与货主一致性等校验及建单; 入库"多个客户编号"校验相应移到存在性之后,多个编号中缺哪个报哪个 5. 入库客户查询结果存入customerCache复用,一致性校验不再二次查库 漏填编号(空白行)仍即时报错,不属于存在性问题,行为不变 --- .../ReservationStockInOrderImpl.java | 95 ++++++++++++------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 2503b839f..20176fe04 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -259,7 +259,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); - // ====== 物料存在性校验(落库前):查询结果为空说明库中没有该物料,收集全部缺失料号后一次性提示维护 ====== + // ====== 第一步:物料编号存在性校验(落库前,先收集全部缺失编号,不立即报错) ====== Map materialCache = new LinkedHashMap<>(); List missingMaterials = new ArrayList<>(); for (ProductDetail productDetail : productDetailList) { @@ -277,21 +277,10 @@ public class ReservationStockInOrderImpl extends ServiceImpl shipper = new HashMap<>(); - shipper.put("shipperId", materialBaseInfoPO.getShipperId()); - shipper.put("shipperName", materialBaseInfoPO.getShipperName()); - shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); - shipperIds.add(shipper); - } - } - // ====== 客户存在性校验(落库前):客户编号在库中查询结果为空说明客户不存在,提示维护后再导入 ====== + // ====== 第二步:客户编号存在性校验(落库前,先收集全部缺失编号,不立即报错) ====== Map customerCache = new HashMap<>(); + List missingCustomers = new ArrayList<>(); for (CustomerDeliveryDetail customerDeliveryDetail : customerDeliveryDetailList) { String customerCode = customerDeliveryDetail.getCustomerCode() == null ? "" : customerDeliveryDetail.getCustomerCode().trim(); if (customerCode.isEmpty()) { @@ -302,9 +291,33 @@ public class ReservationStockInOrderImpl extends ServiceImpl problems = new ArrayList<>(); + if (!missingMaterials.isEmpty()) { + problems.add("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息"); + } + if (!missingCustomers.isEmpty()) { + problems.add("客户[" + String.join("、", missingCustomers) + "]不存在,请先维护客户信息"); + } + throw new Exception(String.join(";", problems) + ",维护完成后重新导入"); + } + + // ====== 后续处理(编号均已存在):货主归属校验、建单落库 ====== + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { + Map shipper = new HashMap<>(); + shipper.put("shipperId", materialBaseInfoPO.getShipperId()); + shipper.put("shipperName", materialBaseInfoPO.getShipperName()); + shipper.put("shipperCode", materialBaseInfoPO.getShipperCode()); + shipperIds.add(shipper); } - customerCache.put(customerCode, customer); } // 货品明细不为空时,校验货主信息 @@ -506,8 +519,8 @@ public class ReservationStockInOrderImpl extends ServiceImpl materialCache = new LinkedHashMap<>(); List missingMaterials = new ArrayList<>(); for (StockInProductDetail productDetail : productDetailList) { @@ -522,9 +535,35 @@ public class ReservationStockInOrderImpl extends ServiceImpl customerCodes = new LinkedHashSet<>(); + for (StockInProductDetail productDetail : productDetailList) { + if (productDetail.getCustomerCode() != null && !productDetail.getCustomerCode().trim().isEmpty()) { + customerCodes.add(productDetail.getCustomerCode().trim()); + } } + Map customerCache = new HashMap<>(); + List missingCustomers = new ArrayList<>(); + for (String customerCode : customerCodes) { + UserPo customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); + if (customer == null || customer.getUserId() == null) { + missingCustomers.add(customerCode); + } else { + customerCache.put(customerCode, customer); + } + } + // ====== 第三步:物料/客户存在性校验全部完成后,统一提示两类编号各自有哪些不存在 ====== + if (!missingMaterials.isEmpty() || !missingCustomers.isEmpty()) { + List problems = new ArrayList<>(); + if (!missingMaterials.isEmpty()) { + problems.add("物料[" + String.join("、", missingMaterials) + "]不存在,请先维护物料信息"); + } + if (!missingCustomers.isEmpty()) { + problems.add("客户[" + String.join("、", missingCustomers) + "]不存在,请先维护客户信息"); + } + throw new ServiceException(String.join(";", problems) + ",维护完成后重新导入"); + } + // ====== 后续处理(编号均已存在):名称自动匹配、货主归属与一致性校验、建单 ====== // 明细回填库中匹配到的物料名称(自动匹配,模板中的名称列可不填/以库中为准;库中名称为空时保留模板值) for (StockInProductDetail productDetail : productDetailList) { String materialName = materialCache.get(productDetail.getProductCode()).getMaterialName(); @@ -532,7 +571,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { @@ -554,24 +593,14 @@ public class ReservationStockInOrderImpl extends ServiceImpl customerCodes = new LinkedHashSet<>(); - for (StockInProductDetail productDetail : productDetailList) { - if (productDetail.getCustomerCode() != null && !productDetail.getCustomerCode().trim().isEmpty()) { - customerCodes.add(productDetail.getCustomerCode().trim()); - } - } if (customerCodes.size() > 1) { throw new ServiceException("导入明细中存在多个客户编号(" + String.join("、", customerCodes) + "),一个入库单只能属于一个客户"); } if (!customerCodes.isEmpty()) { String customerCode = customerCodes.iterator().next(); - // 查询结果为空说明库中没有该客户,提示维护后再导入 - customer = stockOutOrderMapper.queryCustomerByCode(customerCode, loginUser.getUserPo().getOrganizationId()); - if (customer == null || customer.getUserId() == null) { - throw new ServiceException("客户[" + customerCode + "]不存在,请先维护客户信息后再导入"); - } + customer = customerCache.get(customerCode); // 客户编号与物料归属货主一致性校验(不一致拦截,提示两者编号;货主编码未维护时提示货主名称) if (!shipperIds.isEmpty() && !customer.getUserId().equals(shipperIds.get(0).get("shipperId"))) { Object materialShipperCode = shipperIds.get(0).get("shipperCode"); From 923afda21c57933e862af2e8f14959d4e1eafa04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 1 Sep 2026 14:09:23 +0800 Subject: [PATCH 036/101] =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E6=9C=88=E5=8F=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=9F=A5=E8=AF=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BiPlatformRealDataService.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java index 9e2470dc6..fecadf30b 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java @@ -231,15 +231,18 @@ public class BiPlatformRealDataService { } /** - * 实时组装月台监测数据:真实字段查 YMS 库,写死字段保留静态值。 + * 实时组装月台监测数据:原则「有真实数据源用真实,无真实数据源用写死模拟」。 + * 有真实数据源的字段(vehicles / platformOverview / vehicleStatus / taskLoad / taskTotal) + * 无条件用 YMS 真实查询覆盖,真实为空即为空,不用模板兜底; + * 无真实数据源的字段(效率统计、趋势、告警、任务类型等)保留模板写死值。 * 每次调用实时查库,不经过快照表。 */ public PlatformSurveillanceVO buildRealTimePlatformSurveillance() { - // 固定种子,保证写死字段每次生成值一致(真实字段随后实时覆盖) + // 固定种子生成写死模板:仅用于没有真实数据源的字段 Random r = new Random(20260825L); PlatformSurveillanceVO template = BiSnapshotWeeklyRandomDataBuilder.platformSurveillance(r); - // 作业车辆列表 + // 作业车辆列表:真实数据源,无条件覆盖(真实为空则返回空列表,不用模板模拟) List realVehicles = queryVehicles(); List vehicleVos = new ArrayList<>(); for (RealPlatformVehiclePO rv : realVehicles) { @@ -252,52 +255,47 @@ public class BiPlatformRealDataService { v.setPlatformDuration(rv.getPlatformDuration() == null ? 0 : rv.getPlatformDuration().intValue()); vehicleVos.add(v); } - if (!vehicleVos.isEmpty()) { - template.setVehicles(vehicleVos); - } + template.setVehicles(vehicleVos); - // 月台实时概览 - RealPlatformOverviewPO ov = queryPlatformOverview(); + // 月台实时概览:真实数据源,无条件覆盖 if (template.getPlatformOverview() != null) { - template.getPlatformOverview().setTotalPlatforms(ov.getTotalPlatforms().intValue()); - template.getPlatformOverview().setOperatingPlatforms(ov.getOperatingPlatforms().intValue()); + RealPlatformOverviewPO ov = queryPlatformOverview(); int total = ov.getTotalPlatforms().intValue(); int occ = ov.getOperatingPlatforms().intValue(); double rate = total > 0 ? Math.round(((double) occ / total) * 100.0 * 100.0) / 100.0 : 0d; + template.getPlatformOverview().setTotalPlatforms(total); + template.getPlatformOverview().setOperatingPlatforms(occ); template.getPlatformOverview().setCurrentOccupancyRate(rate); - } - long todayTasks = countTodayTasks(); - if (template.getPlatformOverview() != null) { - template.getPlatformOverview().setTodayTasks((int) todayTasks); + template.getPlatformOverview().setTodayTasks((int) countTodayTasks()); } - // 作业车辆状态统计 - RealVehicleStatusPO vs = queryVehicleStatusToday(); + // 作业车辆状态统计:真实数据源,无条件覆盖 if (template.getVehicleStatus() != null) { + RealVehicleStatusPO vs = queryVehicleStatusToday(); template.getVehicleStatus().setTodayReservedVehicles(vs.getTodayReservedVehicles().intValue()); template.getVehicleStatus().setNotCheckedIn(vs.getNotCheckedIn().intValue()); template.getVehicleStatus().setOperatingVehicles(vs.getOperatingVehicles().intValue()); template.getVehicleStatus().setCompletedVehicles(vs.getCompletedVehicles().intValue()); } - // 本月任务统计 taskTotal - long monthTasks = countMonthTasks(); + // 本月任务统计:taskTotal 有真实数据源无条件覆盖;YoY 等无真实数据源保留模板写死值 if (template.getMonthlyTaskStatistics() != null) { - template.getMonthlyTaskStatistics().setTaskTotal((int) monthTasks); + template.getMonthlyTaskStatistics().setTaskTotal((int) countMonthTasks()); } - // 任务负荷(今日 24 小时) + // 任务负荷:有真实数据源;真实为空则清空不用模板模拟,有数据则按真实小时覆盖 List loads = queryTaskLoadToday(); - if (!loads.isEmpty() && template.getTaskLoadStatistics() != null) { + if (loads.isEmpty()) { + template.setTaskLoadStatistics(new ArrayList<>()); + } else if (template.getTaskLoadStatistics() != null) { Map hourMap = new HashMap<>(); for (RealTaskLoadPO l : loads) { hourMap.put(l.getHourOfDay(), l.getTaskCount()); } for (TaskLoadItemVO item : template.getTaskLoadStatistics()) { Integer hour = parseHourFromLabel(item.getTime()); - if (hour != null) { - Long n = hourMap.get(hour); - if (n != null) item.setTaskCount(n.intValue()); + if (hour != null && hourMap.containsKey(hour)) { + item.setTaskCount(hourMap.get(hour).intValue()); } } } From 2bbd6784c4912a6613e9d904b7c43fa5711e86f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 1 Sep 2026 14:14:51 +0800 Subject: [PATCH 037/101] 31 --- mhd-bi/src/main/resources/bootstrap.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mhd-bi/src/main/resources/bootstrap.yml b/mhd-bi/src/main/resources/bootstrap.yml index 376c66f95..fa1d95e1a 100644 --- a/mhd-bi/src/main/resources/bootstrap.yml +++ b/mhd-bi/src/main/resources/bootstrap.yml @@ -16,17 +16,17 @@ spring: # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 # server-addr: 10.102.192.5:6848 - username: nacos - password: manhuoda@2023 - #线上正式环境 - server-addr: 10.102.192.30:6848 # username: nacos # password: manhuoda@2023 + #线上正式环境 + server-addr: 10.102.192.31:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From c174ea8742ed2a6b262b4601e45c87f1ba2c999f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 1 Sep 2026 15:15:53 +0800 Subject: [PATCH 038/101] =?UTF-8?q?=E5=8D=95=E5=8F=B7=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=8F=98=E5=8C=96=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=9F=A5=E8=AF=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessDocumentOrderApplicationService.java | 8 ++++++-- .../service/BusinessDocumentOrderDomainService.java | 6 +++--- mhd_oms/src/main/resources/bootstrap.yml | 8 ++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java index 776b4b2b1..ac7afbe76 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/businessDocumentOrder/BusinessDocumentOrderApplicationService.java @@ -103,10 +103,14 @@ public class BusinessDocumentOrderApplicationService { public List queryList(BusinessDocumentOrderDO businessDocumentOrderDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ + if (loginUser != null && loginUser.getUserPo() != null){ + // 前端未传组织ID时,查询当前登录组织的数据 + if (businessDocumentOrderDO.getOrganizationId() == null){ + businessDocumentOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + } Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); if (topOrganizationId != null && topOrganizationId != 1){ - businessDocumentOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + businessDocumentOrderDO.setTopOrganizationId(topOrganizationId); } } return businessDocumentOrderDomainService.queryList(businessDocumentOrderDO); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java index 385e3c3f9..13e523077 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java @@ -737,9 +737,9 @@ public class BusinessDocumentOrderDomainService { // boolean istrue=businessDocumentOrderService.update(businessDocumentOrderDO); - //生成货源单号(yyMMdd + 当日顺序号,每日重置) 原更新操作会将 电脑更细为当日的日期。默认和之前的逻辑一样保持不变 - String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(tmsOrder.getDocumentDate()); - tmsOrder.setGoodsNumber(orderCode); + //更新操作保留原业务单号,不做重新生成(单号随单据日期与当日顺序生成,编辑时不应变化) + //恢复原单号,避免 BeanUtils.copyProperties 时被前端传入值覆盖 + tmsOrder.setGoodsNumber(businessDocumentOrderService.getById(businessDocumentOrderDO.getId()).getGoodsNumber()); ReservationStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectOne(new LambdaQueryWrapper() .eq(ReservationStockOutOrder::getOutOrderNumber, inOrderNumber) diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..8751e75da 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From a4f27ab6432237284ad4754b9668971be5e64645 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 16:29:41 +0800 Subject: [PATCH 039/101] =?UTF-8?q?feat(oms,wms):=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AF=BC=E5=87=BA=E6=96=B0=E5=A2=9EisExport?= =?UTF-8?q?=E6=A0=87=E8=AF=86=E4=B8=8E=E8=9E=8D=E5=90=88=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=20/list=20=E6=96=B0=E5=A2=9E=E5=8F=AF=E9=80=89=E5=8F=82?= =?UTF-8?q?=E6=95=B0=20isExport=20=E6=A0=87=E8=AF=86=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E8=AF=B7=E6=B1=82(=E5=AF=BC=E5=87=BA=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=95=86=E5=93=81=E9=A5=AE=E7=94=A8=E6=9C=89=E6=95=88=E6=9C=9F?= =?UTF-8?q?/=E7=89=A9=E6=96=99=E5=88=86=E7=B1=BB/=E8=BF=9B=E8=B4=A7?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E7=94=B1=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E)=EF=BC=9BisExport=3Dtrue?= =?UTF-8?q?=20=E6=97=B6=E6=89=80=E6=9C=89=E6=9F=A5=E8=AF=A2=E7=BB=B4?= =?UTF-8?q?=E5=BA=A6(OMS=206=E6=9D=A1/WMS=208=E6=9D=A1)=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E5=AF=BC=E5=87=BA=E8=9E=8D=E5=90=88=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=EF=BC=9A=E5=88=B0=E6=9C=9F=E6=97=A5=E5=80=92=E5=BA=8F?= =?UTF-8?q?=E7=A9=BA=E5=80=BC=E6=9C=80=E5=90=8E(=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E5=8E=9F=20orderByExpiryDate=20=E7=AC=AC=E4=B8=80=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7,=E8=9E=8D=E5=90=88=E4=B8=8D=E5=8F=96?= =?UTF-8?q?=E4=BB=A3)=E2=86=92=E5=90=8C=E5=88=B0=E6=9C=9F=E6=97=A5?= =?UTF-8?q?=E5=86=85=E6=8C=89=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81=E5=8D=87?= =?UTF-8?q?=E5=BA=8F=E2=86=920=E5=BA=93=E5=AD=98=E9=9D=A0=E5=90=8E?= =?UTF-8?q?=E2=86=92=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E5=80=92=E5=BA=8F?= =?UTF-8?q?=E2=86=92MAX(=E5=BA=93=E5=AD=98ID)=E5=85=9C=E5=BA=95=E4=BF=9D?= =?UTF-8?q?=E8=AF=81=E5=88=86=E9=A1=B5=E7=A8=B3=E5=AE=9A=EF=BC=9B=E5=90=84?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5=E6=8C=82=E8=BD=BD=E5=85=AC=E5=85=B1=E7=89=87?= =?UTF-8?q?=E6=AE=B5=20exportOrderByMaterialCode=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=BC=A0=20isExport=20=E4=BF=9D=E6=8C=81=E5=8E=9F=E6=9C=89?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=EF=BC=9BOMS=20Controller=20=E5=9C=A8=20isExp?= =?UTF-8?q?ort=3Dtrue=20=E6=97=B6=E8=B7=B3=E8=BF=87=20Java=20=E6=8C=89?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E9=87=8D=E6=8E=92=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E8=A6=86=E7=9B=96=20SQL=20=E5=AF=BC=E5=87=BA=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/ReservationMaterialInventoryDO.java | 3 + .../ReservationMaterialInventoryApi.java | 12 ++- .../MaterialInventoryMapper.xml | 54 +++++++++-- .../repository/todo/MaterialInventoryDO.java | 3 + .../MaterialInventoryApi.java | 11 ++- .../MaterialInventoryMapper.xml | 89 ++++++++++++++++--- 6 files changed, 143 insertions(+), 29 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java index 61fd270a5..13958e2f2 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/todo/ReservationMaterialInventoryDO.java @@ -270,4 +270,7 @@ public class ReservationMaterialInventoryDO extends MaterialBaseDO { @ApiModelProperty("导出排除库存为0标识:true-排除库存数量汇总为0的数据(所有查询维度 queryRule 均生效);不传-不过滤") private Boolean excludeZeroInventoryQuantity; + + @ApiModelProperty("导出标识:导出与查询共用 /list,true-本次为导出请求,启用导出融合排序(到期日倒序优先→同到期日按物料编码升序→0库存靠后→更新时间倒序);不传-保持原有排序") + private Boolean isExport; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java index bae725a5c..0fcb31b52 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/reservationMaterialInventory/ReservationMaterialInventoryApi.java @@ -47,7 +47,7 @@ public class ReservationMaterialInventoryApi extends BaseController { /** * 分页查询物料库存列表 */ - @ApiOperation(value = "查询物料库存列表", notes = "导出复用本接口,任意查询维度(queryRule)下:前端\"库存为0是否导出\"选\"是\"时传 excludeZeroInventoryQuantity=true 排除库存为0的数据,不传或 false 导出全部(含库存为0);orderByExpiryDate=true 时按到期日分组排序") + @ApiOperation(value = "查询物料库存列表", notes = "导出复用本接口:传 isExport=true 标识导出请求(导出显示:商品饮用有效期expiryDate/物料分类materialClassifyName/进货日期purchaseDate,所有查询维度均返回);excludeZeroInventoryQuantity=true 排除库存为0的数据(所有维度生效);orderByExpiryDate=true 按到期日分组排序") @GetMapping("/list") public TableDataInfo list(ReservationMaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName, @@ -56,7 +56,9 @@ public class ReservationMaterialInventoryApi extends BaseController { @RequestParam(value = "purchaseDateStart", required = false) String purchaseDateStart, @RequestParam(value = "purchaseDateEnd", required = false) String purchaseDateEnd, @RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity, - @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate) + @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate, + // 导出标识:导出与查询共用本接口,isExport=true 表示本次请求为导出(导出专属排序等逻辑以此开关) + @RequestParam(value = "isExport", required = false) Boolean isExport) { // 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配) String shipperName = null; // 保存查询到的货主名称 @@ -95,12 +97,14 @@ public class ReservationMaterialInventoryApi extends BaseController { // 导出场景:前端"库存为0是否导出"选"是"时传 excludeZeroInventoryQuantity=true, // SQL 用 HAVING 排除汇总库存为0的数据(与 WMS 同名参数语义一致) materialInventoryDO.setExcludeZeroInventoryQuantity(excludeZeroInventoryQuantity); + // 导出标识:isExport=true 启用导出融合排序(到期日倒序优先 → 同到期日按物料编码升序,所有维度生效) + materialInventoryDO.setIsExport(isExport); startPage(); // 使用带批次属性的查询方法,批次属性值从库存表中获取 List list = materialInventoryApplicationService.queryListWithBatchAttributes(materialInventoryDO); // 按更新时间倒序排序;update_time 为空的数据放最后 - // (导出 orderByExpiryDate=true 时跳过该重排,避免覆盖 SQL 的到期日分组排序) - if (!Boolean.TRUE.equals(orderByExpiryDate)) { + // (导出 orderByExpiryDate=true 或 isExport=true 时跳过该重排,避免覆盖 SQL 的导出排序) + if (!Boolean.TRUE.equals(orderByExpiryDate) && !Boolean.TRUE.equals(isExport)) { list.sort((o1, o2) -> { Date t1 = o1.getUpdateTime(); Date t2 = o2.getUpdateTime(); diff --git a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml index 200226335..e9cd17b19 100644 --- a/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationMaterialInventory/MaterialInventoryMapper.xml @@ -305,6 +305,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + order by CASE WHEN MAX(a.expiry_date) IS NULL THEN 1 ELSE 0 END ASC, MAX(a.expiry_date) DESC, + MAX(b.material_code) ASC, + CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END ASC, + MAX(a.update_time) DESC, + MAX(a.material_inventory_id) DESC + + @@ -401,16 +427,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.organization_id, a.organization_name, a.top_organization_id, b.material_code, b.material_name - + - - order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, - sort_order, MAX(a.update_time) DESC + + - order by sort_order, MAX(a.update_time) desc + + + + order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, + sort_order, MAX(a.update_time) DESC + + + order by sort_order, MAX(a.update_time) desc + + @@ -427,6 +462,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.SHIPPER_ID + + + diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java index c9b3af8aa..312a5f074 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java @@ -285,4 +285,7 @@ public class MaterialInventoryDO extends MaterialBaseDO { @ApiModelProperty("库存分配匹配:Batch Ref NO's token 列表(默认不启用,仅显式赋值时参与匹配)") private List batchRefNoList; + + @ApiModelProperty("导出标识:导出与查询共用 /list,true-本次为导出请求,启用导出融合排序(到期日倒序优先→同到期日按物料编码升序→0库存靠后→更新时间倒序);不传-保持原有排序") + private Boolean isExport; } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java index 93b329ea3..519994447 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java @@ -53,7 +53,7 @@ public class MaterialInventoryApi extends BaseController { /** * 分页查询物料库存列表 */ - @ApiOperation(value = "查询物料库存列表", notes = "库存查询页不传 excludeZeroInventoryQuantity 可查出数量为0;出库分配页传 excludeZeroInventoryQuantity=true 排除库存数量为0") + @ApiOperation(value = "查询物料库存列表", notes = "库存查询页不传 excludeZeroInventoryQuantity 可查出数量为0;出库分配页传 excludeZeroInventoryQuantity=true 排除库存数量为0;导出复用本接口:传 isExport=true 标识导出请求(导出显示:商品饮用有效期expiryDate/物料分类materialClassifyName/进货日期purchaseDate,所有查询维度均返回)") @GetMapping("/list") public TableDataInfo list(MaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName, @@ -62,7 +62,9 @@ public class MaterialInventoryApi extends BaseController { @RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd, @RequestParam(value = "purchaseDateStart", required = false) String purchaseDateStart, @RequestParam(value = "purchaseDateEnd", required = false) String purchaseDateEnd, - @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate) + @RequestParam(value = "orderByExpiryDate", required = false) Boolean orderByExpiryDate, + // 导出标识:导出与查询共用本接口,isExport=true 表示本次请求为导出(导出专属排序等逻辑以此开关) + @RequestParam(value = "isExport", required = false) Boolean isExport) { if (Boolean.TRUE.equals(excludeZeroInventoryQuantity)) { materialInventoryDTO.setExcludeZeroInventoryQuantity(true); @@ -100,6 +102,8 @@ public class MaterialInventoryApi extends BaseController { materialInventoryDO.setPurchaseDateEnd(purchaseDateEnd); // 导出场景:queryRule=wlExpiry + orderByExpiryDate=true 时 SQL 按到期日倒序分组(与 OMS 库存查询导出一致) materialInventoryDO.setOrderByExpiryDate(orderByExpiryDate); + // 导出标识:isExport=true 启用导出融合排序(到期日倒序优先 → 同到期日按物料编码升序,所有维度生效) + materialInventoryDO.setIsExport(isExport); Date updateTime = materialInventoryDTO.getUpdateTime(); if (updateTime != null) { LocalDateTime localDateTime = updateTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); @@ -172,7 +176,8 @@ public class MaterialInventoryApi extends BaseController { // materialDetailId 是新接口专用参数(出库单明细ID),库存 DTO 的同名字段语义是「上架单明细ID」, // 泄入原查询会生成错误的 a.material_detail_id 条件导致查空,进原查询前显式清除 materialInventoryDTO.setMaterialDetailId(null); - return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate); + // assignableList 非导出场景,isExport 传 null + return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate, null); } @ApiOperation("查询物料库存列表不分页;queryRule=hz 时按货主+物料分组(同一物料在不同货主各占一行)") diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 3b55cabce..783b033bb 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -403,6 +403,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + order by CASE WHEN MAX(a.expiry_date) IS NULL THEN 1 ELSE 0 END ASC, MAX(a.expiry_date) DESC, + MAX(b.material_code) ASC, + CASE WHEN IFNULL(SUM(a.inventory_quantity), 0) = 0 THEN 1 ELSE 0 END ASC, + MAX(a.update_time) DESC, + MAX(a.material_inventory_id) DESC + + @@ -586,16 +621,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.MATERIAL_BASE_INFO_ID, a.EXPIRY_DATE, a.shipper_id, a.organization_id, a.top_organization_id - + - - order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, - sort_order, MAX(a.update_time) DESC + + - order by sort_order, MAX(a.update_time) desc + + + + order by CASE WHEN a.expiry_date IS NULL THEN 1 ELSE 0 END ASC, a.expiry_date DESC, + sort_order, MAX(a.update_time) DESC + + + order by sort_order, MAX(a.update_time) desc + + @@ -631,7 +675,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY a.SHIPPER_ID, a.MATERIAL_BASE_INFO_ID, loc.warehouse_id, loc.warehouse_code, loc.warehouse_name, loc.storage_section_id, loc.storage_code, loc.storage_name, - loc.storage_location_id, loc.storage_location_code, loc.storage_location_name order by sort_order, a.update_time desc + loc.storage_location_id, loc.storage_location_code, loc.storage_location_name + + + + + order by sort_order, a.update_time desc + @@ -691,7 +741,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" b.material_code, a.warehouse_id, a.organization_id, a.top_organization_id - ORDER BY sort_order, MAX(a.update_time) DESC + + + + + ORDER BY sort_order, MAX(a.update_time) DESC + From cd41c616bbe0bfba8d2655d65d8d0ffa5f945542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 1 Sep 2026 16:30:23 +0800 Subject: [PATCH 040/101] 31 --- mhd_oms/src/main/resources/bootstrap.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 8751e75da..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 77fb71dab476686b40c961f7317b74e24c59b4bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 1 Sep 2026 16:32:33 +0800 Subject: [PATCH 041/101] 30 --- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 1208e02fe79912e1888a3c3449ffa82dfaed30a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=BE=89?= <2830717623@qq.com> Date: Tue, 1 Sep 2026 17:14:23 +0800 Subject: [PATCH 042/101] =?UTF-8?q?yms=E7=A7=9F=E6=88=B7=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mhd/common/core/enums/RoleEnum.java | 3 +- .../service/CommonApplicationService.java | 10 +- .../service/UserApplicationService.java | 148 +++++++++++++++--- .../factory/UserRoleFactory.java | 10 +- .../service/UserDomainService.java | 8 +- .../mhd/user/interfaces/facade/UserAPI.java | 16 ++ 6 files changed, 167 insertions(+), 28 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java index e1f4b27ed..841ba0ded 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/enums/RoleEnum.java @@ -16,7 +16,8 @@ public enum RoleEnum { STORE_ADMIN("店铺管理员", "store_admin"), OWNER_CARGO("货主", "ownerCargo"), SUPPLIER("供应商", "supplier"), - CUSTOMER("客户", "customer"); + CUSTOMER("客户", "customer"), + TENANT("租户", "tenant"); private String name; private String code; diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java index 04c8c3236..4968160c9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/CommonApplicationService.java @@ -129,8 +129,14 @@ public class CommonApplicationService { * @param userDO */ public void checkAccountInfo(UserDO userDO) { - //获取当前登录用户的最高组织 - Long topOrganizationId = SecurityUtils.getLoginUser().getUserPo().getTopOrganizationId(); + //获取当前登录用户的最高组织,远程Feign调用无loginUser时从userDO取 + Long topOrganizationId; + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } else { + topOrganizationId = userDO.getTopOrganizationId(); + } checkUserInfo(topOrganizationId, userDO); } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java index e4372185b..1f44ce5eb 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserApplicationService.java @@ -735,14 +735,20 @@ public class UserApplicationService { */ public void addUserInfo(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.USER_NULL); + UserPo loginUserPo = null; + if (ObjectUtil.isNotNull(loginUser)) { + loginUserPo = loginUser.getUserPo(); } - UserPo loginUserPo = loginUser.getUserPo(); CheckDO checkDO = userFactory.getCheckDo(userDO); //用户密码传值 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } checkDO.setUserPassword(userPassword); } //用户信息格式校验 @@ -750,9 +756,15 @@ public class UserApplicationService { String salt = OConvertUtils.randomGen(8); userDO.setUserSalt(salt); regCheck(checkDO); - //用户密码传值 + //用户密码加密入库 if (StringUtils.isNotEmpty(userDO.getUserPassword())) { - String userPassword = AESUtil.decrypt(userDO.getUserPassword()); + String userPassword; + if (ObjectUtil.isNotNull(loginUser)) { + userPassword = AESUtil.decrypt(userDO.getUserPassword()); + } else { + // Feign调用传入的是明文密码,无需AES解密 + userPassword = userDO.getUserPassword(); + } //加密算法,PBEWithMD5AndDES, String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userPassword, salt); userDO.setUserPassword(passwordEncode); @@ -783,11 +795,13 @@ public class UserApplicationService { String idCardDes = DesensitizedUtil.desensitizedIdNumber(idCard); userDO.setUserIdcardNumberDes(idCardDes); } - userDO.setCreateBy(loginUserPo.getUserId()); - userDO.setCreateByName(loginUserPo.getUserName()); - if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { - userDO.setCreateBy(loginUserPo.getCreateBy()); - userDO.setCreateByName(loginUserPo.getCreateByName()); + if (ObjectUtil.isNotNull(loginUserPo)) { + userDO.setCreateBy(loginUserPo.getUserId()); + userDO.setCreateByName(loginUserPo.getUserName()); + if (loginUserPo.getUserAccountType() != null && loginUserPo.getUserAccountType() == 5) { + userDO.setCreateBy(loginUserPo.getCreateBy()); + userDO.setCreateByName(loginUserPo.getCreateByName()); + } } userDO.setCreateTime(new Date()); //用户状态:0-无状态,1-正常,2-锁定 @@ -1379,6 +1393,66 @@ public class UserApplicationService { } } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + * 调用方需传入:organizationId、userAccount、userPassword(明文)、userName + */ + @Transactional(rollbackFor = Exception.class) + public UserPo addUserByFeign(UserDO userDO) { + // 1. 获取一级组织 + AjaxResult organizationInfo = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + String code = organizationInfo.get("code").toString(); + if (!"200".equals(code)) { + throw new DigitalLogisticsException(UserError.USER_ACCOUNT_REG_ERROR); + } + String data = organizationInfo.get("data").toString(); + if (ObjectUtil.isNotNull(data)) { + userDO.setTopOrganizationId(Long.parseLong(data)); + } + // 2. 获取组织名称 + AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); + if ("200".equals(orgInfoResult.get("code").toString())) { + Object orgData = orgInfoResult.get("data"); + if (ObjectUtil.isNotNull(orgData)) { + OrganizationPo organizationPo = BeanUtil.toBean(orgData, OrganizationPo.class); + if (ObjectUtil.isNotNull(organizationPo)) { + userDO.setOrganizationName(organizationPo.getOrganizationName()); + } + } + } + // 3. 密码加密(调用方传入明文,无需AES解密) + if (StringUtils.isNotEmpty(userDO.getUserPassword())) { + String salt = OConvertUtils.randomGen(8); + userDO.setUserSalt(salt); + String passwordEncode = PasswordUtil.encrypt(userDO.getUserAccount(), userDO.getUserPassword(), salt); + userDO.setUserPassword(passwordEncode); + } + // 4. 根据userId判断新增还是更新 + if (ObjectUtil.isNotNull(userDO.getUserId())) { + // 有userId,更新已有用户 + UserEntity updateEntity = new UserEntity(); + BeanUtils.copyProperties(userDO, updateEntity); + userMapper.updateById(updateEntity); + UserPo userPo = userMapper.selectByUserId(userDO.getUserId()); + return userPo; + } else { + // 无userId,新增用户 + userDO.setCreateTime(new Date()); + userDO.setUserStatus(1); + userDO.setUserAuthStatus(1); + userDO.setDelFlag(1); + userDO.setRoleCode(RoleEnum.MUST.getCode()); + userDO.setRoleName(RoleEnum.MUST.getName()); + if (ObjectUtil.isNull(userDO.getUserAccount()) && ObjectUtil.isNotNull(userDO.getUserPhone())) { + userDO.setUserAccount(userDO.getUserPhone()); + } + UserEntity userEntity = userDomainService.addUser(userDO); + UserPo userPo = new UserPo(); + BeanUtils.copyProperties(userEntity, userPo); + return userPo; + } + } + /** * @Description 新增用户 * @Author Alex @@ -1388,18 +1462,31 @@ public class UserApplicationService { public UserPo addUserYG(UserDO userDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); String password = userDO.getPlainPassword(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + // 远程Feign调用时可能无loginUser,优先从loginUser取组织信息,否则使用userDO自身携带的数据 + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else if (ObjectUtil.isNotNull(userDO.getOrganizationId()) && ObjectUtil.isNull(userDO.getTopOrganizationId())) { + // 无loginUser时,提前获取一级组织ID,供后续checkAccountInfo使用 + AjaxResult topOrgResult = productServiceFeign.getTopOrganization(userDO.getOrganizationId()); + if ("200".equals(topOrgResult.get("code").toString())) { + String topOrgData = topOrgResult.get("data").toString(); + if (ObjectUtil.isNotNull(topOrgData)) { + userDO.setTopOrganizationId(Long.parseLong(topOrgData)); + } + } } - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); //2023年3月24日 bug修改 增加登录账号/手机号唯一性校验 commonApplicationService.checkAccountInfo(userDO); if (ObjectUtil.isNotNull(userDO.getUserId())) { return updateUser(userDO); } else { if (ObjectUtil.isNull(userDO.getOrganizationId())) { - userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + if (ObjectUtil.isNotNull(loginUser)) { + userDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + userDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } else { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } } else { // 如果前端传递了 organizationId,根据 organizationId 查询组织信息,获取正确的组织名称 AjaxResult orgInfoResult = productServiceFeign.getInfo(userDO.getOrganizationId()); @@ -1441,7 +1528,14 @@ public class UserApplicationService { //组装新增用户信息 addUserInfo(userDO); + // 远程Feign调用无loginUser时,强制分配默认普通角色,不走管理员 + if (ObjectUtil.isNull(loginUser)) { + userDO.setRoleCode(RoleEnum.TENANT.getCode()); + userDO.setRoleName(RoleEnum.TENANT.getName()); + userDO.setUserAccountType(null); + } UserEntity userEntity = userDomainService.addUser(userDO); + if (ObjectUtil.isNotNull(loginUser)) { if (isCustomerManagementPresetRole(userEntity.getRoleCode())) { // 保持插入结果,不再改 role_code / user_role } else if ((StringUtils.isEmpty(userEntity.getRoleCode()) || !RoleEnum.PLAT_ADMIN.getCode().equals(userEntity.getRoleCode())) && @@ -1480,6 +1574,22 @@ public class UserApplicationService { userDomainService.updateUser(userDO); } } + } // end of loginUser != null check + else { + RoleDo roleDo = new RoleDo(); + roleDo.setRoleCode(userEntity.getRoleCode()); + roleDo.setOrganizationId(userEntity.getOrganizationId()); + RoleEntity roleEntity = roleDomainService.selectByOrganizationIdAndRoleCode(roleDo); + if (roleEntity != null) { + UserRoleDo userRoleDo = new UserRoleDo(); + userRoleDo.setUserId(userEntity.getUserId()); + userRoleDo.setRoleId(roleEntity.getRoleId()); + userRoleDomainService.addUserRole(userRoleDo); + userDO.setRoleId(roleEntity.getRoleId()); + userDO.setUserId(userEntity.getUserId()); + userDomainService.updateUser(userDO); + } + } BeanUtils.copyProperties(userEntity, userPo); //同步网货平台员工信息 try { @@ -1492,13 +1602,15 @@ public class UserApplicationService { // throw e; } //获取组织信息 - Long organizationId = loginUser.getUserPo().getOrganizationId(); + Long organizationId = ObjectUtil.isNotNull(loginUser) ? loginUser.getUserPo().getOrganizationId() : userDO.getOrganizationId(); Integer isQueue = userMapper.getOrdIsQueue(organizationId); if (isQueue==1) { //同步YMS员工信息 try { - userEntity.setUserPassword(password); + if (StringUtils.isNotEmpty(password)) { + userEntity.setUserPassword(password); + } ymsDomainService.addOrEditYmsUser(userEntity); } catch (Exception e) { // 同步YMS失败时,记录日志但不影响用户保存 diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java index d4c2c0388..96af6ea6a 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/factory/UserRoleFactory.java @@ -22,12 +22,12 @@ public class UserRoleFactory { UserRoleEntity userRoleEntity = new UserRoleEntity(); BeanUtils.copyProperties(userRoleDo,userRoleEntity, IgnoreNullUtil.getNullPropertyNames(userRoleDo)); LoginUser loginUser = SecurityUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new DigitalLogisticsException(UserError.TIMEOUT); + String userName = null; + Long userId = null; + if (ObjectUtil.isNotNull(loginUser)) { + userName = loginUser.getUsername(); + userId = loginUser.getUserid(); } - String userName = loginUser.getUsername(); - // 获取登录人id - Long userId = loginUser.getUserid(); if(userRoleDo.getUserRoleId() != null){ if(userId != null){ userRoleEntity.setUpdateBy(userId); diff --git a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java index 5605c1dfb..a421ca8ec 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/domain/userAggregate/service/UserDomainService.java @@ -12,6 +12,7 @@ import com.mhd.user.domain.userAggregate.repository.todo.UserDO; import com.mhd.common.core.domain.po.app.UserAppPo; import com.mhd.common.core.annotation.fieldsetvalue.NeedSetValueMethod; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import com.mhd.user.infrastructure.util.annotation.DataPermissions; import com.mhd.user.interfaces.dto.queryDTO.UserDocumentWarningQueryDTO; import com.mhd.user.interfaces.dto.updateDTO.UpdateHasDefaultAddressDTO; @@ -50,9 +51,12 @@ public class UserDomainService { */ public UserEntity updateUser(UserDO userDO) { UserEntity userEntity = userFactory.getUserEntity(userDO); - userEntity.setUpdateBy(SecurityUtils.getLoginUser().getUserid()); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + userEntity.setUpdateBy(loginUser.getUserid()); + userEntity.setUpdateByName(loginUser.getUsername()); + } userEntity.setUpdateTime(new Date()); - userEntity.setUpdateByName(SecurityUtils.getLoginUser().getUsername()); userRepositoryInterface.updateUser(userEntity); return userEntity; } diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java index 96d2f14e6..52d5058f9 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserAPI.java @@ -283,6 +283,22 @@ public class UserAPI extends BaseController { return R.ok(sysUserVo, "操作成功"); } + /** + * 远程Feign调用新增用户(无token),仅操作USER表基本字段 + */ + @ApiOperation("远程Feign修改用户(无token)") + @PostMapping("/addUserByFeign") + public R addUserByFeign(@RequestBody UserDTO userDTO) { + LoginUser sysUserVo = new LoginUser(); + UserDO userDO = userAssember.toUserDO(userDTO); + UserPo userPo = userApplicationService.addUserByFeign(userDO); + if (ObjectUtil.isNotNull(userPo)) { + sysUserVo.setUserid(userPo.getUserId()); + } + sysUserVo.setUserPo(userPo); + return R.ok(sysUserVo, "操作成功"); + } + /** * @Description 新增合作商 * @Author Alex From 4deaeaa89da77c31546eac99831a5c1b62976f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=BE=89?= <2830717623@qq.com> Date: Tue, 1 Sep 2026 17:22:26 +0800 Subject: [PATCH 043/101] user30 --- mhd-user-center/src/main/resources/bootstrap.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index a66be4688..c954a35cf 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 From 1cec76293009b24a11a27aa7ab43ec10a932f390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E8=BE=89?= <2830717623@qq.com> Date: Tue, 1 Sep 2026 17:35:21 +0800 Subject: [PATCH 044/101] user30 --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../src/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 +- mhd-user-center/src/main/resources/bootstrap.yml | 4 ++-- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 e4a817238..d976fcc98 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.30:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31:8012", configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index c954a35cf..fd3e72060 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -20,13 +20,13 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From da3c58a366952bef7a8ad9654d1c41c8a4cdaf79 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 21:36:33 +0800 Subject: [PATCH 045/101] =?UTF-8?q?fix(wms,oms)=EF=BC=9A=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E6=8E=92=E5=90=8D=E7=BB=9F=E8=AE=A1=E5=8F=A3=E5=BE=84=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9A=E4=BB=B6=E6=95=B0=E6=94=B9=E4=B8=BA=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E4=B8=8A=E6=9E=B6=E9=87=8FSUM(SHELVES=5FQUANTITY)(?= =?UTF-8?q?=E5=8E=9FPIECE=5FCOUNT=E4=B8=BA=E5=BB=BA=E6=A1=A3=E7=94=B3?= =?UTF-8?q?=E6=8A=A5=E5=80=BC=E4=B8=8D=E9=9A=8F=E6=94=B6=E8=B4=A7=E4=B8=8A?= =?UTF-8?q?=E6=9E=B6=E5=8F=98=E5=8C=96)=EF=BC=9BOMS=E7=AB=AF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E8=B7=A8=E5=BA=93=E6=94=B9=E6=9F=A5WMS?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E8=A1=A8NGWL=5FTEST=5FWMS.stock=5Fin=5Forder?= =?UTF-8?q?/in=5Fmaterial=5Fdetail(OMS=E6=89=A7=E8=A1=8C=E5=8D=95=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=B8=8D=E5=9B=9E=E4=BC=A0=E4=B8=94=E4=B8=8A=E6=9E=B6?= =?UTF-8?q?=E9=87=8F=E5=9B=9E=E5=A1=AB=E4=BB=A3=E7=A0=81=E6=9C=AA=E5=90=AF?= =?UTF-8?q?=E7=94=A8=EF=BC=8C=E4=B8=8E=E5=87=BA=E5=BA=93=E6=8E=92=E5=90=8D?= =?UTF-8?q?1300a4e1=E8=B7=A8=E5=BA=93=E4=BF=AE=E6=B3=95=E4=B8=80=E8=87=B4)?= =?UTF-8?q?=EF=BC=8C=E7=8A=B6=E6=80=81=E6=81=A2=E5=A4=8D=E4=B8=BA=E5=B7=B2?= =?UTF-8?q?=E5=85=A5=E5=BA=93(5)=EF=BC=9B=E5=85=A5=E4=BB=93=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E4=B8=BA=E7=A9=BA=E5=85=9C=E5=BA=95=E5=BB=BA=E6=A1=A3?= =?UTF-8?q?=E6=97=B6=E9=97=B4=EF=BC=9BOMS=E4=B8=8EWMS=E4=B8=A4=E7=AB=AF?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=B8=80=E8=87=B4=EF=BC=9B=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B7=AF=E5=BE=84/=E5=8F=82=E6=95=B0/=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=B8=8D=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po/ExecutionInboundMaterialRankPO.java | 10 +++--- .../po/ExecutionInboundRankTotalPO.java | 2 +- .../todo/ExecutionInboundRankDTO.java | 2 +- .../inboundRank/ExecutionInboundRankApi.java | 8 +++-- .../ExecutionInboundRankMapper.xml | 32 +++++++++++-------- .../repository/po/InboundMaterialRankPO.java | 6 ++-- .../repository/po/InboundRankTotalPO.java | 2 +- .../facadeApi/inboundRank/InboundRankApi.java | 2 +- .../mapper/inboundRank/InboundRankMapper.xml | 8 ++--- 9 files changed, 40 insertions(+), 32 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java index abcf12539..6532af87f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java @@ -14,8 +14,10 @@ import java.util.Date; /** * 入库排名统计PO(一行 = 某仓单内某货品的合计,按件数降序排名) * - *

字段口径:入仓日期=执行入仓单入仓日期;仓单编号=执行入库单号;客户编号/存货人=入仓单货主; - * 件数/毛重/体积=仓单内该货品明细合计;毛重(吨)=明细总毛重KG/1000; + *

数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传), + * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致。 + * 字段口径:入仓日期=WMS入仓单入仓日期(为空兜底建档时间);仓单编号=WMS入库单号;客户编号/存货人=入仓单货主; + * 件数/毛重/体积=仓单内该货品明细合计(件数取实际上架量 SHELVES_QUANTITY);毛重(吨)=明细总毛重KG/1000; * 投保总额=货品档案保额(NGWL_TEST_WMS.material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)

* * @author rcx @@ -33,7 +35,7 @@ public class ExecutionInboundMaterialRankPO implements Serializable { @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") private Date warehouseDate; - @ApiModelProperty("仓单编号(执行入库单号)") + @ApiModelProperty("仓单编号(WMS入库单号)") @Excel(name = "仓单编号") private String inOrderNumber; @@ -61,7 +63,7 @@ public class ExecutionInboundMaterialRankPO implements Serializable { @Excel(name = "单位") private String unitName; - @ApiModelProperty("件数(仓单内该货品合计,排名依据)") + @ApiModelProperty("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)") @Excel(name = "件数") private BigDecimal pieceCount; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java index d3d1bd88d..c8a51892e 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java @@ -22,7 +22,7 @@ public class ExecutionInboundRankTotalPO implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty("件数合计") + @ApiModelProperty("件数合计(实际上架量)") private BigDecimal totalPieceCount; @ApiModelProperty("毛重(吨)合计") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java index 3e557dd6d..968c289d5 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/todo/ExecutionInboundRankDTO.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** * 入库排名统计入参DTO * - *

数据源为 OMS 执行入库链路(execution_in_material_detail / execution_stock_in_order)

+ *

数据源跨库取 WMS 入库链路(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传)

* * @author rcx * @date 2026-08-31 diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java index b7cfd6391..f97d23e57 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java @@ -26,9 +26,11 @@ import java.util.List; /** * 入库排名统计Api * - *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底); - * OMS 执行入库单状态不回传(长期停留已创建),不按"已入库"过滤,仅排除已取消(6)/已关闭(7), - * 与入库明细查询页面口径一致;明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数降序排名。 + *

按入仓日期区间筛选商品入库量统计排名。OMS 库执行入库单状态/上架数量均不回传,真实数据在 WMS 库, + * 故数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order/in_material_detail,与 OMS 出库排名跨库修法一致); + * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致:仅已入库(5) + 明细 level=1 主行 + + * 入仓日期(为空的历史单按建档时间兜底) + 件数=实际上架量(SHELVES_QUANTITY); + * 一行 = 某仓单内某货品的合计,按件数降序排名。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/executionOutboundRankApi)配对,前端用 tab 页区分

* diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml index 0401cc603..e6b76eb0d 100644 --- a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -5,19 +5,23 @@ a.del_flag = 1 and a.level = 1 - and b.del_flag = 1 - and b.status not in (6, 7) + and b.status = 5 and b.top_organization_id = #{topOrganizationId} @@ -48,12 +52,12 @@ - from execution_in_material_detail a - join execution_stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 + from NGWL_TEST_WMS.in_material_detail a + join NGWL_TEST_WMS.stock_in_order b on a.in_order_number = b.in_order_number and b.del_flag = 1 left join NGWL_TEST_WMS.material_base_info c on a.material_base_info_id = c.material_base_info_id - + select @@ -66,7 +66,7 @@ MAX(a.material_name) AS materialName, MAX(a.SPECIFICATION_MODEL) AS specificationModel, MAX(a.unit_name) AS unitName, - IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + IFNULL(SUM(a.SHELVES_QUANTITY), 0) AS pieceCount, ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS grossWeightTon, MAX(IFNULL(c.insure_amount, 0)) AS insureAmount, IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume @@ -90,7 +90,7 @@ from ( select b.in_order_number AS inOrderNumber, - IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + IFNULL(SUM(a.SHELVES_QUANTITY), 0) AS pieceCount, IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) AS grossWeightKG, MAX(IFNULL(c.insure_amount, 0)) AS insureAmount, IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume From 004580e252d3c71642a1724e27540d6e8d119514 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 22:36:10 +0800 Subject: [PATCH 046/101] =?UTF-8?q?=E5=8F=91=2030?= 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_oms/src/main/resources/bootstrap.yml | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 9 files changed, 12 insertions(+), 12 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 8cc8bfd57..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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..de19e469b 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 509644885..6238639f6 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..6f6f77377 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,7 +19,7 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index b99fb0b27..966fc1a4a 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.30:6848 + server-addr: 10.102.192.30: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: # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 91bdb99ec2d6fd0b0d8f16362ccf52be447022b2 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 22:50:50 +0800 Subject: [PATCH 047/101] =?UTF-8?q?=E5=8F=91=2031?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 9 files changed, 10 insertions(+), 10 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d976fcc98 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 6f6f77377..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,7 +19,7 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 966fc1a4a..1e7da23c1 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 19e897cae0397543f00c3bd20c04892ce39963f4 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 23:02:30 +0800 Subject: [PATCH 048/101] =?UTF-8?q?=E5=8F=91=2030?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 8cc8bfd57..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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..de19e469b 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 509644885..6238639f6 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 3989d75f05448fd81e46c6f796f3fe6c9ae01a1a Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 1 Sep 2026 23:50:34 +0800 Subject: [PATCH 049/101] =?UTF-8?q?=E5=8F=91=2030?= 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 +- mhd_oms/src/main/resources/bootstrap.yml | 8 ++++---- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 12 insertions(+), 12 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 0d65c89a1..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 8a7006304..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4: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 ba9a45148..de19e469b 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.33.0.129:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 7fbd7dd9b..26a92624c 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, url = "http://10.102.192.3: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 beba5b1af..12571141a 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.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.4: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 9fd21ae67..6238639f6 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.33.0.129:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.30:8012", configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 88471e390..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 52ade270d..ecb312261 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From f5a7c8c1f356900710a1c9fad68311fe5e3a8df8 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 00:12:59 +0800 Subject: [PATCH 050/101] =?UTF-8?q?=E5=8F=91=2031?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d976fcc98 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index ecb312261..52ade270d 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 72cb1d8c07b14e8b37c5bb1e7d3e82c1131779c3 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 14:04:15 +0800 Subject: [PATCH 051/101] =?UTF-8?q?feat(wms):=20=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9E=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E5=8F=AF=E7=94=A8=E6=95=B0=E9=87=8F=E4=B8=BA0?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /materialInventoryApi/list 新增可选参数 excludeZeroAllocationQuantity,为 true 时排除可用数量=0 的库存行;与已有 excludeZeroInventoryQuantity 组成两个独立开关,不传时保持原有行为。配合盘点-库存选择页隐藏数量为0物料及出库选库存隐藏0库存需求。 --- .../repository/todo/MaterialInventoryDO.java | 2 ++ .../materialInventory/MaterialInventoryDTO.java | 3 +++ .../materialInventory/MaterialInventoryApi.java | 17 ++++++++++++++--- .../MaterialInventoryMapper.xml | 6 ++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java index 312a5f074..21c834773 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/todo/MaterialInventoryDO.java @@ -256,6 +256,8 @@ public class MaterialInventoryDO extends MaterialBaseDO { /** 为 true 时 SQL 排除库存数量为 0(含 null 视为 0) */ private Boolean excludeZeroInventoryQuantity; + /** 为 true 时 SQL 排除可用数量为 0(含 null 视为 0),出库选库存可用 */ + private Boolean excludeZeroAllocationQuantity; private String expiryDateStr; private String productionDateStr; private String updateTimeStr; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java index fd5bb71cf..944626b17 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/materialInventory/MaterialInventoryDTO.java @@ -188,6 +188,9 @@ public class MaterialInventoryDTO extends MaterialBaseDTO { /** 为 true 时排除库存数量为 0 的行(出库分配选库存用);库存查询页不传或 false */ @ApiModelProperty(value = "是否排除库存数量为0", example = "false") private Boolean excludeZeroInventoryQuantity; + /** 为 true 时排除可用数量为 0 的行(库存数量>0 但可用数量=0 表示已被冻结/占用完,无法出库);不传或 false 不过滤 */ + @ApiModelProperty(value = "是否排除可用数量为0", example = "false") + private Boolean excludeZeroAllocationQuantity; private String expiryDate; private String productionDate; /** 进货日期(yyyy-MM-dd,单日精确查询) */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java index 519994447..ff774c2bb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/materialInventory/MaterialInventoryApi.java @@ -53,11 +53,17 @@ public class MaterialInventoryApi extends BaseController { /** * 分页查询物料库存列表 */ - @ApiOperation(value = "查询物料库存列表", notes = "库存查询页不传 excludeZeroInventoryQuantity 可查出数量为0;出库分配页传 excludeZeroInventoryQuantity=true 排除库存数量为0;导出复用本接口:传 isExport=true 标识导出请求(导出显示:商品饮用有效期expiryDate/物料分类materialClassifyName/进货日期purchaseDate,所有查询维度均返回)") + @ApiOperation(value = "查询物料库存列表", notes = "两个隐藏0库存开关(均不传或 false 不过滤,保持原行为):" + + "excludeZeroInventoryQuantity=true 排除库存数量为0(盘点-库存选择页\"隐藏数量为0的物料\");" + + "excludeZeroAllocationQuantity=true 排除可用数量为0(出库选库存,可用数量=0 表示已被冻结/占用完无法出库);" + + "物料编号筛选传 materialCode(精确匹配),仓库筛选传 warehouseId(下拉);" + + "库存查询页不传开关可查出数量为0;导出复用本接口:传 isExport=true 标识导出请求" + + "(导出显示:商品饮用有效期expiryDate/物料分类materialClassifyName/进货日期purchaseDate,所有查询维度均返回)") @GetMapping("/list") public TableDataInfo list(MaterialInventoryDTO materialInventoryDTO, @RequestParam(value = "customerName", required = false) String customerName, @RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity, + @RequestParam(value = "excludeZeroAllocationQuantity", required = false) Boolean excludeZeroAllocationQuantity, @RequestParam(value = "expiryDateStart", required = false) String expiryDateStart, @RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd, @RequestParam(value = "purchaseDateStart", required = false) String purchaseDateStart, @@ -69,6 +75,9 @@ public class MaterialInventoryApi extends BaseController { if (Boolean.TRUE.equals(excludeZeroInventoryQuantity)) { materialInventoryDTO.setExcludeZeroInventoryQuantity(true); } + if (Boolean.TRUE.equals(excludeZeroAllocationQuantity)) { + materialInventoryDTO.setExcludeZeroAllocationQuantity(true); + } // 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配) String shipperName = null; // 保存查询到的货主名称 if (StringUtils.isNotBlank(customerName) && materialInventoryDTO.getShipperId() == null) { @@ -176,8 +185,10 @@ public class MaterialInventoryApi extends BaseController { // materialDetailId 是新接口专用参数(出库单明细ID),库存 DTO 的同名字段语义是「上架单明细ID」, // 泄入原查询会生成错误的 a.material_detail_id 条件导致查空,进原查询前显式清除 materialInventoryDTO.setMaterialDetailId(null); - // assignableList 非导出场景,isExport 传 null - return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate, null); + // assignableList 非导出场景,isExport 传 null;excludeZeroAllocationQuantity 已随 DTO 绑定,透传保持开关生效 + return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, + materialInventoryDTO.getExcludeZeroAllocationQuantity(), + expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate, null); } @ApiOperation("查询物料库存列表不分页;queryRule=hz 时按货主+物料分组(同一物料在不同货主各占一行)") diff --git a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml index 783b033bb..18cdfa24f 100644 --- a/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml +++ b/mhd_wms/src/main/resources/mapper/materialInventory/MaterialInventoryMapper.xml @@ -217,6 +217,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and COALESCE(a.inventory_quantity, 0) > 0 + + and COALESCE(a.allocation_quantity, 0) > 0 + and a.create_by_name like concat('%', #{createByName}, '%') @@ -378,6 +381,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and COALESCE(mi.inventory_quantity, 0) > 0 + + and COALESCE(mi.allocation_quantity, 0) > 0 + and mi.create_by_name like concat('%', #{createByName}, '%') From 434348f972aa288b363657fe40ddb61c2a37393a Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 14:32:13 +0800 Subject: [PATCH 052/101] =?UTF-8?q?fix(oms,wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=8D=95=E4=B8=8B=E5=8F=91WMS=E5=A4=B1=E8=B4=A5=E8=A2=AB?= =?UTF-8?q?=E9=9D=99=E9=BB=98=E5=90=9E=E6=8E=89=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?WMS=E5=87=BA=E5=BA=93=E6=8B=A3=E8=B4=A7=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BAOMS=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - OMS建单/下发前校验明细数量>0且已关联库存 - OMS检查WMS自动分配/生成拣货单返回值,失败即报错回滚 - WMS自动分配各类失败场景抛带单号的明确异常,替代NPE - WMS接单幂等保护,失败重试不产生重复数据 --- .../ExecutionStockOutOrderDomainService.java | 71 ++++++++++++++++++- .../StockOutOrderApplicationService.java | 22 +++++- .../service/StockOutOrderDomainService.java | 20 ++++++ 3 files changed, 107 insertions(+), 6 deletions(-) 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 19d42bb59..311b600ae 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 @@ -146,6 +146,8 @@ public class ExecutionStockOutOrderDomainService { */ @Transactional(rollbackFor = Exception.class) public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { + //建单校验:明细数量必须大于0(0数量单下发WMS后自动分配必失败,出库单会卡死在已审核状态) + validateMaterialDetailQuantity(stockOutOrderDO.getMaterialDetailList()); //设置单号 Long warehouseId = stockOutOrderDO.getWarehouseId(); AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); @@ -252,6 +254,8 @@ public class ExecutionStockOutOrderDomainService { stockOutOrderDO.setBusinessOrderNo(prefix + seq); } //设置物料信息 + //建单校验:明细数量必须大于0(0数量单下发WMS后自动分配必失败,出库单会卡死在已审核状态) + validateMaterialDetailQuantity(stockOutOrderDO.getMaterialDetailList()); setMaterialDetailInfo(stockOutOrderDO); //统计种类 stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); @@ -493,10 +497,20 @@ public class ExecutionStockOutOrderDomainService { .set(ExecutionStockOutOrder::getUpdateTime, new Date()) .in(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); - //todo下发推送到wms + //下发前统一校验所有单据:全部通过后再推送WMS,避免部分单据推送成功、部分失败造成两边数据不一致 List inOrderIds = stockOutOrderDO.getOutOrderIds(); + List issueOrderList = new ArrayList<>(); for (Long inOrderId : inOrderIds) { ExecutionStockOutOrder byId = stockOutOrderService.getById(inOrderId); + if (byId == null) { + throw new ServiceException("出库单不存在,outOrderId=" + inOrderId); + } + validateIssueOrderDetail(byId); + issueOrderList.add(byId); + } + + //下发推送到wms + for (ExecutionStockOutOrder byId : issueOrderList) { StockOutOrder stockOutOrder = new StockOutOrder(); BeanUtils.copyProperties(byId, stockOutOrder,"outOrderId"); Long warehouseId = stockOutOrder.getWarehouseId(); @@ -535,13 +549,64 @@ public class ExecutionStockOutOrderDomainService { String outOrderNumber = byId.getOutOrderNumber(); com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO = new com.mhd.system.api.domain.StockOutOrderDTO(); stockOutOrderDTO.setOutOrderNumber(outOrderNumber); - wmsServiceFeign.execution(stockOutOrderDTO); + //WMS自动分配:校验返回值。此前不校验时,WMS侧分配失败被Feign降级吞掉,OMS显示成功但出库单卡死在WMS"已审核"状态,拣货单永远不生成 + AjaxResult executionResult = wmsServiceFeign.execution(stockOutOrderDTO); + if (executionResult == null || !"200".equals(String.valueOf(executionResult.get("code")))) { + throw new ServiceException("出库单[" + outOrderNumber + "]WMS自动分配失败:" + + (executionResult == null ? "WMS服务不可用或已降级" : executionResult.get("msg"))); + } - wmsServiceFeign.genPickingOrderByOms(stockOutOrderDTO); + //WMS生成拣货单:同样校验返回值,失败即中断并回滚,让用户能感知到错误 + AjaxResult genPickingResult = wmsServiceFeign.genPickingOrderByOms(stockOutOrderDTO); + if (genPickingResult == null || !"200".equals(String.valueOf(genPickingResult.get("code")))) { + throw new ServiceException("出库单[" + outOrderNumber + "]WMS生成拣货单失败:" + + (genPickingResult == null ? "WMS服务不可用或已降级" : genPickingResult.get("msg"))); + } } return update; } + /** + * 建单校验:出库明细数量必须大于0 + * 历史缺陷:0数量明细的单下发到WMS后自动分配必然失败,且异常被吞,出库单卡死在"已审核"状态无法生成拣货单 + */ + private void validateMaterialDetailQuantity(List materialDetailList) { + if (CollectionUtils.isEmpty(materialDetailList)) { + throw new ServiceException("出库单明细不能为空"); + } + for (ExecutionOutMaterialDetailDO detail : materialDetailList) { + if (detail.getQuantity() == null || detail.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException("出库明细数量必须大于0,物料:" + + (detail.getMaterialCode() != null ? detail.getMaterialCode() : detail.getMaterialName())); + } + } + } + + /** + * 下发前校验出库单明细: + * 1.必须有物料明细,且数量大于0; + * 2.明细必须已关联库存(materialInventoryId),否则WMS按库存ID自动分配会空指针; + * 校验放在推送WMS之前,失败直接报错回滚,避免出库单卡死在WMS"已审核"状态 + */ + private void validateIssueOrderDetail(ExecutionStockOutOrder order) { + String outOrderNumber = order.getOutOrderNumber(); + List detailList = outMaterialDetailService.list(new QueryWrapper().lambda() + .eq(ExecutionOutMaterialDetail::getOutOrderNumber, outOrderNumber)); + if (CollectionUtils.isEmpty(detailList)) { + throw new ServiceException("出库单[" + outOrderNumber + "]没有物料明细,无法下发"); + } + for (ExecutionOutMaterialDetail detail : detailList) { + String materialDesc = detail.getMaterialCode() != null ? detail.getMaterialCode() + : (detail.getMaterialName() != null ? detail.getMaterialName() : String.valueOf(detail.getMaterialDetailId())); + if (detail.getQuantity() == null || detail.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]数量为0,无法下发"); + } + if (detail.getMaterialInventoryId() == null || detail.getMaterialInventoryId() <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]未关联库存,无法下发"); + } + } + } + /** * @description 修改出库单 * @author ZhouGY 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 50c3e19cd..7dfe88da6 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 @@ -1122,8 +1122,20 @@ public class StockOutOrderApplicationService { // throw new ServiceException("库存不存在:" + batchRefNo + " " + sheetRefNo + " " + boxPalletNo); // } Long materialInventoryId = detail.getMaterialInventoryId(); + String materialDesc = detail.getMaterialCode() != null ? detail.getMaterialCode() + : (detail.getMaterialName() != null ? detail.getMaterialName() : String.valueOf(detail.getUniqueId())); + //OMS推送的库存ID缺失或在WMS不存在时明确报错(此前直接解引用空指针,异常被Feign降级吞掉后单据卡死) + if (materialInventoryId == null || materialInventoryId <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]未关联库存,无法自动分配"); + } MaterialInventory materialInventory = materialInventoryMapper.selectById(materialInventoryId); + if (materialInventory == null) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]库存不存在,库存ID=" + materialInventoryId + ",无法自动分配"); + } BigDecimal remainingQuantity = detail.getQuantity(); // 计划数量 + if (remainingQuantity == null || remainingQuantity.compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]计划数量为0,无法自动分配"); + } // 当前物料的可用库存 BigDecimal availableStock = materialInventory.getAllocationQuantity(); @@ -1132,9 +1144,9 @@ public class StockOutOrderApplicationService { continue; } if (availableStock.compareTo(remainingQuantity) < 0) { - throw new RuntimeException( - String.format("可用库存不足,计划数量:%s,当前可用库存:%s", - remainingQuantity, availableStock) + throw new ServiceException( + String.format("出库单[%s]物料[%s]可用库存不足,计划数量:%s,当前可用库存:%s", + outOrderNumber, materialDesc, remainingQuantity, availableStock) ); } // detail.setMaterialInventoryId(materialInventory.getMaterialInventoryId()); @@ -1148,6 +1160,10 @@ public class StockOutOrderApplicationService { detail.setAllocationQuantity(remainingQuantity); materialDetailList2.add(detail); } + //全部明细因可用库存为0被跳过时明确报错(此前空明细落入batchAssignUpdate抛出笼统的"物料明细不能为空",难定位) + if (materialDetailList2.isEmpty()) { + throw new ServiceException("出库单[" + stockOutOrderDb.getOutOrderNumber() + "]所有物料明细的可用库存为0,无法自动分配"); + } stockOutOrderD.setMaterialDetailList(materialDetailList2); StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderD); Boolean assignResult = stockOutOrderDomainService.autoAssign(assembleStockOutOrderDO); 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 cd3ac6527..18af0e37e 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 @@ -2542,6 +2542,13 @@ public class StockOutOrderDomainService { private static final String OMS_AUTO_AUDIT_REMARK = "OMS下发自动审核"; public void omsOrderAdd(StockOutOrder stockOutOrder) { + //幂等保护:重复下发时同单号活动单已存在则跳过,避免插入重复出库单(下发失败重试场景此前会产生重复数据) + StockOutOrder existOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, stockOutOrder.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag, 1), false); + if (existOrder != null) { + return; + } // 任务下发用户id String userId = stockInOrderMapper.queryWarehouseUserId(stockOutOrder.getOrganizationId(), stockOutOrder.getWarehouseId(), stockOutOrder.getTopOrganizationId()); stockOutOrder.setTaskIssueUserId(userId); @@ -2608,6 +2615,11 @@ public class StockOutOrderDomainService { if (CollectionUtils.isEmpty(outMaterialDetails)) { return; } + //幂等保护:重复下发时先逻辑删除同单号已存在的活动明细,避免重复插入导致分配/拣货数据错乱 + outMaterialDetailService.update(new UpdateWrapper().lambda() + .set(OutMaterialDetail::getDelFlag, 2) + .eq(OutMaterialDetail::getOutOrderNumber, outMaterialDetails.get(0).getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag, 1)); outMaterialDetailService.saveBatch(outMaterialDetails); autoAuditOmsOutOrder(outMaterialDetails.get(0).getOutOrderNumber()); } @@ -2617,6 +2629,14 @@ public class StockOutOrderDomainService { if (CollectionUtils.isEmpty(deliveryDetailsLinks)) { return; } + //幂等保护:重复下发时先逻辑删除同单号已存在的配送明细,避免重复插入 + String firstOrderNumber = deliveryDetailsLinks.get(0).getOrderNumber(); + if (StringUtils.isNotEmpty(firstOrderNumber)) { + deliveryDetailsLinkService.update(new UpdateWrapper().lambda() + .set(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 2) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getOrderNumber, firstOrderNumber) + .eq(com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink::getDelFlag, 1)); + } for (DeliveryDetailsLink deliveryDetailsLink : deliveryDetailsLinks) { com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink deliveryDetailsLinkEntity = new com.mhd.wms.domain.deliveryDetailsLink.entity.DeliveryDetailsLink(); BeanUtils.copyProperties(deliveryDetailsLink, deliveryDetailsLinkEntity); From e821619a961f31f93a62ceb6556f975bbe590b8f Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 15:05:29 +0800 Subject: [PATCH 053/101] =?UTF-8?q?fix(=E5=BA=93=E5=AD=98):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DOMS/WMS=E5=BA=93=E5=AD=98=E6=9F=A5=E8=AF=A2=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=A5=E6=9C=9F=E4=B8=8D=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:业务只在OMS填写饮用日期,且下发DTO无过期日期字段,饮用日期→过期日期的转换仅存在于收货单生成瞬间,后续环节全部丢失。 - InMaterialDetail(DTO) 补充 expiryDate 字段,打通OMS→WMS传递 - 预约单/执行单下发前:过期日期为空时用饮用日期补齐(治本) - WMS收货批次属性回写:恢复饮用日期回写并兜底转换为过期日期(加固) - WMS上架确认:过期日期为空时从收货明细兜底补齐(加固) --- .../system/api/domain/InMaterialDetail.java | 5 +++++ .../ExecutionStockInOrderDomainService.java | 5 +++++ .../ReservationStockInOrderDomainService.java | 5 +++++ .../ReceiptMaterialDetailImpl.java | 21 ++++++++++++------- .../service/StockShelfOrderDomainService.java | 19 +++++++++++++++++ 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java index ff112e22d..927a883aa 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/domain/InMaterialDetail.java @@ -375,6 +375,11 @@ public class InMaterialDetail extends BaseVOEntity { @DateTimeFormat(pattern="yyyy-MM-dd") private Date drinkDate; + @ApiModelProperty("过期日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date expiryDate; + @ApiModelProperty("来货验收是否合格;1 合格,0 不合格") @Excel(name = "来货验收是否合格;1 合格,0 不合格") private String arrivalAcceptQualified; 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 22d304bfe..0a18e0d0f 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 @@ -626,6 +626,11 @@ public class ExecutionStockInOrderDomainService { inMaterialDetail.setOrganizationId(orgId); inMaterialDetail.setOrganizationName(orgName); inMaterialDetail.setTopOrganizationId(topOrgId); + // 过期日期为空且饮用日期有值时,用饮用日期补齐过期日期(食品业务饮用日期即效期), + // 确保下发WMS后入库/收货/库存链路的过期日期能正常回显 + if (inMaterialDetail.getExpiryDate() == null && inMaterialDetail.getDrinkDate() != null) { + inMaterialDetail.setExpiryDate(inMaterialDetail.getDrinkDate()); + } inMaterialDetailList.add(inMaterialDetail); } wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); 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 591c799b1..bd8852799 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 @@ -580,6 +580,11 @@ public class ReservationStockInOrderDomainService { InMaterialDetail inMaterialDetail = new InMaterialDetail(); BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail, "materialDetailId"); inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); + // 过期日期为空且饮用日期有值时,用饮用日期补齐过期日期(食品业务饮用日期即效期), + // 确保下发WMS后入库/收货/库存链路的过期日期能正常回显 + if (inMaterialDetail.getExpiryDate() == null && inMaterialDetail.getDrinkDate() != null) { + inMaterialDetail.setExpiryDate(inMaterialDetail.getDrinkDate()); + } inMaterialDetailList.add(inMaterialDetail); } wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); // 推明细(会触发WMS自动审核) diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java index ba78bc34f..c4a2dee8d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/receiptMaterialDetail/repository/persistence/ReceiptMaterialDetailImpl.java @@ -743,14 +743,19 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl() + .eq(ReceiptMaterialDetail::getUniqueId, shelfMaterialDetail.getReceiptUniqueId()) + .last("LIMIT 1")); + if (receiptDetail != null) { + if (receiptDetail.getExpiryDate() != null) { + shelfMaterialDetail.setExpiryDate(receiptDetail.getExpiryDate()); + } else if (receiptDetail.getDrinkDate() != null) { + shelfMaterialDetail.setExpiryDate(receiptDetail.getDrinkDate()); + } + } + } Long shipperId = stockReceiptOrderDO.getShipperId(); MaterialInventory param = getParam(shelfMaterialDetail, fieldNames, shipperId,stockReceiptOrderDO.getInOrderNumber()); List materialInventoryPOS = materialInventoryMapper.selectListByWhere(param); From 3af78d5d7bafa1ff3238d0af38e09c7dd8696e58 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 15:25:51 +0800 Subject: [PATCH 054/101] =?UTF-8?q?feat(wms,oms)=EF=BC=9A=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E6=8E=92=E5=90=8D=E7=BB=9F=E8=AE=A1=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E4=B8=BA=E4=BB=93=E5=8D=95=C3=97=E8=B4=A7=E5=93=81=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E5=88=97=E8=A1=A8=EF=BC=8C=E6=8C=89=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E9=99=8D=E5=BA=8F=E6=8E=92=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null,数据来源待确认)/出仓日期 - 商品/线路各一套接口,路径名不变;商品接口忽略线路筛选参数,线路接口忽略商品筛选参数;含合计行(件数/毛重吨/体积/仓单数)与Excel导出 - 统计口径不变:出库单创建时间区间+已出库状态(9,12,13)+明细level=1主行;排序按出库数量(销售量)降序,件数/出仓日期/单号次之 - 数据源:WMS查本库出库表;OMS跨库查NGWL_TEST_WMS同名表(OMS库出库单状态不流转,跨库与WMS端数字一致) - 删除原按商品/线路聚合的排名接口(销售量/交易数/金额字段) --- .../facade/IExecutionOutboundRankService.java | 25 +--- .../mapper/ExecutionOutboundRankMapper.java | 25 +--- .../ExecutionOutboundRankImpl.java | 25 +--- .../po/ExecutionOutboundDetailRankPO.java | 85 +++++++++++++ .../ExecutionOutboundDetailRankTotalPO.java | 36 ++++++ .../po/ExecutionOutboundLineRankPO.java | 45 ------- .../po/ExecutionOutboundMaterialRankPO.java | 52 -------- .../po/ExecutionOutboundRankTotalPO.java | 32 ----- .../todo/ExecutionOutboundRankDO.java | 10 +- .../todo/ExecutionOutboundRankDTO.java | 22 +++- ...ecutionOutboundRankApplicationService.java | 58 +++------ .../ExecutionOutboundRankDomainService.java | 33 ++--- .../ExecutionOutboundRankApi.java | 62 +++++---- .../ExecutionOutboundRankMapper.xml | 101 +++++++-------- .../OutboundRankApplicationService.java | 58 +++------ .../facade/IOutboundRankService.java | 25 +--- .../repository/mapper/OutboundRankMapper.java | 25 +--- .../persistence/OutboundRankImpl.java | 25 +--- .../repository/po/OutboundDetailRankPO.java | 85 +++++++++++++ .../po/OutboundDetailRankTotalPO.java | 36 ++++++ .../repository/po/OutboundLineRankPO.java | 45 ------- .../repository/po/OutboundMaterialRankPO.java | 52 -------- .../repository/po/OutboundRankTotalPO.java | 32 ----- .../repository/todo/OutboundRankDO.java | 10 +- .../service/OutboundRankDomainService.java | 33 ++--- .../dto/outboundRank/OutboundRankDTO.java | 23 +++- .../outboundRank/OutboundRankApi.java | 58 +++++---- .../outboundRank/OutboundRankMapper.xml | 120 ++++++++---------- 28 files changed, 554 insertions(+), 684 deletions(-) create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java delete mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java delete mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java delete mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java delete mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java delete mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java delete mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java index b7a1a0830..477fc1e99 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java @@ -1,14 +1,13 @@ package com.mhd.oms.domain.outboundRank.repository.facade; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import java.util.List; /** - * 出库排名统计Service接口 + * 出库排名统计(明细)Service接口 * * @author rcx * @date 2026-08-31 @@ -16,22 +15,12 @@ import java.util.List; public interface IExecutionOutboundRankService { /** - * 商品出库排名列表 + * 出库明细列表 */ - List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO); + List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO); /** - * 线路出库排名列表 + * 出库明细合计(不分页) */ - List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO); - - /** - * 商品出库排名合计(不分页) - */ - ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); - - /** - * 线路出库排名合计(不分页) - */ - ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java index b6722a546..3f88c7823 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java @@ -1,14 +1,13 @@ package com.mhd.oms.domain.outboundRank.repository.mapper; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import java.util.List; /** - * 出库排名统计Mapper接口 + * 出库排名统计(明细)Mapper接口 * * @author rcx * @date 2026-08-31 @@ -16,22 +15,12 @@ import java.util.List; public interface ExecutionOutboundRankMapper { /** - * 商品出库排名列表(按销售量倒序) + * 出库明细列表(一行=仓单×货品,按件数倒序) */ - List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO); + List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO); /** - * 线路出库排名列表(按销售量倒序) + * 出库明细合计(不分页,当前筛选条件全量合计) */ - List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO); - - /** - * 商品出库排名合计(不分页,当前筛选条件全量合计) - */ - ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); - - /** - * 线路出库排名合计(不分页,当前筛选条件全量合计) - */ - ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java index 3c06f90ab..76e2abcd4 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java @@ -2,9 +2,8 @@ package com.mhd.oms.domain.outboundRank.repository.persistence; import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService; import com.mhd.oms.domain.outboundRank.repository.mapper.ExecutionOutboundRankMapper; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,7 +11,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计Service业务层处理 + * 出库排名统计(明细)Service业务层处理 * * @author rcx * @date 2026-08-31 @@ -24,22 +23,12 @@ public class ExecutionOutboundRankImpl implements IExecutionOutboundRankService private ExecutionOutboundRankMapper executionOutboundRankMapper; @Override - public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryMaterialRankList(executionOutboundRankDO); + public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryDetailList(executionOutboundRankDO); } @Override - public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryLineRankList(executionOutboundRankDO); - } - - @Override - public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryMaterialRankTotal(executionOutboundRankDO); - } - - @Override - public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryLineRankTotal(executionOutboundRankDO); + public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryDetailTotal(executionOutboundRankDO); } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java new file mode 100644 index 000000000..f894c05d8 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java @@ -0,0 +1,85 @@ +package com.mhd.oms.domain.outboundRank.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出库排名统计(明细)PO(一行 = 仓单×货品,件数/毛重/体积按行汇总) + * + *

字段口径:种类=出库单据类型;仓单编号=出库单号;收货人=出库单 TO 栏(为空取联系人); + * 毛重(吨)=明细总毛重KG/1000;出仓日期=出仓日期(为空依次兜底完成时间/创建时间); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null(候选:货品档案保额 insure_amount,确认后可补)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名统计明细对象", description = "出库排名统计明细响应对象") +public class ExecutionOutboundDetailRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("种类(出库单据类型)") + @Excel(name = "种类") + private String orderTypeName; + + @ApiModelProperty("仓单编号(出库单号)") + @Excel(name = "仓单编号") + private String outOrderNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("客户编号") + @Excel(name = "客户编号") + private String customerCode; + + @ApiModelProperty("收货人(出库单 TO 栏,为空取联系人)") + @Excel(name = "收货人") + private String receiver; + + @ApiModelProperty("商品货号(辅助字段,不导出)") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("线路编码(辅助字段,不导出)") + private String lineCode; + + @ApiModelProperty("线路") + @Excel(name = "线路") + private String lineName; + + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; + + @ApiModelProperty("出仓日期(出仓日期为空时依次兜底完成时间/创建时间)") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date outboundDate; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java new file mode 100644 index 000000000..355295a34 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java @@ -0,0 +1,36 @@ +package com.mhd.oms.domain.outboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 出库排名统计(明细)合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名统计明细合计对象", description = "出库排名统计明细合计响应对象") +public class ExecutionOutboundDetailRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("仓单数合计(去重出库单数)") + private Long totalOrderCount; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java deleted file mode 100644 index 974944f90..000000000 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.mhd.oms.domain.outboundRank.repository.po; - -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 线路出库排名PO - * - *

按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); - * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") -public class ExecutionOutboundLineRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("线路编码") - @Excel(name = "线路编码") - private String lineCode; - - @ApiModelProperty("线路名称") - @Excel(name = "线路名称") - private String lineName; - - @ApiModelProperty("销售量(出库数量合计)") - @Excel(name = "销售量") - private BigDecimal salesQuantity; - - @ApiModelProperty("交易数(出库单据数)") - @Excel(name = "交易数") - private Long tradeCount; - - @ApiModelProperty("金额") - @Excel(name = "金额") - private BigDecimal amount; -} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java deleted file mode 100644 index c32046d9f..000000000 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mhd.oms.domain.outboundRank.repository.po; - -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 商品出库排名PO - * - *

按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") -public class ExecutionOutboundMaterialRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("商品货号") - @Excel(name = "商品货号") - private String materialCode; - - @ApiModelProperty("商品名称") - @Excel(name = "商品名称") - private String materialName; - - @ApiModelProperty("规格") - @Excel(name = "规格") - private String specificationModel; - - @ApiModelProperty("单位") - @Excel(name = "单位") - private String unitName; - - @ApiModelProperty("销售量(出库数量合计)") - @Excel(name = "销售量") - private BigDecimal salesQuantity; - - @ApiModelProperty("交易数(出库单据数)") - @Excel(name = "交易数") - private Long tradeCount; - - @ApiModelProperty("金额") - @Excel(name = "金额") - private BigDecimal amount; -} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java deleted file mode 100644 index 7622c3593..000000000 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundRankTotalPO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mhd.oms.domain.outboundRank.repository.po; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 出库排名合计PO - * - *

当前筛选条件下不分页的全量合计,随分页列表一起返回(totalSalesQuantity/totalTradeCount/totalAmount)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "出库排名合计对象", description = "出库排名合计响应对象") -public class ExecutionOutboundRankTotalPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("销售量合计") - private BigDecimal totalSalesQuantity; - - @ApiModelProperty("交易数合计(去重出库单数)") - private Long totalTradeCount; - - @ApiModelProperty("金额合计") - private BigDecimal totalAmount; -} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java index 83e8064ce..e825f4059 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDO.java @@ -6,7 +6,7 @@ import lombok.Data; import java.io.Serializable; /** - * 出库排名统计查询DO + * 出库排名统计(明细)查询DO * *

topOrganizationId 由服务端按登录用户注入,前端不传

* @@ -24,10 +24,16 @@ public class ExecutionOutboundRankDO implements Serializable { @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填)") private String createTimeEnd; + @ApiModelProperty("仓单编号/出库单号(模糊)") + private String outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + @ApiModelProperty("商品货号(模糊)") private String materialCode; - @ApiModelProperty("商品名称(模糊)") + @ApiModelProperty("货名/商品名称(模糊)") private String materialName; @ApiModelProperty("线路编码(模糊)") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java index 0637173b7..f150e1335 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/todo/ExecutionOutboundRankDTO.java @@ -6,27 +6,35 @@ import lombok.Data; import java.io.Serializable; /** - * 出库排名统计入参DTO + * 出库排名统计(明细)入参DTO * - *

按日期区间统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), - * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail),与 WMS 端 /outboundRankApi 同口径

+ *

按日期区间筛选出库明细列表,一行 = 仓单×货品(件数/毛重/体积按行汇总,件数降序)。 + * OMS 库出库单状态不流转(无"已出库"数据),数据源跨库取 WMS 库出库表,与 WMS 端 /outboundRankApi 同口径

* * @author rcx * @date 2026-08-31 */ @Data -public class ExecutionOutboundRankDTO { +public class ExecutionOutboundRankDTO implements Serializable { - @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间筛选)") private String createTimeStart; - @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间筛选)") private String createTimeEnd; + @ApiModelProperty("仓单编号/出库单号(模糊)") + private String outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + @ApiModelProperty("商品货号(模糊)") private String materialCode; - @ApiModelProperty("商品名称(模糊)") + @ApiModelProperty("货名/商品名称(模糊)") private String materialName; @ApiModelProperty("线路编码(模糊)") diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java index 158f2b8c2..2d68567c0 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java @@ -4,9 +4,8 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -15,9 +14,9 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计应用服务 + * 出库排名统计(明细)应用服务 * - *

负责登录用户组织隔离注入、日期区间校验,统计逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)

+ *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)

* * @author rcx * @date 2026-08-31 @@ -30,49 +29,26 @@ public class ExecutionOutboundRankApplicationService { private ExecutionOutboundRankDomainService executionOutboundRankDomainService; /** - * 分页查询商品出库排名列表 + * 分页查询出库明细列表 */ - public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO); + return executionOutboundRankDomainService.queryDetailList(executionOutboundRankDO); } /** - * 分页查询线路出库排名列表 + * 出库明细合计(当前筛选条件全量,不分页) */ - public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankDomainService.queryDetailTotal(executionOutboundRankDO); + } + + /** + * 导出出库明细(不分页全量) + */ + public List exportDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO); - } - - /** - * 商品出库排名合计(当前筛选条件全量,不分页) - */ - public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankDomainService.queryMaterialRankTotal(executionOutboundRankDO); - } - - /** - * 线路出库排名合计(当前筛选条件全量,不分页) - */ - public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankDomainService.queryLineRankTotal(executionOutboundRankDO); - } - - /** - * 导出商品出库排名(不分页全量) - */ - public List exportMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO); - } - - /** - * 导出线路出库排名(不分页全量) - */ - public List exportLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO); + return executionOutboundRankDomainService.queryDetailList(executionOutboundRankDO); } /** diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java index ce87d4968..7966fe6bd 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java @@ -1,9 +1,8 @@ package com.mhd.oms.domain.outboundRank.service; import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -12,7 +11,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计领域服务 + * 出库排名统计(明细)领域服务 * * @author rcx * @date 2026-08-31 @@ -25,30 +24,16 @@ public class ExecutionOutboundRankDomainService { private IExecutionOutboundRankService executionOutboundRankService; /** - * 商品出库排名列表 + * 出库明细列表 */ - public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryMaterialRankList(executionOutboundRankDO); + public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryDetailList(executionOutboundRankDO); } /** - * 线路出库排名列表 + * 出库明细合计(不分页) */ - public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryLineRankList(executionOutboundRankDO); - } - - /** - * 商品出库排名合计(不分页) - */ - public ExecutionOutboundRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryMaterialRankTotal(executionOutboundRankDO); - } - - /** - * 线路出库排名合计(不分页) - */ - public ExecutionOutboundRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryLineRankTotal(executionOutboundRankDO); + public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryDetailTotal(executionOutboundRankDO); } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java index f1222e413..87e70bbf7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java @@ -4,9 +4,8 @@ import com.github.pagehelper.PageInfo; import com.mhd.common.core.constant.HttpStatus; import com.mhd.common.core.utils.PageUtils; import com.mhd.common.core.utils.poi.ExcelUtil; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDTO; import com.mhd.oms.domain.outboundRank.service.ExecutionOutboundRankApplicationService; @@ -27,11 +26,11 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选,统计商品/线路出库量排名。OMS 库出库单状态不流转(无"已出库"数据), - * 数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), - * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致; - * 统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; - * 销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)

+ *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按出库数量(销售量)降序,件数/出仓日期/单号次之)。 + * OMS 库出库单状态不流转(无"已出库"数据),数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), + * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致;统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 + * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 + * 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null)/出仓日期

* * @author rcx * @date 2026-08-31 @@ -48,84 +47,97 @@ public class ExecutionOutboundRankApi { private ExecutionOutboundRankApplicationService executionOutboundRankApplicationService; /** - * 分页查询商品出库排名列表(含合计行) + * 分页查询商品出库排名列表(含合计行,商品tab;忽略线路筛选参数) */ @ApiOperation("分页查询商品出库排名列表") @GetMapping("/queryMaterialRankList") public HashMap queryMaterialRankList(ExecutionOutboundRankDTO executionOutboundRankDTO) { //转换实体 ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); + //商品tab:忽略线路筛选参数 + executionOutboundRankDO.setLineCode(null); + executionOutboundRankDO.setLineName(null); startPage(); - List list = executionOutboundRankApplicationService.queryMaterialRankList(executionOutboundRankDO); - ExecutionOutboundRankTotalPO total = executionOutboundRankApplicationService.queryMaterialRankTotal(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.queryDetailList(executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryDetailTotal(executionOutboundRankDO); return getDataTableWithTotal(list, total); } /** - * 分页查询线路出库排名列表(含合计行) + * 分页查询线路出库排名列表(含合计行,线路tab;忽略商品筛选参数) */ @ApiOperation("分页查询线路出库排名列表") @GetMapping("/queryLineRankList") public HashMap queryLineRankList(ExecutionOutboundRankDTO executionOutboundRankDTO) { //转换实体 ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); + //线路tab:忽略商品筛选参数 + executionOutboundRankDO.setMaterialCode(null); + executionOutboundRankDO.setMaterialName(null); startPage(); - List list = executionOutboundRankApplicationService.queryLineRankList(executionOutboundRankDO); - ExecutionOutboundRankTotalPO total = executionOutboundRankApplicationService.queryLineRankTotal(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.queryDetailList(executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryDetailTotal(executionOutboundRankDO); return getDataTableWithTotal(list, total); } /** - * 导出商品出库排名Excel + * 导出商品出库排名Excel(商品tab;忽略线路筛选参数) */ @ApiOperation("导出商品出库排名Excel") @GetMapping("/exportMaterialRank") public void exportMaterialRank(HttpServletResponse response, ExecutionOutboundRankDTO executionOutboundRankDTO) throws Exception { //转换实体(不分页,导出全量) ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); - List list = executionOutboundRankApplicationService.exportMaterialRankList(executionOutboundRankDO); + //商品tab:忽略线路筛选参数 + executionOutboundRankDO.setLineCode(null); + executionOutboundRankDO.setLineName(null); + List list = executionOutboundRankApplicationService.exportDetailList(executionOutboundRankDO); 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<>(ExecutionOutboundMaterialRankPO.class); + ExcelUtil util = new ExcelUtil<>(ExecutionOutboundDetailRankPO.class); util.exportExcel(response, list, "商品出库排名"); } /** - * 导出线路出库排名Excel + * 导出线路出库排名Excel(线路tab;忽略商品筛选参数) */ @ApiOperation("导出线路出库排名Excel") @GetMapping("/exportLineRank") public void exportLineRank(HttpServletResponse response, ExecutionOutboundRankDTO executionOutboundRankDTO) throws Exception { //转换实体(不分页,导出全量) ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); - List list = executionOutboundRankApplicationService.exportLineRankList(executionOutboundRankDO); + //线路tab:忽略商品筛选参数 + executionOutboundRankDO.setMaterialCode(null); + executionOutboundRankDO.setMaterialName(null); + List list = executionOutboundRankApplicationService.exportDetailList(executionOutboundRankDO); 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<>(ExecutionOutboundLineRankPO.class); + ExcelUtil util = new ExcelUtil<>(ExecutionOutboundDetailRankPO.class); util.exportExcel(response, list, "线路出库排名"); } /** - * 分页结果 + 合计行:data/total/code/msg 之外追加 totalSalesQuantity/totalTradeCount/totalAmount + * 分页结果 + 合计行:data/total/code/msg 之外追加 totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount */ - private HashMap getDataTableWithTotal(List list, ExecutionOutboundRankTotalPO total) { + private HashMap getDataTableWithTotal(List list, ExecutionOutboundDetailRankTotalPO total) { HashMap result = new HashMap<>(); result.put("data", list); result.put("total", new PageInfo<>(list).getTotal()); result.put("code", HttpStatus.SUCCESS); result.put("msg", "查询成功"); if (total != null) { - result.put("totalSalesQuantity", total.getTotalSalesQuantity()); - result.put("totalTradeCount", total.getTotalTradeCount()); - result.put("totalAmount", total.getTotalAmount()); + result.put("totalPieceCount", total.getTotalPieceCount()); + result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); + result.put("totalVolume", total.getTotalVolume()); + result.put("totalOrderCount", total.getTotalOrderCount()); } return result; } diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml index f35689979..9dae37f3f 100644 --- a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -5,14 +5,14 @@ a.del_flag = 1 @@ -36,6 +36,12 @@ and b.line_name like concat('%', #{lineName}, '%') + + and b.out_order_number like concat('%', #{outOrderNumber}, '%') + + + and a.in_order_number like concat('%', #{inOrderNumber}, '%') + and a.material_code like concat('%', #{materialCode}, '%') @@ -55,67 +61,50 @@ join NGWL_TEST_WMS.stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - - select - a.material_code AS materialCode, - MAX(a.material_name) AS materialName, - MAX(a.SPECIFICATION_MODEL) AS specificationModel, - MAX(a.unit_name) AS unitName, - IFNULL(SUM(a.outbound_quantity), 0) AS salesQuantity, - COUNT(DISTINCT a.out_order_number) AS tradeCount, - IFNULL(SUM(IFNULL(a.TOTAL_AMOUNT, 0)), 0) AS amount + MAX(b.ORDER_TYPE_NAME) AS orderTypeName, + b.out_order_number AS outOrderNumber, + MAX(a.in_order_number) AS inOrderNumber, + MAX(b.customer_code) AS customerCode, + MAX(IFNULL(b."TO", b.contact_person)) AS receiver, + a.material_code AS materialCode, + MAX(a.material_name) AS materialName, + MAX(b.line_code) AS lineCode, + MAX(b.line_name) AS lineName, + IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS grossWeightTon, + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, + MAX(IFNULL(b.OUTBOUND_DATE, IFNULL(b.COMPLETE_TIME, b.create_time))) AS outboundDate - GROUP BY a.material_code - order by salesQuantity desc + GROUP BY b.out_order_number, a.material_code + order by IFNULL(SUM(a.outbound_quantity), 0) desc, pieceCount desc, outboundDate desc, outOrderNumber desc - - select - b.line_code AS lineCode, - MAX(b.line_name) AS lineName, - IFNULL(SUM(a.outbound_quantity), 0) AS salesQuantity, - COUNT(DISTINCT b.out_order_number) AS tradeCount, - IFNULL(SUM(IFNULL(a.TOTAL_AMOUNT, 0)), 0) AS amount - - - - and b.line_code is not null and b.line_code != '' - - GROUP BY b.line_code - order by salesQuantity desc - - - - - - - diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java index 3f6d4d267..0082a8ed4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java @@ -6,9 +6,8 @@ import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; import com.mhd.system.api.model.LoginUser; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import com.mhd.wms.domain.outboundRank.service.OutboundRankDomainService; import lombok.extern.slf4j.Slf4j; @@ -18,9 +17,9 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计应用服务 + * 出库排名统计(明细)应用服务 * - *

负责登录用户组织隔离注入、日期区间校验,统计逻辑在 OutboundRankDomainService → OutboundRankMapper.xml

+ *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 OutboundRankDomainService → OutboundRankMapper.xml

* * @author rcx * @date 2026-08-31 @@ -33,49 +32,26 @@ public class OutboundRankApplicationService { private OutboundRankDomainService outboundRankDomainService; /** - * 分页查询商品出库排名列表 + * 分页查询出库明细列表 */ - public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + public List queryDetailList(OutboundRankDO outboundRankDO) { fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + return outboundRankDomainService.queryDetailList(outboundRankDO); } /** - * 分页查询线路出库排名列表 + * 出库明细合计(当前筛选条件全量,不分页) */ - public List queryLineRankList(OutboundRankDO outboundRankDO) { + public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryDetailTotal(outboundRankDO); + } + + /** + * 导出出库明细(不分页全量) + */ + public List exportDetailList(OutboundRankDO outboundRankDO) { fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryLineRankList(outboundRankDO); - } - - /** - * 商品出库排名合计(当前筛选条件全量,不分页) - */ - public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankDomainService.queryMaterialRankTotal(outboundRankDO); - } - - /** - * 线路出库排名合计(当前筛选条件全量,不分页) - */ - public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankDomainService.queryLineRankTotal(outboundRankDO); - } - - /** - * 导出商品出库排名(不分页全量) - */ - public List exportMaterialRankList(OutboundRankDO outboundRankDO) { - fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryMaterialRankList(outboundRankDO); - } - - /** - * 导出线路出库排名(不分页全量) - */ - public List exportLineRankList(OutboundRankDO outboundRankDO) { - fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryLineRankList(outboundRankDO); + return outboundRankDomainService.queryDetailList(outboundRankDO); } /** diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java index 81981ab4b..f20e1a989 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java @@ -1,14 +1,13 @@ package com.mhd.wms.domain.outboundRank.repository.facade; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import java.util.List; /** - * 出库排名统计Service接口 + * 出库排名统计(明细)Service接口 * * @author rcx * @date 2026-08-31 @@ -16,22 +15,12 @@ import java.util.List; public interface IOutboundRankService { /** - * 商品出库排名列表 + * 出库明细列表 */ - List queryMaterialRankList(OutboundRankDO outboundRankDO); + List queryDetailList(OutboundRankDO outboundRankDO); /** - * 线路出库排名列表 + * 出库明细合计(不分页) */ - List queryLineRankList(OutboundRankDO outboundRankDO); - - /** - * 商品出库排名合计(不分页) - */ - OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); - - /** - * 线路出库排名合计(不分页) - */ - OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); + OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java index 40f17acc2..ee09b891f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java @@ -1,14 +1,13 @@ package com.mhd.wms.domain.outboundRank.repository.mapper; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import java.util.List; /** - * 出库排名统计Mapper接口 + * 出库排名统计(明细)Mapper接口 * * @author rcx * @date 2026-08-31 @@ -16,22 +15,12 @@ import java.util.List; public interface OutboundRankMapper { /** - * 商品出库排名列表(按销售量倒序) + * 出库明细列表(一行=仓单×货品,按件数倒序) */ - List queryMaterialRankList(OutboundRankDO outboundRankDO); + List queryDetailList(OutboundRankDO outboundRankDO); /** - * 线路出库排名列表(按销售量倒序) + * 出库明细合计(不分页,当前筛选条件全量合计) */ - List queryLineRankList(OutboundRankDO outboundRankDO); - - /** - * 商品出库排名合计(不分页,当前筛选条件全量合计) - */ - OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); - - /** - * 线路出库排名合计(不分页,当前筛选条件全量合计) - */ - OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); + OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java index 0acf88572..4108d2dd4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java @@ -2,9 +2,8 @@ package com.mhd.wms.domain.outboundRank.repository.persistence; import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; import com.mhd.wms.domain.outboundRank.repository.mapper.OutboundRankMapper; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,7 +11,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计Service业务层处理 + * 出库排名统计(明细)Service业务层处理 * * @author rcx * @date 2026-08-31 @@ -24,22 +23,12 @@ public class OutboundRankImpl implements IOutboundRankService { private OutboundRankMapper outboundRankMapper; @Override - public List queryMaterialRankList(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryMaterialRankList(outboundRankDO); + public List queryDetailList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryDetailList(outboundRankDO); } @Override - public List queryLineRankList(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryLineRankList(outboundRankDO); - } - - @Override - public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryMaterialRankTotal(outboundRankDO); - } - - @Override - public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryLineRankTotal(outboundRankDO); + public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryDetailTotal(outboundRankDO); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java new file mode 100644 index 000000000..107dc9b0e --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java @@ -0,0 +1,85 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出库排名统计(明细)PO(一行 = 仓单×货品,件数/毛重/体积按行汇总) + * + *

字段口径:种类=出库单据类型;仓单编号=出库单号;收货人=出库单 TO 栏(为空取联系人); + * 毛重(吨)=明细总毛重KG/1000;出仓日期=出仓日期(为空依次兜底完成时间/创建时间); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null(候选:货品档案保额 insure_amount,确认后可补)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名统计明细对象", description = "出库排名统计明细响应对象") +public class OutboundDetailRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("种类(出库单据类型)") + @Excel(name = "种类") + private String orderTypeName; + + @ApiModelProperty("仓单编号(出库单号)") + @Excel(name = "仓单编号") + private String outOrderNumber; + + @ApiModelProperty("入库单号") + @Excel(name = "入库单号") + private String inOrderNumber; + + @ApiModelProperty("客户编号") + @Excel(name = "客户编号") + private String customerCode; + + @ApiModelProperty("收货人(出库单 TO 栏,为空取联系人)") + @Excel(name = "收货人") + private String receiver; + + @ApiModelProperty("商品货号(辅助字段,不导出)") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("线路编码(辅助字段,不导出)") + private String lineCode; + + @ApiModelProperty("线路") + @Excel(name = "线路") + private String lineName; + + @ApiModelProperty("件数") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; + + @ApiModelProperty("出仓日期(出仓日期为空时依次兜底完成时间/创建时间)") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date outboundDate; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java new file mode 100644 index 000000000..5b37776c7 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java @@ -0,0 +1,36 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 出库排名统计(明细)合计PO + * + *

当前筛选条件下不分页的全量合计,随分页列表一起返回 + * (totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount)

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "出库排名统计明细合计对象", description = "出库排名统计明细合计响应对象") +public class OutboundDetailRankTotalPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("件数合计") + private BigDecimal totalPieceCount; + + @ApiModelProperty("毛重(吨)合计") + private BigDecimal totalGrossWeightTon; + + @ApiModelProperty("体积(CBM)合计") + private BigDecimal totalVolume; + + @ApiModelProperty("仓单数合计(去重出库单数)") + private Long totalOrderCount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java deleted file mode 100644 index 7f5c05c3c..000000000 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.mhd.wms.domain.outboundRank.repository.po; - -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 线路出库排名PO - * - *

按日期区间对出库单聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价); - * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") -public class OutboundLineRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("线路编码") - @Excel(name = "线路编码") - private String lineCode; - - @ApiModelProperty("线路名称") - @Excel(name = "线路名称") - private String lineName; - - @ApiModelProperty("销售量(出库数量合计)") - @Excel(name = "销售量") - private BigDecimal salesQuantity; - - @ApiModelProperty("交易数(出库单据数)") - @Excel(name = "交易数") - private Long tradeCount; - - @ApiModelProperty("金额") - @Excel(name = "金额") - private BigDecimal amount; -} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java deleted file mode 100644 index 9725d50ab..000000000 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mhd.wms.domain.outboundRank.repository.po; - -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 商品出库排名PO - * - *

按日期区间对出库明细聚合:销售量=SUM(出库数量),交易数=COUNT(DISTINCT 出库单号),金额=SUM(明细总价)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") -public class OutboundMaterialRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("商品货号") - @Excel(name = "商品货号") - private String materialCode; - - @ApiModelProperty("商品名称") - @Excel(name = "商品名称") - private String materialName; - - @ApiModelProperty("规格") - @Excel(name = "规格") - private String specificationModel; - - @ApiModelProperty("单位") - @Excel(name = "单位") - private String unitName; - - @ApiModelProperty("销售量(出库数量合计)") - @Excel(name = "销售量") - private BigDecimal salesQuantity; - - @ApiModelProperty("交易数(出库单据数)") - @Excel(name = "交易数") - private Long tradeCount; - - @ApiModelProperty("金额") - @Excel(name = "金额") - private BigDecimal amount; -} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java deleted file mode 100644 index ea0e9ace9..000000000 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundRankTotalPO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mhd.wms.domain.outboundRank.repository.po; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - * 出库排名合计PO - * - *

当前筛选条件下不分页的全量合计,随分页列表一起返回(totalSalesQuantity/totalTradeCount/totalAmount)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "出库排名合计对象", description = "出库排名合计响应对象") -public class OutboundRankTotalPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("销售量合计") - private BigDecimal totalSalesQuantity; - - @ApiModelProperty("交易数合计(去重出库单数)") - private Long totalTradeCount; - - @ApiModelProperty("金额合计") - private BigDecimal totalAmount; -} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java index c38c77230..6ace89562 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/todo/OutboundRankDO.java @@ -6,7 +6,7 @@ import lombok.Data; import java.io.Serializable; /** - * 出库排名统计查询DO + * 出库排名统计(明细)查询DO * *

topOrganizationId / warehouseId 由服务端按登录用户注入,前端不传

* @@ -24,10 +24,16 @@ public class OutboundRankDO implements Serializable { @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填)") private String createTimeEnd; + @ApiModelProperty("仓单编号/出库单号(模糊)") + private String outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + @ApiModelProperty("商品货号(模糊)") private String materialCode; - @ApiModelProperty("商品名称(模糊)") + @ApiModelProperty("货名/商品名称(模糊)") private String materialName; @ApiModelProperty("线路编码(模糊)") diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java index 1d2fe84c2..0b21ed65e 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java @@ -1,9 +1,8 @@ package com.mhd.wms.domain.outboundRank.service; import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -12,7 +11,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计领域服务 + * 出库排名统计(明细)领域服务 * * @author rcx * @date 2026-08-31 @@ -25,30 +24,16 @@ public class OutboundRankDomainService { private IOutboundRankService outboundRankService; /** - * 商品出库排名列表 + * 出库明细列表 */ - public List queryMaterialRankList(OutboundRankDO outboundRankDO) { - return outboundRankService.queryMaterialRankList(outboundRankDO); + public List queryDetailList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryDetailList(outboundRankDO); } /** - * 线路出库排名列表 + * 出库明细合计(不分页) */ - public List queryLineRankList(OutboundRankDO outboundRankDO) { - return outboundRankService.queryLineRankList(outboundRankDO); - } - - /** - * 商品出库排名合计(不分页) - */ - public OutboundRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankService.queryMaterialRankTotal(outboundRankDO); - } - - /** - * 线路出库排名合计(不分页) - */ - public OutboundRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { - return outboundRankService.queryLineRankTotal(outboundRankDO); + public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryDetailTotal(outboundRankDO); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java index eac2c07b5..8c32b7844 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/outboundRank/OutboundRankDTO.java @@ -3,27 +3,38 @@ package com.mhd.wms.interfaces.dto.outboundRank; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + /** - * 出库排名统计入参DTO + * 出库排名统计(明细)入参DTO * - *

按日期区间统计商品/线路出库量排名,统计口径:出库单创建时间 + 已出库及之后状态(9,12,13)

+ *

按日期区间筛选出库明细列表,一行 = 仓单×货品(件数/毛重/体积按行汇总,件数降序), + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13) + 明细仅取 level=1 主行

* * @author rcx * @date 2026-08-31 */ @Data -public class OutboundRankDTO { +public class OutboundRankDTO implements Serializable { - @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间统计)") + private static final long serialVersionUID = 1L; + + @ApiModelProperty("出库日期-开始 yyyy-MM-dd(必填,按出库单创建时间筛选)") private String createTimeStart; - @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间统计)") + @ApiModelProperty("出库日期-结束 yyyy-MM-dd(必填,按出库单创建时间筛选)") private String createTimeEnd; + @ApiModelProperty("仓单编号/出库单号(模糊)") + private String outOrderNumber; + + @ApiModelProperty("入库单号(模糊)") + private String inOrderNumber; + @ApiModelProperty("商品货号(模糊)") private String materialCode; - @ApiModelProperty("商品名称(模糊)") + @ApiModelProperty("货名/商品名称(模糊)") private String materialName; @ApiModelProperty("线路编码(模糊)") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java index 439dbba78..8856a01a5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java @@ -5,9 +5,8 @@ import com.mhd.common.core.constant.HttpStatus; import com.mhd.common.core.utils.PageUtils; import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.wms.application.service.outboundRank.OutboundRankApplicationService; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import com.mhd.wms.interfaces.assember.outboundRank.OutboundRankAssembler; import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; @@ -26,8 +25,10 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选,统计商品/线路出库量排名。统计口径:出库单创建时间 + 已出库及之后状态(9,12,13), - * 明细仅取 level=1 主行;销售量=SUM(出库数量)、交易数=COUNT(DISTINCT 出库单号)、金额=SUM(明细总价)

+ *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按出库数量(销售量)降序,件数/出仓日期/单号次之)。 + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 + * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 + * 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null)/出仓日期

* * @author rcx * @date 2026-08-31 @@ -43,84 +44,97 @@ public class OutboundRankApi { private OutboundRankApplicationService outboundRankApplicationService; /** - * 分页查询商品出库排名列表(含合计行) + * 分页查询商品出库排名列表(含合计行,商品tab;忽略线路筛选参数) */ @ApiOperation("分页查询商品出库排名列表") @GetMapping("/queryMaterialRankList") public HashMap queryMaterialRankList(OutboundRankDTO outboundRankDTO) { //转换实体 OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + //商品tab:忽略线路筛选参数 + outboundRankDO.setLineCode(null); + outboundRankDO.setLineName(null); startPage(); - List list = outboundRankApplicationService.queryMaterialRankList(outboundRankDO); - OutboundRankTotalPO total = outboundRankApplicationService.queryMaterialRankTotal(outboundRankDO); + List list = outboundRankApplicationService.queryDetailList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryDetailTotal(outboundRankDO); return getDataTableWithTotal(list, total); } /** - * 分页查询线路出库排名列表(含合计行) + * 分页查询线路出库排名列表(含合计行,线路tab;忽略商品筛选参数) */ @ApiOperation("分页查询线路出库排名列表") @GetMapping("/queryLineRankList") public HashMap queryLineRankList(OutboundRankDTO outboundRankDTO) { //转换实体 OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); + //线路tab:忽略商品筛选参数 + outboundRankDO.setMaterialCode(null); + outboundRankDO.setMaterialName(null); startPage(); - List list = outboundRankApplicationService.queryLineRankList(outboundRankDO); - OutboundRankTotalPO total = outboundRankApplicationService.queryLineRankTotal(outboundRankDO); + List list = outboundRankApplicationService.queryDetailList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryDetailTotal(outboundRankDO); return getDataTableWithTotal(list, total); } /** - * 导出商品出库排名Excel + * 导出商品出库排名Excel(商品tab;忽略线路筛选参数) */ @ApiOperation("导出商品出库排名Excel") @GetMapping("/exportMaterialRank") public void exportMaterialRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { //转换实体(不分页,导出全量) OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); - List list = outboundRankApplicationService.exportMaterialRankList(outboundRankDO); + //商品tab:忽略线路筛选参数 + outboundRankDO.setLineCode(null); + outboundRankDO.setLineName(null); + List list = outboundRankApplicationService.exportDetailList(outboundRankDO); 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<>(OutboundMaterialRankPO.class); + ExcelUtil util = new ExcelUtil<>(OutboundDetailRankPO.class); util.exportExcel(response, list, "商品出库排名"); } /** - * 导出线路出库排名Excel + * 导出线路出库排名Excel(线路tab;忽略商品筛选参数) */ @ApiOperation("导出线路出库排名Excel") @GetMapping("/exportLineRank") public void exportLineRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { //转换实体(不分页,导出全量) OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); - List list = outboundRankApplicationService.exportLineRankList(outboundRankDO); + //线路tab:忽略商品筛选参数 + outboundRankDO.setMaterialCode(null); + outboundRankDO.setMaterialName(null); + List list = outboundRankApplicationService.exportDetailList(outboundRankDO); 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<>(OutboundLineRankPO.class); + ExcelUtil util = new ExcelUtil<>(OutboundDetailRankPO.class); util.exportExcel(response, list, "线路出库排名"); } /** - * 分页结果 + 合计行:data/total/code/msg 之外追加 totalSalesQuantity/totalTradeCount/totalAmount + * 分页结果 + 合计行:data/total/code/msg 之外追加 totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount */ - private HashMap getDataTableWithTotal(List list, OutboundRankTotalPO total) { + private HashMap getDataTableWithTotal(List list, OutboundDetailRankTotalPO total) { HashMap result = new HashMap<>(); result.put("data", list); result.put("total", new PageInfo<>(list).getTotal()); result.put("code", HttpStatus.SUCCESS); result.put("msg", "查询成功"); if (total != null) { - result.put("totalSalesQuantity", total.getTotalSalesQuantity()); - result.put("totalTradeCount", total.getTotalTradeCount()); - result.put("totalAmount", total.getTotalAmount()); + result.put("totalPieceCount", total.getTotalPieceCount()); + result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); + result.put("totalVolume", total.getTotalVolume()); + result.put("totalOrderCount", total.getTotalOrderCount()); } return result; } diff --git a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml index 54aa7458b..af1abf512 100644 --- a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml @@ -5,10 +5,11 @@ a.del_flag = 1 @@ -35,6 +36,18 @@ and b.line_name like concat('%', #{lineName}, '%') + + and b.out_order_number like concat('%', #{outOrderNumber}, '%') + + + and a.in_order_number like concat('%', #{inOrderNumber}, '%') + + + and a.material_code like concat('%', #{materialCode}, '%') + + + and a.material_name like concat('%', #{materialName}, '%') + and date_format(b.create_time,'%Y-%m-%d') >= #{createTimeStart} @@ -48,79 +61,50 @@ join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - - select - a.material_code AS materialCode, - MAX(a.material_name) AS materialName, - MAX(a.SPECIFICATION_MODEL) AS specificationModel, - MAX(a.unit_name) AS unitName, - IFNULL(SUM(a.outbound_quantity), 0) AS salesQuantity, - COUNT(DISTINCT a.out_order_number) AS tradeCount, - IFNULL(SUM(IFNULL(a.TOTAL_AMOUNT, 0)), 0) AS amount + MAX(b.ORDER_TYPE_NAME) AS orderTypeName, + b.out_order_number AS outOrderNumber, + MAX(a.in_order_number) AS inOrderNumber, + MAX(b.customer_code) AS customerCode, + MAX(IFNULL(b."TO", b.contact_person)) AS receiver, + a.material_code AS materialCode, + MAX(a.material_name) AS materialName, + MAX(b.line_code) AS lineCode, + MAX(b.line_name) AS lineName, + IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS grossWeightTon, + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, + MAX(IFNULL(b.OUTBOUND_DATE, IFNULL(b.COMPLETE_TIME, b.create_time))) AS outboundDate - - and a.material_code like concat('%', #{materialCode}, '%') - - - and a.material_name like concat('%', #{materialName}, '%') - - GROUP BY a.material_code - order by salesQuantity desc + GROUP BY b.out_order_number, a.material_code + order by IFNULL(SUM(a.outbound_quantity), 0) desc, pieceCount desc, outboundDate desc, outOrderNumber desc - - select - b.line_code AS lineCode, - MAX(b.line_name) AS lineName, - IFNULL(SUM(a.outbound_quantity), 0) AS salesQuantity, - COUNT(DISTINCT b.out_order_number) AS tradeCount, - IFNULL(SUM(IFNULL(a.TOTAL_AMOUNT, 0)), 0) AS amount - - - - and b.line_code is not null and b.line_code != '' - - GROUP BY b.line_code - order by salesQuantity desc - - - - - - - From 028af3dd2fb18bfa4306ee01f412ab938ba0a45b Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 15:41:51 +0800 Subject: [PATCH 055/101] =?UTF-8?q?fix(wms,oms)=EF=BC=9A=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=8E=92=E5=90=8D=E4=BB=B6=E6=95=B0=E6=94=B9=E4=B8=BA=E5=A4=8D?= =?UTF-8?q?=E6=A0=B8=E7=A1=AE=E8=AE=A4=E7=9A=84=E5=AE=9E=E9=99=85=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E9=87=8F(CHECK=5FQUANTITY)=EF=BC=8C=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 件数取数由明细 PIECE_COUNT(计划/申报件数)改为 SUM(CHECK_QUANTITY) 复核确认的实际出库量,与入库排名的实际上架量 SHELVES_QUANTITY 取数逻辑对称(已验证现有已出库数据 222/222 全覆盖) - 排序第一键由出库数量(outbound_quantity,下发时的计划复制值)改为件数(实际出库量)降序,出仓日期/单号次之 - 接口路径/传参/返回字段结构均不变,前端无感;其余为注释同步 --- .../repository/po/ExecutionOutboundDetailRankPO.java | 2 +- .../facade/outboundRank/ExecutionOutboundRankApi.java | 2 +- .../outboundRank/ExecutionOutboundRankMapper.xml | 11 ++++++----- .../repository/po/OutboundDetailRankPO.java | 2 +- .../facadeApi/outboundRank/OutboundRankApi.java | 2 +- .../mapper/outboundRank/OutboundRankMapper.xml | 11 ++++++----- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java index f894c05d8..2c37d7725 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java @@ -61,7 +61,7 @@ public class ExecutionOutboundDetailRankPO implements Serializable { @Excel(name = "线路") private String lineName; - @ApiModelProperty("件数") + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") @Excel(name = "件数") private BigDecimal pieceCount; diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java index 87e70bbf7..81ae1b67a 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java @@ -26,7 +26,7 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按出库数量(销售量)降序,件数/出仓日期/单号次之)。 + *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按件数(实际复核出库量)降序,出仓日期/单号次之)。 * OMS 库出库单状态不流转(无"已出库"数据),数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致;统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml index 9dae37f3f..62df4931f 100644 --- a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -12,7 +12,8 @@ 故跨库取数(与 OMS 库存查询跨库 join NGWL_TEST_WMS.material_base_info 同一模式), 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致; 条件:b.status in (9已出库,12已复核,13已交接),排除已取消(10)/已关闭(11); - 日期按出库单创建时间 b.create_time;一行 = 某仓单内某货品的合计,按出库数量(销售量)降序,件数/出仓日期/单号次之 + 日期按出库单创建时间 b.create_time;一行 = 某仓单内某货品的合计; + 件数 = SUM(a.CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量 SHELVES_QUANTITY 对称),按件数降序排名 --> a.del_flag = 1 @@ -61,7 +62,7 @@ join NGWL_TEST_WMS.stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - + @@ -97,7 +98,7 @@ from ( select b.out_order_number AS outOrderNumber, - IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) AS grossWeightKG, IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java index 107dc9b0e..4be88b6a7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java @@ -61,7 +61,7 @@ public class OutboundDetailRankPO implements Serializable { @Excel(name = "线路") private String lineName; - @ApiModelProperty("件数") + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") @Excel(name = "件数") private BigDecimal pieceCount; diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java index 8856a01a5..a7cccda65 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java @@ -25,7 +25,7 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按出库数量(销售量)降序,件数/出仓日期/单号次之)。 + *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按件数(实际复核出库量)降序,出仓日期/单号次之)。 * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 * 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null)/出仓日期

diff --git a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml index af1abf512..095d5eba0 100644 --- a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml @@ -9,7 +9,8 @@ 数据源:出库明细 out_material_detail(a,仅 level=1 主行防重复) join 出库单 stock_out_order(b) 口径:b.status in (9已出库,12已复核,13已交接),排除已取消(10)/已关闭(11); 日期按出库单创建时间 b.create_time(与出库单列表日期筛选一致); - 一行 = 某仓单(b.out_order_number)内某货品(a.material_code)的合计,按出库数量(销售量)降序,件数/出仓日期/单号次之 + 一行 = 某仓单(b.out_order_number)内某货品(a.material_code)的合计; + 件数 = SUM(a.CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量 SHELVES_QUANTITY 对称),按件数降序排名 --> a.del_flag = 1 @@ -61,7 +62,7 @@ join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - + @@ -97,7 +98,7 @@ from ( select b.out_order_number AS outOrderNumber, - IFNULL(SUM(a.PIECE_COUNT), 0) AS pieceCount, + IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) AS grossWeightKG, IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume From 3576d734afa631d225bc00f7adac290b6c81b8d5 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 15:43:07 +0800 Subject: [PATCH 056/101] =?UTF-8?q?fix(oms):=20=E5=87=BA=E5=BA=93=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E5=AF=BC=E5=85=A5=E5=8F=91=E7=A5=A8=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=E4=B8=8D=E8=90=BD=E5=BA=93=EF=BC=8C=E8=A1=A5=E9=BD=90?= =?UTF-8?q?=E7=B9=81=E7=AE=80=E5=BD=92=E4=B8=80=E5=8C=96=E3=80=8C=E7=99=BC?= =?UTF-8?q?/=E9=A1=8D=E3=80=8D=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模板列头「發票編號/金額/發票張數」归一化时映射表缺「發→发」「額→额」,發票編號列识别失败(invoiceNoCol=-1),客户配送明细落库时发票编号为空、查看不回显,金额列与发票张数同样受影响。补齐映射并在关键列缺失时输出告警日志;历史已导入单据需重新导入。 --- .../listener/DynamicDeliveryExcelListener.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java index 07ae79d33..60edcf4f1 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/DynamicDeliveryExcelListener.java @@ -365,6 +365,12 @@ public class DynamicDeliveryExcelListener extends AnalysisEventListener Date: Wed, 2 Sep 2026 16:16:46 +0800 Subject: [PATCH 057/101] =?UTF-8?q?feat(oms):=20=E8=BF=90=E8=BE=93?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=88=97=E8=A1=A8=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=A2=84=E8=AE=A1=E8=B5=B7=E8=BF=90=E6=97=B6=E9=97=B4=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6(layDateStart/layD?= =?UTF-8?q?ateEnd)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/todo/BusinessDocumentOrderDO.java | 10 ++++++++++ .../BusinessDocumentOrderDTO.java | 10 ++++++++++ .../BusinessDocumentOrderMapper.xml | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/todo/BusinessDocumentOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/todo/BusinessDocumentOrderDO.java index 064754dc3..1c62f12cd 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/todo/BusinessDocumentOrderDO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/todo/BusinessDocumentOrderDO.java @@ -749,6 +749,16 @@ public class BusinessDocumentOrderDO extends BaseVOEntity{ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date layDate; + @ApiModelProperty(value = "预计起运时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date layDateStart; + + @ApiModelProperty(value = "预计起运时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date layDateEnd; + @ApiModelProperty("收款账户信息") private String accountInformation; diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrder/BusinessDocumentOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrder/BusinessDocumentOrderDTO.java index 11057c7c9..e51886a7f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrder/BusinessDocumentOrderDTO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/businessDocumentOrder/BusinessDocumentOrderDTO.java @@ -778,6 +778,16 @@ public class BusinessDocumentOrderDTO extends BaseVOEntity{ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date layDate; + @ApiModelProperty(value = "预计起运时间起") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date layDateStart; + + @ApiModelProperty(value = "预计起运时间止") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date layDateEnd; + @ApiModelProperty("入库单号") private String inOrderNumber; diff --git a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml index 1a7f2d51c..7c9037567 100644 --- a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml @@ -700,6 +700,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bdo.PUSH_TIME #{pushTimeEnd} + 1 - 1/86400 + + and bdo.LAY_DATE =]]> #{layDateStart} + + + and bdo.LAY_DATE #{layDateEnd} + 1 - 1/86400 + and bdo.IE_TYPE = #{ieType} From 61572c536afa4526c190ce74b7131e3bcfb84a09 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 16:48:35 +0800 Subject: [PATCH 058/101] =?UTF-8?q?=E5=8F=91=2030?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 9 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 8cc8bfd57..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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..de19e469b 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 509644885..6238639f6 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 52ade270d..ecb312261 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 6d7e42bcde8a792a2b4b4e82fe0465a8460a156d Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 16:55:19 +0800 Subject: [PATCH 059/101] =?UTF-8?q?=E5=8F=91=2031?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d976fcc98 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index ecb312261..52ade270d 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From c1f483f0a0e81ada25cd0da4618b31b23cedcdc7 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Wed, 2 Sep 2026 18:32:12 +0800 Subject: [PATCH 060/101] =?UTF-8?q?feat(oms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9A=E4=BB=93?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E6=A0=A1=E9=AA=8C=E7=89=A9=E6=96=99=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=BD=92=E5=B1=9E=E5=B9=B6=E6=8C=89=E4=BB=93=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=89=B9=E6=AC=A1=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景:物料档案全仓共享,此前导入不区分仓库,批次库存"查到哪条算哪条",单据可能取到其他仓库的库存且主表仓库为空。 1. /parseExcel 新增可选参数 warehouseId(前端随文件提交当前页面仓库;不传保持原有行为) 2. 新增 countInventoryByWarehouse 归属校验:物料在指定仓库无库存记录时统一报错"物料[xx]在当前仓库[名]没有库存记录,无法从该仓库出库" 3. getkcId 批次库存查询增加仓库过滤,明细批次/仓库/入库单号均取当前仓库 4. 导入单主表回填当前仓库 warehouseId/Code/Name(此前导入单仓库为空) 5. 出库导入两个入口(reservationStockInOrderApi/executionStockInOrderApi 的 parseExcel)同步支持 6. 库存不足报错补充物料编码,便于定位 --- .../facade/IExecutionStockInOrderService.java | 3 +- .../ExecutionStockInOrderImpl.java | 31 +++++++++++++++- .../po/ReservationMaterialInventoryPO.java | 25 ++++++------- .../IReservationStockInOrderService.java | 3 +- .../mapper/ReservationStockInOrderMapper.java | 8 ++++- .../ReservationStockInOrderImpl.java | 35 ++++++++++++++++--- .../ExecutionStockInOrderApi.java | 6 ++-- .../ReservationStockInOrderApi.java | 6 ++-- .../ReservationStockInOrderMapper.xml | 8 +++++ .../repository/po/MaterialInventoryPO.java | 25 ++++++------- 10 files changed, 113 insertions(+), 37 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java index d5f32c3f8..9ffe616d9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/repository/facade/IExecutionStockInOrderService.java @@ -53,10 +53,11 @@ public interface IExecutionStockInOrderService extends IService 0) { + String warehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + List wrongWarehouseMaterials = new ArrayList<>(); + for (ProductDetail productDetail : productDetailList) { + MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode()); + if (materialBaseInfoPO == null) { + continue; + } + int count = reservationStockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); + if (count <= 0) { + wrongWarehouseMaterials.add(productDetail.getProductCode()); + } + } + if (!wrongWarehouseMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" + + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); + } + } + ExecutionStockOutOrderDO reservationStockOutOrderDO = new ExecutionStockOutOrderDO(); reservationStockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); reservationStockOutOrderDO.setShipperId((Long) shipperIds.get(0).get("shipperId")); @@ -263,6 +286,12 @@ public class ExecutionStockInOrderImpl extends ServiceImpl 0) { + reservationStockOutOrderDO.setWarehouseId(warehouseId); + reservationStockOutOrderDO.setWarehouseCode(reservationStockInOrderMapper.getWarehouseCode(warehouseId)); + reservationStockOutOrderDO.setWarehouseName(reservationStockInOrderMapper.getWarehouseName(warehouseId)); + } reservationStockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); reservationStockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); reservationStockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java index 02a633c5f..364e0bb55 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java @@ -174,40 +174,41 @@ public class ReservationMaterialInventoryPO extends MaterialBasePO { @Excel(name = "扩展字段2") private String extAttr2; + // 以下业务日期字段只保留年月日:导出复用 /list 接口,前端取 JSON 值直接进 Excel,去掉时分秒(与 WMS 库存查询一致) @ApiModelProperty("生产日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "生产日期", width = 30, dateFormat = "yyyy-MM-dd") private Date productionDate; @ApiModelProperty("过期日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "过期日期", width = 30, dateFormat = "yyyy-MM-dd") private Date expiryDate; @ApiModelProperty("存货日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd") private Date inventoryDate; @ApiModelProperty("进货日期") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd") private Date purchaseDate; @ApiModelProperty("ExtAttr3") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr3", width = 30, dateFormat = "yyyy-MM-dd") private Date extAttr3; @ApiModelProperty("ExtAttr4") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd") private Date extAttr4; diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java index 5e62c95f9..d2963405b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java @@ -53,10 +53,11 @@ public interface IReservationStockInOrderService extends IService getMaterialBaseInfoList(@Param("id") String id); - public List getkcId(@Param("id") Long id,@Param("q") BigDecimal q); + public List getkcId(@Param("id") Long id,@Param("q") BigDecimal q, @Param("warehouseId") Long warehouseId); + + /** + * 出库导入校验:物料在指定仓库是否存在库存记录(存在即视为归属该仓库,不限数量) + * @return 库存记录数 + */ + public int countInventoryByWarehouse(@Param("id") Long id, @Param("warehouseId") Long warehouseId); public MaterialWarehouseControlPO getInfoByMaterialBaseInfoIds(@Param("id") Long id); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 20176fe04..44e1cf151 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -220,7 +220,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { + String warehouseName = stockInOrderMapper.getWarehouseName(warehouseId); + List wrongWarehouseMaterials = new ArrayList<>(); + for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { + int count = stockInOrderMapper.countInventoryByWarehouse(materialBaseInfoPO.getMaterialBaseInfoId(), warehouseId); + if (count <= 0) { + wrongWarehouseMaterials.add(materialBaseInfoPO.getMaterialCode()); + } + } + if (!wrongWarehouseMaterials.isEmpty()) { + throw new Exception("物料[" + String.join("、", wrongWarehouseMaterials) + "]在当前仓库[" + + (warehouseName == null ? warehouseId : warehouseName) + "]没有库存记录,无法从该仓库出库,请确认导入仓库是否正确"); + } + } + // ====== 后续处理(编号均已存在):货主归属校验、建单落库 ====== for (MaterialBaseInfoPO materialBaseInfoPO : materialCache.values()) { if (materialBaseInfoPO.getShipperId() != null && processedShipperIds.add(materialBaseInfoPO.getShipperId())) { @@ -343,6 +360,12 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { + reservationStockOutOrderDO.setWarehouseId(warehouseId); + reservationStockOutOrderDO.setWarehouseCode(stockInOrderMapper.getWarehouseCode(warehouseId)); + reservationStockOutOrderDO.setWarehouseName(stockInOrderMapper.getWarehouseName(warehouseId)); + } reservationStockOutOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); reservationStockOutOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); reservationStockOutOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); @@ -382,13 +405,14 @@ public class ReservationStockInOrderImpl extends ServiceImpl reservationMaterialInventoryPOS = stockInOrderMapper.getkcId(materialBaseInfoId, new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP)); + List reservationMaterialInventoryPOS = stockInOrderMapper.getkcId(materialBaseInfoId, new BigDecimal(productDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP), warehouseId); if (reservationMaterialInventoryPOS != null&&reservationMaterialInventoryPOS.size() > 0) { ReservationMaterialInventoryPO reservationMaterialInventoryPO = reservationMaterialInventoryPOS.get(0); Long materialInventoryId = reservationMaterialInventoryPO.getMaterialInventoryId(); String batchNumber = reservationMaterialInventoryPO.getBatchNumber(); String lotNumber = reservationMaterialInventoryPO.getLotNumber(); - Long warehouseId = reservationMaterialInventoryPO.getWarehouseId(); + // 库存记录所在仓库(指定导入仓库时,getkcId 已按该仓库过滤,两者一致) + Long invWarehouseId = reservationMaterialInventoryPO.getWarehouseId(); String warehouseCode = reservationMaterialInventoryPO.getWarehouseCode(); String warehouseName = reservationMaterialInventoryPO.getWarehouseName(); String inOrderNumber = reservationMaterialInventoryPO.getInOrderNumber(); @@ -398,7 +422,7 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0 ? "在当前仓库" : "") + "批次库存数量少于出库数量!"); } reservationOutMaterialDetailDO.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId()); reservationOutMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode()); 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 6426b6b74..6406a2472 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 @@ -203,13 +203,15 @@ public class ExecutionStockInOrderApi extends BaseController { * 上传并解析Excel文件 * @param file Excel文件 * @param sheetName 工作表名称(出库导入/参考数据) + * @param warehouseId 当前仓库id(非空时校验导入物料是否属于该仓库,并按该仓库过滤批次库存) * @return 解析后的出库数据 */ @PostMapping("/parseExcel") public ResponseEntity> parseExcel( - @RequestParam("file") MultipartFile file) { + @RequestParam("file") MultipartFile file, + @RequestParam(value = "warehouseId", required = false) Long warehouseId) { try { - DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, ""); + DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); Map result = new HashMap<>(); result.put("result", deliveryDataDTO); result.put("code",200); 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 e7894a630..3573345ea 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 @@ -211,14 +211,16 @@ public class ReservationStockInOrderApi extends BaseController { /** * 上传并解析Excel文件(默认读取"出库导入"工作表) * @param file Excel文件 + * @param warehouseId 当前仓库id(非空时校验导入物料是否属于该仓库,并按该仓库过滤批次库存) * @return 解析后的出库数据 */ @PostMapping("/parseExcel") public ResponseEntity> parseExcel( - @RequestParam("file") MultipartFile file) { + @RequestParam("file") MultipartFile file, + @RequestParam(value = "warehouseId", required = false) Long warehouseId) { Map result = new HashMap<>(); try { - DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, ""); + DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); result.put("result", deliveryDataDTO); result.put("code", 200); result.put("msg", "解析成功"); diff --git a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml index 19c04380f..f2d601503 100644 --- a/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reservationStockInOrder/ReservationStockInOrderMapper.xml @@ -556,6 +556,14 @@ + + - -
\ No newline at end of file From bfffc6bbf1b6d6eebee2d9832af4d76c50391495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 2 Sep 2026 20:46:31 +0800 Subject: [PATCH 067/101] =?UTF-8?q?App=E6=B8=B8=E5=AE=A2=E6=97=B6=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E5=B1=95=E7=A4=BA=E6=B6=88=E6=81=AF=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessageManageApplicationService.java | 24 ++++++++++++++++++- .../src/main/resources/bootstrap.yml | 8 +++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java index afa11d0ef..62703d4b2 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/MessageManageApplicationService.java @@ -461,7 +461,8 @@ public class MessageManageApplicationService //获取当前登录人 LoginUser loginUser = SecurityUtils.getLoginUser(); if(null == loginUser){ - throw new ServiceException("获取登录人失败"); + //未登录(游客):返回空消息中心结构,保证小程序界面正常展示而不报错 + return buildEmptyAppNoticeList(); } noticeMessageLoggingDo.setUserId(loginUser.getUserid()); //获取每种类型的最新一条 @@ -522,6 +523,27 @@ public class MessageManageApplicationService return result; } + /** + * 未登录(游客)时返回空的消息中心结构,避免前端页面因无登录上下文而报错 + * @return NoticeMessageLoggingAppListPo + */ + private NoticeMessageLoggingAppListPo buildEmptyAppNoticeList() { + NoticeMessageLoggingAppListPo result = new NoticeMessageLoggingAppListPo(); + NoticeMessageLoggingAppListPo.CommonNotice serviceNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + serviceNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice activityNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + activityNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice logisticsNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + logisticsNotice.setUnreadNum("0"); + NoticeMessageLoggingAppListPo.CommonNotice systemNotice = new NoticeMessageLoggingAppListPo.CommonNotice(); + systemNotice.setUnreadNum("0"); + result.setServiceNotice(serviceNotice); + result.setActivityNotice(activityNotice); + result.setLogisticsNotice(logisticsNotice); + result.setSystemNotice(systemNotice); + return result; + } + /** * APP根据类型获取消息通知 * @param noticeMessageLoggingDo diff --git a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index dc450c4ce..b1b1ca982 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -13,17 +13,17 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From b5f710cd33497b3e8374964da611285168822bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Wed, 2 Sep 2026 20:49:09 +0800 Subject: [PATCH 068/101] 31 --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../src/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 +- mhd-modules/mhd-system/src/main/resources/bootstrap.yml | 4 ++-- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_product/src/main/resources/bootstrap.yml | 4 ++-- 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d852e89bc 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.31:8014",value = ServiceNameConstants.WLHY_SERVICE,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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31:8012", configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index b1b1ca982..99aaf5e4c 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -15,7 +15,7 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -23,7 +23,7 @@ spring: config: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 07b279b1a..521cfaa6f 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -20,7 +20,7 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -29,7 +29,7 @@ spring: config: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 4f45a735058a55e00492cec7e81f581663f4ed7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 3 Sep 2026 00:26:45 +0800 Subject: [PATCH 069/101] =?UTF-8?q?=E5=B7=B2=E7=99=BB=E5=BD=95=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7APP=E8=8F=9C=E5=8D=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/appMenu/AppMenuApplicationService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java b/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java index 76cc89b36..ded62eab6 100644 --- a/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java +++ b/mhd_product/src/main/java/com/linke/product/application/service/appMenu/AppMenuApplicationService.java @@ -92,7 +92,8 @@ public class AppMenuApplicationService { boolean isLogin = loginUser != null && loginUser.getUserPo() != null; if (isLogin) { if (appMenuDO.getUserId() == null){ - appMenuDO.setUserId(SecurityUtils.getUserId()); + // 用 token 中解析出的真实用户ID,避免依赖网关 header(未注入时 SecurityUtils.getUserId() 会返回 0) + appMenuDO.setUserId(loginUser.getUserid()); } if (appMenuDO.getTopOrganizationId() == null){ appMenuDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); From 3a5af634dde5336516a65b742863dced58d06a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 3 Sep 2026 00:29:18 +0800 Subject: [PATCH 070/101] 30 --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_product/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 8cc8bfd57..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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 d852e89bc..de19e469b 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",url = "http://10.102.192.31:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 509644885..6238639f6 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 521cfaa6f..07b279b1a 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -20,7 +20,7 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -29,7 +29,7 @@ spring: config: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 28bf58e8d17c8080eef64fc2b35ab689d60536e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 3 Sep 2026 11:28:22 +0800 Subject: [PATCH 071/101] =?UTF-8?q?BI=E6=9F=A5=E8=AF=A2YMS=E6=9C=88?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/BiPlatformRealDataMapper.java | 4 ++ .../repository/po/RealPlatformInfoPO.java | 59 +++++++++++++++++++ .../service/BiPlatformRealDataService.java | 13 ++++ .../facadeApi/biReport/BiReportApi.java | 11 ++++ .../BiPlatformRealDataMapper.xml | 23 ++++++++ 5 files changed, 110 insertions(+) create mode 100644 mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java index 1f283297c..3a4c041e8 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/mapper/BiPlatformRealDataMapper.java @@ -6,6 +6,7 @@ import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import java.util.List; @@ -39,4 +40,7 @@ public interface BiPlatformRealDataMapper { /** 月台监控-按楼层统计月台车辆(楼层、月台数量、今日预约车辆、当前作业车辆) */ List queryPlatformFloorStats(); + + /** 月台管理列表(YMS qms_window_info,含机构/鹤位/状态/楼层/UUID 等完整信息) */ + List queryPlatformInfoList(); } \ No newline at end of file diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java new file mode 100644 index 000000000..01e22eadb --- /dev/null +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java @@ -0,0 +1,59 @@ +package com.mhd.bi.domain.biPlatformRealData.repository.po; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 月台管理列表(真实数据,来自 TEST_NGWL_YMS.QMS_WINDOW_INFO) + * 对应 YMS qms_window_info 月台/鹤位窗口表 + */ +@Data +public class RealPlatformInfoPO implements Serializable { + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 机构代码(org_no) */ + private String orgNo; + + /** 机构名称(dept_name) */ + private String deptName; + + /** 鹤位号/月台号(window_number) */ + private String windowNumber; + + /** 鹤位名称/月台名称(window_name) */ + private String windowName; + + /** 优先级别(priority_set) */ + private String prioritySet; + + /** 鹤位状态/月台状态(running_status) */ + private String runningStatus; + + /** uuid */ + private String uuid; + + /** 鹤位屏名字集合/绑定月台屏(berr_names) */ + private String berrNames; + + /** 最新业务状态(new_flow_status) */ + private String newFlowStatus; + + /** 月台图片(guide_images) */ + private String guideImages; + + /** 月台楼层(platform_floor) */ + private String platformFloor; + + /** 作业状态 0-空闲 1-占用(job_status) */ + private Integer jobStatus; + + /** 创建者(create_by_name) */ + private String createByName; + + /** 创建时间 */ + private String createTime; +} diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java index fecadf30b..703c71e2a 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/service/BiPlatformRealDataService.java @@ -8,6 +8,7 @@ import com.mhd.bi.domain.biPlatformRealData.repository.po.RealVehicleStatusPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealTaskLoadPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import com.mhd.bi.domain.biPlatformSurveillance.repository.mapper.BiPlatformSurveillanceReportMapper; import com.mhd.bi.domain.biSnapshotSync.repository.mapper.BiSnapshotWriteMapper; import com.mhd.bi.domain.biSnapshotSync.support.BiSnapshotWeeklyRandomDataBuilder; @@ -230,6 +231,18 @@ public class BiPlatformRealDataService { } } + /** + * 月台管理列表:实时查 YMS qms_window_info,返回月台/鹤位窗口完整信息,不落库。 + */ + public List queryPlatformInfoList() { + try { + return biPlatformRealDataMapper.queryPlatformInfoList(); + } catch (Exception e) { + log.error("【YMS】查询月台管理列表失败: {}", e.getMessage(), e); + return java.util.Collections.emptyList(); + } + } + /** * 实时组装月台监测数据:原则「有真实数据源用真实,无真实数据源用写死模拟」。 * 有真实数据源的字段(vehicles / platformOverview / vehicleStatus / taskLoad / taskTotal) diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java index 0375dc7d6..38a6778b4 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java @@ -6,6 +6,7 @@ import com.mhd.bi.domain.biPlatformSurveillance.service.BiPlatformSurveillanceRe import com.mhd.bi.domain.biPlatformRealData.service.BiPlatformRealDataService; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealBusinessTypeStatPO; import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformFloorStatPO; +import com.mhd.bi.domain.biPlatformRealData.repository.po.RealPlatformInfoPO; import com.mhd.bi.domain.biOverallOperation.service.BiOverallOperationReportService; import com.mhd.bi.domain.biHkMacaoServiceZone.service.BiHkMacaoServiceZoneReportService; import com.mhd.bi.domain.biTransportOperationZone.service.BiTransportOperationZoneReportService; @@ -128,6 +129,16 @@ public class BiReportApi extends BaseController { List data = biPlatformRealDataService.queryPlatformFloorStats(); return BiApiResult.ok(data); } + + /** + * 月台管理列表(实时查 YMS qms_window_info,不落库) + */ + @ApiOperation(value = "月台管理列表", notes = "实时查询 YMS 库 qms_window_info,返回月台/鹤位窗口列表(机构、月台号、月台名称、楼层、绑定屏、UUID、状态等),不落库") + @GetMapping("/platformInfoList") + public BiApiResult> platformInfoList() { + List data = biPlatformRealDataService.queryPlatformInfoList(); + return BiApiResult.ok(data); + } //园区物流大屏接口---------------------------------------------------------------------- /** * 总体运营态势 diff --git a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml index 31fda7186..0f5c970e1 100644 --- a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml +++ b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml @@ -113,4 +113,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY EXTRACT(HOUR FROM ENTRY_TIME) ORDER BY EXTRACT(HOUR FROM ENTRY_TIME) + + + \ No newline at end of file From 3880755df085c124a6483c9e7253d71c930e893d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 3 Sep 2026 11:35:33 +0800 Subject: [PATCH 072/101] =?UTF-8?q?BI=E6=9F=A5=E8=AF=A2YMS=E6=9C=88?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/po/RealPlatformInfoPO.java | 6 +-- .../BiPlatformRealDataMapper.xml | 46 +++++++++++-------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java index 01e22eadb..2a1f971e3 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java +++ b/mhd-bi/src/main/java/com/mhd/bi/domain/biPlatformRealData/repository/po/RealPlatformInfoPO.java @@ -51,9 +51,9 @@ public class RealPlatformInfoPO implements Serializable { /** 作业状态 0-空闲 1-占用(job_status) */ private Integer jobStatus; - /** 创建者(create_by_name) */ - private String createByName; + /** 创建人(create_by) */ + private String createBy; - /** 创建时间 */ + /** 创建时间(create_time) */ private String createTime; } diff --git a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml index 0f5c970e1..0c3f51c5d 100644 --- a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml +++ b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml @@ -114,26 +114,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY EXTRACT(HOUR FROM ENTRY_TIME) - + \ No newline at end of file From f5300fdd5dea7481d63b82a8079a38fff7bffa96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Thu, 3 Sep 2026 11:39:13 +0800 Subject: [PATCH 073/101] =?UTF-8?q?BI=E6=9F=A5=E8=AF=A2YMS=E6=9C=88?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biPlatformRealData/BiPlatformRealDataMapper.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml index 0c3f51c5d..d3d0b3c12 100644 --- a/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml +++ b/mhd-bi/src/main/resources/mapper/biPlatformRealData/BiPlatformRealDataMapper.xml @@ -115,10 +115,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + 机构名称 deptName <- sys_dept.DEPT_NAME(d.dept_id = a.ORG_NO 关联) + 鹤位屏名称 berrNames <- qms_window_berr(WINDOW_ID/BERR_ID) join qms_berr_config(ID/BERR_NAME),WM_CONCAT 拼接 + 其余列来自 qms_window_info 本身 --> select max(u.user_id) as user_id, max(u.user_name) as user_name, max(u.user_member_code) as user_member_code from NGWL_TEST_USER."USER" u - left join NGWL_TEST_USER.USER_SHIPPER us - on us.USER_ID = u.USER_ID and us.DEL_FLAG = 1 where u.ORGANIZATION_ID = #{organizationId} and u.DEL_FLAG = 1 - and (u.USER_MEMBER_CODE = #{userMemberCode} or us.CUSTOMER_NC_CODE = #{userMemberCode}) + and u.USER_MEMBER_CODE = #{userMemberCode} select - b.* + b.*, a.status, a.issue_status from reserve_stock_out_order a left join reserve_out_material_detail b on a.OUT_ORDER_NUMBER = b.OUT_ORDER_NUMBER From c9c3062789923ca95a48003c723e30e6888ebd57 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 15:57:44 +0800 Subject: [PATCH 077/101] =?UTF-8?q?feat(wms,oms)=EF=BC=9A=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E6=8E=92=E5=90=8D=E7=BB=9F=E8=AE=A1=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=8C=89=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81=E5=90=88=E5=B9=B6?= =?UTF-8?q?(=E4=B8=80=E8=A1=8C=3D=E4=B8=80=E4=B8=AA=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=9C=A8=E5=8C=BA=E9=97=B4=E5=86=85=E5=85=A8=E9=83=A8=E5=B7=B2?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E4=BB=93=E5=8D=95=E7=9A=84=E5=90=88=E8=AE=A1?= =?UTF-8?q?)=EF=BC=9A=E8=BF=94=E5=9B=9E=E5=88=97=E8=A3=81=E5=89=AA?= =?UTF-8?q?=E4=B8=BA=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81/=E8=B4=A7?= =?UTF-8?q?=E5=90=8D/=E8=A7=84=E6=A0=BC=E5=9E=8B=E5=8F=B7/=E5=8D=95?= =?UTF-8?q?=E4=BD=8D/=E4=BB=B6=E6=95=B0(=E5=AE=9E=E9=99=85=E4=B8=8A?= =?UTF-8?q?=E6=9E=B6=E9=87=8F)/=E6=AF=9B=E9=87=8D(=E5=90=A8)/=E6=8A=95?= =?UTF-8?q?=E4=BF=9D=E6=80=BB=E9=A2=9D(=E8=B4=A7=E5=93=81=E6=A1=A3?= =?UTF-8?q?=E6=A1=88=E4=BF=9D=E9=A2=9D=E5=8F=96MAX=E4=B8=8D=E8=B7=A8?= =?UTF-8?q?=E4=BB=93=E5=8D=95=E7=B4=AF=E5=8A=A0)/=E4=BD=93=E7=A7=AF?= =?UTF-8?q?=EF=BC=9B=E4=BB=93=E5=8D=95=E7=BC=96=E5=8F=B7/=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=BC=96=E5=8F=B7/=E5=AD=98=E8=B4=A7=E4=BA=BA/?= =?UTF-8?q?=E5=85=A5=E4=BB=93=E6=97=A5=E6=9C=9F=E4=B8=BA=E5=8D=95=E6=8D=AE?= =?UTF-8?q?=E7=BA=A7=E5=AD=97=E6=AE=B5=E5=8D=95=E5=80=BC=E5=A4=B1=E7=9C=9F?= =?UTF-8?q?=EF=BC=8C=E7=A7=BB=E5=87=BA=E8=BF=94=E5=9B=9E=E5=88=97=E4=BB=85?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E4=B8=BA=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=EF=BC=9BHAVING=E8=BF=87=E6=BB=A40=E4=BB=B6=E8=A1=8C=EF=BC=9B?= =?UTF-8?q?=E5=90=88=E8=AE=A1=E8=A1=8C=E6=8A=95=E4=BF=9D=E6=80=BB=E9=A2=9D?= =?UTF-8?q?=3D=E5=90=84=E7=89=A9=E6=96=99=E4=BF=9D=E9=A2=9D=E4=B9=8B?= =?UTF-8?q?=E5=92=8C(=E6=AF=8F=E7=89=A9=E6=96=99=E8=AE=A1=E4=B8=80?= =?UTF-8?q?=E6=AC=A1)=EF=BC=8CtotalOrderCount=3D=E6=B6=89=E5=8F=8A?= =?UTF-8?q?=E4=BB=93=E5=8D=95=E6=95=B0=EF=BC=9BOMS/WMS=E4=B8=A4=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E6=95=B0=E5=AD=97=E4=B8=80=E8=87=B4=EF=BC=9B?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8F=82=E6=95=B0=E4=B8=8E=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=A4=96=E5=B1=82=E4=B8=8D=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/ExecutionInboundRankMapper.java | 2 +- .../po/ExecutionInboundMaterialRankPO.java | 41 +++++-------------- .../po/ExecutionInboundRankTotalPO.java | 4 +- .../inboundRank/ExecutionInboundRankApi.java | 4 +- .../ExecutionInboundRankMapper.xml | 28 +++++++------ .../repository/mapper/InboundRankMapper.java | 2 +- .../repository/po/InboundMaterialRankPO.java | 41 +++++-------------- .../repository/po/InboundRankTotalPO.java | 4 +- .../dto/inboundRank/InboundRankDTO.java | 3 +- .../facadeApi/inboundRank/InboundRankApi.java | 6 ++- .../mapper/inboundRank/InboundRankMapper.xml | 27 ++++++------ 11 files changed, 65 insertions(+), 97 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java index 64654e548..699f91e69 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/mapper/ExecutionInboundRankMapper.java @@ -15,7 +15,7 @@ import java.util.List; public interface ExecutionInboundRankMapper { /** - * 商品入库排名列表(仓单+货品汇总,按件数降序) + * 商品入库排名列表(按物料编码合并,按件数降序,过滤0件行) */ List queryMaterialRankList(ExecutionInboundRankDO executionInboundRankDO); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java index 6532af87f..1aa7db54f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundMaterialRankPO.java @@ -1,24 +1,21 @@ package com.mhd.oms.domain.inboundRank.repository.po; -import com.fasterxml.jackson.annotation.JsonFormat; import com.mhd.common.core.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; -import java.util.Date; /** - * 入库排名统计PO(一行 = 某仓单内某货品的合计,按件数降序排名) + * 入库排名统计PO(一行 = 一个物料的合计(按物料编码合并,查询区间内全部已入库仓单),按件数降序排名) * *

数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order / in_material_detail,OMS 执行单状态/上架量不回传), * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致。 - * 字段口径:入仓日期=WMS入仓单入仓日期(为空兜底建档时间);仓单编号=WMS入库单号;客户编号/存货人=入仓单货主; - * 件数/毛重/体积=仓单内该货品明细合计(件数取实际上架量 SHELVES_QUANTITY);毛重(吨)=明细总毛重KG/1000; - * 投保总额=货品档案保额(NGWL_TEST_WMS.material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)

+ * 字段口径:件数=实际上架量(SHELVES_QUANTITY)合计;毛重(吨)=明细总毛重KG/1000;体积=明细合计; + * 投保总额=货品档案保额(NGWL_TEST_WMS.material_base_info.insure_amount,物料维度单一值取MAX,不跨仓单累加); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段,按物料合并后单值失真,仅作查询条件不返回

* * @author rcx * @date 2026-08-31 @@ -29,26 +26,8 @@ public class ExecutionInboundMaterialRankPO implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty("入仓日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") - private Date warehouseDate; - - @ApiModelProperty("仓单编号(WMS入库单号)") - @Excel(name = "仓单编号") - private String inOrderNumber; - - @ApiModelProperty("客户编号") - @Excel(name = "客户编号") - private String shipperCode; - - @ApiModelProperty("存货人(客户名称)") - @Excel(name = "存货人") - private String shipperName; - - @ApiModelProperty("商品货号") - @Excel(name = "商品货号") + @ApiModelProperty("物料编码(合并依据)") + @Excel(name = "物料编码") private String materialCode; @ApiModelProperty("货名/商品名称") @@ -63,19 +42,19 @@ public class ExecutionInboundMaterialRankPO implements Serializable { @Excel(name = "单位") private String unitName; - @ApiModelProperty("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)") + @ApiModelProperty("件数(该物料实际上架量合计 SHELVES_QUANTITY,排名依据)") @Excel(name = "件数") private BigDecimal pieceCount; - @ApiModelProperty("毛重(吨)(仓单内该货品合计,KG/1000)") + @ApiModelProperty("毛重(吨)(该物料合计,KG/1000)") @Excel(name = "毛重(吨)") private BigDecimal grossWeightTon; - @ApiModelProperty("投保总额(货品档案保额)") + @ApiModelProperty("投保总额(货品档案保额,物料维度单一值)") @Excel(name = "投保总额") private BigDecimal insureAmount; - @ApiModelProperty("体积(CBM)(仓单内该货品合计)") + @ApiModelProperty("体积(CBM)(该物料合计)") @Excel(name = "体积(CBM)") private BigDecimal totalVolume; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java index c8a51892e..6bd14a5f4 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/inboundRank/repository/po/ExecutionInboundRankTotalPO.java @@ -28,12 +28,12 @@ public class ExecutionInboundRankTotalPO implements Serializable { @ApiModelProperty("毛重(吨)合计") private BigDecimal totalGrossWeightTon; - @ApiModelProperty("投保总额合计(各仓单+货品行保额之和)") + @ApiModelProperty("投保总额合计(各物料保额之和,每物料计一次)") private BigDecimal totalInsureAmount; @ApiModelProperty("体积(CBM)合计") private BigDecimal totalVolume; - @ApiModelProperty("仓单数合计") + @ApiModelProperty("涉及仓单数(当前筛选条件下去重统计)") private Long totalOrderCount; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java index f97d23e57..5fa9b0fe0 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/inboundRank/ExecutionInboundRankApi.java @@ -30,7 +30,9 @@ import java.util.List; * 故数据源跨库取 WMS 入库表(NGWL_TEST_WMS.stock_in_order/in_material_detail,与 OMS 出库排名跨库修法一致); * 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致:仅已入库(5) + 明细 level=1 主行 + * 入仓日期(为空的历史单按建档时间兜底) + 件数=实际上架量(SHELVES_QUANTITY); - * 一行 = 某仓单内某货品的合计,按件数降序排名。 + * 一行 = 一个物料的合计(按物料编码合并区间内全部已入库仓单),按件数降序排名,件数为0的物料不返回。 + * 返回字段:物料编码/货名/规格型号/单位/件数/毛重(吨)/投保总额/体积(CBM); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件,不返回。 * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 * 与出库排名(/executionOutboundRankApi)配对,前端用 tab 页区分

* diff --git a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml index e6b76eb0d..f73e13eea 100644 --- a/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/inboundRank/ExecutionInboundRankMapper.xml @@ -15,8 +15,8 @@ 口径与 WMS 端 /inboundRankApi 完全一致,两边数字一致; 条件:b.status = 5已入库(排除已取消(6)/已关闭(7)及未完成单据); 日期筛选按入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); - 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计, - 按件数(实际上架量 SUM(a.SHELVES_QUANTITY))降序排名 + 一行 = 一个物料的合计(按物料编码合并,区间内全部已入库仓单),按件数(实际上架量 SUM(a.SHELVES_QUANTITY))降序排名, + 件数为0的物料不返回(HAVING过滤);仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件不返回 --> a.del_flag = 1 @@ -57,14 +57,10 @@ left join NGWL_TEST_WMS.material_base_info c on a.material_base_info_id = c.material_base_info_id - + - + diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java index 5c95d09fa..bb30997d2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/mapper/InboundRankMapper.java @@ -15,7 +15,7 @@ import java.util.List; public interface InboundRankMapper { /** - * 商品入库排名列表(仓单+货品汇总,按件数降序) + * 商品入库排名列表(按物料编码合并,按件数降序,过滤0件行) */ List queryMaterialRankList(InboundRankDO inboundRankDO); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java index 3044767a9..0805c433c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundMaterialRankPO.java @@ -1,22 +1,19 @@ package com.mhd.wms.domain.inboundRank.repository.po; -import com.fasterxml.jackson.annotation.JsonFormat; import com.mhd.common.core.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; -import java.util.Date; /** - * 入库排名统计PO(一行 = 某仓单内某货品的合计,按件数降序排名) + * 入库排名统计PO(一行 = 一个物料的合计(按物料编码合并,查询区间内全部已入库仓单),按件数降序排名) * - *

字段口径:入仓日期=入仓单入仓日期(为空兜底建档时间);仓单编号=入库单号;客户编号/存货人=入仓单货主; - * 件数/毛重/体积=仓单内该货品明细合计(件数取实际上架量 SHELVES_QUANTITY);毛重(吨)=明细总毛重KG/1000; - * 投保总额=货品档案保额(material_base_info.insure_amount,组内取MAX防多批次明细行重复累加)

+ *

字段口径:件数=实际上架量(SHELVES_QUANTITY)合计;毛重(吨)=明细总毛重KG/1000;体积=明细合计; + * 投保总额=货品档案保额(material_base_info.insure_amount,物料维度单一值取MAX,不跨仓单累加); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段,按物料合并后单值失真,仅作查询条件不返回

* * @author rcx * @date 2026-08-31 @@ -27,26 +24,8 @@ public class InboundMaterialRankPO implements Serializable { private static final long serialVersionUID = 1L; - @ApiModelProperty("入仓日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @Excel(name = "入仓日期", width = 30, dateFormat = "yyyy-MM-dd") - private Date warehouseDate; - - @ApiModelProperty("仓单编号(入库单号)") - @Excel(name = "仓单编号") - private String inOrderNumber; - - @ApiModelProperty("客户编号") - @Excel(name = "客户编号") - private String shipperCode; - - @ApiModelProperty("存货人(客户名称)") - @Excel(name = "存货人") - private String shipperName; - - @ApiModelProperty("商品货号") - @Excel(name = "商品货号") + @ApiModelProperty("物料编码(合并依据)") + @Excel(name = "物料编码") private String materialCode; @ApiModelProperty("货名/商品名称") @@ -61,19 +40,19 @@ public class InboundMaterialRankPO implements Serializable { @Excel(name = "单位") private String unitName; - @ApiModelProperty("件数(仓单内该货品实际上架量合计 SHELVES_QUANTITY,排名依据)") + @ApiModelProperty("件数(该物料实际上架量合计 SHELVES_QUANTITY,排名依据)") @Excel(name = "件数") private BigDecimal pieceCount; - @ApiModelProperty("毛重(吨)(仓单内该货品合计,KG/1000)") + @ApiModelProperty("毛重(吨)(该物料合计,KG/1000)") @Excel(name = "毛重(吨)") private BigDecimal grossWeightTon; - @ApiModelProperty("投保总额(货品档案保额)") + @ApiModelProperty("投保总额(货品档案保额,物料维度单一值)") @Excel(name = "投保总额") private BigDecimal insureAmount; - @ApiModelProperty("体积(CBM)(仓单内该货品合计)") + @ApiModelProperty("体积(CBM)(该物料合计)") @Excel(name = "体积(CBM)") private BigDecimal totalVolume; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java index f7433e5af..59ac8006b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/inboundRank/repository/po/InboundRankTotalPO.java @@ -28,12 +28,12 @@ public class InboundRankTotalPO implements Serializable { @ApiModelProperty("毛重(吨)合计") private BigDecimal totalGrossWeightTon; - @ApiModelProperty("投保总额合计(各仓单+货品行保额之和)") + @ApiModelProperty("投保总额合计(各物料保额之和,每物料计一次)") private BigDecimal totalInsureAmount; @ApiModelProperty("体积(CBM)合计") private BigDecimal totalVolume; - @ApiModelProperty("仓单数合计") + @ApiModelProperty("涉及仓单数(当前筛选条件下去重统计)") private Long totalOrderCount; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java index e7c812636..a73386995 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/inboundRank/InboundRankDTO.java @@ -9,7 +9,8 @@ import java.io.Serializable; * 入库排名统计入参DTO * *

按入仓日期区间筛选商品入库量统计排名,统计口径:入仓日期 + 仅已入库状态(5) + 明细仅取 level=1 主行; - * 一行 = 某仓单内某货品的合计,按件数降序排名

+ * 一行 = 一个物料的合计(按物料编码合并),按件数降序排名; + * 仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件,返回列不含这些字段

* * @author rcx * @date 2026-08-31 diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java index bde6855dd..a60b9308a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/inboundRank/InboundRankApi.java @@ -26,8 +26,10 @@ import java.util.List; * 入库排名统计Api * *

按入仓日期区间筛选商品入库量统计排名。统计口径:入仓日期(为空的历史单按建档时间兜底) + 仅已入库状态(5), - * 明细仅取 level=1 主行;一行 = 某仓单内某货品的合计,按件数(实际上架量 SHELVES_QUANTITY)降序排名。 - * 字段:入仓日期/仓单编号/客户编号/存货人/货名/件数/毛重(吨)/投保总额/体积(CBM)。 + * 明细仅取 level=1 主行;一行 = 一个物料的合计(按物料编码合并区间内全部已入库仓单), + * 按件数(实际上架量 SHELVES_QUANTITY)降序排名,件数为0的物料不返回。 + * 返回字段:物料编码/货名/规格型号/单位/件数/毛重(吨)/投保总额/体积(CBM); + * 仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件,不返回。 * 与出库排名(/outboundRankApi)配对,前端用 tab 页区分

* * @author rcx diff --git a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml index 63f9a07e0..f4c34136c 100644 --- a/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/inboundRank/InboundRankMapper.xml @@ -10,7 +10,8 @@ left join 货品档案 material_base_info(c,取保额作投保总额) 口径:b.status = 5已入库(排除已取消(6)/已关闭(7)及未完成单据); 日期筛选按入仓单入仓日期 b.warehouse_date(与列表"入仓日期"列同源,为空的历史单按建档时间兜底); - 一行 = 某仓单(b.in_order_number)内某货品(a.material_code)的合计,按件数(实际上架量 SUM(a.SHELVES_QUANTITY))降序排名 + 一行 = 一个物料的合计(按物料编码合并,区间内全部已入库仓单),按件数(实际上架量 SUM(a.SHELVES_QUANTITY))降序排名, + 件数为0的物料不返回(HAVING过滤);仓单编号/客户编号/存货人/入仓日期为单据级字段仅作查询条件不返回 --> a.del_flag = 1 @@ -54,14 +55,10 @@ left join material_base_info c on a.material_base_info_id = c.material_base_info_id - + - + From 7a3021f82a63d492857e481f3afc0297d27358a1 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 16:01:17 +0800 Subject: [PATCH 078/101] =?UTF-8?q?feat(wms,oms)=EF=BC=9A=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E6=8E=92=E5=90=8D=E7=BB=9F=E8=AE=A1=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E4=B8=BA=E8=81=9A=E5=90=88=E6=8E=92=E5=90=8D=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=8C=89=E7=89=A9=E6=96=99=E5=90=88=E5=B9=B6?= =?UTF-8?q?/=E7=BA=BF=E8=B7=AF=E6=8C=89=E7=BA=BF=E8=B7=AF+=E7=89=A9?= =?UTF-8?q?=E6=96=99=E5=90=88=E5=B9=B6=EF=BC=8C=E6=8C=89=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E9=99=8D=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 商品tab:一行=一个货品(跨出库单汇总),返回 货号/货名/件数/毛重(吨)/体积(CBM)/退保总额(占位null),忽略线路筛选参数 - 线路tab:一行=线路×货品(按线路+物料编码合并),额外返回 线路编码/线路,仅统计带线路的单(排除line_code为空的历史单);商品/线路筛选参数均生效 - 单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)合并后无单值可对应,不再返回 - 件数=SUM(CHECK_QUANTITY)复核确认的实际出库量(与入库排名实际上架量SHELVES_QUANTITY对称),按件数降序,编码次之 - 合计行:件数/毛重吨/体积 全量合计;商品tab含totalOrderCount(去重出库单数),线路tab含totalOrderCount+totalLineCount(去重线路数) - 数据源不变:WMS查本库出库表,OMS跨库查NGWL_TEST_WMS同名表,两边数字一致;接口路径/传参不变 --- .../facade/IExecutionOutboundRankService.java | 23 +++-- .../mapper/ExecutionOutboundRankMapper.java | 23 +++-- .../ExecutionOutboundRankImpl.java | 23 +++-- .../po/ExecutionOutboundDetailRankPO.java | 85 ----------------- .../ExecutionOutboundDetailRankTotalPO.java | 9 +- .../po/ExecutionOutboundLineRankPO.java | 59 ++++++++++++ .../po/ExecutionOutboundMaterialRankPO.java | 50 ++++++++++ ...ecutionOutboundRankApplicationService.java | 46 +++++++--- .../ExecutionOutboundRankDomainService.java | 31 +++++-- .../ExecutionOutboundRankApi.java | 55 +++++------ .../ExecutionOutboundRankMapper.xml | 92 ++++++++++++------- .../OutboundRankApplicationService.java | 46 +++++++--- .../facade/IOutboundRankService.java | 23 +++-- .../repository/mapper/OutboundRankMapper.java | 23 +++-- .../persistence/OutboundRankImpl.java | 23 +++-- .../repository/po/OutboundDetailRankPO.java | 85 ----------------- .../po/OutboundDetailRankTotalPO.java | 3 + .../repository/po/OutboundLineRankPO.java | 59 ++++++++++++ .../repository/po/OutboundMaterialRankPO.java | 50 ++++++++++ .../service/OutboundRankDomainService.java | 31 +++++-- .../outboundRank/OutboundRankApi.java | 53 ++++++----- .../outboundRank/OutboundRankMapper.xml | 91 +++++++++++------- 22 files changed, 615 insertions(+), 368 deletions(-) delete mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java delete mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java index 477fc1e99..239e6f118 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/facade/IExecutionOutboundRankService.java @@ -1,13 +1,14 @@ package com.mhd.oms.domain.outboundRank.repository.facade; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import java.util.List; /** - * 出库排名统计(明细)Service接口 + * 出库排名统计Service接口 * * @author rcx * @date 2026-08-31 @@ -15,12 +16,22 @@ import java.util.List; public interface IExecutionOutboundRankService { /** - * 出库明细列表 + * 商品出库排名列表(货品聚合) */ - List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO); + List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO); /** - * 出库明细合计(不分页) + * 商品出库排名合计(不分页) */ - ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); + + /** + * 线路出库排名列表(线路×货品聚合) + */ + List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO); + + /** + * 线路出库排名合计(不分页) + */ + ExecutionOutboundDetailRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java index 3f88c7823..411aaa893 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/mapper/ExecutionOutboundRankMapper.java @@ -1,13 +1,14 @@ package com.mhd.oms.domain.outboundRank.repository.mapper; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import java.util.List; /** - * 出库排名统计(明细)Mapper接口 + * 出库排名统计Mapper接口 * * @author rcx * @date 2026-08-31 @@ -15,12 +16,22 @@ import java.util.List; public interface ExecutionOutboundRankMapper { /** - * 出库明细列表(一行=仓单×货品,按件数倒序) + * 商品出库排名列表(一行=一个货品,跨单汇总,按实际出库量降序) */ - List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO); + List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO); /** - * 出库明细合计(不分页,当前筛选条件全量合计) + * 商品出库排名合计(不分页,当前筛选条件全量合计) */ - ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); + + /** + * 线路出库排名列表(一行=线路×货品,按实际出库量降序,仅统计带线路的单) + */ + List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO); + + /** + * 线路出库排名合计(不分页,当前筛选条件全量合计) + */ + ExecutionOutboundDetailRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java index 76e2abcd4..e4c23f36b 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/persistence/ExecutionOutboundRankImpl.java @@ -2,8 +2,9 @@ package com.mhd.oms.domain.outboundRank.repository.persistence; import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService; import com.mhd.oms.domain.outboundRank.repository.mapper.ExecutionOutboundRankMapper; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -11,7 +12,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)Service业务层处理 + * 出库排名统计Service业务层处理 * * @author rcx * @date 2026-08-31 @@ -23,12 +24,22 @@ public class ExecutionOutboundRankImpl implements IExecutionOutboundRankService private ExecutionOutboundRankMapper executionOutboundRankMapper; @Override - public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryDetailList(executionOutboundRankDO); + public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryMaterialRankList(executionOutboundRankDO); } @Override - public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankMapper.queryDetailTotal(executionOutboundRankDO); + public ExecutionOutboundDetailRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryMaterialRankTotal(executionOutboundRankDO); + } + + @Override + public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryLineRankList(executionOutboundRankDO); + } + + @Override + public ExecutionOutboundDetailRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankMapper.queryLineRankTotal(executionOutboundRankDO); } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java deleted file mode 100644 index 2c37d7725..000000000 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankPO.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.mhd.oms.domain.outboundRank.repository.po; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 出库排名统计(明细)PO(一行 = 仓单×货品,件数/毛重/体积按行汇总) - * - *

字段口径:种类=出库单据类型;仓单编号=出库单号;收货人=出库单 TO 栏(为空取联系人); - * 毛重(吨)=明细总毛重KG/1000;出仓日期=出仓日期(为空依次兜底完成时间/创建时间); - * 退保总额为占位字段,后端暂无对应数据来源,恒为 null(候选:货品档案保额 insure_amount,确认后可补)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "出库排名统计明细对象", description = "出库排名统计明细响应对象") -public class ExecutionOutboundDetailRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("种类(出库单据类型)") - @Excel(name = "种类") - private String orderTypeName; - - @ApiModelProperty("仓单编号(出库单号)") - @Excel(name = "仓单编号") - private String outOrderNumber; - - @ApiModelProperty("入库单号") - @Excel(name = "入库单号") - private String inOrderNumber; - - @ApiModelProperty("客户编号") - @Excel(name = "客户编号") - private String customerCode; - - @ApiModelProperty("收货人(出库单 TO 栏,为空取联系人)") - @Excel(name = "收货人") - private String receiver; - - @ApiModelProperty("商品货号(辅助字段,不导出)") - private String materialCode; - - @ApiModelProperty("货名") - @Excel(name = "货名") - private String materialName; - - @ApiModelProperty("线路编码(辅助字段,不导出)") - private String lineCode; - - @ApiModelProperty("线路") - @Excel(name = "线路") - private String lineName; - - @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") - @Excel(name = "件数") - private BigDecimal pieceCount; - - @ApiModelProperty("毛重(吨)") - @Excel(name = "毛重(吨)") - private BigDecimal grossWeightTon; - - @ApiModelProperty("体积(CBM)") - @Excel(name = "体积(CBM)") - private BigDecimal totalVolume; - - @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") - @Excel(name = "退保总额") - private BigDecimal depositRefundAmount; - - @ApiModelProperty("出仓日期(出仓日期为空时依次兜底完成时间/创建时间)") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") - private Date outboundDate; -} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java index 355295a34..9ce960473 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundDetailRankTotalPO.java @@ -8,16 +8,16 @@ import java.io.Serializable; import java.math.BigDecimal; /** - * 出库排名统计(明细)合计PO + * 出库排名统计合计PO * *

当前筛选条件下不分页的全量合计,随分页列表一起返回 - * (totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount)

+ * (totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount/totalLineCount)

* * @author rcx * @date 2026-08-31 */ @Data -@ApiModel(value = "出库排名统计明细合计对象", description = "出库排名统计明细合计响应对象") +@ApiModel(value = "出库排名统计合计对象", description = "出库排名统计合计响应对象") public class ExecutionOutboundDetailRankTotalPO implements Serializable { private static final long serialVersionUID = 1L; @@ -33,4 +33,7 @@ public class ExecutionOutboundDetailRankTotalPO implements Serializable { @ApiModelProperty("仓单数合计(去重出库单数)") private Long totalOrderCount; + + @ApiModelProperty("线路数合计(去重线路数,线路排名使用)") + private Long totalLineCount; } diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java new file mode 100644 index 000000000..a1beead56 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundLineRankPO.java @@ -0,0 +1,59 @@ +package com.mhd.oms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 线路出库排名PO(一行 = 线路×货品,日期区间内汇总) + * + *

按线路+物料编码合并:多张出库单合并为一行,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)不提供; + * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空,不参与线路排名); + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") +public class ExecutionOutboundLineRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("线路编码") + @Excel(name = "线路编码") + private String lineCode; + + @ApiModelProperty("线路") + @Excel(name = "线路") + private String lineName; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java new file mode 100644 index 000000000..497b9a205 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/repository/po/ExecutionOutboundMaterialRankPO.java @@ -0,0 +1,50 @@ +package com.mhd.oms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品出库排名PO(一行 = 一个货品,日期区间内跨出库单汇总) + * + *

按物料编码合并:一个货品会走多条线路/多张单,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)与 + * 线路字段均无单值可返,不提供;件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") +public class ExecutionOutboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java index 2d68567c0..6b705c399 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankApplicationService.java @@ -4,8 +4,9 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +15,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)应用服务 + * 出库排名统计应用服务 * *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 ExecutionOutboundRankDomainService → ExecutionOutboundRankMapper.xml(跨库取 WMS 出库数据)

* @@ -29,26 +30,49 @@ public class ExecutionOutboundRankApplicationService { private ExecutionOutboundRankDomainService executionOutboundRankDomainService; /** - * 分页查询出库明细列表 + * 分页查询商品出库排名列表(货品聚合) */ - public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { + public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryDetailList(executionOutboundRankDO); + return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO); } /** - * 出库明细合计(当前筛选条件全量,不分页) + * 商品出库排名合计(当前筛选条件全量,不分页) */ - public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankDomainService.queryDetailTotal(executionOutboundRankDO); + public ExecutionOutboundDetailRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankDomainService.queryMaterialRankTotal(executionOutboundRankDO); } /** - * 导出出库明细(不分页全量) + * 导出商品出库排名(不分页全量) */ - public List exportDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { + public List exportMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { fillLoginContext(executionOutboundRankDO); - return executionOutboundRankDomainService.queryDetailList(executionOutboundRankDO); + return executionOutboundRankDomainService.queryMaterialRankList(executionOutboundRankDO); + } + + /** + * 分页查询线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + fillLoginContext(executionOutboundRankDO); + return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO); + } + + /** + * 线路出库排名合计(当前筛选条件全量,不分页) + */ + public ExecutionOutboundDetailRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankDomainService.queryLineRankTotal(executionOutboundRankDO); + } + + /** + * 导出线路出库排名(不分页全量) + */ + public List exportLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + fillLoginContext(executionOutboundRankDO); + return executionOutboundRankDomainService.queryLineRankList(executionOutboundRankDO); } /** diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java index 7966fe6bd..95b54e602 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outboundRank/service/ExecutionOutboundRankDomainService.java @@ -1,8 +1,9 @@ package com.mhd.oms.domain.outboundRank.service; import com.mhd.oms.domain.outboundRank.repository.facade.IExecutionOutboundRankService; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -11,7 +12,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)领域服务 + * 出库排名统计领域服务 * * @author rcx * @date 2026-08-31 @@ -24,16 +25,30 @@ public class ExecutionOutboundRankDomainService { private IExecutionOutboundRankService executionOutboundRankService; /** - * 出库明细列表 + * 商品出库排名列表(货品聚合) */ - public List queryDetailList(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryDetailList(executionOutboundRankDO); + public List queryMaterialRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryMaterialRankList(executionOutboundRankDO); } /** - * 出库明细合计(不分页) + * 商品出库排名合计(不分页) */ - public ExecutionOutboundDetailRankTotalPO queryDetailTotal(ExecutionOutboundRankDO executionOutboundRankDO) { - return executionOutboundRankService.queryDetailTotal(executionOutboundRankDO); + public ExecutionOutboundDetailRankTotalPO queryMaterialRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryMaterialRankTotal(executionOutboundRankDO); + } + + /** + * 线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryLineRankList(executionOutboundRankDO); + } + + /** + * 线路出库排名合计(不分页) + */ + public ExecutionOutboundDetailRankTotalPO queryLineRankTotal(ExecutionOutboundRankDO executionOutboundRankDO) { + return executionOutboundRankService.queryLineRankTotal(executionOutboundRankDO); } } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java index 81ae1b67a..e723269a6 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outboundRank/ExecutionOutboundRankApi.java @@ -4,8 +4,9 @@ import com.github.pagehelper.PageInfo; import com.mhd.common.core.constant.HttpStatus; import com.mhd.common.core.utils.PageUtils; import com.mhd.common.core.utils.poi.ExcelUtil; -import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankPO; import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundDetailRankTotalPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundLineRankPO; +import com.mhd.oms.domain.outboundRank.repository.po.ExecutionOutboundMaterialRankPO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDO; import com.mhd.oms.domain.outboundRank.repository.todo.ExecutionOutboundRankDTO; import com.mhd.oms.domain.outboundRank.service.ExecutionOutboundRankApplicationService; @@ -26,11 +27,14 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按件数(实际复核出库量)降序,出仓日期/单号次之)。 - * OMS 库出库单状态不流转(无"已出库"数据),数据源跨库取 WMS 库出库表(NGWL_TEST_WMS.stock_out_order / out_material_detail), - * 口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致;统计条件:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 - * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 - * 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null)/出仓日期

+ *

按日期区间筛选出库量统计排名,按出库数量(实际复核出库量)降序。 + * 商品tab:一行 = 一个货品(货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),跨出库单汇总,忽略线路筛选参数; + * 线路tab:一行 = 线路×货品(线路编码/线路/货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),按线路+物料编码合并, + * 仅统计带线路的单,商品/线路筛选参数均生效; + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 数据源跨库取 WMS 库出库表,口径与 WMS 端 /outboundRankApi 完全一致,两边数字一致; + * 退保总额后端暂无对应数据来源,恒为 null

* * @author rcx * @date 2026-08-31 @@ -58,25 +62,22 @@ public class ExecutionOutboundRankApi { executionOutboundRankDO.setLineCode(null); executionOutboundRankDO.setLineName(null); startPage(); - List list = executionOutboundRankApplicationService.queryDetailList(executionOutboundRankDO); - ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryDetailTotal(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.queryMaterialRankList(executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryMaterialRankTotal(executionOutboundRankDO); return getDataTableWithTotal(list, total); } /** - * 分页查询线路出库排名列表(含合计行,线路tab;忽略商品筛选参数) + * 分页查询线路出库排名列表(含合计行,线路tab;一行=线路×货品,仅统计带线路的单) */ @ApiOperation("分页查询线路出库排名列表") @GetMapping("/queryLineRankList") public HashMap queryLineRankList(ExecutionOutboundRankDTO executionOutboundRankDTO) { - //转换实体 + //转换实体(线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); - //线路tab:忽略商品筛选参数 - executionOutboundRankDO.setMaterialCode(null); - executionOutboundRankDO.setMaterialName(null); startPage(); - List list = executionOutboundRankApplicationService.queryDetailList(executionOutboundRankDO); - ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryDetailTotal(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.queryLineRankList(executionOutboundRankDO); + ExecutionOutboundDetailRankTotalPO total = executionOutboundRankApplicationService.queryLineRankTotal(executionOutboundRankDO); return getDataTableWithTotal(list, total); } @@ -91,41 +92,38 @@ public class ExecutionOutboundRankApi { //商品tab:忽略线路筛选参数 executionOutboundRankDO.setLineCode(null); executionOutboundRankDO.setLineName(null); - List list = executionOutboundRankApplicationService.exportDetailList(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.exportMaterialRankList(executionOutboundRankDO); 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<>(ExecutionOutboundDetailRankPO.class); + ExcelUtil util = new ExcelUtil<>(ExecutionOutboundMaterialRankPO.class); util.exportExcel(response, list, "商品出库排名"); } /** - * 导出线路出库排名Excel(线路tab;忽略商品筛选参数) + * 导出线路出库排名Excel(线路tab;一行=线路×货品,仅统计带线路的单) */ @ApiOperation("导出线路出库排名Excel") @GetMapping("/exportLineRank") public void exportLineRank(HttpServletResponse response, ExecutionOutboundRankDTO executionOutboundRankDTO) throws Exception { - //转换实体(不分页,导出全量) + //转换实体(不分页,导出全量;线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) ExecutionOutboundRankDO executionOutboundRankDO = executionOutboundRankAssembler.toDO(executionOutboundRankDTO); - //线路tab:忽略商品筛选参数 - executionOutboundRankDO.setMaterialCode(null); - executionOutboundRankDO.setMaterialName(null); - List list = executionOutboundRankApplicationService.exportDetailList(executionOutboundRankDO); + List list = executionOutboundRankApplicationService.exportLineRankList(executionOutboundRankDO); 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<>(ExecutionOutboundDetailRankPO.class); + ExcelUtil util = new ExcelUtil<>(ExecutionOutboundLineRankPO.class); util.exportExcel(response, list, "线路出库排名"); } /** - * 分页结果 + 合计行:data/total/code/msg 之外追加 totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount + * 分页结果 + 合计行:data/total/code/msg 之外追加合计字段(商品tab含 totalOrderCount,线路tab含 totalOrderCount/totalLineCount) */ private HashMap getDataTableWithTotal(List list, ExecutionOutboundDetailRankTotalPO total) { HashMap result = new HashMap<>(); @@ -137,7 +135,12 @@ public class ExecutionOutboundRankApi { result.put("totalPieceCount", total.getTotalPieceCount()); result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); result.put("totalVolume", total.getTotalVolume()); - result.put("totalOrderCount", total.getTotalOrderCount()); + if (total.getTotalOrderCount() != null) { + result.put("totalOrderCount", total.getTotalOrderCount()); + } + if (total.getTotalLineCount() != null) { + result.put("totalLineCount", total.getTotalLineCount()); + } } return result; } diff --git a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml index 62df4931f..260bf0f80 100644 --- a/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml +++ b/mhd_oms/src/main/resources/mapper/outboundRank/ExecutionOutboundRankMapper.xml @@ -5,15 +5,17 @@ a.del_flag = 1 @@ -62,50 +64,70 @@ join NGWL_TEST_WMS.stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - - select - MAX(b.ORDER_TYPE_NAME) AS orderTypeName, - b.out_order_number AS outOrderNumber, - MAX(a.in_order_number) AS inOrderNumber, - MAX(b.customer_code) AS customerCode, - MAX(IFNULL(b."TO", b.contact_person)) AS receiver, a.material_code AS materialCode, MAX(a.material_name) AS materialName, - MAX(b.line_code) AS lineCode, - MAX(b.line_name) AS lineName, IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS grossWeightTon, - IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, - MAX(IFNULL(b.OUTBOUND_DATE, IFNULL(b.COMPLETE_TIME, b.create_time))) AS outboundDate + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume - GROUP BY b.out_order_number, a.material_code - order by pieceCount desc, outboundDate desc, outOrderNumber desc + GROUP BY a.material_code + order by pieceCount desc, materialCode asc - - select - IFNULL(SUM(t.pieceCount), 0) AS totalPieceCount, - ROUND(IFNULL(SUM(t.grossWeightKG), 0) / 1000, 3) AS totalGrossWeightTon, - IFNULL(SUM(t.totalVolume), 0) AS totalVolume, - COUNT(DISTINCT t.outOrderNumber) AS totalOrderCount - from ( - select - b.out_order_number AS outOrderNumber, - IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, - IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) AS grossWeightKG, - IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume - - - - - GROUP BY b.out_order_number, a.material_code - ) t + IFNULL(SUM(a.CHECK_QUANTITY), 0) AS totalPieceCount, + ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS totalGrossWeightTon, + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, + COUNT(DISTINCT a.out_order_number) AS totalOrderCount + + + + + + + + + + + diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java index 0082a8ed4..d6980900f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/outboundRank/OutboundRankApplicationService.java @@ -6,8 +6,9 @@ import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO; import com.mhd.system.api.domain.cache.SystemServiceCacheUtil; import com.mhd.system.api.model.LoginUser; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import com.mhd.wms.domain.outboundRank.service.OutboundRankDomainService; import lombok.extern.slf4j.Slf4j; @@ -17,7 +18,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)应用服务 + * 出库排名统计应用服务 * *

负责登录用户组织隔离注入、日期区间校验,查询逻辑在 OutboundRankDomainService → OutboundRankMapper.xml

* @@ -32,26 +33,49 @@ public class OutboundRankApplicationService { private OutboundRankDomainService outboundRankDomainService; /** - * 分页查询出库明细列表 + * 分页查询商品出库排名列表(货品聚合) */ - public List queryDetailList(OutboundRankDO outboundRankDO) { + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryDetailList(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); } /** - * 出库明细合计(当前筛选条件全量,不分页) + * 商品出库排名合计(当前筛选条件全量,不分页) */ - public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { - return outboundRankDomainService.queryDetailTotal(outboundRankDO); + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryMaterialRankTotal(outboundRankDO); } /** - * 导出出库明细(不分页全量) + * 导出商品出库排名(不分页全量) */ - public List exportDetailList(OutboundRankDO outboundRankDO) { + public List exportMaterialRankList(OutboundRankDO outboundRankDO) { fillLoginContext(outboundRankDO); - return outboundRankDomainService.queryDetailList(outboundRankDO); + return outboundRankDomainService.queryMaterialRankList(outboundRankDO); + } + + /** + * 分页查询线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); + } + + /** + * 线路出库排名合计(当前筛选条件全量,不分页) + */ + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankDomainService.queryLineRankTotal(outboundRankDO); + } + + /** + * 导出线路出库排名(不分页全量) + */ + public List exportLineRankList(OutboundRankDO outboundRankDO) { + fillLoginContext(outboundRankDO); + return outboundRankDomainService.queryLineRankList(outboundRankDO); } /** diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java index f20e1a989..2bc25d4a3 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/facade/IOutboundRankService.java @@ -1,13 +1,14 @@ package com.mhd.wms.domain.outboundRank.repository.facade; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import java.util.List; /** - * 出库排名统计(明细)Service接口 + * 出库排名统计Service接口 * * @author rcx * @date 2026-08-31 @@ -15,12 +16,22 @@ import java.util.List; public interface IOutboundRankService { /** - * 出库明细列表 + * 商品出库排名列表(货品聚合) */ - List queryDetailList(OutboundRankDO outboundRankDO); + List queryMaterialRankList(OutboundRankDO outboundRankDO); /** - * 出库明细合计(不分页) + * 商品出库排名合计(不分页) */ - OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO); + OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表(线路×货品聚合) + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页) + */ + OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java index ee09b891f..ff5f702d8 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/mapper/OutboundRankMapper.java @@ -1,13 +1,14 @@ package com.mhd.wms.domain.outboundRank.repository.mapper; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import java.util.List; /** - * 出库排名统计(明细)Mapper接口 + * 出库排名统计Mapper接口 * * @author rcx * @date 2026-08-31 @@ -15,12 +16,22 @@ import java.util.List; public interface OutboundRankMapper { /** - * 出库明细列表(一行=仓单×货品,按件数倒序) + * 商品出库排名列表(一行=一个货品,跨单汇总,按实际出库量降序) */ - List queryDetailList(OutboundRankDO outboundRankDO); + List queryMaterialRankList(OutboundRankDO outboundRankDO); /** - * 出库明细合计(不分页,当前筛选条件全量合计) + * 商品出库排名合计(不分页,当前筛选条件全量合计) */ - OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO); + OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名列表(一行=线路×货品,按实际出库量降序,仅统计带线路的单) + */ + List queryLineRankList(OutboundRankDO outboundRankDO); + + /** + * 线路出库排名合计(不分页,当前筛选条件全量合计) + */ + OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java index 4108d2dd4..6555dc647 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/persistence/OutboundRankImpl.java @@ -2,8 +2,9 @@ package com.mhd.wms.domain.outboundRank.repository.persistence; import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; import com.mhd.wms.domain.outboundRank.repository.mapper.OutboundRankMapper; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -11,7 +12,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)Service业务层处理 + * 出库排名统计Service业务层处理 * * @author rcx * @date 2026-08-31 @@ -23,12 +24,22 @@ public class OutboundRankImpl implements IOutboundRankService { private OutboundRankMapper outboundRankMapper; @Override - public List queryDetailList(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryDetailList(outboundRankDO); + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankList(outboundRankDO); } @Override - public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { - return outboundRankMapper.queryDetailTotal(outboundRankDO); + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryMaterialRankTotal(outboundRankDO); + } + + @Override + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankList(outboundRankDO); + } + + @Override + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankMapper.queryLineRankTotal(outboundRankDO); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java deleted file mode 100644 index 4be88b6a7..000000000 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankPO.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.mhd.wms.domain.outboundRank.repository.po; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - -/** - * 出库排名统计(明细)PO(一行 = 仓单×货品,件数/毛重/体积按行汇总) - * - *

字段口径:种类=出库单据类型;仓单编号=出库单号;收货人=出库单 TO 栏(为空取联系人); - * 毛重(吨)=明细总毛重KG/1000;出仓日期=出仓日期(为空依次兜底完成时间/创建时间); - * 退保总额为占位字段,后端暂无对应数据来源,恒为 null(候选:货品档案保额 insure_amount,确认后可补)

- * - * @author rcx - * @date 2026-08-31 - */ -@Data -@ApiModel(value = "出库排名统计明细对象", description = "出库排名统计明细响应对象") -public class OutboundDetailRankPO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("种类(出库单据类型)") - @Excel(name = "种类") - private String orderTypeName; - - @ApiModelProperty("仓单编号(出库单号)") - @Excel(name = "仓单编号") - private String outOrderNumber; - - @ApiModelProperty("入库单号") - @Excel(name = "入库单号") - private String inOrderNumber; - - @ApiModelProperty("客户编号") - @Excel(name = "客户编号") - private String customerCode; - - @ApiModelProperty("收货人(出库单 TO 栏,为空取联系人)") - @Excel(name = "收货人") - private String receiver; - - @ApiModelProperty("商品货号(辅助字段,不导出)") - private String materialCode; - - @ApiModelProperty("货名") - @Excel(name = "货名") - private String materialName; - - @ApiModelProperty("线路编码(辅助字段,不导出)") - private String lineCode; - - @ApiModelProperty("线路") - @Excel(name = "线路") - private String lineName; - - @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") - @Excel(name = "件数") - private BigDecimal pieceCount; - - @ApiModelProperty("毛重(吨)") - @Excel(name = "毛重(吨)") - private BigDecimal grossWeightTon; - - @ApiModelProperty("体积(CBM)") - @Excel(name = "体积(CBM)") - private BigDecimal totalVolume; - - @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") - @Excel(name = "退保总额") - private BigDecimal depositRefundAmount; - - @ApiModelProperty("出仓日期(出仓日期为空时依次兜底完成时间/创建时间)") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @Excel(name = "出仓日期", width = 30, dateFormat = "yyyy-MM-dd") - private Date outboundDate; -} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java index 5b37776c7..397126046 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundDetailRankTotalPO.java @@ -33,4 +33,7 @@ public class OutboundDetailRankTotalPO implements Serializable { @ApiModelProperty("仓单数合计(去重出库单数)") private Long totalOrderCount; + + @ApiModelProperty("线路数合计(去重线路数,线路排名使用)") + private Long totalLineCount; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java new file mode 100644 index 000000000..38b7ecc4a --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundLineRankPO.java @@ -0,0 +1,59 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 线路出库排名PO(一行 = 线路×货品,日期区间内汇总) + * + *

按线路+物料编码合并:多张出库单合并为一行,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)不提供; + * 仅统计带线路的出库单(line_code 为 2026-08-20 新增冗余字段,历史单为空,不参与线路排名); + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "线路出库排名对象", description = "线路出库排名响应对象") +public class OutboundLineRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("线路编码") + @Excel(name = "线路编码") + private String lineCode; + + @ApiModelProperty("线路") + @Excel(name = "线路") + private String lineName; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java new file mode 100644 index 000000000..d58cac1d5 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/repository/po/OutboundMaterialRankPO.java @@ -0,0 +1,50 @@ +package com.mhd.wms.domain.outboundRank.repository.po; + +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品出库排名PO(一行 = 一个货品,日期区间内跨出库单汇总) + * + *

按物料编码合并:一个货品会走多条线路/多张单,单据级字段(种类/仓单编号/入库单号/客户编号/收货人/出仓日期)与 + * 线路字段均无单值可返,不提供;件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额为占位字段,后端暂无对应数据来源,恒为 null

+ * + * @author rcx + * @date 2026-08-31 + */ +@Data +@ApiModel(value = "商品出库排名对象", description = "商品出库排名响应对象") +public class OutboundMaterialRankPO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("商品货号") + @Excel(name = "商品货号") + private String materialCode; + + @ApiModelProperty("货名") + @Excel(name = "货名") + private String materialName; + + @ApiModelProperty("件数(复核确认的实际出库量合计,与入库排名的实际上架量对称)") + @Excel(name = "件数") + private BigDecimal pieceCount; + + @ApiModelProperty("毛重(吨)") + @Excel(name = "毛重(吨)") + private BigDecimal grossWeightTon; + + @ApiModelProperty("体积(CBM)") + @Excel(name = "体积(CBM)") + private BigDecimal totalVolume; + + @ApiModelProperty("退保总额(占位字段,后端暂无数据来源,恒为 null)") + @Excel(name = "退保总额") + private BigDecimal depositRefundAmount; +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java index 0b21ed65e..18af50291 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/outboundRank/service/OutboundRankDomainService.java @@ -1,8 +1,9 @@ package com.mhd.wms.domain.outboundRank.service; import com.mhd.wms.domain.outboundRank.repository.facade.IOutboundRankService; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -11,7 +12,7 @@ import org.springframework.stereotype.Service; import java.util.List; /** - * 出库排名统计(明细)领域服务 + * 出库排名统计领域服务 * * @author rcx * @date 2026-08-31 @@ -24,16 +25,30 @@ public class OutboundRankDomainService { private IOutboundRankService outboundRankService; /** - * 出库明细列表 + * 商品出库排名列表(货品聚合) */ - public List queryDetailList(OutboundRankDO outboundRankDO) { - return outboundRankService.queryDetailList(outboundRankDO); + public List queryMaterialRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankList(outboundRankDO); } /** - * 出库明细合计(不分页) + * 商品出库排名合计(不分页) */ - public OutboundDetailRankTotalPO queryDetailTotal(OutboundRankDO outboundRankDO) { - return outboundRankService.queryDetailTotal(outboundRankDO); + public OutboundDetailRankTotalPO queryMaterialRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryMaterialRankTotal(outboundRankDO); + } + + /** + * 线路出库排名列表(线路×货品聚合) + */ + public List queryLineRankList(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankList(outboundRankDO); + } + + /** + * 线路出库排名合计(不分页) + */ + public OutboundDetailRankTotalPO queryLineRankTotal(OutboundRankDO outboundRankDO) { + return outboundRankService.queryLineRankTotal(outboundRankDO); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java index a7cccda65..649e3906a 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/outboundRank/OutboundRankApi.java @@ -5,8 +5,9 @@ import com.mhd.common.core.constant.HttpStatus; import com.mhd.common.core.utils.PageUtils; import com.mhd.common.core.utils.poi.ExcelUtil; import com.mhd.wms.application.service.outboundRank.OutboundRankApplicationService; -import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankPO; import com.mhd.wms.domain.outboundRank.repository.po.OutboundDetailRankTotalPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundLineRankPO; +import com.mhd.wms.domain.outboundRank.repository.po.OutboundMaterialRankPO; import com.mhd.wms.domain.outboundRank.repository.todo.OutboundRankDO; import com.mhd.wms.interfaces.assember.outboundRank.OutboundRankAssembler; import com.mhd.wms.interfaces.dto.outboundRank.OutboundRankDTO; @@ -25,10 +26,13 @@ import java.util.List; /** * 出库排名统计Api * - *

按日期区间筛选出库明细列表(一行 = 仓单×货品,件数/毛重/体积按行汇总,按件数(实际复核出库量)降序,出仓日期/单号次之)。 - * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行。 - * 商品/线路两个 tab 各自独立接口,内部为同一份明细查询:商品接口忽略线路筛选参数,线路接口忽略商品筛选参数。 - * 字段:种类/仓单编号/入库单号/客户编号/收货人/货名/线路/件数/毛重(吨)/体积(CBM)/退保总额(占位null)/出仓日期

+ *

按日期区间筛选出库量统计排名,按出库数量(实际复核出库量)降序。 + * 商品tab:一行 = 一个货品(货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),跨出库单汇总,忽略线路筛选参数; + * 线路tab:一行 = 线路×货品(线路编码/线路/货号/货名/件数/毛重(吨)/体积(CBM)/退保总额占位),按线路+物料编码合并, + * 仅统计带线路的单,商品/线路筛选参数均生效; + * 统计口径:出库单创建时间 + 已出库及之后状态(9,12,13),明细仅取 level=1 主行; + * 件数 = SUM(CHECK_QUANTITY) 复核确认的实际出库量(与入库排名的实际上架量对称); + * 退保总额后端暂无对应数据来源,恒为 null

* * @author rcx * @date 2026-08-31 @@ -55,25 +59,22 @@ public class OutboundRankApi { outboundRankDO.setLineCode(null); outboundRankDO.setLineName(null); startPage(); - List list = outboundRankApplicationService.queryDetailList(outboundRankDO); - OutboundDetailRankTotalPO total = outboundRankApplicationService.queryDetailTotal(outboundRankDO); + List list = outboundRankApplicationService.queryMaterialRankList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryMaterialRankTotal(outboundRankDO); return getDataTableWithTotal(list, total); } /** - * 分页查询线路出库排名列表(含合计行,线路tab;忽略商品筛选参数) + * 分页查询线路出库排名列表(含合计行,线路tab;一行=线路×货品,仅统计带线路的单) */ @ApiOperation("分页查询线路出库排名列表") @GetMapping("/queryLineRankList") public HashMap queryLineRankList(OutboundRankDTO outboundRankDTO) { - //转换实体 + //转换实体(线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); - //线路tab:忽略商品筛选参数 - outboundRankDO.setMaterialCode(null); - outboundRankDO.setMaterialName(null); startPage(); - List list = outboundRankApplicationService.queryDetailList(outboundRankDO); - OutboundDetailRankTotalPO total = outboundRankApplicationService.queryDetailTotal(outboundRankDO); + List list = outboundRankApplicationService.queryLineRankList(outboundRankDO); + OutboundDetailRankTotalPO total = outboundRankApplicationService.queryLineRankTotal(outboundRankDO); return getDataTableWithTotal(list, total); } @@ -88,41 +89,38 @@ public class OutboundRankApi { //商品tab:忽略线路筛选参数 outboundRankDO.setLineCode(null); outboundRankDO.setLineName(null); - List list = outboundRankApplicationService.exportDetailList(outboundRankDO); + List list = outboundRankApplicationService.exportMaterialRankList(outboundRankDO); 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<>(OutboundDetailRankPO.class); + ExcelUtil util = new ExcelUtil<>(OutboundMaterialRankPO.class); util.exportExcel(response, list, "商品出库排名"); } /** - * 导出线路出库排名Excel(线路tab;忽略商品筛选参数) + * 导出线路出库排名Excel(线路tab;一行=线路×货品,仅统计带线路的单) */ @ApiOperation("导出线路出库排名Excel") @GetMapping("/exportLineRank") public void exportLineRank(HttpServletResponse response, OutboundRankDTO outboundRankDTO) throws Exception { - //转换实体(不分页,导出全量) + //转换实体(不分页,导出全量;线路tab:商品/线路筛选参数均生效,按线路+物料编码合并) OutboundRankDO outboundRankDO = outboundRankAssembler.toDO(outboundRankDTO); - //线路tab:忽略商品筛选参数 - outboundRankDO.setMaterialCode(null); - outboundRankDO.setMaterialName(null); - List list = outboundRankApplicationService.exportDetailList(outboundRankDO); + List list = outboundRankApplicationService.exportLineRankList(outboundRankDO); 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<>(OutboundDetailRankPO.class); + ExcelUtil util = new ExcelUtil<>(OutboundLineRankPO.class); util.exportExcel(response, list, "线路出库排名"); } /** - * 分页结果 + 合计行:data/total/code/msg 之外追加 totalPieceCount/totalGrossWeightTon/totalVolume/totalOrderCount + * 分页结果 + 合计行:data/total/code/msg 之外追加合计字段(商品tab含 totalOrderCount,线路tab含 totalOrderCount/totalLineCount) */ private HashMap getDataTableWithTotal(List list, OutboundDetailRankTotalPO total) { HashMap result = new HashMap<>(); @@ -134,7 +132,12 @@ public class OutboundRankApi { result.put("totalPieceCount", total.getTotalPieceCount()); result.put("totalGrossWeightTon", total.getTotalGrossWeightTon()); result.put("totalVolume", total.getTotalVolume()); - result.put("totalOrderCount", total.getTotalOrderCount()); + if (total.getTotalOrderCount() != null) { + result.put("totalOrderCount", total.getTotalOrderCount()); + } + if (total.getTotalLineCount() != null) { + result.put("totalLineCount", total.getTotalLineCount()); + } } return result; } diff --git a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml index 095d5eba0..b35a01337 100644 --- a/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml +++ b/mhd_wms/src/main/resources/mapper/outboundRank/OutboundRankMapper.xml @@ -5,12 +5,13 @@ a.del_flag = 1 @@ -62,50 +63,70 @@ join stock_out_order b on a.out_order_number = b.out_order_number and b.del_flag = 1 - - select - MAX(b.ORDER_TYPE_NAME) AS orderTypeName, - b.out_order_number AS outOrderNumber, - MAX(a.in_order_number) AS inOrderNumber, - MAX(b.customer_code) AS customerCode, - MAX(IFNULL(b."TO", b.contact_person)) AS receiver, a.material_code AS materialCode, MAX(a.material_name) AS materialName, - MAX(b.line_code) AS lineCode, - MAX(b.line_name) AS lineName, IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS grossWeightTon, - IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, - MAX(IFNULL(b.OUTBOUND_DATE, IFNULL(b.COMPLETE_TIME, b.create_time))) AS outboundDate + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume - GROUP BY b.out_order_number, a.material_code - order by pieceCount desc, outboundDate desc, outOrderNumber desc + GROUP BY a.material_code + order by pieceCount desc, materialCode asc - - select - IFNULL(SUM(t.pieceCount), 0) AS totalPieceCount, - ROUND(IFNULL(SUM(t.grossWeightKG), 0) / 1000, 3) AS totalGrossWeightTon, - IFNULL(SUM(t.totalVolume), 0) AS totalVolume, - COUNT(DISTINCT t.outOrderNumber) AS totalOrderCount - from ( - select - b.out_order_number AS outOrderNumber, - IFNULL(SUM(a.CHECK_QUANTITY), 0) AS pieceCount, - IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) AS grossWeightKG, - IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume - - - - - GROUP BY b.out_order_number, a.material_code - ) t + IFNULL(SUM(a.CHECK_QUANTITY), 0) AS totalPieceCount, + ROUND(IFNULL(SUM(a.TOTAL_GROSS_WEIGHT), 0) / 1000, 3) AS totalGrossWeightTon, + IFNULL(SUM(a.TOTAL_VOLUME), 0) AS totalVolume, + COUNT(DISTINCT a.out_order_number) AS totalOrderCount + + + + + + + + + + + From 34496de969e4a12a2ce1356b44fc3a46ae5f4426 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 16:04:04 +0800 Subject: [PATCH 079/101] =?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_oms/src/main/resources/bootstrap.yml | 8 ++++---- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 9 files changed, 15 insertions(+), 15 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 e18484e8d..0d65c89a1 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129: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 e9418197a..8a7006304 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4: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 de19e469b..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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 26a92624c..7fbd7dd9b 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.3: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 12571141a..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.4: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 6238639f6..9fd21ae67 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.30: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 ca93d3312..376500b1c 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.30: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_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..88471e390 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 52ade270d..39eb710cb 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.30: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: + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From fee891dad00056186ad3d5265f72fb6abd73afbf Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 17:44:16 +0800 Subject: [PATCH 080/101] =?UTF-8?q?fix(oms):=20=E4=B8=8B=E5=8F=91=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E5=8D=95=E5=A2=9E=E5=8A=A0=E5=B9=82=E7=AD=89=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=EF=BC=8C=E5=B7=B2=E5=AD=98=E5=9C=A8=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=8D=95=E6=97=B6=E7=A6=81=E6=AD=A2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:单据下发过并取消后重新下发(或重复点下发),issueOrder 会再生成新执行单并原样复制业务明细uniqueId插入,撞执行明细表唯一约束(如CONS134279709)导致下发失败。 修复:issueOrder 生成执行单前先查同业务单号下是否已存在有效执行单(del_flag=1),存在则提示「已下发,请勿重复下发;如需重新下发请先取消下发」。 配套DB变更(单独由DBA执行):执行明细表唯一键CONS134279709改为函数唯一索引,仅对DEL_FLAG=1的行约束UNIQUE_ID唯一,软删行不再占用唯一键。 --- .../service/ReservationStockOutOrderDomainService.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 bde5e11a3..a90e17cdb 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 @@ -514,6 +514,13 @@ public class ReservationStockOutOrderDomainService { for (Long inOrderId : inOrderIds) { ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId); String inOrderNumber = byId.getOutOrderNumber(); + // 幂等拦截:已存在有效执行单时禁止重复下发(重复下发会生成新执行单并原样复制明细uniqueId,撞执行明细表唯一约束) + long activeExecutionCount = executionStockOutOrderService.count(new QueryWrapper().lambda() + .eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, inOrderNumber) + .eq(ExecutionStockOutOrder::getDelFlag, 1)); + if (activeExecutionCount > 0) { + throw new ServiceException("出库单[" + inOrderNumber + "]已下发,请勿重复下发;如需重新下发请先取消下发"); + } List executionInOrderNumbers = new ArrayList<>(); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber)); From 0eb47793a8c78d087d34a8665f3fa1fb9ca8b249 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 18:00:52 +0800 Subject: [PATCH 081/101] =?UTF-8?q?fix(=E5=BA=93=E5=AD=98):=20OMS/WMS?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E6=9F=A5=E8=AF=A2=E5=85=A5=E5=BA=93=E6=97=B6?= =?UTF-8?q?=E9=97=B4/=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E5=8F=AA?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=B9=B4=E6=9C=88=E6=97=A5=EF=BC=8C=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E6=97=B6=E5=88=86=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 入库时间(createTime)/更新时间(updateTime)继承自全系统基类 BaseVOEntity,默认序列化带时分秒;库存查询导出复用 /list 接口,前端取 JSON 值直接进 Excel,导出后无法在 Excel 里修改格式 - 两个库存 PO 覆盖 getCreateTime/getUpdateTime 并收窄 @JsonFormat 为 yyyy-MM-dd,仅影响 OMS/WMS 库存查询的显示与导出,不改动 BaseVOEntity 全局行为 - 页面列表/详情回显同步变为纯年月日;排序仍按原始时间值,逻辑不变 --- .../po/ReservationMaterialInventoryPO.java | 15 +++++++++++++++ .../repository/po/MaterialInventoryPO.java | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java index 364e0bb55..175f9f3dc 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationMaterialInventory/repository/po/ReservationMaterialInventoryPO.java @@ -232,4 +232,19 @@ public class ReservationMaterialInventoryPO extends MaterialBasePO { @ApiModelProperty("LOT编号") @Excel(name = "LOT编号") private String lotNumber; + + // 入库时间(createTime)/更新时间(updateTime)继承自 BaseVOEntity,默认带时分秒; + // 库存查询导出复用 /list 接口,前端取 JSON 值直接进 Excel,这里覆盖 getter 只保留年月日。 + // 不改 BaseVOEntity(全系统基类,其他模块时间列仍需时分秒),仅收窄本 PO 的序列化格式(与 WMS 库存查询一致) + @Override + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + public Date getCreateTime() { + return super.getCreateTime(); + } + + @Override + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + public Date getUpdateTime() { + return super.getUpdateTime(); + } } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/po/MaterialInventoryPO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/po/MaterialInventoryPO.java index f785b7190..6a1bc7539 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/po/MaterialInventoryPO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/po/MaterialInventoryPO.java @@ -240,4 +240,19 @@ public class MaterialInventoryPO extends MaterialBasePO { @ApiModelProperty("规格型号") @Excel(name = "规格型号") private String specificationModel; + + // 入库时间(createTime)/更新时间(updateTime)继承自 BaseVOEntity,默认带时分秒; + // 库存查询导出复用 /list 接口,前端取 JSON 值直接进 Excel,这里覆盖 getter 只保留年月日。 + // 不改 BaseVOEntity(全系统基类,其他模块时间列仍需时分秒),仅收窄本 PO 的序列化格式(与 OMS 库存查询一致) + @Override + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + public Date getCreateTime() { + return super.getCreateTime(); + } + + @Override + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + public Date getUpdateTime() { + return super.getUpdateTime(); + } } \ No newline at end of file From bf3f0a2bfe822acf777cd1056986ec1e7395c481 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 18:25:37 +0800 Subject: [PATCH 082/101] =?UTF-8?q?=E5=8F=91=2030?= 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_oms/src/main/resources/bootstrap.yml | 8 ++++---- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 9 files changed, 15 insertions(+), 15 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 0d65c89a1..e18484e8d 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",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 8a7006304..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4: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 ba9a45148..de19e469b 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.33.0.129:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,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 7fbd7dd9b..26a92624c 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, url = "http://10.102.192.3: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 beba5b1af..12571141a 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.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.4: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 9fd21ae67..6238639f6 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.33.0.129:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.30: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 376500b1c..ca93d3312 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.33.0.129:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 88471e390..ee058f0f6 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 +# server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 39eb710cb..ecb312261 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.30:6848 + server-addr: 10.102.192.30: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: # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From a549ac1507d33ff44e489b482e8b7a3746b41851 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 18:32:25 +0800 Subject: [PATCH 083/101] =?UTF-8?q?=E5=8F=91=2031?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 4 ++-- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 9 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 e18484e8d..8cc8bfd57 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 de19e469b..d976fcc98 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",url = "http://10.102.192.30:8014",value = ServiceNameConstants.WLHY_SERVICE,configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 6238639f6..509644885 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.30:8012", configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index ee058f0f6..542b6bce7 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -19,14 +19,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index ecb312261..52ade270d 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129: # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 7d3c229b9a5920a1d13982963b0a3797d9bc0ba8 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 4 Sep 2026 10:47:29 +0800 Subject: [PATCH 084/101] =?UTF-8?q?feat(oms):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=87=BA=E4=BB=93=E5=A7=94=E6=89=98=E5=8D=95=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91/=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8/=E4=B8=8B=E5=8F=91WMS/=E5=AE=8C=E6=88=90=E5=85=A5?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 订单状态五态:1待审核(新增默认,驳回单编辑后自动回此态) 2已审核(下发后保持,用下发状态区分) 3已驳回 4进行中(预留) 5已入库 - 下发走WMS出库通知单链路(stockOutOrInInsert),返回强校验防吞错;完成入库限已审核+已下发 - 订单类型未传默认普通出库;明细新增单价unitPrice;列表支持invoiceNo/settlementCurrency查询,时间参数只传年月日 - 必填:客户/业务员/仓库/商品名称/申报数量;编辑删除限待审核/已驳回且未下发 - 附达梦建表脚本oms_out_entrust_order(主表+明细表,最终版) --- .../OutEntrustOrderApplicationService.java | 390 ++++++++++++++++++ .../oms/constant/OutEntrustOrderConstant.java | 37 ++ .../entity/OutEntrustOrder.java | 204 +++++++++ .../entity/OutEntrustOrderDetail.java | 98 +++++ .../facade/IOutEntrustOrderDetailService.java | 42 ++ .../facade/IOutEntrustOrderService.java | 62 +++ .../mapper/OutEntrustOrderDetailMapper.java | 14 + .../mapper/OutEntrustOrderMapper.java | 28 ++ .../OutEntrustOrderDetailImpl.java | 97 +++++ .../persistence/OutEntrustOrderImpl.java | 159 +++++++ .../po/OutEntrustOrderDetailPO.java | 100 +++++ .../repository/po/OutEntrustOrderPO.java | 212 ++++++++++ .../repository/todo/OutEntrustOrderDO.java | 216 ++++++++++ .../todo/OutEntrustOrderDetailDO.java | 90 ++++ .../service/OutEntrustOrderDomainService.java | 177 ++++++++ .../OutEntrustOrderAssembler.java | 84 ++++ .../outEntrustOrder/OutEntrustOrderDTO.java | 198 +++++++++ .../OutEntrustOrderDetailDTO.java | 93 +++++ .../outEntrustOrder/OutEntrustOrderApi.java | 111 +++++ .../outEntrustOrder/OutEntrustOrderMapper.xml | 181 ++++++++ ...te_table_dm_szwl_oms_out_entrust_order.sql | 230 +++++++++++ 21 files changed, 2823 insertions(+) create mode 100644 mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/constant/OutEntrustOrderConstant.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrder.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrderDetail.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderDetailService.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderService.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderDetailMapper.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderMapper.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderDetailImpl.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderImpl.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderDetailPO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderPO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDetailDO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/service/OutEntrustOrderDomainService.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/interfaces/assembler/outEntrustOrder/OutEntrustOrderAssembler.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDTO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDetailDTO.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outEntrustOrder/OutEntrustOrderApi.java create mode 100644 mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml create mode 100644 sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql 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 new file mode 100644 index 000000000..6dd2abf2e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/application/service/outEntrustOrder/OutEntrustOrderApplicationService.java @@ -0,0 +1,390 @@ +package com.mhd.oms.application.service.outEntrustOrder; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.constant.OutEntrustOrderConstant; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO; +import com.mhd.oms.domain.outEntrustOrder.service.OutEntrustOrderDomainService; +import com.mhd.system.api.SystemServiceFeign; +import com.mhd.system.api.WmsServiceFeign; +import com.mhd.system.api.domain.NoticeMaterialDetailDTO; +import com.mhd.system.api.domain.NoticeOrderDTO; +import com.mhd.system.api.domain.WarehouseFeignPO; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 出仓委托单ApplicationService + * + * @author rcx + * @date 2026-09-02 + */ +@Service +@Slf4j +public class OutEntrustOrderApplicationService { + + @Resource + private OutEntrustOrderDomainService outEntrustOrderDomainService; + + @Resource + private SystemServiceFeign systemServiceFeign; + + @Resource + private WmsServiceFeign wmsServiceFeign; + + /** + * 分页查询出仓委托单列表(不做默认状态过滤,显示全部数据) + */ + public List queryList(OutEntrustOrderDO outEntrustOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1) { + outEntrustOrderDO.setTopOrganizationId(topOrganizationId); + } + } + //结束时间只传年月日(解析为当天00:00:00),归一为当天最后一秒,保证查询包含结束日当天 + if (outEntrustOrderDO.getEndCreateTime() != null) { + outEntrustOrderDO.setEndCreateTime(DateUtil.endOfDay(outEntrustOrderDO.getEndCreateTime())); + } + List orderList = outEntrustOrderDomainService.queryList(outEntrustOrderDO); + fillInvoiceNo(orderList); + return orderList; + } + + /** + * 列表回填发票号(明细发票号去重逗号拼接,供列表列展示) + */ + private void fillInvoiceNo(List orderList) { + if (orderList == null || orderList.isEmpty()) { + return; + } + List entrustNumbers = orderList.stream() + .map(OutEntrustOrderPO::getEntrustNumber).collect(Collectors.toList()); + Map invoiceNoMap = outEntrustOrderDomainService.getDetailByEntrustNumbers(entrustNumbers).stream() + .filter(detail -> detail.getInvoiceNo() != null && !detail.getInvoiceNo().trim().isEmpty()) + .collect(Collectors.toMap(OutEntrustOrderDetailPO::getEntrustNumber, detail -> detail.getInvoiceNo().trim(), + (existing, replacement) -> existing.contains(replacement) ? existing + : existing + "," + replacement)); + for (OutEntrustOrderPO order : orderList) { + order.setInvoiceNo(invoiceNoMap.get(order.getEntrustNumber())); + } + } + + /** + * 新增出仓委托单(必填:客户、业务员、仓库、商品名称、申报数量) + */ + public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) { + //必填项校验 + validateRequired(outEntrustOrderDO); + //订单类型未维护时默认普通出库(落库即生效,列表可见) + setDefaultOrderType(outEntrustOrderDO); + //仓库信息回填(校验仓库存在) + setWarehouseInfo(outEntrustOrderDO); + //组织信息填充 + setOrganizationInfo(outEntrustOrderDO); + //汇总申报总数量 + outEntrustOrderDO.setDeclareTotalQuantity(sumDeclareQuantity(outEntrustOrderDO.getMaterialDetailList())); + return outEntrustOrderDomainService.insert(outEntrustOrderDO); + } + + /** + * 修改出仓委托单(仅待审核/已驳回且未下发可修改;已驳回单编辑后状态重置为待审核) + */ + public Boolean update(OutEntrustOrderDO outEntrustOrderDO) { + //必填项校验 + validateRequired(outEntrustOrderDO); + //状态类字段由审核/下发/完成入库接口推进,编辑不允许改动(置null后updateById跳过这些列,防前端误传/绕过审核改状态) + outEntrustOrderDO.setOrderStatus(null); + outEntrustOrderDO.setIssueStatus(null); + outEntrustOrderDO.setAuditRemark(null); + //订单类型未维护时默认普通出库(落库即生效,列表可见) + setDefaultOrderType(outEntrustOrderDO); + //仓库信息回填(校验仓库存在) + setWarehouseInfo(outEntrustOrderDO); + //明细全量替换时明细创建信息随主单更新人 + if (outEntrustOrderDO.getCreateBy() == null) { + outEntrustOrderDO.setCreateBy(outEntrustOrderDO.getUpdateBy()); + outEntrustOrderDO.setCreateByName(outEntrustOrderDO.getUpdateByName()); + outEntrustOrderDO.setCreateTime(outEntrustOrderDO.getUpdateTime()); + } + //汇总申报总数量 + outEntrustOrderDO.setDeclareTotalQuantity(sumDeclareQuantity(outEntrustOrderDO.getMaterialDetailList())); + return outEntrustOrderDomainService.update(outEntrustOrderDO); + } + + /** + * 订单类型未维护时默认普通出库(与下发兜底保持一致,保存即落库) + */ + private void setDefaultOrderType(OutEntrustOrderDO outEntrustOrderDO) { + if (outEntrustOrderDO.getOrderTypeCode() == null || outEntrustOrderDO.getOrderTypeCode().trim().isEmpty()) { + outEntrustOrderDO.setOrderTypeCode(OutEntrustOrderConstant.WMS_ORDER_TYPE_CODE); + outEntrustOrderDO.setOrderTypeName(OutEntrustOrderConstant.WMS_ORDER_TYPE_NAME); + } + } + + /** + * 获取出仓委托单详情(含明细) + */ + public OutEntrustOrderPO getInfo(Long id) { + return outEntrustOrderDomainService.getInfo(id); + } + + /** + * 批量删除出仓委托单(仅待审核/已驳回且未下发可删除) + */ + public Boolean delete(Long[] ids) { + if (ids == null || ids.length == 0) { + throw new ServiceException("传递的ID值缺失或为空"); + } + return outEntrustOrderDomainService.delete(ids); + } + + /** + * 批量审核:待审核/已驳回 → 已审核(2)或已驳回(3) + * + * @param dto.idList 委托单ID集合 + * @param dto.orderStatus 审核结果:2-审核通过 3-驳回 + * @param dto.auditRemark 审核备注(驳回原因,选填) + */ + public Boolean audit(OutEntrustOrderDO outEntrustOrderDO) { + List ids = outEntrustOrderDO.getIdList(); + if (ids == null || ids.isEmpty()) { + throw new ServiceException("传递的ID值缺失或为空"); + } + Integer targetStatus = outEntrustOrderDO.getOrderStatus(); + if (!OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(targetStatus) + && !OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(targetStatus)) { + throw new ServiceException("审核结果参数错误,只能为已审核或已驳回"); + } + //只有待审核/已驳回的委托单才可以审核 + List orderList = outEntrustOrderDomainService.queryByIds(ids); + List unableAuditIds = orderList.stream() + .filter(order -> !OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(order.getOrderStatus()) + && !OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(order.getOrderStatus())) + .map(OutEntrustOrderPO::getId).collect(Collectors.toList()); + if (!unableAuditIds.isEmpty()) { + throw new ServiceException("选中数据中存在进行中/已审核/已入库的委托单,只有待审核或已驳回的委托单方可审核"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long auditBy = loginUser == null ? null : loginUser.getUserid(); + String auditByName = loginUser == null ? null : loginUser.getUsername(); + return outEntrustOrderDomainService.audit(ids, targetStatus, auditBy, auditByName, outEntrustOrderDO.getAuditRemark()); + } + + /** + * 批量下发:已审核的委托单下发到WMS(生成出库通知单),下发后订单状态保持已审核,仅置下发状态为已下发 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean issueOrder(List ids) { + if (ids == null || ids.isEmpty()) { + throw new ServiceException("传递的ID值缺失或为空"); + } + //只有已审核且未下发的委托单才可以下发 + List orderList = outEntrustOrderDomainService.queryByIds(ids); + for (OutEntrustOrderPO order : orderList) { + if (!OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(order.getOrderStatus())) { + throw new ServiceException(String.format("委托单[%s]未审核,已审核的委托单方可下发", order.getEntrustNumber())); + } + if (!OutEntrustOrderConstant.ISSUE_STATUS_1.equals(order.getIssueStatus())) { + throw new ServiceException(String.format("委托单[%s]已下发,不允许重复下发", order.getEntrustNumber())); + } + } + + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long issueBy = loginUser == null ? null : loginUser.getUserid(); + String issueByName = loginUser == null ? null : loginUser.getUsername(); + for (OutEntrustOrderPO order : orderList) { + //组装出库通知单 + NoticeOrderDTO noticeOrderDTO = createNoticeOrderInfo(order); + //推送给WMS + AjaxResult ajaxResult = wmsServiceFeign.stockOutOrInInsert(noticeOrderDTO); + //WMS返回成功才允许置为已下发,避免下发失败被静默吞掉 + if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) { + String errorMsg = ajaxResult == null ? "WMS服务调用失败" : String.valueOf(ajaxResult.get("msg")); + log.error("出仓委托单[{}]下发WMS失败:{}", order.getEntrustNumber(), errorMsg); + throw new ServiceException(String.format("委托单[%s]下发WMS失败:%s", order.getEntrustNumber(), errorMsg)); + } + log.info("出仓委托单[{}]下发WMS成功", order.getEntrustNumber()); + } + return outEntrustOrderDomainService.issue(ids, issueBy, issueByName); + } + + /** + * 批量完成:已审核(已下发) → 已入库(OMS人工推进,WMS出库完成后由人工确认) + */ + public Boolean finish(List ids) { + if (ids == null || ids.isEmpty()) { + throw new ServiceException("传递的ID值缺失或为空"); + } + //只有已审核且已下发的委托单才可以置为已入库(兼容存量:旧版本曾自动置为进行中的也允许) + List orderList = outEntrustOrderDomainService.queryByIds(ids); + List unableFinishIds = orderList.stream() + .filter(order -> !(OutEntrustOrderConstant.ORDER_STATUS_IN_PROGRESS.equals(order.getOrderStatus()) + || (OutEntrustOrderConstant.ORDER_STATUS_AUDITED.equals(order.getOrderStatus()) + && OutEntrustOrderConstant.ISSUE_STATUS_2.equals(order.getIssueStatus())))) + .map(OutEntrustOrderPO::getId).collect(Collectors.toList()); + if (!unableFinishIds.isEmpty()) { + throw new ServiceException("选中数据中存在待审核/已驳回或未下发的委托单,只有已审核且已下发的委托单方可置为已入库"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long updateBy = loginUser == null ? null : loginUser.getUserid(); + String updateByName = loginUser == null ? null : loginUser.getUsername(); + return outEntrustOrderDomainService.finish(ids, updateBy, updateByName); + } + + /** + * 组装出库通知单信息(客户=货主) + */ + private NoticeOrderDTO createNoticeOrderInfo(OutEntrustOrderPO order) { + NoticeOrderDTO noticeOrderDTO = new NoticeOrderDTO(); + noticeOrderDTO.setType(OutEntrustOrderConstant.NOTICE_TYPE_OUT); + //客户订单号记录委托单号,便于WMS侧追溯 + noticeOrderDTO.setCustomerOrderNumber(order.getEntrustNumber()); + noticeOrderDTO.setWarehouseId(order.getWarehouseId()); + //出仓委托单的客户即WMS货主,货主为物料档案/库存作业的归属 + noticeOrderDTO.setShipperId(order.getShipperId()); + noticeOrderDTO.setShipperName(order.getShipperName()); + noticeOrderDTO.setCustomerId(order.getShipperId()); + noticeOrderDTO.setCustomerName(order.getShipperName()); + //订单类型:未维护时默认普通出库(WMS侧按出库单据类型字典翻译) + noticeOrderDTO.setOrderTypeCode(order.getOrderTypeCode() == null + ? OutEntrustOrderConstant.WMS_ORDER_TYPE_CODE : order.getOrderTypeCode()); + noticeOrderDTO.setOrderTypeName(order.getOrderTypeName()); + noticeOrderDTO.setExpectTime(order.getExpectTime() == null ? new Date() : order.getExpectTime()); + noticeOrderDTO.setNullify(2); + //出库通知单仅有限几个业务字段:业务员及委托/报关关键信息拼入备注留存(超长截断) + noticeOrderDTO.setRemark(buildNoticeRemark(order)); + //物料明细:申报数量作为通知单计划数量 + List detailList = outEntrustOrderDomainService.getDetailByEntrustNumber(order.getEntrustNumber()); + if (detailList == null || detailList.isEmpty()) { + throw new ServiceException(String.format("委托单[%s]缺少商品明细,无法下发", order.getEntrustNumber())); + } + List materialDetailList = new ArrayList<>(); + for (OutEntrustOrderDetailPO detail : detailList) { + NoticeMaterialDetailDTO materialDetail = new NoticeMaterialDetailDTO(); + materialDetail.setMaterialBaseInfoId(detail.getMaterialBaseInfoId()); + materialDetail.setMaterialCode(detail.getMaterialCode()); + //物料名称:档案名优先,无档案时用委托单品名 + materialDetail.setMaterialName(detail.getMaterialName() != null && !detail.getMaterialName().trim().isEmpty() + ? detail.getMaterialName() : detail.getCommodityName()); + materialDetail.setBarCode(detail.getBarCode()); + materialDetail.setQuantity(detail.getDeclareQuantity()); + materialDetailList.add(materialDetail); + } + noticeOrderDTO.setMaterialDetailList(materialDetailList); + return noticeOrderDTO; + } + + /** + * 出库通知单备注:拼入业务员及委托/报关关键信息(通知单无对应字段) + */ + private String buildNoticeRemark(OutEntrustOrderPO order) { + StringBuilder remark = new StringBuilder(); + if (order.getRemark() != null && !order.getRemark().trim().isEmpty()) { + remark.append(order.getRemark().trim()); + } + appendIfPresent(remark, "业务员", order.getSalesmanName()); + appendIfPresent(remark, "委托编号", order.getEntrustNo()); + appendIfPresent(remark, "柜号", order.getContainerNo()); + appendIfPresent(remark, "承运商", order.getCarrierName() != null ? order.getCarrierName() : order.getCarrier()); + appendIfPresent(remark, "To", order.getToReceiver()); + appendIfPresent(remark, "联系人", order.getContactPerson()); + appendIfPresent(remark, "电话", order.getTel()); + appendIfPresent(remark, "申报地关区", order.getDeclareCustoms()); + appendIfPresent(remark, "进出境关别", order.getEntryExitCustoms()); + //备注列长度保护 + return remark.length() > 480 ? remark.substring(0, 480) : remark.toString(); + } + + private void appendIfPresent(StringBuilder remark, String label, String value) { + if (value != null && !value.trim().isEmpty()) { + remark.append(remark.length() > 0 ? ";" : "").append(label).append(":").append(value.trim()); + } + } + + /** + * 必填项校验:客户、业务员、仓库、商品名称、申报数量,其余字段不强制 + */ + private void validateRequired(OutEntrustOrderDO outEntrustOrderDO) { + if (outEntrustOrderDO.getShipperId() == null) { + throw new ServiceException("客户不能为空"); + } + if (outEntrustOrderDO.getSalesmanId() == null || outEntrustOrderDO.getSalesmanId().trim().isEmpty()) { + throw new ServiceException("业务员不能为空"); + } + if (outEntrustOrderDO.getWarehouseId() == null) { + throw new ServiceException("仓库不能为空"); + } + if (outEntrustOrderDO.getMaterialDetailList() == null || outEntrustOrderDO.getMaterialDetailList().isEmpty()) { + throw new ServiceException("商品明细不能为空"); + } + int index = 1; + for (OutEntrustOrderDetailDO detail : outEntrustOrderDO.getMaterialDetailList()) { + //商品名称:物料档案名/委托单品名至少其一 + boolean nameBlank = (detail.getMaterialName() == null || detail.getMaterialName().trim().isEmpty()) + && (detail.getCommodityName() == null || detail.getCommodityName().trim().isEmpty()); + if (nameBlank) { + throw new ServiceException(String.format("商品明细第%d行商品名称不能为空", index)); + } + if (detail.getDeclareQuantity() == null || detail.getDeclareQuantity().compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException(String.format("商品明细第%d行申报数量必须大于0", index)); + } + index++; + } + } + + /** + * 仓库信息校验并回填编码/名称 + */ + 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); + if (warehouseFeignPO == null || Objects.isNull(warehouseFeignPO.getWarehouseId())) { + throw new ServiceException("仓库不存在,请重新选择"); + } + outEntrustOrderDO.setWarehouseCode(warehouseFeignPO.getWarehouseCode()); + outEntrustOrderDO.setWarehouseName(warehouseFeignPO.getWarehouseName()); + } + + /** + * 组织信息填充 + */ + private void setOrganizationInfo(OutEntrustOrderDO outEntrustOrderDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + outEntrustOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + outEntrustOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + outEntrustOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } + } + + /** + * 汇总明细申报数量 + */ + private BigDecimal sumDeclareQuantity(List detailList) { + return detailList.stream() + .map(OutEntrustOrderDetailDO::getDeclareQuantity) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/constant/OutEntrustOrderConstant.java b/mhd_oms/src/main/java/com/mhd/oms/constant/OutEntrustOrderConstant.java new file mode 100644 index 000000000..341990c34 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/constant/OutEntrustOrderConstant.java @@ -0,0 +1,37 @@ +package com.mhd.oms.constant; + +/** + * 出仓委托单常量 + * + * @author rcx + * @date 2026-09-02 + */ +public interface OutEntrustOrderConstant { + + /** 出仓委托单号前缀 */ + String OUT_ENTRUST_NO_PREFIX = "CKWT"; + + /** 订单状态:1-待审核(新增默认值;已驳回单重新编辑后也回到此状态) */ + Integer ORDER_STATUS_PENDING_AUDIT = 1; + /** 订单状态:2-已审核 */ + Integer ORDER_STATUS_AUDITED = 2; + /** 订单状态:3-已驳回 */ + Integer ORDER_STATUS_REJECTED = 3; + /** 订单状态:4-进行中(已下发WMS) */ + Integer ORDER_STATUS_IN_PROGRESS = 4; + /** 订单状态:5-已入库 */ + Integer ORDER_STATUS_STORED = 5; + + /** 下发状态:1-未下发 */ + Integer ISSUE_STATUS_1 = 1; + /** 下发状态:2-已下发 */ + Integer ISSUE_STATUS_2 = 2; + + /** 下发WMS出库通知单-订单类型编码 */ + String WMS_ORDER_TYPE_CODE = "pu_tong_chu_ku"; + /** 下发WMS出库通知单-订单类型名称 */ + String WMS_ORDER_TYPE_NAME = "普通出库"; + + /** 出库通知单类型(NoticeOrderDTO.type:1-入库通知单 2-出库通知单) */ + Integer NOTICE_TYPE_OUT = 2; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrder.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrder.java new file mode 100644 index 000000000..c8aae9112 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrder.java @@ -0,0 +1,204 @@ +package com.mhd.oms.domain.outEntrustOrder.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mhd.common.core.web.domain.BaseVOEntity; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出仓委托单对象 oms_out_entrust_order + * 表单字段对齐WMS出库管理新增(报关/委托信息块) + * + * @author rcx + * @date 2026-09-02 + */ + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("oms_out_entrust_order") +public class OutEntrustOrder extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("委托单号") + private String entrustNumber; + + @ApiModelProperty("出库仓库ID") + private Long warehouseId; + @ApiModelProperty("仓库编码") + private String warehouseCode; + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("客户ID(货主)") + private Long shipperId; + @ApiModelProperty("客户编码") + private String shipperCode; + @ApiModelProperty("客户名称") + private String shipperName; + + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("订单类型编码(字典outDocumentType)") + private String orderTypeCode; + @ApiModelProperty("订单类型名称") + private String orderTypeName; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + + @ApiModelProperty("优先级别编码") + private String priorityLevelCode; + @ApiModelProperty("优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("预计出货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("出仓日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date outboundDate; + + @ApiModelProperty("orderDate") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("完成时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date completeTime; + + @ApiModelProperty("To(收货人)") + @TableField("to_receiver") + private String toReceiver; + + @ApiModelProperty("联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号(客户委托单号)") + private String entrustNo; + + @ApiModelProperty("Tel电话") + private String tel; + + @ApiModelProperty("Fax传真") + private String fax; + + @ApiModelProperty("司机签名") + private String driverSign; + + @ApiModelProperty("承运商编码") + private String carrier; + @ApiModelProperty("承运商名称") + private String carrierName; + + @ApiModelProperty("柜号") + private String containerNo; + @ApiModelProperty("柜") + private String containerNoName; + + @ApiModelProperty("运输方式编码") + private String transportModeCode; + @ApiModelProperty("运输方式名称") + private String transportModeName; + + @ApiModelProperty("监管方式编码") + private String supervisionModeCode; + @ApiModelProperty("监管方式名称") + private String supervisionModeName; + + @ApiModelProperty("申报地关区") + private String declareCustoms; + + @ApiModelProperty("进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("海关是否查验货物") + private String customsInspectionFlag; + + @ApiModelProperty("是否需要报关(预留,页面隐藏)") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输(预留,页面隐藏)") + private String needTransportFlag; + + @ApiModelProperty("生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + private String deliveryAddr; + + @ApiModelProperty("附件url") + private String annexUrl; + + @ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库") + private Integer orderStatus; + + @ApiModelProperty("审核人ID") + private Long auditBy; + @ApiModelProperty("审核人姓名") + private String auditByName; + @ApiModelProperty("审核时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date auditTime; + @ApiModelProperty("审核备注(驳回原因)") + private String auditRemark; + + @ApiModelProperty("下发状态:1-未下发 2-已下发") + private Integer issueStatus; + @ApiModelProperty("下发人ID") + private Long issueBy; + @ApiModelProperty("下发人姓名") + private String issueByName; + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("申报总数量(明细申报数量之和)") + private BigDecimal declareTotalQuantity; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("组织ID") + private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrderDetail.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrderDetail.java new file mode 100644 index 000000000..3231fdc7e --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/entity/OutEntrustOrderDetail.java @@ -0,0 +1,98 @@ +package com.mhd.oms.domain.outEntrustOrder.entity; + +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 lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 出仓委托单明细对象 oms_out_entrust_order_detail + * 明细列对齐WMS出库管理新增(出仓委托单明细列) + * + * @author rcx + * @date 2026-09-02 + */ + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("oms_out_entrust_order_detail") +public class OutEntrustOrderDetail extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("委托单号(关联主表)") + private String entrustNumber; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + @ApiModelProperty("商品编码") + private String materialCode; + @ApiModelProperty("商品名称(物料档案名)") + private String materialName; + @ApiModelProperty("商品条形码") + private String barCode; + + @ApiModelProperty("商品名称(委托单品名)") + private String commodityName; + @ApiModelProperty("商品编号") + private String commodityNo; + @ApiModelProperty("料号") + private String materialNo; + @ApiModelProperty("规格型号") + private String specificationModel; + @ApiModelProperty("SKU码") + private String skucode; + @ApiModelProperty("发票号") + private String invoiceNo; + + @ApiModelProperty("申报单位") + private String declareUnit; + @ApiModelProperty("申报数量") + private BigDecimal declareQuantity; + @ApiModelProperty("单价") + private BigDecimal unitPrice; + + @ApiModelProperty("单位") + private String unit; + @ApiModelProperty("升") + private String liter; + @ApiModelProperty("尺寸") + private String size; + @ApiModelProperty("箱数") + private BigDecimal caseCount; + @ApiModelProperty("件数") + private BigDecimal pieceCount; + @ApiModelProperty("出库数量") + private BigDecimal outboundQuantity; + @ApiModelProperty("总净重(千克)") + private BigDecimal totalNetWeight; + @ApiModelProperty("总毛重(千克)") + private BigDecimal totalGrossWeight; + @ApiModelProperty("总体积(立方米)") + private BigDecimal totalVolume; + @ApiModelProperty("总面积") + private BigDecimal totalArea; + @ApiModelProperty("总金额") + private BigDecimal totalAmount; + @ApiModelProperty("币制") + private String currency; + @ApiModelProperty("批次") + private String batchRefNo; + @ApiModelProperty("单据参考号") + private String sheetRefNo; + @ApiModelProperty("原产国") + private String countryOfOrigin; + @ApiModelProperty("箱/托盘号") + private String boxPalletNo; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderDetailService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderDetailService.java new file mode 100644 index 000000000..52c31a897 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderDetailService.java @@ -0,0 +1,42 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO; + +import java.util.List; + +/** + * 出仓委托单明细Service接口 + * + * @author rcx + * @date 2026-09-02 + */ +public interface IOutEntrustOrderDetailService extends IService { + + /** + * 根据委托单号查询有效明细 + */ + List queryByEntrustNumber(String entrustNumber); + + /** + * 根据委托单号集合查询有效明细 + */ + List queryByEntrustNumbers(List entrustNumbers); + + /** + * 批量保存明细 + */ + Boolean batchInsert(String entrustNumber, List detailDOList); + + /** + * 根据委托单号逻辑删除明细 + */ + Boolean deleteByEntrustNumber(String entrustNumber); + + /** + * 根据委托单号集合逻辑删除明细 + */ + Boolean deleteByEntrustNumbers(List entrustNumbers); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderService.java new file mode 100644 index 000000000..86e3588b6 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/facade/IOutEntrustOrderService.java @@ -0,0 +1,62 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; + +import java.util.List; + +/** + * 出仓委托单Service接口 + * + * @author rcx + * @date 2026-09-02 + */ +public interface IOutEntrustOrderService extends IService { + + /** + * 分页查询出仓委托单列表 + */ + List queryList(OutEntrustOrderDO outEntrustOrderDO); + + /** + * 新增出仓委托单 + */ + Boolean insert(OutEntrustOrderDO outEntrustOrderDO); + + /** + * 修改出仓委托单 + */ + Boolean update(OutEntrustOrderDO outEntrustOrderDO); + + /** + * 批量删除出仓委托单 + */ + Boolean delete(Long[] ids); + + /** + * 获取出仓委托单详情(含明细) + */ + OutEntrustOrderPO getInfo(Long id); + + /** + * 根据编号集合查询出仓委托单列表 + */ + List getInfoByIds(List ids); + + /** + * 审核:待审核/已驳回 → 已审核(2)或已驳回(3) + */ + Boolean audit(List ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark); + + /** + * 下发:置为已下发,订单状态置为进行中 + */ + Boolean issue(List ids, Long issueBy, String issueByName); + + /** + * 完成:进行中 → 已入库 + */ + Boolean finish(List ids, Long updateBy, String updateByName); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderDetailMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderDetailMapper.java new file mode 100644 index 000000000..a5ec639aa --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderDetailMapper.java @@ -0,0 +1,14 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail; + +/** + * 出仓委托单明细Mapper接口 + * + * @author rcx + * @date 2026-09-02 + */ +public interface OutEntrustOrderDetailMapper extends BaseMapper { + +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderMapper.java new file mode 100644 index 000000000..fcf8d0e61 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/mapper/OutEntrustOrderMapper.java @@ -0,0 +1,28 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 出仓委托单Mapper接口 + * + * @author rcx + * @date 2026-09-02 + */ +public interface OutEntrustOrderMapper extends BaseMapper { + + /** + * 查询出仓委托单列表 + */ + List queryList(OutEntrustOrderDO outEntrustOrderDO); + + /** + * 根据编号集合查询出仓委托单列表 + */ + List getInfoByIds(@Param("idList") List idList); +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderDetailImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderDetailImpl.java new file mode 100644 index 000000000..d2654e956 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderDetailImpl.java @@ -0,0 +1,97 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.persistence; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrderDetail; +import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderDetailService; +import com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderDetailMapper; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 出仓委托单明细Service业务层处理 + * + * @author rcx + * @date 2026-09-02 + */ +@Service +public class OutEntrustOrderDetailImpl extends ServiceImpl implements IOutEntrustOrderDetailService { + + /** + * 根据委托单号查询有效明细 + */ + @Override + public List queryByEntrustNumber(String entrustNumber) { + List detailList = this.list(new LambdaQueryWrapper() + .eq(OutEntrustOrderDetail::getEntrustNumber, entrustNumber) + .eq(OutEntrustOrderDetail::getDelFlag, 1) + .orderByAsc(OutEntrustOrderDetail::getId)); + return detailList.stream().map(detail -> { + OutEntrustOrderDetailPO detailPO = new OutEntrustOrderDetailPO(); + BeanUtils.copyProperties(detail, detailPO); + return detailPO; + }).collect(Collectors.toList()); + } + + /** + * 根据委托单号集合查询有效明细 + */ + @Override + public List queryByEntrustNumbers(List entrustNumbers) { + if (entrustNumbers == null || entrustNumbers.isEmpty()) { + return new java.util.ArrayList<>(); + } + List detailList = this.list(new LambdaQueryWrapper() + .in(OutEntrustOrderDetail::getEntrustNumber, entrustNumbers) + .eq(OutEntrustOrderDetail::getDelFlag, 1) + .orderByAsc(OutEntrustOrderDetail::getId)); + return detailList.stream().map(detail -> { + OutEntrustOrderDetailPO detailPO = new OutEntrustOrderDetailPO(); + BeanUtils.copyProperties(detail, detailPO); + return detailPO; + }).collect(Collectors.toList()); + } + + /** + * 批量保存明细 + */ + @Override + public Boolean batchInsert(String entrustNumber, List detailDOList) { + List detailList = detailDOList.stream().map(detailDO -> { + OutEntrustOrderDetail detail = new OutEntrustOrderDetail(); + BeanUtils.copyProperties(detailDO, detail); + detail.setEntrustNumber(entrustNumber); + detail.setDelFlag(1); + return detail; + }).collect(Collectors.toList()); + return this.saveBatch(detailList); + } + + /** + * 根据委托单号逻辑删除明细 + */ + @Override + public Boolean deleteByEntrustNumber(String entrustNumber) { + return this.update(new LambdaUpdateWrapper() + .eq(OutEntrustOrderDetail::getEntrustNumber, entrustNumber) + .eq(OutEntrustOrderDetail::getDelFlag, 1) + .set(OutEntrustOrderDetail::getDelFlag, 2)); + } + + /** + * 根据委托单号集合逻辑删除明细 + */ + @Override + public Boolean deleteByEntrustNumbers(List entrustNumbers) { + return this.update(new LambdaUpdateWrapper() + .in(OutEntrustOrderDetail::getEntrustNumber, entrustNumbers) + .eq(OutEntrustOrderDetail::getDelFlag, 1) + .set(OutEntrustOrderDetail::getDelFlag, 2)); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderImpl.java new file mode 100644 index 000000000..c7ccd494c --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/persistence/OutEntrustOrderImpl.java @@ -0,0 +1,159 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.persistence; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.constant.OutEntrustOrderConstant; +import com.mhd.oms.domain.outEntrustOrder.entity.OutEntrustOrder; +import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderService; +import com.mhd.oms.domain.outEntrustOrder.repository.mapper.OutEntrustOrderMapper; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 出仓委托单Service业务层处理 + * + * @author rcx + * @date 2026-09-02 + */ +@Service +public class OutEntrustOrderImpl extends ServiceImpl implements IOutEntrustOrderService { + + /** + * 查询出仓委托单列表 + */ + @Override + public List queryList(OutEntrustOrderDO outEntrustOrderDO) { + return baseMapper.queryList(outEntrustOrderDO); + } + + /** + * 新增出仓委托单 + */ + @Override + public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) { + OutEntrustOrder outEntrustOrder = new OutEntrustOrder(); + BeanUtils.copyProperties(outEntrustOrderDO, outEntrustOrder); + return this.save(outEntrustOrder); + } + + /** + * 修改出仓委托单 + */ + @Override + public Boolean update(OutEntrustOrderDO outEntrustOrderDO) { + OutEntrustOrder outEntrustOrder = new OutEntrustOrder(); + BeanUtils.copyProperties(outEntrustOrderDO, outEntrustOrder); + return this.updateById(outEntrustOrder); + } + + /** + * 批量删除出仓委托单(仅待审核/已驳回且未下发可删除) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean delete(Long[] ids) { + List outEntrustOrders = this.listByIds(Arrays.asList(ids)); + //只有待审核/已驳回且未下发的委托单才可以删除 + List unableDeleteList = outEntrustOrders.stream() + .filter(order -> !(OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(order.getOrderStatus()) + || OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(order.getOrderStatus())) + || !OutEntrustOrderConstant.ISSUE_STATUS_1.equals(order.getIssueStatus())) + .collect(Collectors.toList()); + if (!unableDeleteList.isEmpty()) { + throw new ServiceException("已审核/进行中/已入库或已下发的委托单不允许删除"); + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + Date now = new Date(); + for (OutEntrustOrder outEntrustOrder : outEntrustOrders) { + outEntrustOrder.setDelFlag(2); + outEntrustOrder.setUpdateBy(loginUser == null ? null : loginUser.getUserid()); + outEntrustOrder.setUpdateByName(loginUser == null ? null : loginUser.getUsername()); + outEntrustOrder.setUpdateTime(now); + } + return this.updateBatchById(outEntrustOrders); + } + + /** + * 获取出仓委托单详情 + */ + @Override + public OutEntrustOrderPO getInfo(Long id) { + OutEntrustOrder outEntrustOrder = this.getOne(new LambdaQueryWrapper() + .eq(OutEntrustOrder::getId, id).eq(OutEntrustOrder::getDelFlag, 1)); + if (outEntrustOrder == null) { + throw new ServiceException("出仓委托单不存在"); + } + OutEntrustOrderPO outEntrustOrderPO = new OutEntrustOrderPO(); + BeanUtils.copyProperties(outEntrustOrder, outEntrustOrderPO); + return outEntrustOrderPO; + } + + /** + * 根据编号集合查询出仓委托单列表 + */ + @Override + public List getInfoByIds(List ids) { + return baseMapper.getInfoByIds(ids); + } + + /** + * 审核:待审核/已驳回 → 已审核(2)或已驳回(3) + */ + @Override + public Boolean audit(List ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark) { + return this.update(new LambdaUpdateWrapper() + .in(OutEntrustOrder::getId, ids) + .eq(OutEntrustOrder::getDelFlag, 1) + .set(OutEntrustOrder::getOrderStatus, targetStatus) + .set(OutEntrustOrder::getAuditBy, auditBy) + .set(OutEntrustOrder::getAuditByName, auditByName) + .set(OutEntrustOrder::getAuditTime, new Date()) + .set(OutEntrustOrder::getAuditRemark, auditRemark) + .set(OutEntrustOrder::getUpdateBy, auditBy) + .set(OutEntrustOrder::getUpdateByName, auditByName) + .set(OutEntrustOrder::getUpdateTime, new Date())); + } + + /** + * 下发:下发状态置为已下发(订单状态保持已审核) + */ + @Override + public Boolean issue(List ids, Long issueBy, String issueByName) { + return this.update(new LambdaUpdateWrapper() + .in(OutEntrustOrder::getId, ids) + .eq(OutEntrustOrder::getDelFlag, 1) + .set(OutEntrustOrder::getIssueStatus, OutEntrustOrderConstant.ISSUE_STATUS_2) + .set(OutEntrustOrder::getIssueBy, issueBy) + .set(OutEntrustOrder::getIssueByName, issueByName) + .set(OutEntrustOrder::getIssueTime, new Date()) + .set(OutEntrustOrder::getUpdateBy, issueBy) + .set(OutEntrustOrder::getUpdateByName, issueByName) + .set(OutEntrustOrder::getUpdateTime, new Date())); + } + + /** + * 完成:已审核(已下发)/进行中 → 已入库 + */ + @Override + public Boolean finish(List ids, Long updateBy, String updateByName) { + return this.update(new LambdaUpdateWrapper() + .in(OutEntrustOrder::getId, ids) + .eq(OutEntrustOrder::getDelFlag, 1) + .set(OutEntrustOrder::getOrderStatus, OutEntrustOrderConstant.ORDER_STATUS_STORED) + .set(OutEntrustOrder::getUpdateBy, updateBy) + .set(OutEntrustOrder::getUpdateByName, updateByName) + .set(OutEntrustOrder::getUpdateTime, new Date())); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderDetailPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderDetailPO.java new file mode 100644 index 000000000..046cbd06f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderDetailPO.java @@ -0,0 +1,100 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.po; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 出仓委托单明细对象 oms_out_entrust_order_detail + * + * @author rcx + * @date 2026-09-02 + */ + +@Data +@ApiModel(value = "出仓委托单明细对象", description = "出仓委托单明细响应对象") +public class OutEntrustOrderDetailPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Long id; + + @ApiModelProperty("委托单号(关联主表)") + private String entrustNumber; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + @ApiModelProperty("商品编码") + private String materialCode; + @ApiModelProperty("商品名称(物料档案名)") + private String materialName; + @ApiModelProperty("商品条形码") + private String barCode; + + @ApiModelProperty("商品名称(委托单品名)") + private String commodityName; + @ApiModelProperty("商品编号") + private String commodityNo; + @ApiModelProperty("料号") + private String materialNo; + @ApiModelProperty("规格型号") + private String specificationModel; + @ApiModelProperty("SKU码") + private String skucode; + @ApiModelProperty("发票号") + private String invoiceNo; + + @ApiModelProperty("申报单位") + private String declareUnit; + @ApiModelProperty("申报数量") + private BigDecimal declareQuantity; + @ApiModelProperty("单价") + private BigDecimal unitPrice; + + @ApiModelProperty("单位") + private String unit; + @ApiModelProperty("升") + private String liter; + @ApiModelProperty("尺寸") + private String size; + @ApiModelProperty("箱数") + private BigDecimal caseCount; + @ApiModelProperty("件数") + private BigDecimal pieceCount; + @ApiModelProperty("出库数量") + private BigDecimal outboundQuantity; + @ApiModelProperty("总净重(千克)") + private BigDecimal totalNetWeight; + @ApiModelProperty("总毛重(千克)") + private BigDecimal totalGrossWeight; + @ApiModelProperty("总体积(立方米)") + private BigDecimal totalVolume; + @ApiModelProperty("总面积") + private BigDecimal totalArea; + @ApiModelProperty("总金额") + private BigDecimal totalAmount; + @ApiModelProperty("币制") + private String currency; + @ApiModelProperty("批次") + private String batchRefNo; + @ApiModelProperty("单据参考号") + private String sheetRefNo; + @ApiModelProperty("原产国") + private String countryOfOrigin; + @ApiModelProperty("箱/托盘号") + private String boxPalletNo; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderPO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderPO.java new file mode 100644 index 000000000..f2e3e7843 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/po/OutEntrustOrderPO.java @@ -0,0 +1,212 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 出仓委托单对象 oms_out_entrust_order + * + * @author rcx + * @date 2026-09-02 + */ + +@Data +@ApiModel(value = "出仓委托单对象", description = "出仓委托单响应对象") +public class OutEntrustOrderPO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("委托单号") + private String entrustNumber; + + @ApiModelProperty("出库仓库ID") + private Long warehouseId; + @ApiModelProperty("仓库编码") + private String warehouseCode; + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("客户ID(货主)") + private Long shipperId; + @ApiModelProperty("客户编码") + private String shipperCode; + @ApiModelProperty("客户名称") + private String shipperName; + + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("订单类型编码(字典outDocumentType)") + private String orderTypeCode; + @ApiModelProperty("订单类型名称") + private String orderTypeName; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + + @ApiModelProperty("优先级别编码") + private String priorityLevelCode; + @ApiModelProperty("优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("预计出货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("出仓日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date outboundDate; + + @ApiModelProperty("orderDate") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("完成时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date completeTime; + + @ApiModelProperty("To(收货人)") + @JsonProperty("to") + private String toReceiver; + + @ApiModelProperty("联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号(客户委托单号)") + private String entrustNo; + + @ApiModelProperty("Tel电话") + private String tel; + + @ApiModelProperty("Fax传真") + private String fax; + + @ApiModelProperty("司机签名") + private String driverSign; + + @ApiModelProperty("承运商编码") + private String carrier; + @ApiModelProperty("承运商名称") + private String carrierName; + + @ApiModelProperty("柜号") + private String containerNo; + @ApiModelProperty("柜") + private String containerNoName; + + @ApiModelProperty("运输方式编码") + private String transportModeCode; + @ApiModelProperty("运输方式名称") + private String transportModeName; + + @ApiModelProperty("监管方式编码") + private String supervisionModeCode; + @ApiModelProperty("监管方式名称") + private String supervisionModeName; + + @ApiModelProperty("申报地关区") + private String declareCustoms; + + @ApiModelProperty("进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("海关是否查验货物") + private String customsInspectionFlag; + + @ApiModelProperty("是否需要报关(预留,页面隐藏)") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输(预留,页面隐藏)") + private String needTransportFlag; + + @ApiModelProperty("生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + private String deliveryAddr; + + @ApiModelProperty("附件url") + private String annexUrl; + + @ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库") + private Integer orderStatus; + @ApiModelProperty("订单状态") + private String orderStatusStr; + + @ApiModelProperty("审核人ID") + private Long auditBy; + @ApiModelProperty("审核人姓名") + private String auditByName; + @ApiModelProperty("审核时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date auditTime; + @ApiModelProperty("审核备注(驳回原因)") + private String auditRemark; + + @ApiModelProperty("下发状态:1-未下发 2-已下发") + private Integer issueStatus; + @ApiModelProperty("下发状态") + private String issueStatusStr; + @ApiModelProperty("下发人ID") + private Long issueBy; + @ApiModelProperty("下发人姓名") + private String issueByName; + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("申报总数量(明细申报数量之和)") + private BigDecimal declareTotalQuantity; + + @ApiModelProperty("发票号(列表展示用,明细发票号逗号拼接;详情请看明细)") + private String invoiceNo; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("组织ID") + private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("商品明细") + private List materialDetailList; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDO.java new file mode 100644 index 000000000..0c6e44725 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDO.java @@ -0,0 +1,216 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.todo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 出仓委托单对象 oms_out_entrust_order + * + * @author rcx + * @date 2026-09-02 + */ + +@Data +public class OutEntrustOrderDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Long id; + @ApiModelProperty("编号集合") + private List idList; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("委托单号") + private String entrustNumber; + + @ApiModelProperty("出库仓库ID") + private Long warehouseId; + @ApiModelProperty("仓库编码") + private String warehouseCode; + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("客户ID(货主)") + private Long shipperId; + @ApiModelProperty("客户编码") + private String shipperCode; + @ApiModelProperty("客户名称") + private String shipperName; + + @ApiModelProperty("业务员ID") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("订单类型编码(字典outDocumentType)") + private String orderTypeCode; + @ApiModelProperty("订单类型名称") + private String orderTypeName; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + + @ApiModelProperty("优先级别编码") + private String priorityLevelCode; + @ApiModelProperty("优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("预计出货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("出仓日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date outboundDate; + + @ApiModelProperty("orderDate") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("完成时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date completeTime; + + @ApiModelProperty("To(收货人)") + private String toReceiver; + + @ApiModelProperty("联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号(客户委托单号)") + private String entrustNo; + + @ApiModelProperty("Tel电话") + private String tel; + + @ApiModelProperty("Fax传真") + private String fax; + + @ApiModelProperty("司机签名") + private String driverSign; + + @ApiModelProperty("承运商编码") + private String carrier; + @ApiModelProperty("承运商名称") + private String carrierName; + + @ApiModelProperty("柜号") + private String containerNo; + @ApiModelProperty("柜") + private String containerNoName; + + @ApiModelProperty("运输方式编码") + private String transportModeCode; + @ApiModelProperty("运输方式名称") + private String transportModeName; + + @ApiModelProperty("监管方式编码") + private String supervisionModeCode; + @ApiModelProperty("监管方式名称") + private String supervisionModeName; + + @ApiModelProperty("申报地关区") + private String declareCustoms; + + @ApiModelProperty("进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("海关是否查验货物") + private String customsInspectionFlag; + + @ApiModelProperty("是否需要报关(预留,页面隐藏)") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输(预留,页面隐藏)") + private String needTransportFlag; + + @ApiModelProperty("生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + private String deliveryAddr; + + @ApiModelProperty("附件url") + private String annexUrl; + + @ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库") + private Integer orderStatus; + + @ApiModelProperty("审核人ID") + private Long auditBy; + @ApiModelProperty("审核人姓名") + private String auditByName; + @ApiModelProperty("审核时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date auditTime; + @ApiModelProperty("审核备注(驳回原因)") + private String auditRemark; + + @ApiModelProperty("下发状态:1-未下发 2-已下发") + private Integer issueStatus; + @ApiModelProperty("下发人ID") + private Long issueBy; + @ApiModelProperty("下发人姓名") + private String issueByName; + @ApiModelProperty("下发时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date issueTime; + + @ApiModelProperty("申报总数量(明细申报数量之和)") + private BigDecimal declareTotalQuantity; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("组织ID") + private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; + @ApiModelProperty("一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("查询-创建开始时间(年月日yyyy-MM-dd)") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginCreateTime; + @ApiModelProperty("查询-创建结束时间(年月日yyyy-MM-dd,含当天)") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endCreateTime; + + @ApiModelProperty("查询-发票号(模糊匹配明细发票号)") + private String invoiceNo; + + @ApiModelProperty("商品明细") + private List materialDetailList; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDetailDO.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDetailDO.java new file mode 100644 index 000000000..68d9f0381 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/repository/todo/OutEntrustOrderDetailDO.java @@ -0,0 +1,90 @@ +package com.mhd.oms.domain.outEntrustOrder.repository.todo; + +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 出仓委托单明细对象 oms_out_entrust_order_detail + * + * @author rcx + * @date 2026-09-02 + */ + +@Data +public class OutEntrustOrderDetailDO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Long id; + + @ApiModelProperty("委托单号(关联主表)") + private String entrustNumber; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + @ApiModelProperty("商品编码") + private String materialCode; + @ApiModelProperty("商品名称(物料档案名)") + private String materialName; + @ApiModelProperty("商品条形码") + private String barCode; + + @ApiModelProperty("商品名称(委托单品名)") + private String commodityName; + @ApiModelProperty("商品编号") + private String commodityNo; + @ApiModelProperty("料号") + private String materialNo; + @ApiModelProperty("规格型号") + private String specificationModel; + @ApiModelProperty("SKU码") + private String skucode; + @ApiModelProperty("发票号") + private String invoiceNo; + + @ApiModelProperty("申报单位") + private String declareUnit; + @ApiModelProperty("申报数量") + private BigDecimal declareQuantity; + @ApiModelProperty("单价") + private BigDecimal unitPrice; + + @ApiModelProperty("单位") + private String unit; + @ApiModelProperty("升") + private String liter; + @ApiModelProperty("尺寸") + private String size; + @ApiModelProperty("箱数") + private BigDecimal caseCount; + @ApiModelProperty("件数") + private BigDecimal pieceCount; + @ApiModelProperty("出库数量") + private BigDecimal outboundQuantity; + @ApiModelProperty("总净重(千克)") + private BigDecimal totalNetWeight; + @ApiModelProperty("总毛重(千克)") + private BigDecimal totalGrossWeight; + @ApiModelProperty("总体积(立方米)") + private BigDecimal totalVolume; + @ApiModelProperty("总面积") + private BigDecimal totalArea; + @ApiModelProperty("总金额") + private BigDecimal totalAmount; + @ApiModelProperty("币制") + private String currency; + @ApiModelProperty("批次") + private String batchRefNo; + @ApiModelProperty("单据参考号") + private String sheetRefNo; + @ApiModelProperty("原产国") + private String countryOfOrigin; + @ApiModelProperty("箱/托盘号") + private String boxPalletNo; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/service/OutEntrustOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/service/OutEntrustOrderDomainService.java new file mode 100644 index 000000000..8d1854105 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/outEntrustOrder/service/OutEntrustOrderDomainService.java @@ -0,0 +1,177 @@ +package com.mhd.oms.domain.outEntrustOrder.service; + +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.utils.OrderSequence; +import com.mhd.oms.constant.OutEntrustOrderConstant; +import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderDetailService; +import com.mhd.oms.domain.outEntrustOrder.repository.facade.IOutEntrustOrderService; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderDetailPO; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 出仓委托单 + * + * @author rcx + * @date 2026-09-02 + */ +@Service +@Slf4j +public class OutEntrustOrderDomainService { + + @Autowired + private IOutEntrustOrderService outEntrustOrderService; + + @Autowired + private IOutEntrustOrderDetailService outEntrustOrderDetailService; + + /** + * 分页查询出仓委托单列表 + */ + public List queryList(OutEntrustOrderDO outEntrustOrderDO) { + return outEntrustOrderService.queryList(outEntrustOrderDO); + } + + /** + * 新增出仓委托单(主单+明细) + */ + @Transactional(rollbackFor = Exception.class) + public Boolean insert(OutEntrustOrderDO outEntrustOrderDO) { + //生成委托单号,初始状态:待审核、未下发;新单无审核信息 + outEntrustOrderDO.setEntrustNumber(OrderSequence.getOrderCode(OutEntrustOrderConstant.OUT_ENTRUST_NO_PREFIX)); + outEntrustOrderDO.setOrderStatus(OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT); + outEntrustOrderDO.setIssueStatus(OutEntrustOrderConstant.ISSUE_STATUS_1); + outEntrustOrderDO.setAuditRemark(null); + outEntrustOrderService.insert(outEntrustOrderDO); + outEntrustOrderDetailService.batchInsert(outEntrustOrderDO.getEntrustNumber(), buildDetailList(outEntrustOrderDO)); + return true; + } + + /** + * 修改出仓委托单(仅已创建且未下发可修改,明细全量替换) + */ + /** + * 修改出仓委托单(仅待审核/已驳回且未下发可修改,明细全量替换) + * 已驳回单重新编辑后状态重置为待审核,待重新审核 + */ + @Transactional(rollbackFor = Exception.class) + public Boolean update(OutEntrustOrderDO outEntrustOrderDO) { + OutEntrustOrderPO orderPO = checkEditable(outEntrustOrderDO.getId()); + //已驳回 → 编辑后回到待审核;待审核 → 保持不变(置null,updateById跳过该列) + outEntrustOrderDO.setOrderStatus(OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(orderPO.getOrderStatus()) + ? OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT : null); + outEntrustOrderDO.setEntrustNumber(orderPO.getEntrustNumber()); + outEntrustOrderService.update(outEntrustOrderDO); + //明细全量替换:逻辑删除旧明细后重新保存 + outEntrustOrderDetailService.deleteByEntrustNumber(outEntrustOrderDO.getEntrustNumber()); + outEntrustOrderDetailService.batchInsert(outEntrustOrderDO.getEntrustNumber(), buildDetailList(outEntrustOrderDO)); + return true; + } + + /** + * 批量删除出仓委托单(仅待审核/已驳回且未下发可删除) + */ + @Transactional(rollbackFor = Exception.class) + public Boolean delete(Long[] ids) { + List orderList = outEntrustOrderService.getInfoByIds(java.util.Arrays.stream(ids).collect(Collectors.toList())); + List entrustNumbers = orderList.stream().map(OutEntrustOrderPO::getEntrustNumber).collect(Collectors.toList()); + outEntrustOrderService.delete(ids); + outEntrustOrderDetailService.deleteByEntrustNumbers(entrustNumbers); + return true; + } + + /** + * 获取出仓委托单详情(含明细) + */ + public OutEntrustOrderPO getInfo(Long id) { + OutEntrustOrderPO outEntrustOrderPO = outEntrustOrderService.getInfo(id); + List detailList = outEntrustOrderDetailService.queryByEntrustNumber(outEntrustOrderPO.getEntrustNumber()); + outEntrustOrderPO.setMaterialDetailList(detailList); + return outEntrustOrderPO; + } + + /** + * 批量审核:待审核/已驳回 → 已审核(2)或已驳回(3) + */ + public Boolean audit(List ids, Integer targetStatus, Long auditBy, String auditByName, String auditRemark) { + return outEntrustOrderService.audit(ids, targetStatus, auditBy, auditByName, auditRemark); + } + + /** + * 批量下发:订单状态保持已审核,下发状态置为已下发(WMS侧单据由ApplicationService推送) + */ + public Boolean issue(List ids, Long issueBy, String issueByName) { + return outEntrustOrderService.issue(ids, issueBy, issueByName); + } + + /** + * 完成:已审核(已下发) → 已入库(OMS人工推进) + */ + public Boolean finish(List ids, Long updateBy, String updateByName) { + return outEntrustOrderService.finish(ids, updateBy, updateByName); + } + + /** + * 根据委托单号查询明细 + */ + public List getDetailByEntrustNumber(String entrustNumber) { + return outEntrustOrderDetailService.queryByEntrustNumber(entrustNumber); + } + + /** + * 根据委托单号集合查询明细 + */ + public List getDetailByEntrustNumbers(List entrustNumbers) { + return outEntrustOrderDetailService.queryByEntrustNumbers(entrustNumbers); + } + + /** + * 根据编号集合查询出仓委托单列表 + */ + public List queryByIds(List ids) { + return outEntrustOrderService.getInfoByIds(ids); + } + + /** + * 明细补充审计信息(取主单的创建/更新人) + */ + private List buildDetailList(OutEntrustOrderDO outEntrustOrderDO) { + List detailDOList = outEntrustOrderDO.getMaterialDetailList(); + for (OutEntrustOrderDetailDO detailDO : detailDOList) { + detailDO.setCreateBy(outEntrustOrderDO.getCreateBy()); + detailDO.setCreateByName(outEntrustOrderDO.getCreateByName()); + detailDO.setCreateTime(outEntrustOrderDO.getCreateTime()); + detailDO.setUpdateBy(outEntrustOrderDO.getUpdateBy()); + detailDO.setUpdateByName(outEntrustOrderDO.getUpdateByName()); + detailDO.setUpdateTime(outEntrustOrderDO.getUpdateTime()); + detailDO.setDelFlag(1); + } + return detailDOList; + } + + /** + * 校验委托单是否可编辑/删除:仅待审核/已驳回 且未下发 + * + * @return 委托单信息(供调用方复用当前状态/委托单号) + */ + private OutEntrustOrderPO checkEditable(Long id) { + OutEntrustOrderPO outEntrustOrderPO = outEntrustOrderService.getInfo(id); + boolean editableStatus = OutEntrustOrderConstant.ORDER_STATUS_PENDING_AUDIT.equals(outEntrustOrderPO.getOrderStatus()) + || OutEntrustOrderConstant.ORDER_STATUS_REJECTED.equals(outEntrustOrderPO.getOrderStatus()); + if (!editableStatus) { + throw new ServiceException("已审核/进行中/已入库的委托单不允许修改"); + } + if (!OutEntrustOrderConstant.ISSUE_STATUS_1.equals(outEntrustOrderPO.getIssueStatus())) { + throw new ServiceException("已下发的委托单不允许修改"); + } + return outEntrustOrderPO; + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/assembler/outEntrustOrder/OutEntrustOrderAssembler.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/assembler/outEntrustOrder/OutEntrustOrderAssembler.java new file mode 100644 index 000000000..5f3c7f145 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/assembler/outEntrustOrder/OutEntrustOrderAssembler.java @@ -0,0 +1,84 @@ +package com.mhd.oms.interfaces.assembler.outEntrustOrder; + +import cn.hutool.core.util.ObjectUtil; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.core.utils.IgnoreNullUtil; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDetailDO; +import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDTO; +import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDetailDTO; +import com.mhd.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 出仓委托单Assembler + * + * @author rcx + * @date 2026-09-02 + */ +@Component +public class OutEntrustOrderAssembler { + + /** + * 转换实体 + */ + public OutEntrustOrderDO toDO(OutEntrustOrderDTO outEntrustOrderDTO) { + OutEntrustOrderDO outEntrustOrderDO = new OutEntrustOrderDO(); + // 拷贝 + BeanUtils.copyProperties(outEntrustOrderDTO, outEntrustOrderDO, IgnoreNullUtil.getNullPropertyNames(outEntrustOrderDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + String userName = loginUser.getUsername(); + // 获取登录人id + Long userId = loginUser.getUserid(); + if (outEntrustOrderDTO.getId() != null) { + if (userId != null) { + outEntrustOrderDO.setUpdateBy(userId); + } else { + outEntrustOrderDO.setUpdateBy(0L); + } + outEntrustOrderDO.setUpdateByName(userName); + outEntrustOrderDO.setUpdateTime(new Date()); + + } else { + if (userId != null) { + outEntrustOrderDO.setCreateBy(userId); + outEntrustOrderDO.setUpdateBy(userId); + } else { + outEntrustOrderDO.setCreateBy(0L); + outEntrustOrderDO.setUpdateBy(0L); + } + outEntrustOrderDO.setCreateByName(userName); + outEntrustOrderDO.setUpdateByName(userName); + outEntrustOrderDO.setCreateTime(new Date()); + outEntrustOrderDO.setUpdateTime(new Date()); + outEntrustOrderDO.setDelFlag(1); + } + // 明细转换 + List materialDetailList = outEntrustOrderDTO.getMaterialDetailList(); + if (materialDetailList != null) { + outEntrustOrderDO.setMaterialDetailList(toDetailDOList(materialDetailList)); + } + return outEntrustOrderDO; + } + + /** + * 明细DTO转DO + */ + public List toDetailDOList(List detailDTOList) { + return detailDTOList.stream().map(detailDTO -> { + OutEntrustOrderDetailDO detailDO = new OutEntrustOrderDetailDO(); + BeanUtils.copyProperties(detailDTO, detailDO, IgnoreNullUtil.getNullPropertyNames(detailDTO)); + return detailDO; + }).collect(Collectors.toList()); + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDTO.java new file mode 100644 index 000000000..832d51670 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDTO.java @@ -0,0 +1,198 @@ +package com.mhd.oms.interfaces.dto.outEntrustOrder; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 出仓委托单对象 oms_out_entrust_order + * 表单字段对齐WMS出库管理新增(报关/委托信息块) + * + * @author rcx + * @date 2026-09-02 + */ + +@EqualsAndHashCode(callSuper = true) +@Data +public class OutEntrustOrderDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Long id; + @ApiModelProperty("编号集合(审核/下发/删除用)") + private List idList; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("委托单号") + private String entrustNumber; + + @ApiModelProperty("出库仓库ID(必填)") + private Long warehouseId; + @ApiModelProperty("仓库编码") + private String warehouseCode; + @ApiModelProperty("仓库名称") + private String warehouseName; + + @ApiModelProperty("客户ID(货主,必填)") + private Long shipperId; + @ApiModelProperty("客户编码") + private String shipperCode; + @ApiModelProperty("客户名称") + private String shipperName; + + @ApiModelProperty("业务员ID(必填)") + private String salesmanId; + @ApiModelProperty("业务员名称") + private String salesmanName; + + @ApiModelProperty("订单类型编码(字典outDocumentType)") + private String orderTypeCode; + @ApiModelProperty("订单类型名称") + private String orderTypeName; + + @ApiModelProperty("结算币种") + private String settlementCurrency; + + @ApiModelProperty("优先级别编码") + private String priorityLevelCode; + @ApiModelProperty("优先级别名称") + private String priorityLevelName; + + @ApiModelProperty("是否直接出库: 1-是 2-否") + private Integer directWarehouse; + + @ApiModelProperty("是否复核: 1-是 2-否") + private Integer review; + + @ApiModelProperty("预计出货时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date expectTime; + + @ApiModelProperty("出仓日期") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date outboundDate; + + @ApiModelProperty("orderDate") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderDate; + + @ApiModelProperty("完成时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date completeTime; + + @ApiModelProperty("To(收货人)") + @JsonProperty("to") + private String toReceiver; + + @ApiModelProperty("联系人") + private String contactPerson; + + @ApiModelProperty("车型及车牌") + private String vehicleModelPlate; + + @ApiModelProperty("委托编号(客户委托单号)") + private String entrustNo; + + @ApiModelProperty("Tel电话") + private String tel; + + @ApiModelProperty("Fax传真") + private String fax; + + @ApiModelProperty("司机签名") + private String driverSign; + + @ApiModelProperty("承运商编码") + private String carrier; + @ApiModelProperty("承运商名称") + private String carrierName; + + @ApiModelProperty("柜号") + private String containerNo; + @ApiModelProperty("柜") + private String containerNoName; + + @ApiModelProperty("运输方式编码") + private String transportModeCode; + @ApiModelProperty("运输方式名称") + private String transportModeName; + + @ApiModelProperty("监管方式编码") + private String supervisionModeCode; + @ApiModelProperty("监管方式名称") + private String supervisionModeName; + + @ApiModelProperty("申报地关区") + private String declareCustoms; + + @ApiModelProperty("进出境关别") + private String entryExitCustoms; + + @ApiModelProperty("起运/运抵国(地区)") + private String departureArrivalCountry; + + @ApiModelProperty("海关是否查验货物") + private String customsInspectionFlag; + + @ApiModelProperty("是否需要报关(预留,页面隐藏)") + private String needDeclareFlag; + @ApiModelProperty("是否需要运输(预留,页面隐藏)") + private String needTransportFlag; + + @ApiModelProperty("生产商") + private String manufacturer; + + @ApiModelProperty("报关员姓名及联系方式") + private String customsDeclarerInfo; + + @ApiModelProperty("送货地址") + private String deliveryAddr; + + @ApiModelProperty("附件url") + private String annexUrl; + + @ApiModelProperty("订单状态:1-待审核 2-已审核 3-已驳回 4-进行中 5-已入库") + private Integer orderStatus; + + @ApiModelProperty("下发状态:1-未下发 2-已下发") + private Integer issueStatus; + + @ApiModelProperty("审核备注(驳回原因,审核时传)") + private String auditRemark; + + @ApiModelProperty("申报总数量(服务端按明细汇总,无需传入)") + private BigDecimal declareTotalQuantity; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("查询-创建开始时间(年月日yyyy-MM-dd)") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginCreateTime; + @ApiModelProperty("查询-创建结束时间(年月日yyyy-MM-dd,含当天)") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endCreateTime; + + @ApiModelProperty("查询-发票号(模糊匹配明细发票号)") + private String invoiceNo; + + @ApiModelProperty("商品明细") + private List materialDetailList; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDetailDTO.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDetailDTO.java new file mode 100644 index 000000000..8e261a274 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/dto/outEntrustOrder/OutEntrustOrderDetailDTO.java @@ -0,0 +1,93 @@ +package com.mhd.oms.interfaces.dto.outEntrustOrder; + +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 出仓委托单明细对象 oms_out_entrust_order_detail + * 明细列对齐WMS出库管理新增(出仓委托单明细列) + * + * @author rcx + * @date 2026-09-02 + */ + +@EqualsAndHashCode(callSuper = true) +@Data +public class OutEntrustOrderDetailDTO extends BaseVOEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("编号") + private Long id; + + @ApiModelProperty("委托单号(关联主表)") + private String entrustNumber; + + @ApiModelProperty("物料基础信息ID") + private Long materialBaseInfoId; + @ApiModelProperty("商品编码") + private String materialCode; + @ApiModelProperty("商品名称(物料档案名,与commodityName至少其一)") + private String materialName; + @ApiModelProperty("商品条形码") + private String barCode; + + @ApiModelProperty("商品名称(委托单品名,与materialName至少其一)") + private String commodityName; + @ApiModelProperty("商品编号") + private String commodityNo; + @ApiModelProperty("料号") + private String materialNo; + @ApiModelProperty("规格型号") + private String specificationModel; + @ApiModelProperty("SKU码") + private String skucode; + @ApiModelProperty("发票号") + private String invoiceNo; + + @ApiModelProperty("申报单位") + private String declareUnit; + @ApiModelProperty("申报数量(必填,大于0)") + private BigDecimal declareQuantity; + @ApiModelProperty("单价") + private BigDecimal unitPrice; + + @ApiModelProperty("单位") + private String unit; + @ApiModelProperty("升") + private String liter; + @ApiModelProperty("尺寸") + private String size; + @ApiModelProperty("箱数") + private BigDecimal caseCount; + @ApiModelProperty("件数") + private BigDecimal pieceCount; + @ApiModelProperty("出库数量") + private BigDecimal outboundQuantity; + @ApiModelProperty("总净重(千克)") + private BigDecimal totalNetWeight; + @ApiModelProperty("总毛重(千克)") + private BigDecimal totalGrossWeight; + @ApiModelProperty("总体积(立方米)") + private BigDecimal totalVolume; + @ApiModelProperty("总面积") + private BigDecimal totalArea; + @ApiModelProperty("总金额") + private BigDecimal totalAmount; + @ApiModelProperty("币制") + private String currency; + @ApiModelProperty("批次") + private String batchRefNo; + @ApiModelProperty("单据参考号") + private String sheetRefNo; + @ApiModelProperty("原产国") + private String countryOfOrigin; + @ApiModelProperty("箱/托盘号") + private String boxPalletNo; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outEntrustOrder/OutEntrustOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outEntrustOrder/OutEntrustOrderApi.java new file mode 100644 index 000000000..4f24f5cfe --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/outEntrustOrder/OutEntrustOrderApi.java @@ -0,0 +1,111 @@ +package com.mhd.oms.interfaces.facade.outEntrustOrder; + +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.oms.application.service.outEntrustOrder.OutEntrustOrderApplicationService; +import com.mhd.oms.domain.outEntrustOrder.repository.po.OutEntrustOrderPO; +import com.mhd.oms.domain.outEntrustOrder.repository.todo.OutEntrustOrderDO; +import com.mhd.oms.interfaces.assembler.outEntrustOrder.OutEntrustOrderAssembler; +import com.mhd.oms.interfaces.dto.outEntrustOrder.OutEntrustOrderDTO; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +/** + * 出仓委托单Api + * + * @author rcx + * @date 2026-09-02 + */ +@Slf4j +@RestController +@RequestMapping("/outEntrustOrderApi") +public class OutEntrustOrderApi extends BaseController { + + @Autowired + private OutEntrustOrderApplicationService outEntrustOrderApplicationService; + + @Resource + private OutEntrustOrderAssembler outEntrustOrderAssembler; + + /** + * 分页查询出仓委托单列表(显示全部数据,不做默认状态过滤) + */ + @ApiOperation("查询出仓委托单列表") + @GetMapping("/list") + public TableDataInfo list(OutEntrustOrderDTO outEntrustOrderDTO) { + //转换实体 + OutEntrustOrderDO outEntrustOrderDO = outEntrustOrderAssembler.toDO(outEntrustOrderDTO); + startPage(); + List list = outEntrustOrderApplicationService.queryList(outEntrustOrderDO); + return getDataTable(list); + } + + /** + * 新增/修改出仓委托单(必填:客户、业务员、仓库、商品名称、申报数量) + */ + @ApiOperation("编辑出仓委托单") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody OutEntrustOrderDTO outEntrustOrderDTO) { + //转换实体 + OutEntrustOrderDO outEntrustOrderDO = outEntrustOrderAssembler.toDO(outEntrustOrderDTO); + if (outEntrustOrderDTO.getId() != null) { + return toAjax(outEntrustOrderApplicationService.update(outEntrustOrderDO)); + } else { + return toAjax(outEntrustOrderApplicationService.insert(outEntrustOrderDO)); + } + } + + /** + * 批量删除出仓委托单(仅待审核/已驳回且未下发) + */ + @ApiOperation("批量删除出仓委托单") + @DeleteMapping("/deleteByIds/{ids}") + public AjaxResult delete(@PathVariable Long[] ids) { + return toAjax(outEntrustOrderApplicationService.delete(ids)); + } + + /** + * 获取出仓委托单详情(含明细) + */ + @ApiOperation("获取出仓委托单") + @GetMapping(value = "/getInfo/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(outEntrustOrderApplicationService.getInfo(id)); + } + + /** + * 批量审核:待审核/已驳回 → 已审核(通过)或已驳回 + * 请求体:{"idList":[1,2],"orderStatus":3,"auditRemark":"备注"},orderStatus:2-审核通过 3-驳回(auditRemark选填) + */ + @ApiOperation("审核出仓委托单") + @PostMapping("/audit") + public AjaxResult audit(@RequestBody OutEntrustOrderDTO outEntrustOrderDTO) { + return toAjax(outEntrustOrderApplicationService.audit(outEntrustOrderAssembler.toDO(outEntrustOrderDTO))); + } + + /** + * 批量下发:已审核的委托单下发到WMS(生成出库通知单),下发后订单状态变为进行中 + */ + @ApiOperation("下发出仓委托单") + @PostMapping("/issueOrder") + public AjaxResult issueOrder(@RequestBody HashMap> body) { + List ids = body.get("ids"); + return toAjax(outEntrustOrderApplicationService.issueOrder(ids)); + } + + /** + * 批量完成:进行中 → 已入库(WMS出库完成后人工确认) + */ + @ApiOperation("委托单完成入库") + @PostMapping("/finish") + public AjaxResult finish(@RequestBody List ids) { + return toAjax(outEntrustOrderApplicationService.finish(ids)); + } +} diff --git a/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml b/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml new file mode 100644 index 000000000..d5a2017aa --- /dev/null +++ b/mhd_oms/src/main/resources/mapper/outEntrustOrder/OutEntrustOrderMapper.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + a.id,a.create_by,a.create_by_name,a.create_time,a.update_by,a.update_by_name,a.update_time,a.del_flag, + a.entrust_number,a.warehouse_id,a.warehouse_code,a.warehouse_name,a.shipper_id,a.shipper_code,a.shipper_name, + a.salesman_id,a.salesman_name,a.order_type_code,a.order_type_name,a.settlement_currency,a.priority_level_code,a.priority_level_name, + a.direct_warehouse,a.review,a.expect_time,a.outbound_date,a.order_date,a.complete_time, + a.to_receiver,a.contact_person,a.vehicle_model_plate,a.entrust_no,a.tel,a.fax,a.driver_sign, + a.carrier,a.carrier_name,a.container_no,a.container_no_name, + a.transport_mode_code,a.transport_mode_name,a.supervision_mode_code,a.supervision_mode_name, + a.declare_customs,a.entry_exit_customs,a.departure_arrival_country,a.customs_inspection_flag, + a.need_declare_flag,a.need_transport_flag,a.manufacturer,a.customs_declarer_info,a.delivery_addr,a.annex_url, + a.order_status,a.audit_by,a.audit_by_name,a.audit_time,a.audit_remark, + a.issue_status,a.issue_by,a.issue_by_name,a.issue_time,a.declare_total_quantity, + a.remark,a.organization_id,a.organization_name,a.top_organization_id, + case a.order_status when 1 then '待审核' when 2 then '已审核' when 3 then '已驳回' when 4 then '进行中' when 5 then '已入库' else '未知状态' end order_status_str, + case a.issue_status when 1 then '未下发' when 2 then '已下发' else '未知状态' end issue_status_str + from + oms_out_entrust_order a + + + + + a.del_flag = 1 + + and a.entrust_number like concat('%', #{entrustNumber}, '%') + + + and a.entrust_no like concat('%', #{entrustNo}, '%') + + + and a.warehouse_id = #{warehouseId} + + + and a.warehouse_name like concat('%', #{warehouseName}, '%') + + + and a.shipper_id = #{shipperId} + + + and a.shipper_name like concat('%', #{shipperName}, '%') + + + and a.salesman_id = #{salesmanId} + + + and a.salesman_name like concat('%', #{salesmanName}, '%') + + + and a.container_no like concat('%', #{containerNo}, '%') + + + and a.order_status = #{orderStatus} + + + and a.issue_status = #{issueStatus} + + + and a.settlement_currency = #{settlementCurrency} + + + and exists ( + select 1 from oms_out_entrust_order_detail d + where d.entrust_number = a.entrust_number + and d.del_flag = 1 + and d.invoice_no like concat('%', #{invoiceNo}, '%') + ) + + + and a.top_organization_id = #{topOrganizationId} + + + and a.create_time >= #{beginCreateTime} + + + and a.create_time <= #{endCreateTime} + + + and a.id in + + #{id} + + + + order by a.create_time desc + + + + + + + diff --git a/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql b/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql new file mode 100644 index 000000000..c336f89e8 --- /dev/null +++ b/sql/20260903_create_table_dm_szwl_oms_out_entrust_order.sql @@ -0,0 +1,230 @@ +-- ---------------------------- +-- 通宇「出仓委托单」OMS 建表脚本 —— 达梦(DM)数据库版(最终版,新库直接执行本脚本即可,无需任何增量) +-- 适用:mhd-oms-service 连接的达梦库(生产/测试按环境选择,在OMS服务连接的用户/模式下执行) +-- 含:明细单价UNIT_PRICE、结算币种、审核备注、订单状态(1-待审核 2-已审核 3-已驳回 4-进行中(预留) 5-已入库,默认1待审核) +-- @date 2026-09-03 +-- ---------------------------- + +-- 主表:出仓委托单 +CREATE TABLE OMS_OUT_ENTRUST_ORDER ( + ID BIGINT IDENTITY(1,1) NOT NULL, + ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL, + WAREHOUSE_ID BIGINT DEFAULT NULL, + WAREHOUSE_CODE VARCHAR(50) DEFAULT NULL, + WAREHOUSE_NAME VARCHAR(100) DEFAULT NULL, + SHIPPER_ID BIGINT DEFAULT NULL, + SHIPPER_CODE VARCHAR(50) DEFAULT NULL, + SHIPPER_NAME VARCHAR(100) DEFAULT NULL, + SALESMAN_ID VARCHAR(64) DEFAULT NULL, + SALESMAN_NAME VARCHAR(50) DEFAULT NULL, + ORDER_TYPE_CODE VARCHAR(50) DEFAULT NULL, + ORDER_TYPE_NAME VARCHAR(100) DEFAULT NULL, + SETTLEMENT_CURRENCY VARCHAR(50) DEFAULT NULL, + PRIORITY_LEVEL_CODE VARCHAR(50) DEFAULT NULL, + PRIORITY_LEVEL_NAME VARCHAR(50) DEFAULT NULL, + DIRECT_WAREHOUSE INT DEFAULT NULL, + REVIEW INT DEFAULT NULL, + EXPECT_TIME DATETIME DEFAULT NULL, + OUTBOUND_DATE DATETIME DEFAULT NULL, + ORDER_DATE DATETIME DEFAULT NULL, + COMPLETE_TIME DATETIME DEFAULT NULL, + TO_RECEIVER VARCHAR(200) DEFAULT NULL, + CONTACT_PERSON VARCHAR(100) DEFAULT NULL, + VEHICLE_MODEL_PLATE VARCHAR(100) DEFAULT NULL, + ENTRUST_NO VARCHAR(100) DEFAULT NULL, + TEL VARCHAR(50) DEFAULT NULL, + FAX VARCHAR(50) DEFAULT NULL, + DRIVER_SIGN VARCHAR(100) DEFAULT NULL, + CARRIER VARCHAR(100) DEFAULT NULL, + CARRIER_NAME VARCHAR(200) DEFAULT NULL, + CONTAINER_NO VARCHAR(100) DEFAULT NULL, + CONTAINER_NO_NAME VARCHAR(50) DEFAULT NULL, + TRANSPORT_MODE_CODE VARCHAR(50) DEFAULT NULL, + TRANSPORT_MODE_NAME VARCHAR(50) DEFAULT NULL, + SUPERVISION_MODE_CODE VARCHAR(50) DEFAULT NULL, + SUPERVISION_MODE_NAME VARCHAR(50) DEFAULT NULL, + DECLARE_CUSTOMS VARCHAR(100) DEFAULT NULL, + ENTRY_EXIT_CUSTOMS VARCHAR(100) DEFAULT NULL, + DEPARTURE_ARRIVAL_COUNTRY VARCHAR(100) DEFAULT NULL, + CUSTOMS_INSPECTION_FLAG VARCHAR(50) DEFAULT NULL, + NEED_DECLARE_FLAG VARCHAR(50) DEFAULT NULL, + NEED_TRANSPORT_FLAG VARCHAR(50) DEFAULT NULL, + MANUFACTURER VARCHAR(200) DEFAULT NULL, + CUSTOMS_DECLARER_INFO VARCHAR(200) DEFAULT NULL, + DELIVERY_ADDR VARCHAR(500) DEFAULT NULL, + ANNEX_URL VARCHAR(500) DEFAULT NULL, + ORDER_STATUS INT DEFAULT 1, + AUDIT_BY BIGINT DEFAULT NULL, + AUDIT_BY_NAME VARCHAR(50) DEFAULT NULL, + AUDIT_TIME DATETIME DEFAULT NULL, + AUDIT_REMARK VARCHAR(500) DEFAULT NULL, + ISSUE_STATUS INT DEFAULT 1, + ISSUE_BY BIGINT DEFAULT NULL, + ISSUE_BY_NAME VARCHAR(50) DEFAULT NULL, + ISSUE_TIME DATETIME DEFAULT NULL, + DECLARE_TOTAL_QUANTITY DECIMAL(24,6) DEFAULT 0, + REMARK VARCHAR(500) DEFAULT NULL, + ORGANIZATION_ID BIGINT DEFAULT NULL, + ORGANIZATION_NAME VARCHAR(100) DEFAULT NULL, + TOP_ORGANIZATION_ID BIGINT DEFAULT NULL, + CREATE_BY BIGINT DEFAULT NULL, + CREATE_BY_NAME VARCHAR(50) DEFAULT NULL, + CREATE_TIME DATETIME DEFAULT NULL, + UPDATE_BY BIGINT DEFAULT NULL, + UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL, + UPDATE_TIME DATETIME DEFAULT NULL, + DEL_FLAG INT DEFAULT 1, + CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER PRIMARY KEY (ID) +); + +COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER IS '出仓委托单主表'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ID IS '编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NUMBER IS '委托单号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_ID IS '出库仓库ID(必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_CODE IS '仓库编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.WAREHOUSE_NAME IS '仓库名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_ID IS '客户ID(货主,必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_CODE IS '客户编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SHIPPER_NAME IS '客户名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_ID IS '业务员ID(必填)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SALESMAN_NAME IS '业务员名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_CODE IS '订单类型编码(字典outDocumentType,为空时下发默认普通出库)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_TYPE_NAME IS '订单类型名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SETTLEMENT_CURRENCY IS '结算币种'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_CODE IS '优先级别编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.PRIORITY_LEVEL_NAME IS '优先级别名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DIRECT_WAREHOUSE IS '是否直接出库: 1-是 2-否'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REVIEW IS '是否复核: 1-是 2-否'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.EXPECT_TIME IS '预计出货时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.OUTBOUND_DATE IS '出仓日期'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_DATE IS 'orderDate'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.COMPLETE_TIME IS '完成时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TO_RECEIVER IS 'To(收货人)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTACT_PERSON IS '联系人'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.VEHICLE_MODEL_PLATE IS '车型及车牌'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRUST_NO IS '委托编号(客户委托单号)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TEL IS 'Tel电话'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.FAX IS 'Fax传真'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DRIVER_SIGN IS '司机签名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER IS '承运商编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CARRIER_NAME IS '承运商名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO IS '柜号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CONTAINER_NO_NAME IS '柜'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_CODE IS '运输方式编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TRANSPORT_MODE_NAME IS '运输方式名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_CODE IS '监管方式编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.SUPERVISION_MODE_NAME IS '监管方式名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_CUSTOMS IS '申报地关区'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ENTRY_EXIT_CUSTOMS IS '进出境关别'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEPARTURE_ARRIVAL_COUNTRY IS '起运/运抵国(地区)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_INSPECTION_FLAG IS '海关是否查验货物'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_DECLARE_FLAG IS '是否需要报关(预留,页面隐藏)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.NEED_TRANSPORT_FLAG IS '是否需要运输(预留,页面隐藏)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.MANUFACTURER IS '生产商'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.CUSTOMS_DECLARER_INFO IS '报关员姓名及联系方式'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DELIVERY_ADDR IS '送货地址'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ANNEX_URL IS '附件url'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORDER_STATUS IS '订单状态:1-待审核 2-已审核(含已下发) 3-已驳回 4-进行中(预留) 5-已入库'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY IS '审核人ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_BY_NAME IS '审核人姓名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_TIME IS '审核时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.AUDIT_REMARK IS '审核备注(驳回原因)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_STATUS IS '下发状态:1-未下发 2-已下发'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY IS '下发人ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_BY_NAME IS '下发人姓名'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ISSUE_TIME IS '下发时间'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DECLARE_TOTAL_QUANTITY IS '申报总数量(明细申报数量之和)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.REMARK IS '备注'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_ID IS '组织ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.ORGANIZATION_NAME IS '组织名称'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.TOP_ORGANIZATION_ID IS '一级组织ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除'; + +CREATE INDEX IDX_OOE_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER (ENTRUST_NUMBER); +CREATE INDEX IDX_OOE_TOP_ORG ON OMS_OUT_ENTRUST_ORDER (TOP_ORGANIZATION_ID); + +-- 明细表:出仓委托单明细 +CREATE TABLE OMS_OUT_ENTRUST_ORDER_DETAIL ( + ID BIGINT IDENTITY(1,1) NOT NULL, + ENTRUST_NUMBER VARCHAR(50) DEFAULT NULL, + MATERIAL_BASE_INFO_ID BIGINT DEFAULT NULL, + MATERIAL_CODE VARCHAR(100) DEFAULT NULL, + MATERIAL_NAME VARCHAR(200) DEFAULT NULL, + BAR_CODE VARCHAR(100) DEFAULT NULL, + COMMODITY_NAME VARCHAR(200) DEFAULT NULL, + COMMODITY_NO VARCHAR(100) DEFAULT NULL, + MATERIAL_NO VARCHAR(100) DEFAULT NULL, + SPECIFICATION_MODEL VARCHAR(200) DEFAULT NULL, + SKUCODE VARCHAR(100) DEFAULT NULL, + INVOICE_NO VARCHAR(200) DEFAULT NULL, + DECLARE_UNIT VARCHAR(50) DEFAULT NULL, + DECLARE_QUANTITY DECIMAL(24,6) DEFAULT NULL, + UNIT_PRICE DECIMAL(24,6) DEFAULT NULL, + UNIT VARCHAR(50) DEFAULT NULL, + LITER VARCHAR(50) DEFAULT NULL, + "SIZE" VARCHAR(100) DEFAULT NULL, + CASE_COUNT DECIMAL(24,6) DEFAULT NULL, + PIECE_COUNT DECIMAL(24,6) DEFAULT NULL, + OUTBOUND_QUANTITY DECIMAL(24,6) DEFAULT NULL, + TOTAL_NET_WEIGHT DECIMAL(24,6) DEFAULT NULL, + TOTAL_GROSS_WEIGHT DECIMAL(24,6) DEFAULT NULL, + TOTAL_VOLUME DECIMAL(24,6) DEFAULT NULL, + TOTAL_AREA DECIMAL(24,6) DEFAULT NULL, + TOTAL_AMOUNT DECIMAL(24,6) DEFAULT NULL, + CURRENCY VARCHAR(50) DEFAULT NULL, + BATCH_REF_NO VARCHAR(100) DEFAULT NULL, + SHEET_REF_NO VARCHAR(100) DEFAULT NULL, + COUNTRY_OF_ORIGIN VARCHAR(100) DEFAULT NULL, + BOX_PALLET_NO VARCHAR(100) DEFAULT NULL, + REMARK VARCHAR(500) DEFAULT NULL, + CREATE_BY BIGINT DEFAULT NULL, + CREATE_BY_NAME VARCHAR(50) DEFAULT NULL, + CREATE_TIME DATETIME DEFAULT NULL, + UPDATE_BY BIGINT DEFAULT NULL, + UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL, + UPDATE_TIME DATETIME DEFAULT NULL, + DEL_FLAG INT DEFAULT 1, + CONSTRAINT PK_OMS_OUT_ENTRUST_ORDER_DETAIL PRIMARY KEY (ID) +); + +COMMENT ON TABLE OMS_OUT_ENTRUST_ORDER_DETAIL IS '出仓委托单明细表'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ID IS '编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.ENTRUST_NUMBER IS '委托单号(关联主表)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_BASE_INFO_ID IS '物料基础信息ID'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_CODE IS '商品编码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NAME IS '商品名称(物料档案名,与COMMODITY_NAME至少其一)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BAR_CODE IS '商品条形码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NAME IS '商品名称(委托单品名,与MATERIAL_NAME至少其一)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COMMODITY_NO IS '商品编号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.MATERIAL_NO IS '料号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SPECIFICATION_MODEL IS '规格型号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SKUCODE IS 'SKU码'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.INVOICE_NO IS '发票号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_UNIT IS '申报单位'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DECLARE_QUANTITY IS '申报数量(必填,大于0)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT_PRICE IS '单价'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.UNIT IS '单位'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.LITER IS '升'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL."SIZE" IS '尺寸'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CASE_COUNT IS '箱数'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.PIECE_COUNT IS '件数'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.OUTBOUND_QUANTITY IS '出库数量'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_NET_WEIGHT IS '总净重(千克)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_GROSS_WEIGHT IS '总毛重(千克)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_VOLUME IS '总体积(立方米)'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AREA IS '总面积'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.TOTAL_AMOUNT IS '总金额'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.CURRENCY IS '币制'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BATCH_REF_NO IS '批次'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.SHEET_REF_NO IS '单据参考号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.COUNTRY_OF_ORIGIN IS '原产国'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.BOX_PALLET_NO IS '箱/托盘号'; +COMMENT ON COLUMN OMS_OUT_ENTRUST_ORDER_DETAIL.DEL_FLAG IS '删除标记:0-无状态,1-正常,2-已删除'; + +CREATE INDEX IDX_OOED_ENTRUST_NUMBER ON OMS_OUT_ENTRUST_ORDER_DETAIL (ENTRUST_NUMBER); + +-- ---------------------------- +-- 回滚脚本 +-- DROP TABLE OMS_OUT_ENTRUST_ORDER_DETAIL; +-- DROP TABLE OMS_OUT_ENTRUST_ORDER; +-- ---------------------------- From ce3bb036fae9d96192e796a9d72cac4cb46c0f35 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 4 Sep 2026 10:50:48 +0800 Subject: [PATCH 085/101] =?UTF-8?q?=E5=8F=91=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../java/com/mhd/system/api/WlhyServiceFeign.java | 2 +- .../java/com/mhd/system/api/WmsServiceFeign.java | 2 +- .../java/com/mhd/system/api/YmsServiceFeign.java | 2 +- .../common/core/feign/ThirdPartyServiceFeign.java | 2 +- mhd_bms/src/main/resources/bootstrap.yml | 14 ++++++++------ .../feign/ThirdPartyServiceFeign.java | 2 +- mhd_oms/src/main/resources/bootstrap.yml | 8 ++++---- 9 files changed, 19 insertions(+), 17 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 8cc8bfd57..0d65c89a1 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32:8019",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129: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 4ef3bed80..8a7006304 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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 1fe69a003..7fbd7dd9b 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 509644885..9fd21ae67 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_bms/src/main/resources/bootstrap.yml b/mhd_bms/src/main/resources/bootstrap.yml index 72c069a36..57159b97e 100644 --- a/mhd_bms/src/main/resources/bootstrap.yml +++ b/mhd_bms/src/main/resources/bootstrap.yml @@ -16,15 +16,17 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 127.0.0.1:8848 + # 线上测试环境配置 容器名+端口号 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: - server-addr: 127.0.0.1:8848 -# server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.31:6848 +# server-addr: 127.0.0.1:8848 + # 线上测试环境配置 容器名+端口号 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 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 8c86ae1ad..376500b1c 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_oms/src/main/resources/bootstrap.yml b/mhd_oms/src/main/resources/bootstrap.yml index 542b6bce7..88471e390 100644 --- a/mhd_oms/src/main/resources/bootstrap.yml +++ b/mhd_oms/src/main/resources/bootstrap.yml @@ -18,15 +18,15 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.31:6848 + server-addr: 10.33.0.129:6010 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 1b8511c09267d048887526951a44a9da993aa174 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 4 Sep 2026 10:55:18 +0800 Subject: [PATCH 086/101] =?UTF-8?q?feat(oms):=20=E5=87=BA=E5=BA=93/?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E9=A1=B5=E7=AD=BE=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=E5=B7=A5=E4=BD=9C=E8=A1=A8=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=B8=80=E5=BC=A0=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一、行为变更(ReservationStockInOrderImpl) - 出库导入(parseExcelFile)/入库导入(parseStockInExcel):不再固定读单一页签,枚举Excel全部工作表,每个页签独立解析为一张单据(5个页签=5张单5个单号) - 全部回滚策略:任一页签校验失败整体不落库,报错按页签聚合列出(页签[x]:原因;页签[y]:原因) - 空页签(无货品/客户明细)自动跳过;单页签文件行为与原先完全一致 - 出库单号改到落库阶段逐张生成:多页签下校验阶段统一生成会因全部未入库而取到相同单号 - 入库模板OrderNO增加本文件内跨页签查重:各页签都未入库时库查重互相不可见,防两页签同OrderNO重复落库 - 页签解析异常message为空时兜底用异常类名,避免报错显示null - 方法级@Transactional(rollbackFor=Exception.class):顺带修复旧入库导入因this自调用导致事务代理失效的问题 二、接口与返回结构(IReservationStockInOrderService / ReservationStockInOrderApi) - 两个导入方法返回类型改为List(每页签一条:页签名/单号/物料行数/数量合计/解析数据) - /parseExcel与/parse-excel返回:result=第一个页签解析数据(兼容老前端)、results=全部页签结果、msg=成功导入N张单:单号1、单号2… - 入库接口不传sheetName为多页签模式,显式传页签名保持单页签老行为 --- .../IReservationStockInOrderService.java | 19 +- .../ReservationStockInOrderImpl.java | 222 +++++++++++++++--- .../repository/vo/SheetImportResultDTO.java | 31 +++ .../ReservationStockInOrderApi.java | 28 ++- 4 files changed, 255 insertions(+), 45 deletions(-) create mode 100644 mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/vo/SheetImportResultDTO.java diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java index d2963405b..97435b85f 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/facade/IReservationStockInOrderService.java @@ -6,6 +6,7 @@ import com.mhd.oms.domain.reservationStockInOrder.entity.ReservationStockInOrder import com.mhd.oms.domain.reservationStockInOrder.repository.po.ReservationStockInOrderPO; import com.mhd.oms.domain.reservationStockInOrder.repository.todo.ReservationStockInOrderDO; import com.mhd.oms.domain.reservationStockInOrder.repository.vo.DeliveryDataDTO; +import com.mhd.oms.domain.reservationStockInOrder.repository.vo.SheetImportResultDTO; import com.mhd.oms.domain.reservationStockInOrder.repository.vo.StockInDataDTO; import org.springframework.web.multipart.MultipartFile; @@ -50,21 +51,23 @@ public interface IReservationStockInOrderService extends IService queryNoticePrintDetail(ReservationStockInOrderDO stockInOrderDTO); /** - * 解析Excel文件并获取出库数据 + * 解析Excel文件并导入出库单(多页签:文件中每个工作表独立解析为一张出库单,单页签文件行为不变)。 + * 任一页签校验失败则整体不落库,报错聚合列出所有失败页签 * @param file Excel文件 - * @param sheetName 工作表名称(出库导入/参考数据) + * @param sheetName 兼容参数(多页签模式下不再按名字筛选,传空即可) * @param warehouseId 当前仓库id(非空时校验导入物料是否属于该仓库,并按该仓库过滤批次库存) - * @return 出库数据DTO + * @return 每个工作表的导入结果(含生成的出库单号与解析数据) * @throws Exception 解析异常 */ - DeliveryDataDTO parseExcelFile(MultipartFile file, String sheetName, Long warehouseId) throws Exception; + List parseExcelFile(MultipartFile file, String sheetName, Long warehouseId) throws Exception; /** - * 解析入库单Excel文件 + * 解析并导入入库单Excel(多页签:未指定页签名时文件中每个工作表独立解析为一张入库单,单页签文件行为不变)。 + * 任一页签校验失败则整体不落库,报错聚合列出所有失败页签 * @param file Excel文件 - * @param sheetName 工作表名称(默认:入库模版) - * @return 入库单完整数据(表头+明细) + * @param sheetName 显式指定页签时保持单页签行为;不传/为空则为多页签模式 + * @return 每个工作表的导入结果(含生成的入库单号与解析数据) * @throws Exception 解析异常 */ - StockInDataDTO parseStockInExcel(MultipartFile file, String sheetName) throws Exception; + List parseStockInExcel(MultipartFile file, String sheetName) throws Exception; } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java index 21ed397d6..c1a474c7a 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/persistence/ReservationStockInOrderImpl.java @@ -4,6 +4,8 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -57,6 +59,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; @@ -220,19 +223,90 @@ public class ReservationStockInOrderImpl extends ServiceImpl parseExcelFile(MultipartFile file, String sheetName, Long warehouseId) throws Exception { LoginUser loginUser = SecurityUtils.getLoginUser(); - // 校验文件和工作表名称(逻辑不变) + // 校验文件(逻辑不变) if (file.isEmpty()) { throw new IllegalArgumentException("上传的Excel文件不能为空"); } - if (!"出库导入".equals(sheetName) && !"参考数据".equals(sheetName)) { - sheetName = "出库导入"; + // 多页签模式:文件中每个工作表独立解析为一张出库单(老逻辑固定只读"出库导入"页签) + byte[] fileBytes = file.getBytes(); + List sheetNames = listSheetNames(fileBytes); + if (sheetNames.isEmpty()) { + throw new IllegalArgumentException("Excel文件中没有工作表"); } + // ====== 第一阶段:逐页签解析+校验+组装(不落库),失败按页签聚合收集,全部页签处理完统一报错 ====== + List preparedOrders = new ArrayList<>(); + List sheetProblems = new ArrayList<>(); + for (String name : sheetNames) { + try { + PreparedDeliveryOrder prepared = buildDeliveryOrder(fileBytes, name, warehouseId, loginUser); + if (prepared != null) { + preparedOrders.add(prepared); // null=空页签,跳过 + } + } catch (Exception e) { + // 非模板页签的解析异常(如NPE)message 可能为空,兜底用异常类名,避免报错显示"页签[x]:null" + sheetProblems.add("页签[" + name + "]:" + (e.getMessage() == null ? e.toString() : e.getMessage())); + } + } + if (!sheetProblems.isEmpty()) { + throw new Exception(String.join(";", sheetProblems)); + } + if (preparedOrders.isEmpty()) { + throw new IllegalArgumentException("Excel中没有可导入的数据页签"); + } + // ====== 第二阶段:全部页签校验通过后统一落库(同一事务,任一失败整体回滚) ====== + List results = new ArrayList<>(); + for (PreparedDeliveryOrder prepared : preparedOrders) { + // 出库单号在落库阶段逐张生成:此时上一张已入库(同事务内可见),取号递增不会重复; + // 校验阶段统一生成会因全部页签都未入库而取到相同号 + String orderNumber = reservationStockOutOrderApplicationService.generateReserveOrderNumber(); + ReservationStockOutOrderDO order = prepared.order; + order.setOutOrderNumber(orderNumber); + order.setBusinessOrderNo(orderNumber); + if (order.getMaterialDetailList() != null) { + for (ReservationOutMaterialDetailDO detail : order.getMaterialDetailList()) { + detail.setOutOrderNumber(orderNumber); + } + } + reservationStockOutOrderApplicationService.insert(order); + saveDeliveryLinks(prepared); + prepared.result.setOrderNumber(orderNumber); + results.add(prepared.result); + } + return results; + } + /** + * 枚举Excel全部工作表名(EasyExcel 3.x:excelExecutor().sheetList()) + */ + private List listSheetNames(byte[] fileBytes) { + List sheetNames = new ArrayList<>(); + try (ExcelReader reader = EasyExcel.read(new ByteArrayInputStream(fileBytes)).build()) { + for (ReadSheet readSheet : reader.excelExecutor().sheetList()) { + sheetNames.add(readSheet.getSheetName()); + } + } + return sheetNames; + } + + /** 出库单页签解析/校验/组装完成后的暂存容器(统一落库阶段使用) */ + private static class PreparedDeliveryOrder { + ReservationStockOutOrderDO order; + List customerDeliveryDetailList; + Map customerCache; + SheetImportResultDTO result; + } + + /** + * 单个页签的出库单解析+校验+组装(不落库,由调用方在全部页签通过后统一插入)。 + * 空页签(货品明细与客户配送明细均为空)返回 null 由调用方跳过。 + */ + private PreparedDeliveryOrder buildDeliveryOrder(byte[] fileBytes, String sheetName, Long warehouseId, LoginUser loginUser) throws Exception { // 关键变更:使用动态行数监听器 DynamicDeliveryExcelListener listener = new DynamicDeliveryExcelListener(); - try (InputStream inputStream = file.getInputStream()) { + try (InputStream inputStream = new ByteArrayInputStream(fileBytes)) { EasyExcel.read(inputStream, listener) .sheet(sheetName) .headRowNumber(0) // 无固定表头,全部行交由监听器处理 @@ -254,8 +328,17 @@ public class ReservationStockInOrderImpl extends ServiceImpl> shipperIds = new ArrayList<>(); Set processedShipperIds = new HashSet<>(); @@ -356,10 +439,8 @@ public class ReservationStockInOrderImpl extends ServiceImpl customerCache = prepared.customerCache; // 客户配送明细判空处理:为空时跳过关联保存 - for (CustomerDeliveryDetail customerDeliveryDetail : customerDeliveryDetailList) { + for (CustomerDeliveryDetail customerDeliveryDetail : prepared.customerDeliveryDetailList) { ReservationDeliveryDetailsLink reservationDeliveryDetailsLink = new ReservationDeliveryDetailsLink(); reservationDeliveryDetailsLink.setInvoiceNumber(customerDeliveryDetail.getInvoiceNo()); reservationDeliveryDetailsLink.setAmount(customerDeliveryDetail.getAmount()); @@ -507,7 +609,6 @@ public class ReservationStockInOrderImpl extends ServiceImpl parseStockInExcel(MultipartFile file, String sheetName) throws Exception { LoginUser loginUser = SecurityUtils.getLoginUser(); // 1. 校验文件 if (file.isEmpty()) { @@ -537,29 +637,78 @@ public class ReservationStockInOrderImpl extends ServiceImpl sheetNames; + if (sheetName != null && !sheetName.trim().isEmpty()) { + sheetNames = Collections.singletonList(sheetName.trim()); + } else { + sheetNames = listSheetNames(fileBytes); + } - // 3. 使用EasyExcel解析(指定监听器) + // ====== 第一阶段:逐页签解析+校验+组装(不落库),失败按页签聚合收集,全部页签处理完统一报错 ====== + List preparedOrders = new ArrayList<>(); + List sheetProblems = new ArrayList<>(); + // 本文件内已使用的模板OrderNO:各页签都未入库时 existsByBusinessOrderNo 查不到彼此,需按页签追加查重防跨页签重复 + Set usedBusinessOrderNos = new HashSet<>(); + for (String name : sheetNames) { + try { + PreparedStockInOrder prepared = buildStockInOrder(fileBytes, name, loginUser, usedBusinessOrderNos); + if (prepared != null) { + preparedOrders.add(prepared); // null=空页签,跳过 + } + } catch (Exception e) { + sheetProblems.add("页签[" + name + "]:" + (e.getMessage() == null ? e.toString() : e.getMessage())); + } + } + if (!sheetProblems.isEmpty()) { + throw new Exception(String.join(";", sheetProblems)); + } + if (preparedOrders.isEmpty()) { + throw new IllegalArgumentException("未解析到产品明细数据,请检查模板中是否填写了產品編號"); + } + + // ====== 第二阶段:全部页签校验通过后统一落库(同一事务,任一失败整体回滚) ====== + List results = new ArrayList<>(); + for (PreparedStockInOrder prepared : preparedOrders) { + insertApplication(prepared.order); + // 入库单号在落库阶段生成(insertDomain),回填到页签结果 + prepared.result.setOrderNumber(prepared.order.getInOrderNumber()); + results.add(prepared.result); + } + return results; + } + + /** 入库单页签解析/校验/组装完成后的暂存容器(统一落库阶段使用) */ + private static class PreparedStockInOrder { + ReservationStockInOrderDO order; + SheetImportResultDTO result; + } + + /** + * 单个页签的入库单解析+校验+组装(不落库,由调用方在全部页签通过后统一插入)。 + * 空页签(未解析到产品明细)返回 null 由调用方跳过。 + */ + private PreparedStockInOrder buildStockInOrder(byte[] fileBytes, String sheetName, LoginUser loginUser, Set usedBusinessOrderNos) throws Exception { + // 3. 使用EasyExcel解析(指定监听器,多页签模式下 sheetName 为实际页签名) StockInExcelListener listener = new StockInExcelListener(); - try (InputStream inputStream = file.getInputStream()) { + try (InputStream inputStream = new ByteArrayInputStream(fileBytes)) { EasyExcel.read(inputStream, listener) - .sheet(targetSheetName) // 指定工作表 + .sheet(sheetName) // 指定工作表 .headRowNumber(0) // 从第1行开始解析(不跳过任何行) .doRead(); } - // 4. 封装DTO返回 + // 4. 封装DTO StockInDataDTO resultDTO = new StockInDataDTO(); resultDTO.setStockInHeader(listener.getStockInHeader()); resultDTO.setProductDetailList(listener.getProductDetailList()); - LOGGER.info("Excel解析成功,工作表:{},产品明细数:{}", - targetSheetName, resultDTO.getProductDetailList().size()); + LOGGER.info("页签[{}]解析成功,产品明细数:{}", sheetName, resultDTO.getProductDetailList().size()); List productDetailList = resultDTO.getProductDetailList(); + // 空页签跳过:该页签未解析到产品明细时视为非数据页签(说明页/空表),不算失败 if (productDetailList == null || productDetailList.isEmpty()) { - throw new ServiceException("未解析到产品明细数据,请检查模板中是否填写了產品編號"); + return null; } StockInHeader stockInHeader = resultDTO.getStockInHeader(); // ====== 第一步:物料编号存在性校验(模板只填物料编号即可,名称按编号自动匹配) ====== @@ -664,6 +813,10 @@ public class ReservationStockInOrderImpl extends ServiceImpl 0) { throw new ServiceException("业务单号已存在:" + templateOrderNo + ",请修改模板中的OrderNO后重新导入"); } + // 多页签查重:各页签都未入库时上面的库查重互相看不见,需对本文件内已使用的OrderNO追加拦截 + if (!usedBusinessOrderNos.add(templateOrderNo)) { + throw new ServiceException("业务单号已存在:" + templateOrderNo + "(与本文件其他页签的OrderNO重复),请修改模板中的OrderNO后重新导入"); + } reservationStockInOrderDO.setBusinessOrderNo(templateOrderNo); } reservationStockInOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); @@ -740,8 +893,19 @@ public class ReservationStockInOrderImpl extends ServiceImpl result = new HashMap<>(); try { - DeliveryDataDTO deliveryDataDTO = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); - result.put("result", deliveryDataDTO); + // 多页签导入:Excel中每个工作表独立生成一张出库单,任一页签校验失败整体不落库 + List results = reservationStockInOrderService.parseExcelFile(file, "", warehouseId); + // result 保留第一个页签的解析数据(兼容老前端);results 为全部页签结果 + result.put("result", results.isEmpty() ? null : results.get(0).getDeliveryData()); + result.put("results", results); result.put("code", 200); - result.put("msg", "解析成功"); + String orderNumbers = results.stream() + .map(SheetImportResultDTO::getOrderNumber) + .collect(java.util.stream.Collectors.joining("、")); + result.put("msg", "成功导入" + results.size() + "张出库单:" + orderNumbers); return new ResponseEntity<>(result, HttpStatus.OK); } catch (IllegalArgumentException e) { result.put("code", 400); @@ -237,18 +244,23 @@ public class ReservationStockInOrderApi extends BaseController { } /** - * 接口1:仅解析Excel文件(返回解析结果,不保存) - * 用途:预览Excel解析数据 + * 接口1:解析并导入入库单Excel(多页签:不传sheetName时每个工作表独立生成一张入库单,任一页签校验失败整体不落库) */ @PostMapping("/parse-excel") public ResponseEntity> parseStockInExcel( @RequestParam("file") MultipartFile file, @RequestParam(value = "sheetName", required = false) String sheetName) { try { - StockInDataDTO resultDTO = reservationStockInOrderService.parseStockInExcel(file, sheetName); + List results = reservationStockInOrderService.parseStockInExcel(file, sheetName); Map result = new HashMap<>(); - result.put("result", resultDTO); - result.put("code",200); + // result 保留第一个页签的解析数据(兼容老前端);results 为全部页签结果 + result.put("result", results.isEmpty() ? null : results.get(0).getStockInData()); + result.put("results", results); + result.put("code", 200); + String orderNumbers = results.stream() + .map(SheetImportResultDTO::getOrderNumber) + .collect(java.util.stream.Collectors.joining("、")); + result.put("msg", "成功导入" + results.size() + "张入库单:" + orderNumbers); return new ResponseEntity<>(result, HttpStatus.OK); } catch (IllegalArgumentException e) { // 参数错误(如文件为空) From 762c49cd0f3ef6459916e51ce3bd5ff35e70b0cd Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Fri, 4 Sep 2026 11:10:20 +0800 Subject: [PATCH 087/101] =?UTF-8?q?=E5=8F=91=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd_wms/src/main/resources/bootstrap.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mhd_wms/src/main/resources/bootstrap.yml b/mhd_wms/src/main/resources/bootstrap.yml index 52ade270d..39eb710cb 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.30: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: + server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 +# server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From edb7a5343d6eaa0277a036e1f3cf5d2d9cc50191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 11:37:06 +0800 Subject: [PATCH 088/101] =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stockOutOrder/StockOutOrderApplicationService.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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 7dfe88da6..af7cae9d0 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 @@ -1005,7 +1005,8 @@ public class StockOutOrderApplicationService { } BeanUtils.copyProperties(stockOutOrderDb, stockOutOrderD); List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() - .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag,1)); List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); List materialDetailList2 = new ArrayList<>(); // 仅通宇账号启用与库存分配弹窗同口径的新匹配(物料+箱号/卡板+Sheet Ref 多值拆 token); @@ -1103,7 +1104,8 @@ public class StockOutOrderApplicationService { } BeanUtils.copyProperties(stockOutOrderDb, stockOutOrderD); List outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda() - .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber())); + .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDb.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag, 1)); List materialDetailList = cn.hutool.core.bean.BeanUtil.copyToList(outMaterialDetailList, OutMaterialDetailDO.class); List materialDetailList2 = new ArrayList<>(); for (OutMaterialDetailDO detail : materialDetailList) { @@ -1441,7 +1443,9 @@ public class StockOutOrderApplicationService { List returnOutMaterialDetailDOList = new ArrayList<>(); for (OutMaterialDetailDO outMaterialDetailDO : stockOutOrderDO.getMaterialDetailList()){ Long uniqueId = outMaterialDetailDO.getUniqueId(); - OutMaterialDetail outMaterialDetail = outMaterialDetailService.getOne(new LambdaQueryWrapper().eq(OutMaterialDetail::getUniqueId, uniqueId)); + OutMaterialDetail outMaterialDetail = outMaterialDetailService.getOne(new LambdaQueryWrapper() + .eq(OutMaterialDetail::getUniqueId, uniqueId) + .eq(OutMaterialDetail::getDelFlag,1)); if (outMaterialDetail == null){ throw new ServiceException("出库明细不存在"); } From 9fd3d34610db1e73a6974548a4d06bbe8f25187e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 11:51:10 +0800 Subject: [PATCH 089/101] =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stockOutOrder/service/StockOutOrderDomainService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 18af0e37e..57a0b3801 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 @@ -1436,7 +1436,10 @@ public class StockOutOrderDomainService { stockOutOrderService.update(stockOutOrder, new UpdateWrapper().lambda().in(StockOutOrder::getOutOrderId, stockOutOrderId)); List stockOutOrderNumber = stockOutOrderList.stream().map(StockOutOrder::getOutOrderNumber).collect(Collectors.toList()); - List list = outMaterialDetailService.list(new QueryWrapper().lambda().in(OutMaterialDetail::getOutOrderNumber, stockOutOrderNumber).eq(OutMaterialDetail::getGenPickingOrder, 2)); + List list = outMaterialDetailService.list(new QueryWrapper().lambda() + .in(OutMaterialDetail::getOutOrderNumber, stockOutOrderNumber) + .eq(OutMaterialDetail::getGenPickingOrder, 2) + .eq(OutMaterialDetail::getDelFlag, 1)); if (CollectionUtils.isEmpty(list)){ throw new ServiceException("不存在已分配且未生成拣货单的物料明细,无法生成拣货单!"); } From 94d05cca9cfb96e30eef0438823389d12c8946f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 11:52:53 +0800 Subject: [PATCH 090/101] =?UTF-8?q?=E5=8F=9131?= 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 0d65c89a1..e37c5e3cf 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.33.0.129:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32: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 8a7006304..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.33.0.99:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 ba9a45148..d976fcc98 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.33.0.129:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 7fbd7dd9b..1fe69a003 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, url = "http://10.102.192.32: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 beba5b1af..750ed853e 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.33.0.99:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 9fd21ae67..2268b61c6 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.33.0.129:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 376500b1c..8c86ae1ad 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.33.0.129:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31: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 39eb710cb..e8f169bf2 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.30: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.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From ee7dbfcfb97543551f29debb26eccc2fd04f0e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 11:55:45 +0800 Subject: [PATCH 091/101] =?UTF-8?q?=E5=8F=9130?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 e37c5e3cf..ff342323e 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 @@ -18,7 +18,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.102.192.3: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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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..e4a817238 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.102.192.30: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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 2268b61c6..61f781399 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30: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..fc7380c20 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 03978d23d78853f1fc7976dcfbb2633c7d2af7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 12:17:28 +0800 Subject: [PATCH 092/101] =?UTF-8?q?=E5=8F=9130?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/OutMaterialDetailImpl.java | 8 ++++++-- .../pickingOrder/service/PickingOrderDomainService.java | 4 +++- .../pickingOrder/service/ReviewOrderDomainService.java | 3 ++- .../repository/persistence/ShiftMaterialDetailImpl.java | 7 +++++-- 4 files changed, 16 insertions(+), 6 deletions(-) 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 ee2655055..1865c6e22 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 @@ -551,7 +551,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1)); for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { BigDecimal nowAllocationQuantity = outMaterialDetail.getNowAllocationQuantity(); if (nowAllocationQuantity == null || nowAllocationQuantity.compareTo(BigDecimal.ZERO) <= 0) { @@ -700,7 +702,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag,1)); for (OutMaterialDetail outMaterialDetail : outMaterialDetailList) { BigDecimal nowAllocationQuantity = outMaterialDetail.getNowAllocationQuantity(); if (nowAllocationQuantity == null || nowAllocationQuantity.compareTo(BigDecimal.ZERO) <= 0) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java index d79187f09..078a926d6 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java @@ -522,7 +522,9 @@ public class PickingOrderDomainService { List list = pickingMaterialDetailService.list(new QueryWrapper().lambda().eq(PickingMaterialDetail::getPickingOrderNumber, pickingOrder.getPickingOrderNumber())); for (PickingMaterialDetail pickingMaterialDetail :list){ - OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda().eq(OutMaterialDetail::getUniqueId, pickingMaterialDetail.getOutUniqueId())); + OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getUniqueId, pickingMaterialDetail.getOutUniqueId()) + .eq(OutMaterialDetail::getDelFlag,1)); outMaterialDetail.setPickingQuantity(pickingMaterialDetail.getPickingQuantity()); outMaterialDetailMapper.updateById(outMaterialDetail); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java index 56ecf7782..054f14b46 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/ReviewOrderDomainService.java @@ -260,7 +260,8 @@ public class ReviewOrderDomainService { .eq(OutMaterialDetail::getDelFlag, 1)); if (outMd == null) { outMd = outMaterialDetailMapper.selectOne(new LambdaQueryWrapper() - .eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId())); + .eq(OutMaterialDetail::getUniqueId, line.getOutUniqueId()) + .eq(OutMaterialDetail::getDelFlag, 1)); } if (outMd != null) { d.setMaterialDetailId(outMd.getMaterialDetailId()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java index 44f73bcaf..945430d61 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/shiftMaterialDetail/repository/persistence/ShiftMaterialDetailImpl.java @@ -20,6 +20,7 @@ import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventory 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.MaterialInventoryDO; +import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetailSerialNumber.entity.OutMaterialDetailSerialNumber; import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.facade.IOutMaterialDetailSerialNumberService; import com.mhd.wms.domain.outMaterialDetailSerialNumber.repository.todo.OutMaterialDetailSerialNumberDO; @@ -153,7 +154,9 @@ public class ShiftMaterialDetailImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); // 按照物料名称排序 - lqw.eq(ShiftMaterialDetail::getShiftIoDetailId, shiftIoDetailId).orderByAsc(ShiftMaterialDetail::getMaterialName); + lqw.eq(ShiftMaterialDetail::getShiftIoDetailId, shiftIoDetailId) + .eq(ShiftMaterialDetail::getDelFlag, 1) + .orderByAsc(ShiftMaterialDetail::getMaterialName); ShiftMaterialDetail shiftMaterialDetail = shiftMaterialDetailMapper.selectOne(lqw); ShiftMaterialDetailPO shiftMaterialDetailPO = new ShiftMaterialDetailPO(); BeanUtils.copyProperties(shiftMaterialDetail, shiftMaterialDetailPO); @@ -888,4 +891,4 @@ public class ShiftMaterialDetailImpl extends ServiceImpl Date: Fri, 4 Sep 2026 12:21:17 +0800 Subject: [PATCH 093/101] =?UTF-8?q?=E5=8F=9131?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 ff342323e..e37c5e3cf 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32: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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 e4a817238..d976fcc98 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.30:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 61f781399..2268b61c6 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.30:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31: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 fc7380c20..e8f169bf2 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 12e43080b8af43e019e1446aa4d03b3a76851b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 13:55:07 +0800 Subject: [PATCH 094/101] =?UTF-8?q?=E5=8F=9131?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExecutionStockOutOrderDomainService.java | 4 +++- .../ReservationStockOutOrderDomainService.java | 4 +++- .../ReservationStockOutOrderApi.java | 6 ++++-- .../ReserveStockOutOrderApi.java | 7 +++++-- .../ExecutionStockOutOrderApi.java | 7 +++++-- .../repository/persistence/DeliveTaskImpl.java | 5 +++-- .../service/HandoverTaskOrderDomainService.java | 1 + .../persistence/OutMaterialDetailImpl.java | 10 ++++++++-- .../service/PickingOrderDomainService.java | 8 +++++--- .../pushSyncBms/PushSyncBmsDomainService.java | 6 +++--- .../SowingDistributionDetailsImpl.java | 15 ++++++++++----- .../service/StockOutTaskOrderDomainService.java | 7 +++++-- .../facadeApi/stockOutOrder/StockOutOrderApi.java | 2 ++ 13 files changed, 57 insertions(+), 25 deletions(-) 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 311b600ae..faa399de7 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 @@ -1028,7 +1028,9 @@ public class ExecutionStockOutOrderDomainService { ReservationDeliveryDetailsLink reservationDeliveryDetailsLink = list.get(0); String orderNumber = reservationDeliveryDetailsLink.getOrderNumber(); Integer bag = reservationDeliveryDetailsLink.getBag(); - ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda().eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber), false); + ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber) + .eq(ExecutionStockOutOrder::getDelFlag,1), false); if (stockOutOrder != null) { ExecutionStockInOrder reservationStockInOrder = new ExecutionStockInOrder(); reservationStockInOrder.setPictureUrl(pictureUrl); 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 a90e17cdb..84c3abc6b 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 @@ -1220,7 +1220,9 @@ public class ReservationStockOutOrderDomainService { ReservationDeliveryDetailsLink reservationDeliveryDetailsLink = list.get(0); String orderNumber = reservationDeliveryDetailsLink.getOrderNumber(); Integer bag = reservationDeliveryDetailsLink.getBag(); - ReservationStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda().eq(ReservationStockOutOrder::getOutOrderNumber, orderNumber), false); + ReservationStockOutOrder stockOutOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(ReservationStockOutOrder::getOutOrderNumber, orderNumber) + .eq(ReservationStockOutOrder::getDelFlag,1), false); if (stockOutOrder != null) { ReservationStockInOrder reservationStockInOrder = new ReservationStockInOrder(); reservationStockInOrder.setPictureUrl(pictureUrl); 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 77dd5ebf6..28114c62b 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 @@ -104,7 +104,8 @@ public class ReservationStockOutOrderApi extends BaseController { { // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 ReservationStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ReservationStockOutOrder::getOutOrderNumber, outOrderNumber)); + .eq(ReservationStockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(ReservationStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } @@ -122,7 +123,8 @@ public class ReservationStockOutOrderApi extends BaseController { return AjaxResult.error("orderNumber不能为空"); } ReservationStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ReservationStockOutOrder::getOutOrderNumber, orderNumber)); + .eq(ReservationStockOutOrder::getOutOrderNumber, orderNumber) + .eq(ReservationStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java index 5be6eb209..0b3d587e7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/ReserveStockOutOrder/ReserveStockOutOrderApi.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder; import com.mhd.oms.domain.reserveOutMaterialDetail.repository.po.ReserveOutMaterialDetailPO; import com.mhd.oms.domain.reserveStockInOrder.repository.listener.ValidationException; import com.mhd.oms.domain.reserveStockInOrder.repository.todo.ReserveStockInOrderDO; @@ -149,7 +150,8 @@ public class ReserveStockOutOrderApi extends BaseController { { // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 ReserveStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ReserveStockOutOrder::getOutOrderNumber, outOrderNumber)); + .eq(ReserveStockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(ReserveStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } @@ -167,7 +169,8 @@ public class ReserveStockOutOrderApi extends BaseController { return AjaxResult.error("orderNumber不能为空"); } ReserveStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ReserveStockOutOrder::getOutOrderNumber, orderNumber)); + .eq(ReserveStockOutOrder::getOutOrderNumber, orderNumber) + .eq(ReserveStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } diff --git a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java index 271db670f..d0c679bc3 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java +++ b/mhd_oms/src/main/java/com/mhd/oms/interfaces/facade/executionStockOutOrder/ExecutionStockOutOrderApi.java @@ -12,6 +12,7 @@ import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockO import com.mhd.oms.domain.executionStockOutOrder.repository.todo.ExecutionStockOutOrderDTO; import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderApplicationService; import com.mhd.oms.domain.executionStockOutOrder.service.ExecutionStockOutOrderAssembler; +import com.mhd.oms.domain.reservationStockOutOrder.entity.ReservationStockOutOrder; import com.mhd.system.api.domain.OutMaterialDetailTZPD; import com.mhd.system.api.domain.StockOutOrderTZPD; import io.swagger.annotations.ApiOperation; @@ -102,7 +103,8 @@ public class ExecutionStockOutOrderApi extends BaseController { { // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ExecutionStockOutOrder::getOutOrderNumber, outOrderNumber)); + .eq(ExecutionStockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(ExecutionStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } @@ -120,7 +122,8 @@ public class ExecutionStockOutOrderApi extends BaseController { return AjaxResult.error("orderNumber不能为空"); } ExecutionStockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber)); + .eq(ExecutionStockOutOrder::getOutOrderNumber, orderNumber) + .eq(ExecutionStockOutOrder::getDelFlag,1)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java index 5d9fbaa99..df5867e8d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java @@ -120,7 +120,8 @@ public class DeliveTaskImpl extends ServiceImpl im String orderNumber = handoverTaskOrder.getOrderNumber();//出库单号 // 已复核数量、出库单信息:直接从出库单获取(需在物料统计前获取,用于判断是否需要复核) StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(StockOutOrder::getOutOrderNumber, orderNumber)); + .eq(StockOutOrder::getOutOrderNumber, orderNumber) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder != null) { deliveTaskPO.setOutOrderNumber(stockOutOrder.getOutOrderNumber()); deliveTaskPO.setOutOrderStatus(stockOutOrder.getStatus()); @@ -297,4 +298,4 @@ public class DeliveTaskImpl extends ServiceImpl im public DeliveTaskPO querySum(DeliveTaskDO deliveTaskDO) { return deliveTaskMapper.querySum(deliveTaskDO); } -} +} \ No newline at end of file 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 e9ecea6d7..e7e0d0941 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 @@ -407,6 +407,7 @@ public class HandoverTaskOrderDomainService { //交接完成节点修改库存 String orderNumber = handoverTaskOrder.getOrderNumber(); StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, orderNumber)); if (stockOutOrder == null) { continue; 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 1865c6e22..a473fa5ed 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 @@ -999,7 +999,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); for (OutMaterialDetailDO outMaterialDetail : outMaterialDetailList) { Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); BigDecimal allocationQuantity = outMaterialDetail.getActualQuantity(); @@ -1109,7 +1111,9 @@ public class OutMaterialDetailImpl extends ServiceImpl outMaterialDetailList,String outOrderNumber,LoginUser loginUser) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getDelFlag,1) + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); for (OutMaterialDetailDO outMaterialDetail : outMaterialDetailList) { Long materialInventoryId = outMaterialDetail.getMaterialInventoryId(); BigDecimal allocationQuantity = outMaterialDetail.getActualQuantity(); @@ -1245,11 +1249,13 @@ public class OutMaterialDetailImpl extends ServiceImpl().lambda() .eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderDO.getOutOrderNumber()) + .eq(OutMaterialDetail::getDelFlag,1) .eq(OutMaterialDetail::getBarCode, stockOutOrderDO.getBarCode())); }else { OutMaterialDetailSerialNumber outMaterialDetailSerialNumber = outMaterialDetailSerialNumberService.getOne(new QueryWrapper().lambda() .eq(OutMaterialDetailSerialNumber::getSerialNumber, stockOutOrderDO.getSerialNumber())); outMaterialDetailDb = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getDelFlag,1) .eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); } if(outMaterialDetailDb == null){ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java index 078a926d6..d255f2cea 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java @@ -401,7 +401,8 @@ public class PickingOrderDomainService { // 拣货提交(/pickingOrderApi/picking)一次拣满也会完成拣货,此前仅 completePicking 会生成复核单,此处对齐 if (Boolean.TRUE.equals(updated) && Integer.valueOf(1).equals(pickingOrderPODb.getType())) { StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() - .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder != null) { Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, stockOutOrder); if (newReviewId != null) { @@ -493,7 +494,8 @@ public class PickingOrderDomainService { int status = 6; //不需要复核的单子 标记出库单完成 StockOutOrder stockOutOrderDb = stockOutOrderService.getOne(new QueryWrapper().lambda() - .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); + .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); // 与下发拣货数量比较:只下发部分时用拣货计划数量,否则用出库单总数量 List allPickingOrders = pickingOrderService.list(new QueryWrapper().lambda() .eq(PickingOrder::getDelFlag, 1) @@ -736,7 +738,7 @@ public class PickingOrderDomainService { throw new ServiceException("拣货单不存在"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockOutOrder::getOutOrderNumber, pickingOrderPO.getOrderNumber()); + queryWrapper.eq(StockOutOrder::getDelFlag,1).eq(StockOutOrder::getOutOrderNumber, pickingOrderPO.getOrderNumber()); StockOutOrder stockOutOrder = stockOutOrderService.getOne(queryWrapper); if(null == stockOutOrder){ throw new ServiceException("出库单不存在"); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java index 14861f700..85876594f 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pushSyncBms/PushSyncBmsDomainService.java @@ -48,7 +48,7 @@ public class PushSyncBmsDomainService { public void pushInShelfOrder(String inOrderNumber) { // 根据入库单号,查询入库单信息,并拼接推送所需参数 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockInOrder::getInOrderNumber, inOrderNumber); + queryWrapper.eq(StockInOrder::getInOrderNumber, inOrderNumber).eq(StockInOrder::getDelFlag,1); StockInOrder stockInOrder = iStockInOrderService.getOne(queryWrapper); if(null == stockInOrder){ throw new ServiceException("入库单信息未找到"); @@ -96,7 +96,7 @@ public class PushSyncBmsDomainService { */ public void pushOutOrder(String outOrderNumber) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(StockOutOrder::getOutOrderNumber, outOrderNumber); + queryWrapper.eq(StockOutOrder::getOutOrderNumber, outOrderNumber).eq(StockOutOrder::getDelFlag,1); StockOutOrder stockOutOrder = iStockOutOrderService.getOne(queryWrapper); if(null == stockOutOrder){ throw new ServiceException("出库单信息未找到"); @@ -153,4 +153,4 @@ public class PushSyncBmsDomainService { } -} +} \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/sowingDistributionDetails/repository/persistence/SowingDistributionDetailsImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/sowingDistributionDetails/repository/persistence/SowingDistributionDetailsImpl.java index 6cbb43dbd..4be0031fa 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/sowingDistributionDetails/repository/persistence/SowingDistributionDetailsImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/sowingDistributionDetails/repository/persistence/SowingDistributionDetailsImpl.java @@ -233,8 +233,9 @@ public class SowingDistributionDetailsImpl extends ServiceImpl().lambda(). - eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); + OutMaterialDetail outMaterialDetail = outMaterialDetailMapper.selectOne(new QueryWrapper().lambda() + .eq(OutMaterialDetail::getDelFlag,1) + .eq(OutMaterialDetail::getUniqueId, outMaterialDetailSerialNumber.getMaterialDetailUniqueId())); if (outMaterialDetail == null){ throw new ServiceException("物料不存在"); } @@ -273,7 +274,9 @@ public class SowingDistributionDetailsImpl extends ServiceImpl allocationByOrder(AllocationByOrderDO allocationByOrderDO) { - StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda().eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber())); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder == null){ throw new ServiceException("出库单不存在"); } @@ -306,7 +309,9 @@ public class SowingDistributionDetailsImpl extends ServiceImpl().lambda().eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber())); + StockOutOrder stockOutOrder = stockOutOrderMapper.selectOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, allocationByOrderDO.getOutOrderNumber()) + .eq(StockOutOrder::getDelFlag,1)); if (stockOutOrder == null){ throw new ServiceException("出库单不存在"); } @@ -356,4 +361,4 @@ public class SowingDistributionDetailsImpl extends ServiceImpl().lambda().eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber())); + PickingOrder onePickingOrder = pickingOrderService.getOne(new QueryWrapper().lambda() + .eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber()) + .eq(PickingOrder::getDelFlag,1)); PickingOrderPO pickingOrderPODb = pickingOrderService.getInfoByIdAndType(onePickingOrder.getPickingOrderId(), onePickingOrder.getType()); return updateStockOutOrder(pickingOrderPODb); } @@ -938,6 +940,7 @@ public class StockOutTaskOrderDomainService { // 与 PickingOrderDomainService.picking 一致:PDA 按物料拣货/作业单路径拣满时只走本方法,需触发生成复核单 if (stockOutUpdated) { StockOutOrder so = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, pickingOrderPODb.getOrderNumber())); if (so != null) { Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPODb, so); @@ -1068,4 +1071,4 @@ public class StockOutTaskOrderDomainService { } } -} +} \ No newline at end of file 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 6e3d11735..eb8575300 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 @@ -208,6 +208,7 @@ public class StockOutOrderApi extends BaseController { public AjaxResult getInfoOutOrderNumber(String outOrderNumber) { // 根据出库单号查询出库单,再按出库单ID查询详情,保证与出库管理页面一致 StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, outOrderNumber)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); @@ -226,6 +227,7 @@ public class StockOutOrderApi extends BaseController { return AjaxResult.error("orderNumber不能为空"); } StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getDelFlag,1) .eq(StockOutOrder::getOutOrderNumber, orderNumber)); if (stockOutOrder == null) { return AjaxResult.error("出库单不存在"); From 6b3912aae9f3be93eda7862e56b6769986bc516e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Fri, 4 Sep 2026 13:59:37 +0800 Subject: [PATCH 095/101] =?UTF-8?q?=E5=8F=9130?= 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 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_wms/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 e37c5e3cf..ff342323e 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 @@ -18,7 +18,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.102.192.3: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 4ef3bed80..e9418197a 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; 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.102.192.4: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..e4a817238 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.102.192.30: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 1fe69a003..26a92624c 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.102.192.3: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..12571141a 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.102.192.4: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 2268b61c6..61f781399 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.102.192.30: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 8c86ae1ad..ca93d3312 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.102.192.30: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..fc7380c20 100644 --- a/mhd_wms/src/main/resources/bootstrap.yml +++ b/mhd_wms/src/main/resources/bootstrap.yml @@ -16,7 +16,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -25,7 +25,7 @@ spring: # server-addr: 127.0.0.1:8848 # server-addr: 10.33.0.129:6010 # 线上测试环境配置 容器名+端口号 - server-addr: 10.102.192.31:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 From 4755d4e62bf2308b0472032da51acb063f749b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 5 Sep 2026 10:30:36 +0800 Subject: [PATCH 096/101] 30 --- .../src/main/resources/bootstrap.yml | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index bdc9a37f6..301f8c7fb 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/src/main/resources/bootstrap.yml @@ -18,15 +18,17 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 + # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 config: - server-addr: 127.0.0.1:8848 +# server-addr: 127.0.0.1:8848 + # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 -# server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.30:6848 username: nacos password: manhuoda@2023 #线上正式环境 @@ -35,4 +37,12 @@ spring: file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + +# Feign 超时 +feign: + client: + config: + default: + connectTimeout: 10000 + readTimeout: 300000 \ No newline at end of file From b46483263bdf4927f2b25f13b2d1fb39ef6f6d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 5 Sep 2026 10:36:12 +0800 Subject: [PATCH 097/101] 31 --- .../src/main/java/com/mhd/system/api/BmsServiceFeign.java | 2 +- .../src/main/java/com/mhd/system/api/OmsServiceFeign.java | 2 +- .../src/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 +- .../mhd/oms/infrastructure/feign/ThirdPartyServiceFeign.java | 2 +- mhd_thrid_party/src/main/resources/bootstrap.yml | 4 ++-- 8 files changed, 9 insertions(+), 9 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 ff342323e..e37c5e3cf 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 @@ -18,7 +18,7 @@ import java.util.Set; /** * bms财务结算系统feign调用接口 */ -@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.3:8012",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "BmsService", value = ServiceNameConstants.BMS_SERVICE, url = "http://10.102.192.32: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 e9418197a..4ef3bed80 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 @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import java.util.List; import java.util.concurrent.CompletableFuture; -@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.4:8017",fallbackFactory = RemoteOmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "OmsService", value = ServiceNameConstants.OMS_SERVICE,url = "http://10.102.192.33: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 e4a817238..d976fcc98 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.30:8014",configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "commonWlhyServiceFeign",value = ServiceNameConstants.WLHY_SERVICE,url = "http://10.102.192.31: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 26a92624c..1fe69a003 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.3:8016",fallbackFactory = RemoteWmsFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "remoteWmsServiceFeign",value = ServiceNameConstants.WMS_SERVICE, url = "http://10.102.192.32: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 12571141a..750ed853e 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.4:8018",fallbackFactory = RemoteBmsFeignFallbackFactory.class, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "YmsService", value = ServiceNameConstants.YMS_SERVICE,url = "http://10.102.192.33: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 61f781399..2268b61c6 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.30:8012",configuration = FeignAutoConfiguration.class) +@FeignClient(value = "mhd-third-party-service",url = "http://10.102.192.31: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 ca93d3312..8c86ae1ad 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.30:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) +@FeignClient(contextId = "thirdPartyServiceFeign",url = "http://10.102.192.31:8012", value = ServiceNameConstants.THIRDPARTY_CENTER, configuration = FeignAutoConfiguration.class) public interface ThirdPartyServiceFeign { //查询当前组织所有三方接口信息 diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index 301f8c7fb..abae2544b 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/src/main/resources/bootstrap.yml @@ -21,14 +21,14 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.33.0.129:6010 - server-addr: 10.102.192.30:6848 + server-addr: 10.102.192.31:6848 username: nacos password: manhuoda@2023 #线上正式环境 From c0bcedbdc3d4852ad75a89980735642b04839123 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Sat, 5 Sep 2026 13:38:06 +0800 Subject: [PATCH 098/101] =?UTF-8?q?fix(wms,oms):=20JSON=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E5=85=BC=E5=AE=B9yyyy-MM-d?= =?UTF-8?q?d=E7=BA=AF=E6=97=A5=E6=9C=9F=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 库存查询日期只保留年月日后,前端回传纯日期(如 createTime=2026-07-06)触发 @JsonFormat("yyyy-MM-dd HH:mm:ss") 严格格式反序列化 InvalidFormatException - 新增 FlexibleDateDeserializer:字段 @JsonFormat 模式优先严格解析,失败后兼容 yyyy-MM-dd HH:mm:ss / yyyy-MM-dd HH:mm / yyyy-MM-dd / 时间戳 / ISO-8601 - 仅在 OMS/WMS 通过 Module Bean 注册生效,不改动 BaseVOEntity 全局行为 --- .../jackson/FlexibleDateDeserializer.java | 112 ++++++++++++++++++ .../oms/config/DateCompatibilityConfig.java | 33 ++++++ .../wms/config/DateCompatibilityConfig.java | 33 ++++++ 3 files changed, 178 insertions(+) create mode 100644 mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/jackson/FlexibleDateDeserializer.java create mode 100644 mhd_oms/src/main/java/com/mhd/oms/config/DateCompatibilityConfig.java create mode 100644 mhd_wms/src/main/java/com/mhd/wms/config/DateCompatibilityConfig.java diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/jackson/FlexibleDateDeserializer.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/jackson/FlexibleDateDeserializer.java new file mode 100644 index 000000000..91dc9d344 --- /dev/null +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/jackson/FlexibleDateDeserializer.java @@ -0,0 +1,112 @@ +package com.mhd.common.core.jackson; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.deser.ContextualDeserializer; + +import java.io.IOException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 宽松日期反序列化:兼容 yyyy-MM-dd(纯日期)等常见格式。 + * + * 背景:库存查询等接口日期只保留年月日后,前端可能把 "2026-07-06" 这类纯日期回传, + * 而实体/DTO 上 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 是严格格式,反序列化直接报 + * InvalidFormatException。本反序列化器解析顺序: + * 1) 字段 @JsonFormat 指定的模式(严格全匹配,保持原行为); + * 2) 兜底常见格式:yyyy-MM-dd HH:mm:ss → yyyy-MM-dd HH:mm → yyyy-MM-dd; + * 3) 纯数字按毫秒时间戳; + * 4) 交给 Jackson 默认解析(ISO-8601 等)。 + * 仅放宽接受范围,不影响任何既有格式的解析结果;由各服务 DateCompatibilityConfig 显式注册生效。 + * + * @author rcx + * @date 2026-09-05 + */ +public class FlexibleDateDeserializer extends JsonDeserializer implements ContextualDeserializer { + + /** 兜底格式按长度降序排列,避免长文本被短格式部分解析 */ + private static final String[] FALLBACK_PATTERNS = { + "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd" + }; + + /** 字段 @JsonFormat 指定的模式,可为空 */ + private final String pattern; + + public FlexibleDateDeserializer() { + this(null); + } + + public FlexibleDateDeserializer(String pattern) { + this.pattern = pattern; + } + + @Override + public Date deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException { + String value = parser.getText(); + if (value == null || value.trim().isEmpty()) { + return null; + } + value = value.trim(); + + // 纯数字按毫秒时间戳(10位秒级时间戳也兼容) + if (value.matches("\\d{10,}")) { + return new Date(Long.parseLong(value)); + } + + // 1) 字段 @JsonFormat 指定的模式优先 + Date parsed = tryParse(value, pattern); + // 2) 兜底常见格式 + if (parsed == null) { + for (String fallback : FALLBACK_PATTERNS) { + parsed = tryParse(value, fallback); + if (parsed != null) { + break; + } + } + } + // 3) 交给 Jackson 默认解析(ISO-8601 等) + if (parsed == null) { + try { + parsed = ctxt.parseDate(value); + } catch (IllegalArgumentException ignore) { + // 走不到默认解析时统一在下方抛出友好异常 + } + } + if (parsed == null) { + throw ctxt.weirdStringException(value, Date.class, + "支持格式:yyyy-MM-dd HH:mm:ss / yyyy-MM-dd HH:mm / yyyy-MM-dd"); + } + return parsed; + } + + /** + * 严格全匹配解析:解析失败或文本未完整消费(如按 yyyy-MM-dd 解析 "2026-07-06 10:00:00") + * 都视为不匹配返回 null,交由下一个格式尝试 + */ + private Date tryParse(String value, String pattern) { + if (pattern == null || pattern.isEmpty()) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + sdf.setLenient(false); + ParsePosition pos = new ParsePosition(0); + Date date = sdf.parse(value, pos); + return (date != null && pos.getIndex() == value.length()) ? date : null; + } + + @Override + public JsonDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { + if (property != null) { + JsonFormat jsonFormat = property.getAnnotation(JsonFormat.class); + if (jsonFormat != null && jsonFormat.pattern() != null && !jsonFormat.pattern().isEmpty()) { + return new FlexibleDateDeserializer(jsonFormat.pattern()); + } + } + return this; + } +} diff --git a/mhd_oms/src/main/java/com/mhd/oms/config/DateCompatibilityConfig.java b/mhd_oms/src/main/java/com/mhd/oms/config/DateCompatibilityConfig.java new file mode 100644 index 000000000..714c4c851 --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/config/DateCompatibilityConfig.java @@ -0,0 +1,33 @@ +package com.mhd.oms.config; + +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.mhd.common.core.jackson.FlexibleDateDeserializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Date; + +/** + * JSON 日期反序列化兼容配置:Date 字段兼容 yyyy-MM-dd(纯日期)等格式。 + * + * 背景:库存查询日期只保留年月日后,前端回传纯日期(如 createTime=2026-07-06)时, + * 实体/DTO 上 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 严格格式反序列化报 + * InvalidFormatException。注册 FlexibleDateDeserializer 后优先按字段 @JsonFormat + * 严格解析,失败时兼容纯日期等常见格式(与 WMS 库存查询一致)。 + * + * Spring Boot 会自动把容器中的 Module Bean 注册进 MVC 使用的 ObjectMapper。 + * + * @author rcx + * @date 2026-09-05 + */ +@Configuration +public class DateCompatibilityConfig { + + @Bean + public Module flexibleDateModule() { + SimpleModule module = new SimpleModule("oms-flexible-date-module"); + module.addDeserializer(Date.class, new FlexibleDateDeserializer()); + return module; + } +} diff --git a/mhd_wms/src/main/java/com/mhd/wms/config/DateCompatibilityConfig.java b/mhd_wms/src/main/java/com/mhd/wms/config/DateCompatibilityConfig.java new file mode 100644 index 000000000..8763207b7 --- /dev/null +++ b/mhd_wms/src/main/java/com/mhd/wms/config/DateCompatibilityConfig.java @@ -0,0 +1,33 @@ +package com.mhd.wms.config; + +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.mhd.common.core.jackson.FlexibleDateDeserializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Date; + +/** + * JSON 日期反序列化兼容配置:Date 字段兼容 yyyy-MM-dd(纯日期)等格式。 + * + * 背景:库存查询日期只保留年月日后,前端回传纯日期(如 createTime=2026-07-06)时, + * 实体/DTO 上 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 严格格式反序列化报 + * InvalidFormatException。注册 FlexibleDateDeserializer 后优先按字段 @JsonFormat + * 严格解析,失败时兼容纯日期等常见格式(与 OMS 库存查询一致)。 + * + * Spring Boot 会自动把容器中的 Module Bean 注册进 MVC 使用的 ObjectMapper。 + * + * @author rcx + * @date 2026-09-05 + */ +@Configuration +public class DateCompatibilityConfig { + + @Bean + public Module flexibleDateModule() { + SimpleModule module = new SimpleModule("wms-flexible-date-module"); + module.addDeserializer(Date.class, new FlexibleDateDeserializer()); + return module; + } +} From be8ba4506763082fa052519bfd1e59bd719fbfa0 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Sat, 5 Sep 2026 13:42:02 +0800 Subject: [PATCH 099/101] =?UTF-8?q?fix(oms,wms):=20=E5=87=BA=E5=BA=93?= =?UTF-8?q?=E5=8D=95=E4=B8=8B=E5=8F=91WMS=E5=A4=B1=E8=B4=A5=E8=A2=AB?= =?UTF-8?q?=E9=9D=99=E9=BB=98=E5=90=9E=E6=8E=89=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?WMS=E5=87=BA=E5=BA=93=E6=8B=A3=E8=B4=A7=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BAOMS=E5=8D=95=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 建单/下发前统一校验(数量>0、已关联库存、WMS可用库存),错误汇总一次性提示 - 新增WMS库存校验接口,库存不足在OMS侧拦截不再推送WMS;拦截重复下发 - 检查WMS自动分配/生成拣货单返回值,失败报错并补偿清理WMS残留单据 - 下发状态逐单提交,避免批量部分失败造成两边状态撕裂 - 预约单多仓下发增加逐仓预校验 - 修复取消下发不删拣货单、无库存脏单无法取消两个历史问题 --- .../com/mhd/system/api/WmsServiceFeign.java | 10 +- .../api/factory/RemoteWmsFallbackFactory.java | 11 ++- .../ExecutionStockOutOrderDomainService.java | 91 ++++++++++++++---- ...ReservationStockOutOrderDomainService.java | 41 +++++++++ .../StockOutOrderApplicationService.java | 92 +++++++++++++++++++ .../service/StockOutOrderDomainService.java | 30 ++++-- .../stockOutOrder/StockOutOrderApi.java | 13 ++- 7 files changed, 258 insertions(+), 30 deletions(-) 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 7fbd7dd9b..22be78474 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 @@ -100,7 +100,7 @@ public interface WmsServiceFeign { @ApiOperation("oms取消下发单保存") @PostMapping(value = "/stockOutOrderApi/cancelExecutionOrder") - public void omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder); + public AjaxResult omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder); @ApiOperation("oms取消下发单自动分配") @PostMapping(value = "/stockOutOrderApi/omsAutoAssign") @@ -110,6 +110,14 @@ public interface WmsServiceFeign { @PostMapping(value = "/stockOutOrderApi/execution") public AjaxResult execution(@RequestBody com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO); + /** + * oms下发前库存校验:可用库存不足时返回错误,OMS据此在推送前拦截下发, + * 避免单据先落库、分配才失败而在WMS残留"已审核"状态的垃圾单 + */ + @ApiOperation("oms下发前库存校验") + @PostMapping(value = "/stockOutOrderApi/checkOmsAssignInventory") + public AjaxResult checkOmsAssignInventory(@RequestBody List outMaterialDetails); + /** * oms下发单明细保存 */ 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 1bf77e956..aabf37512 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 @@ -74,8 +74,9 @@ public class RemoteWmsFallbackFactory implements FallbackFactory outMaterialDetails) { + //校验接口本身不可用时返回错误,OMS会阻止下发(不能在WMS状态未知时盲目推送) + return AjaxResult.error("WMS库存校验服务不可用:" + cause.getMessage()); + } + @Override public void omsInOrderAddDetail(List inMaterialDetails) { } 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 311b600ae..e5572cc8d 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 @@ -480,37 +480,59 @@ public class ExecutionStockOutOrderDomainService { * @param stockOutOrderDO * @return Boolean */ - @Transactional(rollbackFor = Exception.class) + //注意:不能用方法级事务。批量下发时若前一张已推送WMS成功、后一张失败,方法级事务回滚会把已成功单据的 + //下发状态一并回滚(WMS已分配库存、已生成拣货单,OMS却显示未下发),造成两边状态撕裂。 + //因此改为:每张单全链路推送成功后立即逐单更新并提交下发状态,失败单据补偿清理后抛错,不影响已成功单据。 public Boolean issueOrder(ExecutionStockOutOrderDO 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()); - boolean update = stockOutOrderService.update(null, new UpdateWrapper().lambda() - .set(ExecutionStockOutOrder::getIssueId, loginUser.getUserid()) - .set(ExecutionStockOutOrder::getIssueName, userRealName) - .set(ExecutionStockOutOrder::getIssueTime, new Date()) - //.set(ExecutionStockOutOrder::getIssueStatus, 1) - .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) - .set(ExecutionStockOutOrder::getUpdateByName, userRealName) - .set(ExecutionStockOutOrder::getUpdateTime, new Date()) - .in(ExecutionStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); - //下发前统一校验所有单据:全部通过后再推送WMS,避免部分单据推送成功、部分失败造成两边数据不一致 + //下发前统一校验所有单据:先完成全部校验并汇总所有问题一次性提示,全部通过后再推送WMS List inOrderIds = stockOutOrderDO.getOutOrderIds(); List issueOrderList = new ArrayList<>(); + List validateErrors = new ArrayList<>(); for (Long inOrderId : inOrderIds) { ExecutionStockOutOrder byId = stockOutOrderService.getById(inOrderId); if (byId == null) { - throw new ServiceException("出库单不存在,outOrderId=" + inOrderId); + validateErrors.add("出库单不存在,outOrderId=" + inOrderId); + continue; } - validateIssueOrderDetail(byId); - issueOrderList.add(byId); + try { + List detailList = validateIssueOrderDetail(byId); + //下发前调WMS校验可用库存(单内全部库存行校验完才返回结果),问题先收集,最后统一提示,不推送任何数据到WMS + List checkList = new ArrayList<>(); + for (ExecutionOutMaterialDetail detail : detailList) { + OutMaterialDetail checkDetail = new OutMaterialDetail(); + checkDetail.setOutOrderNumber(byId.getOutOrderNumber()); + checkDetail.setMaterialInventoryId(detail.getMaterialInventoryId()); + checkDetail.setQuantity(detail.getQuantity()); + checkDetail.setMaterialCode(detail.getMaterialCode()); + checkDetail.setMaterialName(detail.getMaterialName()); + checkList.add(checkDetail); + } + AjaxResult checkResult = wmsServiceFeign.checkOmsAssignInventory(checkList); + if (checkResult == null || !"200".equals(String.valueOf(checkResult.get("code")))) { + validateErrors.add("出库单[" + byId.getOutOrderNumber() + "]库存校验失败:" + + (checkResult == null ? "WMS服务不可用,已阻止下发" : checkResult.get("msg"))); + continue; + } + issueOrderList.add(byId); + } catch (ServiceException e) { + //单张单据校验失败不中断,继续校验其余单据,最后统一提示 + validateErrors.add(e.getMessage()); + } + } + if (!validateErrors.isEmpty()) { + throw new ServiceException("下发校验未通过(共" + validateErrors.size() + "项):" + String.join(";", validateErrors)); } //下发推送到wms for (ExecutionStockOutOrder byId : issueOrderList) { + String currentOrderNumber = byId.getOutOrderNumber(); + try { StockOutOrder stockOutOrder = new StockOutOrder(); BeanUtils.copyProperties(byId, stockOutOrder,"outOrderId"); Long warehouseId = stockOutOrder.getWarehouseId(); @@ -562,17 +584,50 @@ public class ExecutionStockOutOrderDomainService { throw new ServiceException("出库单[" + outOrderNumber + "]WMS生成拣货单失败:" + (genPickingResult == null ? "WMS服务不可用或已降级" : genPickingResult.get("msg"))); } + + //该单全链路成功,逐单更新并提交下发信息(后续单据失败不回滚本单,保持与WMS状态一致) + boolean updated = stockOutOrderService.update(null, new UpdateWrapper().lambda() + .set(ExecutionStockOutOrder::getIssueId, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getIssueName, userRealName) + .set(ExecutionStockOutOrder::getIssueTime, new Date()) + //.set(ExecutionStockOutOrder::getIssueStatus, 1) + .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()) + .eq(ExecutionStockOutOrder::getOutOrderId, byId.getOutOrderId())); + if (!updated) { + log.warn("出库单[{}]WMS下发成功,但OMS下发信息更新失败,请检查", currentOrderNumber); + } + } catch (RuntimeException e) { + //补偿清理:推送中途失败时WMS可能已落库单头/明细(甚至已分配冻结库存),调用取消下发清理, + //避免残留"已审核"状态的垃圾单;清理失败记error日志提示人工处理,不影响向用户报出原始错误 + try { + StockOutOrder cancelParam = new StockOutOrder(); + cancelParam.setOutOrderNumber(currentOrderNumber); + AjaxResult cancelResult = wmsServiceFeign.omsCancelExecutionOrder(cancelParam); + if (cancelResult == null || !"200".equals(String.valueOf(cancelResult.get("code")))) { + log.error("出库单[{}]下发失败,且WMS补偿清理失败({}),请手动到WMS删除残留单据", + currentOrderNumber, cancelResult == null ? "WMS服务不可用" : cancelResult.get("msg"), e); + } else { + log.warn("出库单[{}]下发失败,已补偿清理WMS侧单据", currentOrderNumber, e); + } + } catch (Exception cleanupEx) { + log.error("出库单[{}]下发失败,且WMS补偿清理异常,请手动到WMS删除残留单据", currentOrderNumber, cleanupEx); + } + throw e; + } } - return update; + return Boolean.TRUE; } /** * 建单校验:出库明细数量必须大于0 * 历史缺陷:0数量明细的单下发到WMS后自动分配必然失败,且异常被吞,出库单卡死在"已审核"状态无法生成拣货单 + * 注意:明细为空时跳过校验(保持原有"先建单后补明细"的行为),下发时的校验会兜底拦截无明细单据 */ private void validateMaterialDetailQuantity(List materialDetailList) { if (CollectionUtils.isEmpty(materialDetailList)) { - throw new ServiceException("出库单明细不能为空"); + return; } for (ExecutionOutMaterialDetailDO detail : materialDetailList) { if (detail.getQuantity() == null || detail.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { @@ -587,8 +642,9 @@ public class ExecutionStockOutOrderDomainService { * 1.必须有物料明细,且数量大于0; * 2.明细必须已关联库存(materialInventoryId),否则WMS按库存ID自动分配会空指针; * 校验放在推送WMS之前,失败直接报错回滚,避免出库单卡死在WMS"已审核"状态 + * @return 校验通过的明细列表,供后续WMS库存校验使用 */ - private void validateIssueOrderDetail(ExecutionStockOutOrder order) { + private List validateIssueOrderDetail(ExecutionStockOutOrder order) { String outOrderNumber = order.getOutOrderNumber(); List detailList = outMaterialDetailService.list(new QueryWrapper().lambda() .eq(ExecutionOutMaterialDetail::getOutOrderNumber, outOrderNumber)); @@ -605,6 +661,7 @@ public class ExecutionStockOutOrderDomainService { throw new ServiceException("出库单[" + outOrderNumber + "]物料[" + materialDesc + "]未关联库存,无法下发"); } } + return detailList; } /** 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 a90e17cdb..99bd307a5 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 @@ -696,6 +696,47 @@ public class ReservationStockOutOrderDomainService { // 按照 warehouseId 分组 Map> materialDetailGroupByWarehouse = materialDetailList.stream() .collect(Collectors.groupingBy(ReservationOutMaterialDetail::getWarehouseId)); + + //下发前统一校验各仓明细(数量>0、已关联库存、WMS可用库存充足),全部通过后再逐仓生成执行单下发: + //本方法的事务回滚不了WMS已提交的数据,若后面的仓在生成执行单后才失败,前面的仓会在WMS残留单据 + List issueValidateErrors = new ArrayList<>(); + materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { + boolean groupBaseValid = true; + for (ReservationOutMaterialDetail detail : details) { + String materialDesc = detail.getMaterialCode() != null ? detail.getMaterialCode() + : (detail.getMaterialName() != null ? detail.getMaterialName() : String.valueOf(detail.getMaterialDetailId())); + if (detail.getQuantity() == null || detail.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { + issueValidateErrors.add("预约单[" + inOrderNumber + "]物料[" + materialDesc + "]数量为0,无法下发"); + groupBaseValid = false; + } else if (detail.getMaterialInventoryId() == null || detail.getMaterialInventoryId() <= 0) { + issueValidateErrors.add("预约单[" + inOrderNumber + "]物料[" + materialDesc + "]未关联库存,无法下发"); + groupBaseValid = false; + } + } + if (!groupBaseValid) { + return; + } + //WMS库存校验(接口内部会聚合该仓全部明细的需求量后比对可用库存) + List checkList = new ArrayList<>(); + for (ReservationOutMaterialDetail detail : details) { + OutMaterialDetail checkDetail = new OutMaterialDetail(); + checkDetail.setMaterialInventoryId(detail.getMaterialInventoryId()); + checkDetail.setQuantity(detail.getQuantity()); + checkDetail.setMaterialCode(detail.getMaterialCode()); + checkDetail.setMaterialName(detail.getMaterialName()); + checkList.add(checkDetail); + } + AjaxResult checkResult = wmsServiceFeign.checkOmsAssignInventory(checkList); + if (checkResult == null || !"200".equals(String.valueOf(checkResult.get("code")))) { + String groupWarehouseName = reservationStockInOrderMapper.getWarehouseName(warehouseId); + issueValidateErrors.add("仓库[" + (groupWarehouseName != null ? groupWarehouseName : warehouseId) + "]库存校验失败:" + + (checkResult == null ? "WMS服务不可用,已阻止下发" : checkResult.get("msg"))); + } + }); + if (!issueValidateErrors.isEmpty()) { + throw new ServiceException("下发校验未通过(共" + issueValidateErrors.size() + "项):" + String.join(";", issueValidateErrors)); + } + List executionInOrderNumbers = new ArrayList<>(); materialDetailGroupByWarehouse.forEach((warehouseId, details) -> { if (warehouseId == null) warehouseId = warehouseId1; 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 7dfe88da6..b7c1e7f2a 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 @@ -1174,6 +1174,98 @@ public class StockOutOrderApplicationService { return result; } + /** + * OMS下发前库存校验:按库存ID聚合各明细计划数量,逐一比对WMS可用库存, + * 全部比对完成后汇总所有不足项一次性抛错。用于OMS在下发推送前拦截 + * (此前单据先落库、分配才失败,会在WMS残留"已审核"状态的垃圾单) + */ + public void checkOmsAssignInventory(List outMaterialDetails) { + if (CollectionUtils.isEmpty(outMaterialDetails)) { + return; + } + //重复下发保护:该单号在WMS已存在活动单据时直接拦截(继续下发会删改已分配明细、 + //失败补偿还会误删正在拣货的单和拣货单)。历史残留单据需先在OMS取消下发后再重试 + String outOrderNumber = outMaterialDetails.get(0).getOutOrderNumber(); + if (outOrderNumber != null && !outOrderNumber.isEmpty()) { + StockOutOrder existOrder = stockOutOrderService.getOne(new QueryWrapper().lambda() + .eq(StockOutOrder::getOutOrderNumber, outOrderNumber) + .eq(StockOutOrder::getDelFlag, 1), false); + if (existOrder != null) { + throw new ServiceException("WMS已存在该出库单(当前状态:" + stockOutOrderStatusName(existOrder.getStatus()) + + "),请勿重复下发;若为历史残留单据,请先取消下发后重试"); + } + } + //同一库存被多条明细引用时聚合需求量再比较(单条比会漏判) + Map needByInventoryId = new LinkedHashMap<>(); + Map materialDescByInventoryId = new HashMap<>(); + for (OutMaterialDetail detail : outMaterialDetails) { + if (detail.getMaterialInventoryId() == null) { + continue; + } + BigDecimal need = detail.getQuantity() == null ? BigDecimal.ZERO : detail.getQuantity(); + needByInventoryId.merge(detail.getMaterialInventoryId(), need, BigDecimal::add); + materialDescByInventoryId.putIfAbsent(detail.getMaterialInventoryId(), buildMaterialDesc(detail)); + } + List errors = new ArrayList<>(); + for (Map.Entry entry : needByInventoryId.entrySet()) { + Long materialInventoryId = entry.getKey(); + BigDecimal need = entry.getValue(); + String materialDesc = materialDescByInventoryId.getOrDefault(materialInventoryId, "库存ID=" + materialInventoryId); + if (materialInventoryId <= 0) { + errors.add("物料[" + materialDesc + "]未关联库存,合计需求数量:" + need.stripTrailingZeros().toPlainString()); + continue; + } + MaterialInventory materialInventory = materialInventoryMapper.selectById(materialInventoryId); + if (materialInventory == null) { + errors.add("物料[" + materialDesc + "]库存不存在,库存ID=" + materialInventoryId); + continue; + } + BigDecimal available = materialInventory.getAllocationQuantity() == null + ? BigDecimal.ZERO : materialInventory.getAllocationQuantity(); + if (available.compareTo(need) < 0) { + errors.add(String.format("物料[%s]可用库存不足:需要%s,当前可用%s", + materialDesc, need.stripTrailingZeros().toPlainString(), available.stripTrailingZeros().toPlainString())); + } + } + if (!errors.isEmpty()) { + throw new ServiceException("下发前库存校验未通过(共" + errors.size() + "项):" + String.join(";", errors)); + } + } + + private String buildMaterialDesc(OutMaterialDetail detail) { + if (detail.getMaterialCode() != null) { + return detail.getMaterialCode() + (detail.getMaterialName() != null ? "-" + detail.getMaterialName() : ""); + } + if (detail.getMaterialName() != null) { + return detail.getMaterialName(); + } + return "未知物料"; + } + + /** + * 出库单状态码转名称(用于校验提示),未知状态码原样返回 + */ + private String stockOutOrderStatusName(Integer status) { + if (status == null) { + return "未知"; + } + switch (status) { + case 1: return "已创建"; + case 2: return "已审核"; + case 3: return "部分分配"; + case 4: return "已分配"; + case 5: return "波次中"; + case 6: return "拣货中"; + case 7: return "拣货完成"; + case 8: return "复核中"; + case 9: return "已出库"; + case 10: return "取消"; + case 11: return "关闭"; + case 12: return "已复核"; + default: return "状态码" + status; + } + } + /*public Boolean autoAssign(StockOutOrderDO stockOutOrderDO){ StockOutOrderDO assembleStockOutOrderDO = assembleParamByOutOrder(stockOutOrderDO); return stockOutOrderDomainService.autoAssign(assembleStockOutOrderDO); 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 18af0e37e..52bd75e31 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 @@ -2555,6 +2555,7 @@ public class StockOutOrderDomainService { stockOutOrderService.save(stockOutOrder); } + @Transactional(rollbackFor = Exception.class) public void cancelExecutionOrder(StockOutOrder stockOutOrder) { String outOrderNumber = stockOutOrder.getOutOrderNumber(); StockOutOrder stockOutOrderDB = stockOutOrderService.getOne(new LambdaQueryWrapper() @@ -2563,23 +2564,33 @@ public class StockOutOrderDomainService { if (stockOutOrderDB == null) { throw new ServiceException("出库单不存在"); } + //逻辑删除配送明细(放在最前:所有清理路径——含下方无明细提前返回——统一先清配送明细,避免残留) + 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)); if (CollectionUtils.isEmpty(materialDetails)) { - throw new ServiceException("出库单明细不存在"); + //无明细(下发中途失败的补偿清理场景):没有可还原的库存,直接逻辑删除单头即可 + stockOutOrderDB.setDelFlag(2); + stockOutOrderService.updateById(stockOutOrderDB); + return; } for (OutMaterialDetail materialDetail : materialDetails) { //还原库存 BigDecimal allocationQuantity = materialDetail.getAllocationQuantity(); Long materialInventoryId = materialDetail.getMaterialInventoryId(); MaterialInventory materialInventory = materialInventoryMapper.selectById(materialInventoryId); - if (materialInventory == null) { - throw new ServiceException("库存信息不存在"); + //以下两种情况都无可还原的冻结量,跳过还原直接删单,保证此类单据也能被取消/补偿清理: + //1.库存不存在(如OMS漏传库存ID的历史脏单); + //2.未分配的明细(allocationQuantity为空或0,如下发失败后的补偿清理) + 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)); + materialInventoryMapper.updateById(materialInventory); } - materialInventory.setAllocationQuantity(materialInventory.getAllocationQuantity().add(allocationQuantity)); - materialInventory.setFreezeQuantity(materialInventory.getFreezeQuantity().subtract(allocationQuantity)); - materialInventoryMapper.updateById(materialInventory); //逻辑删除库存调整记录 Long uniqueId = materialDetail.getUniqueId(); String relateNo = outOrderNumber+"#"+uniqueId; @@ -2590,9 +2601,9 @@ public class StockOutOrderDomainService { materialDetail.setDelFlag(2); outMaterialDetailService.updateById(materialDetail); } - //逻辑删除出库单 - stockOutOrder.setDelFlag(2); - stockOutOrderService.updateById(stockOutOrder); + //逻辑删除出库单(用按单号查出的DB对象更新:OMS补偿清理只传单号,传入对象无主键,直接updateById不生效) + stockOutOrderDB.setDelFlag(2); + stockOutOrderService.updateById(stockOutOrderDB); PickingOrder pickingOrder = pickingOrderService.getOne(new LambdaQueryWrapper() .eq(PickingOrder::getDelFlag, 1) @@ -2606,6 +2617,7 @@ public class StockOutOrderDomainService { pickingMaterialDetail.setDelFlag(2); pickingMaterialDetailService.updateById(pickingMaterialDetail); } + pickingOrder.setDelFlag(2); pickingOrderService.updateById(pickingOrder); } } 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 6e3d11735..fc3ceece7 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 @@ -542,10 +542,21 @@ public class StockOutOrderApi extends BaseController { stockOutOrderApplicationService.omsOrderAddDetail(outMaterialDetails); } + /** + * oms下发前库存校验:不足时返回错误,OMS据此拦截下发,避免单据落库后分配失败残留垃圾单 + */ + @ApiOperation("oms下发前库存校验") + @PostMapping(value = "/checkOmsAssignInventory") + public AjaxResult checkOmsAssignInventory(@RequestBody List outMaterialDetails) { + stockOutOrderApplicationService.checkOmsAssignInventory(outMaterialDetails); + return AjaxResult.success("库存校验通过"); + } + @ApiOperation("oms下发单保存") @PostMapping(value = "/cancelExecutionOrder") - public void omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder) { + public AjaxResult omsCancelExecutionOrder(@RequestBody StockOutOrder stockOutOrder) { stockOutOrderApplicationService.cancelExecutionOrder(stockOutOrder); + return AjaxResult.success(); } /** From 9e186bc034be85995e869d91c1b34e18c7fe4e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 5 Sep 2026 14:38:49 +0800 Subject: [PATCH 100/101] =?UTF-8?q?=E5=8D=97=E5=B2=90GPS=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facadeApi/biReport/BiReportApi.java | 34 +++++++++++++++++++ .../core/feign/ThirdPartyServiceFeign.java | 8 +++++ 2 files changed, 42 insertions(+) diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java index 38a6778b4..108afc412 100644 --- a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/BiReportApi.java @@ -15,12 +15,17 @@ import com.mhd.bi.domain.biWarehouseTransport.service.BiWarehouseTransportReport import com.mhd.bi.interfaces.facadeApi.biReport.dto.BiApiResult; import com.mhd.bi.interfaces.facadeApi.biReport.vo.ComprehensiveSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.WarehouseTransportSituationVO; +import com.mhd.bi.interfaces.facadeApi.biReport.vo.gps.NanqiGpsLocationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.overall.OverallOperationSituationVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.platform.PlatformSurveillanceVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.hkMacaoZone.HkMacaoServiceZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.transportZone.TransportOperationZoneVO; import com.mhd.bi.interfaces.facadeApi.biReport.vo.warehouseZone.WarehouseOperationZoneVO; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.common.core.feign.ThirdPartyServiceFeign; import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -72,6 +77,12 @@ public class BiReportApi extends BaseController { @Autowired private BiReportSnapshotSyncService biReportSnapshotSyncService; + @Autowired + private ThirdPartyServiceFeign thirdPartyServiceFeign; + + @Autowired + private ObjectMapper objectMapper; + @ApiOperation(value = "手动触发快照同步", notes = "立即写入各 BI 快照表(综合、仓储运输、月台监测、总体运营、仓储运营专区、运输运营专区、港澳服务专区);须带 X-BI-Access-Token") @PostMapping("/snapshotSync/run") @@ -139,6 +150,29 @@ public class BiReportApi extends BaseController { List data = biPlatformRealDataService.queryPlatformInfoList(); return BiApiResult.ok(data); } + + /** + * 南岐GPS:根据车牌号查询车辆实时定位 + * (内部经 ThirdPartyServiceFeign 转发到 mhd_thrid_party 的 /nanqiGps/queryByPlate,逻辑仍在 mhd_thrid_party) + */ + @ApiOperation(value = "根据车牌号查询车辆实时定位(南岐GPS)", notes = "按车牌号查询南岐GPS车辆实时定位,实时转发到三方服务") + @GetMapping("/nanqiGps/queryByPlate") + public BiApiResult nanqiQueryByPlate( + @ApiParam(value = "车牌号") + @RequestParam(value = "carPlate") String carPlate) { + if (carPlate == null || carPlate.trim().isEmpty()) { + throw new ServiceException("车牌号不能为空"); + } + AjaxResult result = thirdPartyServiceFeign.nanqiQueryByPlate(carPlate); + Object codeObj = result == null ? null : result.get("code"); + if (codeObj == null || !"200".equals(String.valueOf(codeObj))) { + String msg = result == null ? "南岐GPS查询失败" : String.valueOf(result.get("msg")); + throw new ServiceException(msg); + } + Object data = result.get("data"); + NanqiGpsLocationVO vo = objectMapper.convertValue(data, NanqiGpsLocationVO.class); + return BiApiResult.ok(vo); + } //园区物流大屏接口---------------------------------------------------------------------- /** * 总体运营态势 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 2268b61c6..f2e3287de 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 @@ -334,4 +334,12 @@ public interface ThirdPartyServiceFeign { @PostMapping("/mdmMasterData/queryMerchant") R queryMdmMerchant( @RequestBody com.mhd.common.core.domain.thirdparty.MdmMerchantQueryDTO queryDTO); + + /** + * 南岐GPS:根据车牌号查询车辆实时定位 + * @param carPlate 车牌号 + * @return AjaxResult,data 为车辆定位信息(code=200 成功) + */ + @GetMapping("/nanqiGps/queryByPlate") + AjaxResult nanqiQueryByPlate(@RequestParam("carPlate") String carPlate); } \ No newline at end of file From 8ddf20f3e747ba7d685a7cb0040a74f97c582c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Sat, 5 Sep 2026 14:39:04 +0800 Subject: [PATCH 101/101] =?UTF-8?q?=E5=8D=97=E5=B2=90GPS=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biReport/vo/gps/NanqiGpsLocationVO.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/gps/NanqiGpsLocationVO.java diff --git a/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/gps/NanqiGpsLocationVO.java b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/gps/NanqiGpsLocationVO.java new file mode 100644 index 000000000..22e5fb32a --- /dev/null +++ b/mhd-bi/src/main/java/com/mhd/bi/interfaces/facadeApi/biReport/vo/gps/NanqiGpsLocationVO.java @@ -0,0 +1,92 @@ +package com.mhd.bi.interfaces.facadeApi.biReport.vo.gps; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 南岐GPS 车辆定位信息 VO(与 mhd_thrid_party.NanqiGpsLocationVO 同构,供 BI 开放接口返回) + * + * @author mhd + */ +@Data +@ApiModel("南岐GPS 车辆定位信息") +public class NanqiGpsLocationVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("应答结果:1成功 0失败") + private Integer rspCode; + + @ApiModelProperty("应答描述") + private String rspDesc; + + @ApiModelProperty("车辆id") + private String carId; + + @ApiModelProperty("车牌号") + private String carPlate; + + @ApiModelProperty("车辆名") + private String carName; + + @ApiModelProperty("车队id") + private String teamId; + + @ApiModelProperty("车队名称") + private String teamName; + + @ApiModelProperty("定位时间") + private String time; + + @ApiModelProperty("经度(WGS84)") + private BigDecimal lng; + + @ApiModelProperty("纬度(WGS84)") + private BigDecimal lat; + + @ApiModelProperty("速度(千米/小时)") + private BigDecimal speed; + + @ApiModelProperty("方向 0~360") + private String drct; + + @ApiModelProperty("平台总里程(千米)") + private String mile; + + @ApiModelProperty("今日里程(千米)") + private String preMile; + + @ApiModelProperty("定位信号:0无 弱<=3 中<=6 强>6") + private String satl; + + @ApiModelProperty("通讯信号:0无 弱<=10 中<=20 强>20") + private String sgn; + + @ApiModelProperty("地理描述") + private String addr; + + @ApiModelProperty("车辆定位状态") + private String state; + + @ApiModelProperty("车辆状态文字") + private String stateCn; + + @ApiModelProperty("驾驶员") + private String drvName; + + @ApiModelProperty("驾驶员电话") + private String drvPhone; + + @ApiModelProperty("车辆类型") + private String carType; + + @ApiModelProperty("服务到期状态:1已到期 0未到期") + private String expState; + + @ApiModelProperty("服务期限") + private String expTime; +}