@ -322,21 +322,37 @@ public class PoServiceImpl extends ServiceImpl<PoMapper, PurchaseOrder> 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<PoMapper, PurchaseOrder> 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 ;