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] =?UTF-8?q?feat(oms,wms):=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=9EisExport=E6=A0=87?= =?UTF-8?q?=E8=AF=86=E4=B8=8E=E8=9E=8D=E5=90=88=E6=8E=92=E5=BA=8F=20/list?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E5=8F=AF=E9=80=89=E5=8F=82=E6=95=B0=20isE?= =?UTF-8?q?xport=20=E6=A0=87=E8=AF=86=E5=AF=BC=E5=87=BA=E8=AF=B7=E6=B1=82(?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=98=BE=E7=A4=BA=E5=95=86=E5=93=81=E9=A5=AE?= =?UTF-8?q?=E7=94=A8=E6=9C=89=E6=95=88=E6=9C=9F/=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=88=86=E7=B1=BB/=E8=BF=9B=E8=B4=A7=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E7=94=B1=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E)=EF=BC=9BisExport=3Dtrue=20=E6=97=B6?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=9F=A5=E8=AF=A2=E7=BB=B4=E5=BA=A6(OMS=206?= =?UTF-8?q?=E6=9D=A1/WMS=208=E6=9D=A1)=E7=BB=9F=E4=B8=80=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E8=9E=8D=E5=90=88=E6=8E=92=E5=BA=8F=EF=BC=9A?= =?UTF-8?q?=E5=88=B0=E6=9C=9F=E6=97=A5=E5=80=92=E5=BA=8F=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E6=9C=80=E5=90=8E(=E4=BF=9D=E7=95=99=E5=8E=9F=20orderByExpiryD?= =?UTF-8?q?ate=20=E7=AC=AC=E4=B8=80=E4=BC=98=E5=85=88=E7=BA=A7,=E8=9E=8D?= =?UTF-8?q?=E5=90=88=E4=B8=8D=E5=8F=96=E4=BB=A3)=E2=86=92=E5=90=8C?= =?UTF-8?q?=E5=88=B0=E6=9C=9F=E6=97=A5=E5=86=85=E6=8C=89=E7=89=A9=E6=96=99?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E5=8D=87=E5=BA=8F=E2=86=920=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E9=9D=A0=E5=90=8E=E2=86=92=E6=9B=B4=E6=96=B0=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=80=92=E5=BA=8F=E2=86=92MAX(=E5=BA=93=E5=AD=98ID)?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E4=BF=9D=E8=AF=81=E5=88=86=E9=A1=B5=E7=A8=B3?= =?UTF-8?q?=E5=AE=9A=EF=BC=9B=E5=90=84=E8=AF=AD=E5=8F=A5=E6=8C=82=E8=BD=BD?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=89=87=E6=AE=B5=20exportOrderByMaterialCod?= =?UTF-8?q?e=EF=BC=8C=E4=B8=8D=E4=BC=A0=20isExport=20=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=E5=8E=9F=E6=9C=89=E6=8E=92=E5=BA=8F=EF=BC=9BOMS=20Controller?= =?UTF-8?q?=20=E5=9C=A8=20isExport=3Dtrue=20=E6=97=B6=E8=B7=B3=E8=BF=87=20?= =?UTF-8?q?Java=20=E6=8C=89=E6=9B=B4=E6=96=B0=E6=97=B6=E9=97=B4=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=81=BF=E5=85=8D=E8=A6=86=E7=9B=96=20SQL=20=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=8E=92=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 +