feat(wms,oms):库存管理-库存查询新增进货日期、入库日期查询条件,新增进货日期字段贯通收货-上架-库存全链路

需求:OMS/WMS 库存管理-库存查询页增加查询条件:物料分类(后端已支持,无需改动)、
进货日期(新增字段)、入库日期。

一、DDL(sql/20260831_wms_oms_add_purchase_date.sql)
    WMS 收货明细、上架明细、物料库存及 OMS 预留库存共 4 张表新增 PURCHASE_DATE DATE 列,
    附批次明细配置模板、执行前检查与回滚语句;须先执行 DDL 再发布服务。

二、进货日期录入与落库链路(收货→上架→WMS库存→OMS库存)
    1、录入入口为收货批次属性「进货日期」标签(批次规则配置,标签须一字不差),
       ReceiptMaterialDetailImpl 两处标签解析新增分支;
    2、收货明细→上架明细:StockReceiptOrderDomainService 6 处日期拷贝点补 setPurchaseDate(含子项);
    3、上架落库:stockIn/sj 赋值写入 material_inventory;
    4、同步 OMS:MaterialInventoryOmsParamDO 新增字段经 Feign omsEdit 传递,
       写入 reservation_material_inventory;
    5、库存行合并键:批次规则勾选后进货日期参与分行(getParam 映射 + selectListByWhere 全等匹配),
       OMS omsEdit 行匹配同步按进货日期区分,避免不同进货日期误合并到同一行。

三、查询条件(两模块 /list 接口)
    1、进货日期:purchaseDate(单日精确)+ purchaseDateStart/purchaseDateEnd(区间,End 含当天);
    2、入库日期:WMS 新增 createTimeStart/createTimeEnd(按库存行创建时间过滤,与 OMS 现有口径一致);
    3、列表/导出返回新增 purchaseDate 字段,分组查询取 MAX(purchase_date)。

