Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r38571 -r38592 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 38571) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 38592) @@ -10468,6 +10468,12 @@ objectDao.update(pr); List tousseInstanceList = pr.getTousseInstanceList(objectDao); if(CollectionUtils.isNotEmpty(tousseInstanceList)){ + int expirationDateValueMode = ConfigUtils.getSystemSetConfigByNameInt("expirationDateValueMode", 0); + if(expirationDateValueMode == 1){ + //NYSY-68通过干预模块对器械包实例装配时间进行了干预修改, + //器械包的失效日期和预警日期根据装配时间来重新计算 + updateTousseInstanceValidUntilAndWarningUntil(packTime, tousseInstanceList); + } for (TousseInstance tousseInstance : tousseInstanceList) { tousseInstance.setOperationTime(packTime); objectDao.update(tousseInstance); @@ -10480,6 +10486,175 @@ appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INTERFERE, Log.TYPE_UPDATE, description); } + /** + * 通过干预模块对器械包实例装配时间进行了干预修改,器械包的失效日期和预警日期根据装配时间来重新计算NYSY-68 + * @param packTime + */ + private void updateTousseInstanceValidUntilAndWarningUntil(Date packTime, List tousseInstanceList) { + if(CollectionUtils.isEmpty(tousseInstanceList)){ + return; + } + if(packTime == null){ + throw new RuntimeException("装配时间不能为空!"); + } + + //获取包装类型,默认同一装配任务下的所有器械包实例的包装类型一样 + String packageType = tousseInstanceList.get(0).getPackageType(); + if(StringUtils.isBlank(packageType)){ + //没有包装类型,不改失效期预警期 + return; + } + + ExpirationDateInfo expirationDateInfo = (ExpirationDateInfo) objectDao.getByProperty(ExpirationDateInfo.class.getSimpleName(), "packageType", packageType); + if(expirationDateInfo == null){ + return; + } + + //根据装配时间计算的失效期和预警期 + Date validUntil = getValidUntil(packTime, expirationDateInfo); + Date warningUntil = getWarningUntil(packTime, expirationDateInfo); + + //查询灭菌记录,器械包实例没有灭菌则不返回灭菌记录 + Map sterilizationRecordMap = getTousseInstanceSterilizationRecordMap(tousseInstanceList); + for (TousseInstance tousseInstance : tousseInstanceList) { + Long sterilizationRecordId = tousseInstance.getSterilizationRecord_id(); + SterilizationRecord sterilizationRecord = sterilizationRecordMap.get(sterilizationRecordId); + if(sterilizationRecord != null && sterilizationRecord.getStartDate() != null && packTime.after(sterilizationRecord.getStartDate())){ + throw new RuntimeException("装配时间不能晚于灭菌开始时间。"); + } + //比较实际灭菌失效期和装配失效期,判断是否修改失效期 + boolean updateValidUntil = updateValidUntil(sterilizationRecord, validUntil, expirationDateInfo); + if(updateValidUntil){ + tousseInstance.setValidUntil(validUntil); + } + //比较实际灭菌预警期和装配预警期,判断是否修改预警期 + boolean updateWarningUntil = updateWarningUntil(sterilizationRecord, warningUntil, expirationDateInfo); + if(updateWarningUntil){ + tousseInstance.setWarningUntil(warningUntil); + } + } + + } + + /** + * 计算预警期 + * @param nowDate + * @param expirationDateInfo + * @return + */ + private Date getWarningUntil(Date nowDate, ExpirationDateInfo expirationDateInfo) { + //预警日期 + Date warningUntil = null; + //只有当失效日期不为空和0的情况下,才去更新包的失效日期 + if(nowDate != null && null != expirationDateInfo && null != expirationDateInfo.getWarningDate() && 0 != expirationDateInfo.getWarningDate().intValue()){ + //如果单位是月,则每月默认当做30天计算。 + if(StringTools.equals(ExpirationDateInfo.DATEUNIT_MONTH, expirationDateInfo.getValidDateUnit())){ + warningUntil = DateTools.addDate(nowDate, expirationDateInfo.getWarningDate() * 30); + }else{//否则当做天处理 + warningUntil = DateTools.addDate(nowDate,expirationDateInfo.getWarningDate()); + } + } + return warningUntil; + } + + /** + * 计算失效期 + * @param nowDate + * @param expirationDateInfo + * @return + */ + private Date getValidUntil(Date nowDate, ExpirationDateInfo expirationDateInfo) { + //失效日期 + Date validUntil = null; + //只有当失效日期不为空和0的情况下,才去更新包的失效日期 + if(nowDate != null && null != expirationDateInfo && null != expirationDateInfo.getValidDate() && 0 != expirationDateInfo.getValidDate().intValue()){ + //如果单位是月,则每月默认当做30天计算。 + if(StringTools.equals(ExpirationDateInfo.DATEUNIT_MONTH, expirationDateInfo.getValidDateUnit())){ + validUntil = DateTools.addDate(nowDate, expirationDateInfo.getValidDate() * 30); + }else{//否则当做天处理 + validUntil = DateTools.addDate(nowDate,expirationDateInfo.getValidDate()); + } + } + return validUntil; + } + + /** + * 判断是否修改预警期: + * 1、如果没有灭菌记录或者没有灭菌完成,则允许修改; + * 2、根据装配时间计算的预警期小于等于灭菌记录灭菌结算时间计算的(预警期,则允许修改; + * @param sterilizationRecord + * @param expirationObj + * @param sterilizationExpirationObj + * @return + */ + private boolean updateWarningUntil(SterilizationRecord sterilizationRecord, Date packWarningUntil, ExpirationDateInfo expirationDateInfo) { + if(sterilizationRecord == null || sterilizationRecord.isSterilizationFinish()){ + return true; + } + //根据实际灭菌结束时间计算的预警期 + Date sterilizationWarningUntil = getWarningUntil(sterilizationRecord == null ? null : sterilizationRecord.getEndDate(), expirationDateInfo); + //原来没有预警期,干预后也没有预警期 + if(packWarningUntil == null || sterilizationWarningUntil == null){ + return false; + } + + return packWarningUntil.getTime() <= sterilizationWarningUntil.getTime(); + } + + /** + * 判断是否修改失效期预警期: + * 1、如果没有灭菌记录或者没有灭菌完成,则允许修改; + * 2、根据装配时间计算的失效期(预警期)小于大于灭菌记录灭菌结算时间计算的失效期(预警期),则允许修改; + * @param sterilizationRecord + * @param expirationObj + * @param sterilizationExpirationObj + * @return + */ + private boolean updateValidUntil(SterilizationRecord sterilizationRecord, Date packValidUntil, ExpirationDateInfo expirationDateInfo) { + if(sterilizationRecord == null || sterilizationRecord.isSterilizationFinish()){ + return true; + } + //根据灭菌记录灭菌结算时间计算的失效期 + Date sterilizationValidUntil = getValidUntil(sterilizationRecord == null ? null : sterilizationRecord.getEndDate(), expirationDateInfo); + //原来没有失效期,干预后也没有失效期 + if(packValidUntil == null || sterilizationValidUntil == null){ + return false; + } + + return packValidUntil.getTime() <= sterilizationValidUntil.getTime(); + } + + /** + * 查询器械包实例的灭菌记录map + * @param tousseInstanceList + * @return + */ + @SuppressWarnings("unchecked") + private Map getTousseInstanceSterilizationRecordMap(List tousseInstanceList) { + Map sterilizationRecordMap = new HashMap(); + if(CollectionUtils.isEmpty(tousseInstanceList)){ + return sterilizationRecordMap; + } + List sterilizationRecordIdList = new ArrayList(); + for (TousseInstance tousseInstance : tousseInstanceList) { + Long sterilizationRecordId = tousseInstance.getSterilizationRecord_id(); + if(DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + sterilizationRecordIdList.add(sterilizationRecordId); + } + } + if(CollectionUtils.isEmpty(sterilizationRecordIdList)){ + return sterilizationRecordMap; + } + List sterilizationRecordList = objectDao.findByIds(SterilizationRecord.class.getSimpleName(), sterilizationRecordIdList); + if(CollectionUtils.isEmpty(sterilizationRecordList)){ + return sterilizationRecordMap; + } + for (SterilizationRecord sterilizationRecord : sterilizationRecordList) { + sterilizationRecordMap.put(sterilizationRecord.getId(), sterilizationRecord); + } + return sterilizationRecordMap; + } + private HSSFWorkbook getExportWorkbook(String sql){ try{ String fileName = Path.getWebAppRoot()