fix(库存): 修复OMS/WMS库存查询过期日期不回显

根因:业务只在OMS填写饮用日期,且下发DTO无过期日期字段,饮用日期→过期日期的转换仅存在于收货单生成瞬间,后续环节全部丢失。

- InMaterialDetail(DTO) 补充 expiryDate 字段,打通OMS→WMS传递
- 预约单/执行单下发前:过期日期为空时用饮用日期补齐(治本)
- WMS收货批次属性回写:恢复饮用日期回写并兜底转换为过期日期(加固)
- WMS上架确认:过期日期为空时从收货明细兜底补齐(加固)
This commit is contained in:
rcx
2026-09-02 15:05:29 +08:00
parent 434348f972
commit e821619a96
5 changed files with 47 additions and 8 deletions
@@ -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;
@@ -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);
@@ -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自动审核)
@@ -743,14 +743,19 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
//receiptMaterialDetailDO.setExtAttr4(date);
} else if ("饮用日期".equals(batchLabels)) {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Date date = null;
// try {
// date = sdf.parse(attributeValue);
// } catch (ParseException e) {
// throw new RuntimeException(e);
// }
// receiptMaterialDetailDO.setInventoryDate(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(attributeValue);
} catch (ParseException e) {
throw new RuntimeException(e);
}
receiptMaterialDetailDO.setDrinkDate(date);
// 过期日期未单独填写时,饮用日期兜底作为过期日期(与收货单生成时的转换逻辑保持一致),
// 避免只填饮用日期导致库存过期日期为空不回显
if (receiptMaterialDetailDO.getExpiryDate() == null) {
receiptMaterialDetailDO.setExpiryDate(date);
}
} else if ("扩展属性2".equals(batchLabels)) {
receiptMaterialDetailDO.setExtAttr2(attributeValue);
} else if ("扩展属性1".equals(batchLabels)) {
@@ -62,6 +62,8 @@ import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO;
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParamDO;
import com.mhd.wms.domain.materialMoreDetail.repository.todo.MaterialMoreDetailDO;
import com.mhd.wms.domain.receiptMaterialDetail.entity.ReceiptMaterialDetail;
import com.mhd.wms.domain.receiptMaterialDetail.repository.facade.IReceiptMaterialDetailService;
import com.mhd.wms.domain.serialNumber.entity.SerialNumber;
import com.mhd.wms.domain.serialNumber.repository.facade.ISerialNumberService;
import com.mhd.wms.domain.shelfMaterialDetail.entity.ShelfMaterialDetail;
@@ -148,6 +150,8 @@ public class StockShelfOrderDomainService {
private MaterialBaseInfoMapper materialBaseInfoMapper;
@Autowired
private ICopyCodeReferenceService copyCodeReferenceService;
@Autowired
private IReceiptMaterialDetailService receiptMaterialDetailService;
@Resource
private OmsServiceFeign omsServiceFeign;
@@ -1134,6 +1138,21 @@ public class StockShelfOrderDomainService {
.collect(Collectors.toList());
}
}
// 过期日期兜底:上架明细未带过期日期时,回查收货明细补齐(优先过期日期,其次饮用日期),
// 避免收货环节补填的效期丢失导致库存过期日期为空不回显
if (shelfMaterialDetail.getExpiryDate() == null && shelfMaterialDetail.getReceiptUniqueId() != null) {
ReceiptMaterialDetail receiptDetail = receiptMaterialDetailService.getOne(
new LambdaQueryWrapper<ReceiptMaterialDetail>()
.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<MaterialInventoryPO> materialInventoryPOS = materialInventoryMapper.selectListByWhere(param);