From 0225c724e488c655679126d9418a0cfc03d88a8b Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 4 Nov 2026 15:58:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A9=E4=BA=8E=E4=BB=8A=E5=A4=A9=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E7=89=A9=E6=96=99=E5=B7=B2=E8=BF=87=E6=9C=9F=EF=BC=8C?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E6=8B=A6=E4=BD=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po/service/impl/PoServiceImpl.java | 48 +++++++++++++++++-- .../resources/i18n/messages_en_US.properties | 3 ++ .../resources/i18n/messages_zh_CN.properties | 3 ++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java index 3ba3a702..00571093 100644 --- a/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java +++ b/src/main/java/com/gaotao/modules/po/service/impl/PoServiceImpl.java @@ -322,21 +322,37 @@ public class PoServiceImpl extends ServiceImpl implemen handlingUnit.setBatchNo(inData.getBatchNo()); handlingUnit.setLocationId(inData.getLocationNo()); handlingUnit.setWarehouseId(transHeader.getWarehouseId()); + // 记下参与计算的基准日,过期时报错要告诉用户是供应商生产日期还是到达日期导致的 + String expiryBaseName = null; + Date expiryBaseDate = null; if (shelfLife==null || shelfLife==0) { handlingUnit.setExpiredDate(null); - } else if (inData.getManufactureDate() != null) { - // 如果有制造日期,计算失效日期 + } else if (inData.getSupplierManufactureDate() != null) { + // 有供应商生产日期时优先用它推算,页面字段同名 + expiryBaseName = i18n.text("purchase.po.expiryBaseSupplierManufactureDate"); + expiryBaseDate = inData.getSupplierManufactureDate(); java.util.Calendar calendar = java.util.Calendar.getInstance(); - calendar.setTime(inData.getManufactureDate()); + calendar.setTime(expiryBaseDate); calendar.add(java.util.Calendar.DAY_OF_YEAR, shelfLife); handlingUnit.setExpiredDate(calendar.getTime()); } else if (inData.getArrivalDate() != null) { - // 如果制造日期,但有接收日期,尝试用接收日期计算 + // 没有供应商生产日期才退回到达日期,避免两套基准日同时参与计算 + expiryBaseName = i18n.text("purchase.po.expiryBaseArrivalDate"); + expiryBaseDate = inData.getArrivalDate(); java.util.Calendar calendar = java.util.Calendar.getInstance(); - calendar.setTime(inData.getArrivalDate()); + calendar.setTime(expiryBaseDate); calendar.add(java.util.Calendar.DAY_OF_YEAR, shelfLife); handlingUnit.setExpiredDate(calendar.getTime()); } + // 按自然日比较:当天仍可入库,早于今天说明物料已过期,必须拦住,避免过期料进入库存 + if (isBeforeToday(handlingUnit.getExpiredDate())) { + String expiredDateText = DateUtils.format(handlingUnit.getExpiredDate(), DateUtils.DATE_PATTERN); + String baseDateText = DateUtils.format(expiryBaseDate, DateUtils.DATE_PATTERN); + log.warn("采购入库失效日期早于当前日期,拒绝入库,poNo={}, partNo={}, baseDateName={}, baseDate={}, shelfLife={}, expiredDate={}", + inData.getPoNo(), inData.getPartNo(), expiryBaseName, baseDateText, shelfLife, expiredDateText); + throw new XJException(i18n.text("purchase.po.expiredDateBeforeToday", + expiryBaseName, baseDateText, shelfLife, expiredDateText)); + } handlingUnit.setWdr(inData.getWdr()!=null?inData.getWdr():"*"); handlingUnit.setStatus("ACTIVE"); handlingUnit.setStatusDb("ACTIVE"); @@ -584,6 +600,28 @@ public class PoServiceImpl extends ServiceImpl implemen ); } + /** + * 失效日期早于今天则视为已过期。只比较自然日,当天不算过期。 + */ + private boolean isBeforeToday(Date expiredDate) { + if (expiredDate == null) { + return false; + } + Calendar expired = Calendar.getInstance(); + expired.setTime(expiredDate); + expired.set(Calendar.HOUR_OF_DAY, 0); + expired.set(Calendar.MINUTE, 0); + expired.set(Calendar.SECOND, 0); + expired.set(Calendar.MILLISECOND, 0); + + Calendar today = Calendar.getInstance(); + today.set(Calendar.HOUR_OF_DAY, 0); + today.set(Calendar.MINUTE, 0); + today.set(Calendar.SECOND, 0); + today.set(Calendar.MILLISECOND, 0); + return expired.before(today); + } + private Date calculateExpiryDate(Date baseDate, Integer shelfLife) { if (baseDate == null || shelfLife == null || shelfLife <= 0) { return null; diff --git a/src/main/resources/i18n/messages_en_US.properties b/src/main/resources/i18n/messages_en_US.properties index e12c2d57..a1038447 100644 --- a/src/main/resources/i18n/messages_en_US.properties +++ b/src/main/resources/i18n/messages_en_US.properties @@ -216,6 +216,9 @@ purchase.po.orderNotFound=No matching purchase order was found purchase.po.orderLineNotFound=No matching purchase order lines were found purchase.po.getPoListFailedWithDetail=Failed to get PO list: {0} purchase.po.shelfLifeMissing=Please contact engineering to maintain product shelf life +purchase.po.expiryBaseSupplierManufactureDate=supplier manufacture date +purchase.po.expiryBaseArrivalDate=arrival date +purchase.po.expiredDateBeforeToday=Expiry date {3}, calculated from {0} {1} plus a shelf life of {2} days, is earlier than today and cannot be received purchase.po.receiptFailedWithDetail=Purchase receipt failed: {0} purchase.po.labelSaveReturnedFalseWithUnitId=Label save failed (save returned false): {0} purchase.po.labelSaveValidationFailedWithUnitId=Label save failed (validation check failed): {0} diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 625835d9..9f507465 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -216,6 +216,9 @@ purchase.po.orderNotFound=未找到对应的采购订单 purchase.po.orderLineNotFound=未找到对应的采购订单行 purchase.po.getPoListFailedWithDetail=获取PO列表失败: {0} purchase.po.shelfLifeMissing=请联系工程维护产品有效期! +purchase.po.expiryBaseSupplierManufactureDate=供应商生产日期 +purchase.po.expiryBaseArrivalDate=到达日期 +purchase.po.expiredDateBeforeToday=根据{0}{1}加有效期{2}天计算出的失效日期{3}早于当前日期,不能入库 purchase.po.receiptFailedWithDetail=采购入库失败: {0} purchase.po.labelSaveReturnedFalseWithUnitId=标签保存失败(save返回false): {0} purchase.po.labelSaveValidationFailedWithUnitId=标签保存失败(验证未通过): {0}