说明:历史库存进货日期为空,按进货日期查询查不到存量数据(无来源可回填),区间查询会排除空值行。
This commit is contained in:
rcx
2026-08-31 13:41:19 +08:00
parent 2d1e4b5912
commit da84b7bb69
26 changed files with 257 additions and 7 deletions
@@ -83,6 +83,8 @@ public class MaterialInventoryOmsParamDO extends BaseVOEntity {
private Date productionDate;
//过期日期
private Date expiryDate;
//进货日期
private Date purchaseDate;
private String executioOrderNumber;
@@ -210,6 +210,12 @@ public class ReservationMaterialInventory extends BaseVOEntity {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -127,6 +127,9 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl<ReservationMat
String batchNumber = materialInventoryOmsParamDO.getBatchNumber();
Long materialBaseInfoId = materialInventoryOmsParamDO.getMaterialBaseInfoId();
Long warehouseId = materialInventoryOmsParamDO.getWarehouseId();
// 进货日期参与行匹配:WMS 库存行按批次属性(含进货日期)分行后,OMS 同步按进货日期区分,避免不同进货日期误合并;
// 为空时匹配 purchase_date 为空的行,存量行为不变
Date purchaseDate = materialInventoryOmsParamDO.getPurchaseDate();
LambdaQueryWrapper<ReservationMaterialInventory> param = new LambdaQueryWrapper<ReservationMaterialInventory>()
// .eq(ReservationMaterialInventory::getInOrderNumber, inOrderNumber)
//.eq(ReservationMaterialInventory::getLotNumber, lotNumber)
@@ -148,6 +151,11 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl<ReservationMat
} else {
param.isNull(ReservationMaterialInventory::getBatchNumber);
}
if (purchaseDate != null) {
param.eq(ReservationMaterialInventory::getPurchaseDate, purchaseDate);
} else {
param.isNull(ReservationMaterialInventory::getPurchaseDate);
}
List<ReservationMaterialInventory> reservationMaterialInventories = materialInventoryMapper.selectList(param);
if (reservationMaterialInventories != null && reservationMaterialInventories.size() > 0) {
ReservationMaterialInventory reservationMaterialInventory = reservationMaterialInventories.get(0);
@@ -542,6 +550,7 @@ public class ReservationMaterialInventoryImpl extends ServiceImpl<ReservationMat
// materialInventory.setExtAttr4(materialInventoryParamDO.getExtAttr4());
materialInventory.setExpiryDate(materialInventoryParamDO.getExpiryDate());
// materialInventory.setInventoryDate(materialInventoryParamDO.getInventoryDate());
materialInventory.setPurchaseDate(materialInventoryParamDO.getPurchaseDate());
materialInventory.setBatchNumber(materialInventoryParamDO.getBatchNumber());
String batchNo = materialInventoryParamDO.getBatchNo();
if (batchNo != null) {
@@ -192,6 +192,12 @@ public class ReservationMaterialInventoryPO extends MaterialBasePO {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -217,6 +217,12 @@ public class ReservationMaterialInventoryDO extends MaterialBaseDO {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -253,8 +259,11 @@ public class ReservationMaterialInventoryDO extends MaterialBaseDO {
private String createTimeEnd;
private String expiryDateStr;
private String productionDateStr;
private String purchaseDateStr;
private String expiryDateStart;
private String expiryDateEnd;
private String purchaseDateStart;
private String purchaseDateEnd;
@ApiModelProperty("导出按到期日分组排序标识:仅 queryRule=wlExpiry 时生效,true-到期日倒序(日期近的在前、空值最后、0库存靠后);不传-保持原有排序")
private Boolean orderByExpiryDate;
@@ -193,5 +193,7 @@ public class ReservationMaterialInventoryDTO extends MaterialBaseDTO {
private String createTimeEnd;
private String expiryDate;
private String productionDate;
/** 进货日期(yyyy-MM-dd,单日精确查询) */
private String purchaseDate;
}
@@ -53,6 +53,8 @@ public class ReservationMaterialInventoryApi extends BaseController {
@RequestParam(value = "customerName", required = false) String customerName,
@RequestParam(value = "expiryDateStart", required = false) String expiryDateStart,
@RequestParam(value = "expiryDateEnd", required = false) String expiryDateEnd,
@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)
{
@@ -82,8 +84,11 @@ public class ReservationMaterialInventoryApi extends BaseController {
ReservationMaterialInventoryDO materialInventoryDO = materialInventoryAssembler.toDO(materialInventoryDTO);
materialInventoryDO.setExpiryDateStr(materialInventoryDTO.getExpiryDate());
materialInventoryDO.setProductionDateStr(materialInventoryDTO.getProductionDate());
materialInventoryDO.setPurchaseDateStr(materialInventoryDTO.getPurchaseDate());
materialInventoryDO.setExpiryDateStart(expiryDateStart);
materialInventoryDO.setExpiryDateEnd(expiryDateEnd);
materialInventoryDO.setPurchaseDateStart(purchaseDateStart);
materialInventoryDO.setPurchaseDateEnd(purchaseDateEnd);
// 导出场景:queryRule=wlExpiry + orderByExpiryDate=true 时 SQL 按到期日倒序分组
// (日期近的在前、空值最后、0库存靠后、同到期日按更新时间倒序)
materialInventoryDO.setOrderByExpiryDate(orderByExpiryDate);
@@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productionDate" column="production_date" />
<result property="expiryDate" column="expiry_date" />
<result property="inventoryDate" column="inventory_date" />
<result property="purchaseDate" column="purchase_date" />
<result property="batchRefNo" column="batch_ref_no" />
<result property="sheetRefNo" column="sheet_ref_no" />
<result property="boxPalletNo" column="box_pallet_no" />
@@ -138,7 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT,
IFNULL (sum(a.VOLUME), 0) VOLUME,
a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4,
a.production_date, a.expiry_date, a.inventory_date,
a.production_date, a.expiry_date, a.inventory_date, a.purchase_date,
a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name,
a.bar_code as inv_bar_code,
a.in_order_number,a.lot_number
@@ -280,6 +281,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="expiryDateEnd != null and expiryDateEnd != ''">
and a.expiry_date <![CDATA[ < ]]> DATEADD(DAY, 1, #{expiryDateEnd})
</if>
<if test="purchaseDateStr != null and purchaseDateStr != ''">
AND TO_CHAR(a.purchase_date, 'yyyy-MM-dd') = #{purchaseDateStr}
</if>
<if test="purchaseDateStart != null and purchaseDateStart != ''">
and a.purchase_date >= #{purchaseDateStart}
</if>
<if test="purchaseDateEnd != null and purchaseDateEnd != ''">
and a.purchase_date <![CDATA[ < ]]> DATEADD(DAY, 1, #{purchaseDateEnd})
</if>
</sql>
<!-- 导出排除库存为0:所有维度查询(all/hz/wl/kw/wlkw/wlExpiry)的库存数量均为SUM聚合值,
@@ -367,6 +377,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
MAX(a.unit_name) AS unit_name,
MAX(a.production_date) AS production_date,
MAX(a.inventory_date) AS inventory_date,
MAX(a.purchase_date) AS purchase_date,
MAX(a.batch_ref_no) AS batch_ref_no, MAX(a.sheet_ref_no) AS sheet_ref_no, MAX(a.box_pallet_no) AS box_pallet_no,
MAX(a.bar_code) AS inv_bar_code,
MAX(a.in_order_number) AS in_order_number, MAX(a.lot_number) AS lot_number,
@@ -461,6 +472,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productionDate" column="production_date" />
<result property="expiryDate" column="expiry_date" />
<result property="inventoryDate" column="inventory_date" />
<result property="purchaseDate" column="purchase_date" />
<result property="extAttr3" column="ext_attr_3" />
<result property="extAttr4" column="ext_attr_4" />
<result property="remark" column="remark" />
@@ -210,6 +210,12 @@ public class MaterialInventory extends BaseVOEntity {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -874,6 +874,7 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
materialInventory.setExtAttr4(materialInventoryParamDO.getExtAttr4());
materialInventory.setExpiryDate(materialInventoryParamDO.getExpiryDate());
materialInventory.setInventoryDate(materialInventoryParamDO.getInventoryDate());
materialInventory.setPurchaseDate(materialInventoryParamDO.getPurchaseDate());
materialInventory.setBatchNumber(materialInventoryParamDO.getBatchNumber());
materialInventory.setUnit(materialBaseInfo.getUnitCode());
materialInventory.setUnitName(materialBaseInfo.getUnitName());
@@ -194,6 +194,12 @@ public class MaterialInventoryPO extends MaterialBasePO {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -218,6 +218,12 @@ public class MaterialInventoryDO extends MaterialBaseDO {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -253,6 +259,7 @@ public class MaterialInventoryDO extends MaterialBaseDO {
private String expiryDateStr;
private String productionDateStr;
private String updateTimeStr;
private String purchaseDateStr;
private String expiryDateStart;
private String expiryDateEnd;
@@ -263,6 +270,13 @@ public class MaterialInventoryDO extends MaterialBaseDO {
private String updateTimeStart;
private String updateTimeEnd;
private String purchaseDateStart;
private String purchaseDateEnd;
/** 入库日期(库存行创建时间)区间查询 */
private String createTimeStart;
private String createTimeEnd;
@ApiModelProperty("库存分配匹配:箱号/卡板号 token 列表(明细多值拆分后,OR 匹配;空则不参与匹配)")
private List<String> boxPalletNoList;
@@ -88,6 +88,8 @@ public class MaterialInventoryParamDO extends MaterialBaseDO {
private Date expiryDate;
//库存日期
private Date inventoryDate;
//进货日期
private Date purchaseDate;
//扩展字段3
private Date extAttr3;
//扩展字段4
@@ -286,6 +286,11 @@ public class ReceiptMaterialDetail extends BaseVOEntity {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseDate;
@ApiModelProperty("扩展属性1")
@Excel(name = "扩展属性1")
@TableField("ext_attr_1")
@@ -770,6 +770,15 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
throw new RuntimeException(e);
}
receiptMaterialDetailDO.setInventoryDate(date);
} else if ("进货日期".equals(batchLabels)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(attributeValue);
} catch (ParseException e) {
throw new RuntimeException(e);
}
receiptMaterialDetailDO.setPurchaseDate(date);
}
}
}
@@ -1274,6 +1283,15 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
log.warn("库存日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
break;
case "进货日期":
try {
if (attributeValue.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
receiptMaterialDetailDO.setPurchaseDate(DateUtils.parseDate(attributeValue));
}
} catch (Exception e) {
log.warn("进货日期格式转换失败,物料:{},原始值:{}", receiptMaterialDetailDO.getMaterialName(), attributeValue);
}
break;
case "总净重":
case "净重(KG)":
case "净重":
@@ -316,6 +316,11 @@ public class ReceiptMaterialDetailPO extends BaseVOEntity {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseDate;
@ApiModelProperty("扩展属性1")
@Excel(name = "扩展属性1")
private String extAttr1;
@@ -300,6 +300,11 @@ public class ReceiptMaterialDetailDO extends BaseVOEntity {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date purchaseDate;
@ApiModelProperty("扩展属性1")
@Excel(name = "扩展属性1")
private String extAttr1;
@@ -301,6 +301,13 @@ public class ShelfMaterialDetail extends BaseVOEntity {
@TableField("inventory_date")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
@TableField("purchase_date")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -313,6 +313,12 @@ public class ShelfMaterialDetailDO extends BaseVOEntity {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -1493,6 +1493,7 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDO.setTotalGrossWeight(receiptMaterialDetailDO.getTotalGrossWeight());
shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailDO.getExpiryDate());
shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailDO.getInventoryDate());
shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailDO.getPurchaseDate());
shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailDO.getBatchRefNo());
shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailDO.getSheetRefNo());
shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailDO.getBoxPalletNo());
@@ -1533,6 +1534,7 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailDOChildren.getProductionDate());
shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailDOChildren.getExpiryDate());
shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailDOChildren.getInventoryDate());
shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailDOChildren.getPurchaseDate());
shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailDOChildren.getBatchRefNo());
shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailDOChildren.getSheetRefNo());
shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailDOChildren.getBoxPalletNo());
@@ -1634,10 +1636,11 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDO.setTotalVolume(receiptMaterialDetailPO.getTotalVolume());
shelfMaterialDetailDO.setTotalNetWeight(receiptMaterialDetailPO.getTotalNetWeight());
shelfMaterialDetailDO.setTotalGrossWeight(receiptMaterialDetailPO.getTotalGrossWeight());
// 传递生产日期过期日期存货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
// 传递生产日期过期日期存货日期进货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
shelfMaterialDetailDO.setProductionDate(receiptMaterialDetailPO.getProductionDate());
shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailPO.getExpiryDate());
shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailPO.getInventoryDate());
shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailPO.getPurchaseDate());
shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailPO.getBatchRefNo());
shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailPO.getSheetRefNo());
shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailPO.getBoxPalletNo());
@@ -1686,6 +1689,7 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailPOChildren.getProductionDate());
shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailPOChildren.getExpiryDate());
shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailPOChildren.getInventoryDate());
shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailPOChildren.getPurchaseDate());
shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailPOChildren.getBatchRefNo());
shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailPOChildren.getSheetRefNo());
shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailPOChildren.getBoxPalletNo());
@@ -1767,10 +1771,11 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDO.setQuantity(receiptMaterialDetailPO.getReceiptQuantity());
shelfMaterialDetailDO.setInUniqueId(receiptMaterialDetailPO.getInUniqueId());
shelfMaterialDetailDO.setReceiptUniqueId(receiptMaterialDetailPO.getUniqueId());
// 传递生产日期过期日期存货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
// 传递生产日期过期日期存货日期进货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
shelfMaterialDetailDO.setProductionDate(receiptMaterialDetailPO.getProductionDate());
shelfMaterialDetailDO.setExpiryDate(receiptMaterialDetailPO.getExpiryDate());
shelfMaterialDetailDO.setInventoryDate(receiptMaterialDetailPO.getInventoryDate());
shelfMaterialDetailDO.setPurchaseDate(receiptMaterialDetailPO.getPurchaseDate());
shelfMaterialDetailDO.setBatchRefNo(receiptMaterialDetailPO.getBatchRefNo());
shelfMaterialDetailDO.setSheetRefNo(receiptMaterialDetailPO.getSheetRefNo());
shelfMaterialDetailDO.setBoxPalletNo(receiptMaterialDetailPO.getBoxPalletNo());
@@ -1809,10 +1814,11 @@ public class StockReceiptOrderDomainService {
shelfMaterialDetailDOChildren.setInUniqueId(receiptMaterialDetailPO.getInUniqueId());
// 子项使用自身的 uniqueId 作为 receiptUniqueId以便正确关联 material_more_detail 中的扩展属性
shelfMaterialDetailDOChildren.setReceiptUniqueId(receiptMaterialDetailDOChildren.getUniqueId());
// 传递生产日期过期日期存货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
// 传递生产日期过期日期存货日期进货日期Batch Ref NO'sSheet Ref NO's箱号/卡板号扩展属性1-4
shelfMaterialDetailDOChildren.setProductionDate(receiptMaterialDetailDOChildren.getProductionDate());
shelfMaterialDetailDOChildren.setExpiryDate(receiptMaterialDetailDOChildren.getExpiryDate());
shelfMaterialDetailDOChildren.setInventoryDate(receiptMaterialDetailDOChildren.getInventoryDate());
shelfMaterialDetailDOChildren.setPurchaseDate(receiptMaterialDetailDOChildren.getPurchaseDate());
shelfMaterialDetailDOChildren.setBatchRefNo(receiptMaterialDetailDOChildren.getBatchRefNo());
shelfMaterialDetailDOChildren.setSheetRefNo(receiptMaterialDetailDOChildren.getSheetRefNo());
shelfMaterialDetailDOChildren.setBoxPalletNo(receiptMaterialDetailDOChildren.getBoxPalletNo());
@@ -1262,6 +1262,7 @@ public class StockShelfOrderDomainService {
inventoryParamDO.setInventoryDate(shelfMaterialDetail.getInventoryDate());
inventoryParamDO.setExpiryDate(shelfMaterialDetail.getExpiryDate());
inventoryParamDO.setProductionDate(shelfMaterialDetail.getProductionDate());
inventoryParamDO.setPurchaseDate(shelfMaterialDetail.getPurchaseDate());
inventoryParamDO.setBoxPalletNo(shelfMaterialDetail.getBoxPalletNo());
inventoryParamDO.setSheetRefNo(shelfMaterialDetail.getSheetRefNo());
inventoryParamDO.setBatchRefNo(shelfMaterialDetail.getBatchRefNo());
@@ -1348,6 +1349,7 @@ public class StockShelfOrderDomainService {
BeanUtils.copyProperties(inventoryParamDO, materialInventoryOmsParamDO);
materialInventoryOmsParamDO.setProductionDate(materialInventoryPO.getProductionDate());
materialInventoryOmsParamDO.setExpiryDate(materialInventoryPO.getExpiryDate());
materialInventoryOmsParamDO.setPurchaseDate(materialInventoryPO.getPurchaseDate());
materialInventoryOmsParamDO.setMaterialBaseInfoId(materialInventoryPO.getMaterialBaseInfoId());
materialInventoryOmsParamDO.setWarehouseId(materialInventoryPO.getWarehouseId());
materialInventoryOmsParamDO.setLotNumber(materialInventoryPO.getLotNumber());
@@ -1510,6 +1512,9 @@ public class StockShelfOrderDomainService {
case "production_date":
param.setProductionDate(shelfMaterialDetail.getProductionDate());
break;
case "purchase_date":
param.setPurchaseDate(shelfMaterialDetail.getPurchaseDate());
break;
}
}
} else {
@@ -190,9 +190,12 @@ public class MaterialInventoryDTO extends MaterialBaseDTO {
private Boolean excludeZeroInventoryQuantity;
private String expiryDate;
private String productionDate;
/** 进货日期(yyyy-MM-dd,单日精确查询) */
private String purchaseDate;
private String expiryDateStr;
private String productionDateStr;
private String updateTimeStr;
private String purchaseDateStr;
private String expiryDateStart;
private String expiryDateEnd;
@@ -203,4 +206,11 @@ public class MaterialInventoryDTO extends MaterialBaseDTO {
private String updateTimeStart;
private String updateTimeEnd;
private String purchaseDateStart;
private String purchaseDateEnd;
/** 入库日期(库存行创建时间)区间查询 */
private String createTimeStart;
private String createTimeEnd;
}
@@ -311,6 +311,12 @@ public class ShelfMaterialDetailDTO extends BaseVOEntity {
@Excel(name = "存货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date inventoryDate;
@ApiModelProperty("进货日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "进货日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date purchaseDate;
@ApiModelProperty("ExtAttr3")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -60,6 +60,8 @@ public class MaterialInventoryApi extends BaseController {
@RequestParam(value = "excludeZeroInventoryQuantity", required = false) Boolean excludeZeroInventoryQuantity,
@RequestParam(value = "expiryDateStart", required = false) String expiryDateStart,
@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)
{
if (Boolean.TRUE.equals(excludeZeroInventoryQuantity)) {
@@ -91,8 +93,11 @@ public class MaterialInventoryApi extends BaseController {
MaterialInventoryDO materialInventoryDO = materialInventoryAssembler.toDO(materialInventoryDTO);
materialInventoryDO.setExpiryDateStr(materialInventoryDTO.getExpiryDate());
materialInventoryDO.setProductionDateStr(materialInventoryDTO.getProductionDate());
materialInventoryDO.setPurchaseDateStr(materialInventoryDTO.getPurchaseDate());
materialInventoryDO.setExpiryDateStart(expiryDateStart);
materialInventoryDO.setExpiryDateEnd(expiryDateEnd);
materialInventoryDO.setPurchaseDateStart(purchaseDateStart);
materialInventoryDO.setPurchaseDateEnd(purchaseDateEnd);
// 导出场景queryRule=wlExpiry + orderByExpiryDate=true SQL 按到期日倒序分组 OMS 库存查询导出一致
materialInventoryDO.setOrderByExpiryDate(orderByExpiryDate);
Date updateTime = materialInventoryDTO.getUpdateTime();
@@ -167,7 +172,7 @@ public class MaterialInventoryApi extends BaseController {
// materialDetailId 是新接口专用参数出库单明细ID库存 DTO 的同名字段语义是上架单明细ID
// 泄入原查询会生成错误的 a.material_detail_id 条件导致查空进原查询前显式清除
materialInventoryDTO.setMaterialDetailId(null);
return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, orderByExpiryDate);
return list(materialInventoryDTO, customerName, excludeZeroInventoryQuantity, expiryDateStart, expiryDateEnd, null, null, orderByExpiryDate);
}
@ApiOperation("查询物料库存列表不分页;queryRule=hz 时按货主+物料分组(同一物料在不同货主各占一行)")
@@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productionDate" column="production_date" />
<result property="expiryDate" column="expiry_date" />
<result property="inventoryDate" column="inventory_date" />
<result property="purchaseDate" column="purchase_date" />
<result property="batchRefNo" column="batch_ref_no" />
<result property="sheetRefNo" column="sheet_ref_no" />
<result property="boxPalletNo" column="box_pallet_no" />
@@ -84,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT,
IFNULL (sum(a.VOLUME), 0) VOLUME,
a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4,
a.production_date, a.expiry_date, a.inventory_date,
a.production_date, a.expiry_date, a.inventory_date, a.purchase_date,
a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name,
a.bar_code as inv_bar_code,
a.in_order_number,a.lot_number,
@@ -108,7 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
IFNULL (sum(a.GROSS_WEIGHT), 0) GROSS_WEIGHT,
IFNULL (sum(a.VOLUME), 0) VOLUME,
a.ext_attr_1, a.ext_attr_2, a.ext_attr_3, a.ext_attr_4,
a.production_date, a.expiry_date, a.inventory_date,
a.production_date, a.expiry_date, a.inventory_date, a.purchase_date,
a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO,nvl(a.unit_name,b.unit_name) as unit_name,
a.bar_code as inv_bar_code,
a.in_order_number,a.lot_number,
@@ -263,6 +264,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="expiryDateEnd != null and expiryDateEnd != ''">
and a.expiry_date <![CDATA[ < ]]> DATEADD(DAY, 1, #{expiryDateEnd})
</if>
<if test="purchaseDateStr != null and purchaseDateStr != ''">
AND TO_CHAR(a.purchase_date, 'yyyy-MM-dd') = #{purchaseDateStr}
</if>
<if test="purchaseDateStart != null and purchaseDateStart != ''">
and a.purchase_date >= #{purchaseDateStart}
</if>
<if test="purchaseDateEnd != null and purchaseDateEnd != ''">
and a.purchase_date <![CDATA[ < ]]> DATEADD(DAY, 1, #{purchaseDateEnd})
</if>
<if test="createTimeStart != null and createTimeStart != ''">
and date_format(a.create_time,'%Y-%m-%d') &gt;= #{createTimeStart}
</if>
<if test="createTimeEnd != null and createTimeEnd != ''">
and date_format(a.create_time,'%Y-%m-%d') &lt;= #{createTimeEnd}
</if>
</sql>
<!-- 与 selectMaterialInventoryPo1 相同条件,表别名为 mi(用于 queryListByWl 最新明细子查询) -->
@@ -534,6 +550,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
MAX(a.unit_name) AS unit_name,
MAX(a.production_date) AS production_date,
MAX(a.inventory_date) AS inventory_date,
MAX(a.purchase_date) AS purchase_date,
MAX(a.batch_ref_no) AS batch_ref_no, MAX(a.sheet_ref_no) AS sheet_ref_no, MAX(a.box_pallet_no) AS box_pallet_no,
MAX(a.bar_code) AS inv_bar_code,
MAX(a.in_order_number) AS in_order_number, MAX(a.lot_number) AS lot_number,
@@ -1195,6 +1212,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productionDate" column="production_date" />
<result property="expiryDate" column="expiry_date" />
<result property="inventoryDate" column="inventory_date" />
<result property="purchaseDate" column="purchase_date" />
<result property="batchRefNo" column="batch_ref_no" />
<result property="sheetRefNo" column="sheet_ref_no" />
<result property="boxPalletNo" column="box_pallet_no" />
@@ -1513,6 +1531,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productionDate != null">
AND TRUNC(a.PRODUCTION_DATE) = TRUNC(#{productionDate})
</if>
<if test="purchaseDate != null">
AND TRUNC(a.purchase_date) = TRUNC(#{purchaseDate})
</if>
<if test="extAttr2 != null and extAttr2 != ''">
AND a.EXT_ATTR_2 = #{extAttr2}
</if>
@@ -1544,6 +1565,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productionDate == null">
AND a.PRODUCTION_DATE is null
</if>
<if test="purchaseDate == null">
AND a.purchase_date is null
</if>
<if test="extAttr2 == ''">
AND a.EXT_ATTR_2 = #{extAttr2}
</if>
@@ -0,0 +1,68 @@
-- =============================================================================
-- OMS/WMS 库存查询新增「进货日期」查询条件 —— 新增 PURCHASE_DATE 列
-- 日期: 2026-08-31
-- 数据库: 达梦(DM8), 兼容 Oracle 语法, 表名/字段名统一大写
-- 模式: NGWL_TEST_WMS (mhd_wms) / NGWL_TEST_OMS (mhd_oms)
-- 需求:
-- OMS-库存管理-库存查询 / WMS-库存管理-库存查询 增加查询条件:
-- 物料分类(后端已支持, 无需改表)、进货日期(本脚本, 新字段)、入库日期(复用
-- create_time, 无需改表)。
-- 说明:
-- 1. 进货日期录入入口为「收货批次属性」(batch_detail 配置标签「进货日期」),
-- 链路: 收货明细 -> 上架明细 -> WMS 物料库存 -> Feign -> OMS 预留库存。
-- 2. 列追加在表尾(DM 不支持 AFTER 定位); 历史数据该列为空, 按进货日期查询
-- 查不到存量库存(无来源可回填)。
-- 3. DATE 类型与同表现有 PRODUCTION_DATE/EXPIRY_DATE/INVENTORY_DATE 保持一致。
-- =============================================================================
-- WMS 收货明细
ALTER TABLE "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL" ADD COLUMN PURCHASE_DATE DATE;
COMMENT ON COLUMN "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL".PURCHASE_DATE IS '进货日期';
-- WMS 上架明细
ALTER TABLE "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL" ADD COLUMN PURCHASE_DATE DATE;
COMMENT ON COLUMN "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL".PURCHASE_DATE IS '进货日期';
-- WMS 物料库存
ALTER TABLE "NGWL_TEST_WMS"."MATERIAL_INVENTORY" ADD COLUMN PURCHASE_DATE DATE;
COMMENT ON COLUMN "NGWL_TEST_WMS"."MATERIAL_INVENTORY".PURCHASE_DATE IS '进货日期';
-- OMS 预留库存
ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY" ADD COLUMN PURCHASE_DATE DATE;
COMMENT ON COLUMN "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY".PURCHASE_DATE IS '进货日期';
-- =============================================================================
-- 批次明细配置(可选, 数据操作): 需要按进货日期录入/分行的物料, 在其批次规则中
-- 新增一条明细。BATCH_LABELS 必须一字不差为「进货日期」(后端 setMore() 按标签
-- 精确匹配解析); IS_DISPLAY=1 时同时参与库存行合并键(不同进货日期分库存行)。
--
-- 参考现有「生产日期」配置行(格式/控件取值对齐):
-- SELECT * FROM "NGWL_TEST_SYSTEM"."BATCH_DETAIL" WHERE BATCH_LABELS = '生产日期';
--
-- 配置模板(BATCH_ID 等按实际批次规则替换, 建议直接在 系统-批次管理 界面新增):
-- INSERT INTO "NGWL_TEST_SYSTEM"."BATCH_DETAIL"
-- (BATCH_DETAIL_ID, ORGANIZATION_ID, TOP_ORGANIZATION_ID, BATCH_ID,
-- BATCH_LABELS, FIELD_NAME, INPUT_CONTROL, ATTRIBUTE_FORMAT, IS_DISPLAY)
-- VALUES
-- (<主键>, <组织ID>, <顶级组织ID>, <批次规则ID>,
-- '进货日期', 'purchase_date', <同生产日期行>, '2', 1);
-- -- ATTRIBUTE_FORMAT: 2-日期
-- =============================================================================
-- =============================================================================
-- 执行前检查(确认列不存在, 避免重复执行报错; DM 数据字典标识符按大写存储)
-- SELECT OWNER, TABLE_NAME, COLUMN_NAME
-- FROM ALL_TAB_COLUMNS
-- WHERE COLUMN_NAME = 'PURCHASE_DATE'
-- AND OWNER IN ('NGWL_TEST_WMS', 'NGWL_TEST_OMS')
-- AND TABLE_NAME IN ('RECEIPT_MATERIAL_DETAIL', 'SHELF_MATERIAL_DETAIL',
-- 'MATERIAL_INVENTORY', 'RESERVATION_MATERIAL_INVENTORY');
--
-- 回滚(发布前执行了本脚本需回退时)
-- ALTER TABLE "NGWL_TEST_WMS"."RECEIPT_MATERIAL_DETAIL" DROP COLUMN PURCHASE_DATE;
-- ALTER TABLE "NGWL_TEST_WMS"."SHELF_MATERIAL_DETAIL" DROP COLUMN PURCHASE_DATE;
-- ALTER TABLE "NGWL_TEST_WMS"."MATERIAL_INVENTORY" DROP COLUMN PURCHASE_DATE;
-- ALTER TABLE "NGWL_TEST_OMS"."RESERVATION_MATERIAL_INVENTORY" DROP COLUMN PURCHASE_DATE;
--
-- 发布顺序: 先执行本 DDL 再发布服务(实体带新字段而表无列, MyBatis-Plus insert 会报错)
-- =============================================================================