Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/util/UseRecordUtil.java =================================================================== diff -u -r32636 -r34831 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/util/UseRecordUtil.java (.../UseRecordUtil.java) (revision 32636) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/util/UseRecordUtil.java (.../UseRecordUtil.java) (revision 34831) @@ -190,6 +190,14 @@ }else{ tousseInstance.setUrgentLevelForUseRecord(null); } + + //“使用记录”表单信息中的使用物品列表新增表格列“结算科室”; + //“使用记录转申请单”功能改进可根据表格列“结算科室”自动拆成多张申请单(SZSDSRMYY-95) + String settleAccountDeptCodeUseRecord = obj.optString("settleAccountDeptCodeUseRecord", null); + if(StringUtils.isNotBlank(settleAccountDeptCodeUseRecord)){ + tousseInstance.setSettleAccountDeptCodeUseRecord(settleAccountDeptCodeUseRecord); + } + tousseInstance.setActualUsed(JSONUtil.optString(obj, "actualUsed", Constants.STR_YES)); RecyclingItem recyclingItem = null; if(isModified){ Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r34553 -r34831 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 34553) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 34831) @@ -6590,7 +6590,6 @@ return list; } - /** * 创建申请单(根据申请科室、器械包的处理供应室生成一个或多个申请单) * @param tousseNameAndAmount 器械包map,key为名称,value为数量 @@ -6605,12 +6604,34 @@ * @param dpf 一次性物品价格浮动系数 * @param invoicePlanType 单类型 */ - @Override public List createRecyclingApplicationByTousse( Map tousseNameAndAmountMap,Map diposableGoodMap, String applicant, String depart, String departCoding, String hospitalNumber, String remark, Map tousseInstanceMap,Date applicationCreateDate,String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, Map applyUrgentTousseMap,Map applyTousseNameToUrgentAmountMap,Map applyTousseNameToMaxUrgentLevelMap,Long useRecordId) { + return this.createRecyclingApplicationByTousse(tousseNameAndAmountMap, diposableGoodMap, applicant, depart, departCoding, null, null, hospitalNumber, remark, tousseInstanceMap, applicationCreateDate, operationRoom, sterilizationMode, dpf, invoicePlanType, applyUrgentTousseMap, applyTousseNameToUrgentAmountMap, applyTousseNameToMaxUrgentLevelMap, useRecordId); + } + + /** + * 创建申请单(根据申请科室、结算科室、器械包的处理供应室生成一个或多个申请单) + * @param tousseNameAndAmount 器械包map,key为名称,value为数量 + * @param diposableGoodMap 一次性物品map,key为名称,value为数量 + * @param applicant 申请人 + * @param depart 使用记录的科室名称 + * @param departCoding 使用记录的科室编码 + * @param remark 备注 + * @param tousseInstanceMap 器械包或标识牌条码map:key为条码,value为包定义id + * @param applicationCreateDate 申请时间(使用记录的时间) + * @param operationRoom 使用记录的病房 + * @param dpf 一次性物品价格浮动系数 + * @param invoicePlanType 单类型 + */ + @Override + public List createRecyclingApplicationByTousse( + Map tousseNameAndAmountMap,Map diposableGoodMap, String applicant, + String depart, String departCoding, String settleAccountsDepart, String settleAccountsDepartCoding, String hospitalNumber, String remark, + Map tousseInstanceMap,Date applicationCreateDate,String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, + Map applyUrgentTousseMap,Map applyTousseNameToUrgentAmountMap,Map applyTousseNameToMaxUrgentLevelMap,Long useRecordId) { List list = null; if ((tousseNameAndAmountMap != null && tousseNameAndAmountMap.size() > 0) || (diposableGoodMap != null && diposableGoodMap.size() > 0)) { list = new ArrayList(); @@ -6657,20 +6678,35 @@ recyclingApplication.setHandleDepartCoding((String)handleDepartMap.get("handleDepartCoding")); recyclingApplication.setHandleDepart((String)handleDepartMap.get("handleDepart")); //设置结算科室 - String settleAccountsDepart = depart; - String settleAccountsDepartCoding = departCoding; - SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(departCoding); - if(settleSupplyRoomConfig != null){ - settleAccountsDepart = settleSupplyRoomConfig.getOrgUnitName(); - settleAccountsDepartCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + String finalSettleAccountsDeptName = ""; + String finalSettleAccountsDeptCoding = ""; + if(StringUtils.isNotBlank(settleAccountsDepartCoding) + && StringUtils.isNotBlank(settleAccountsDepart)){ + //表格列“结算科室”中选择的科室已经设置了默认结算科室,则取值默认结算科室中设定的值;SZSDSRMYY-95 + SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(settleAccountsDepartCoding); + if(settleSupplyRoomConfig != null){ + finalSettleAccountsDeptName = settleSupplyRoomConfig.getOrgUnitName(); + finalSettleAccountsDeptCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + } //如果科室供应室配置的申请科室对应的默认结算科室编码为空的话,取申请科室的编码及名称 + if(StringUtils.isBlank(finalSettleAccountsDeptCoding)){ + finalSettleAccountsDeptCoding = settleAccountsDepartCoding; + finalSettleAccountsDeptName = settleAccountsDepart; + } + }else{ + SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(departCoding); + if(settleSupplyRoomConfig != null){ + finalSettleAccountsDeptName = settleSupplyRoomConfig.getOrgUnitName(); + finalSettleAccountsDeptCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + } + //如果科室供应室配置的申请科室对应的默认结算科室编码为空的话,取申请科室的编码及名称 if(StringUtils.isBlank(settleAccountsDepartCoding)){ - settleAccountsDepartCoding = departCoding; - settleAccountsDepart = depart; + finalSettleAccountsDeptCoding = departCoding; + finalSettleAccountsDeptName = depart; } } - recyclingApplication.setSettleAccountsDepart(settleAccountsDepart); - recyclingApplication.setSettleAccountsDepartCoding(settleAccountsDepartCoding); + recyclingApplication.setSettleAccountsDepart(finalSettleAccountsDeptName); + recyclingApplication.setSettleAccountsDepartCoding(finalSettleAccountsDeptCoding); recyclingApplication.setOperationRoom(operationRoom); recyclingApplication.setOrSpelling(GB2Alpha.string2Alpha(operationRoom)); @@ -6707,7 +6743,7 @@ Map>> ancestorTdToMaterialMd5ToTiListMapMap, Map idToUseRecordMap,boolean needInvoiceForUseRecordOfDepart, String invoicePlanType, String handleDepartCoding, String handleDepartName, String departCoding, String depart, - String applicant, Date applicationCreateDate, String operationRoom) { + String applicant, Date applicationCreateDate, String operationRoom, String settleAccountDeptCode, String settleAccountDeptName) { List list = new ArrayList(); SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); @@ -6775,17 +6811,17 @@ for (Long useRecordId : useRecordToTiListMap.keySet()) { List tiList = useRecordToTiListMap.get(useRecordId); UseRecord useRecord = idToUseRecordMap.get(useRecordId); - RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, applicant, applicationCreateDate, useRecord.getOperationRoom()); + RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, settleAccountDeptCode, settleAccountDeptName, applicant, applicationCreateDate, useRecord.getOperationRoom()); list.add(recyclingApplication); } }else{ List tiList = operationRoomToTiListMap.get(operationRoom1); - RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, applicant, applicationCreateDate, operationRoom1); + RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, settleAccountDeptCode, settleAccountDeptName, applicant, applicationCreateDate, operationRoom1); list.add(recyclingApplication); } } }else if(StringUtils.equals(useRecordConvertRecyclingApplicationMergeRegular, "depart")){ - RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tousseInstanceList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, applicant, applicationCreateDate, operationRoom); + RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tousseInstanceList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, settleAccountDeptCode, settleAccountDeptName, applicant, applicationCreateDate, operationRoom); list.add(recyclingApplication); }else{ Map> useRecordToTiListMap = new HashMap>(); @@ -6800,7 +6836,7 @@ for (Long useRecordId : useRecordToTiListMap.keySet()) { List tiList = useRecordToTiListMap.get(useRecordId); UseRecord useRecord = idToUseRecordMap.get(useRecordId); - RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, applicant, applicationCreateDate, useRecord.getOperationRoom()); + RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tiList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, settleAccountDeptCode, settleAccountDeptName, applicant, applicationCreateDate, useRecord.getOperationRoom()); list.add(recyclingApplication); } } @@ -6810,7 +6846,7 @@ List tempList = new ArrayList(); tempList.add(tousseInstance); UseRecord useRecord = idToUseRecordMap.get(tousseInstance.getUseRecord_id()); - RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tempList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, applicant, applicationCreateDate, useRecord.getOperationRoom()); + RecyclingApplication recyclingApplication = createRecyclingApplicationByTousseInstance(ancestorTd, tempList, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, handleDepartName, departCoding, depart, settleAccountDeptCode, settleAccountDeptName, applicant, applicationCreateDate, useRecord.getOperationRoom()); list.add(recyclingApplication); } } @@ -6836,7 +6872,7 @@ * @return */ public RecyclingApplication createRecyclingApplicationByTousseInstance(TousseDefinition ancestorTd, List tousseInstanceList, Map idToUseRecordMap,boolean needInvoiceForUseRecordOfDepart, String invoicePlanType, - String handleDepartCoding, String handleDepartName, String departCoding, String depart, + String handleDepartCoding, String handleDepartName, String departCoding, String depart, String settleAccountDeptCode, String settleAccountDeptName, String applicant, Date applicationCreateDate, String operationRoom){ RecyclingApplication recyclingApplication = new RecyclingApplication(); @@ -6850,14 +6886,29 @@ recyclingApplication.setHandleDepartCoding(handleDepartCoding); recyclingApplication.setHandleDepart(handleDepartName); //设置结算科室 - String settleAccountsDepart = depart; - String settleAccountsDepartCoding = departCoding; - SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(departCoding); - if(settleSupplyRoomConfig != null){ - settleAccountsDepart = settleSupplyRoomConfig.getOrgUnitName(); - settleAccountsDepartCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + String settleAccountsDepart = ""; + String settleAccountsDepartCoding = ""; + if(StringUtils.isNotBlank(settleAccountDeptCode) + && StringUtils.isNotBlank(settleAccountDeptName)){ + //若表格列“结算科室”中选择的科室已经设置了默认结算科室,则取值默认结算科室中设定的值SZSDSRMYY-95 + SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(settleAccountDeptCode); + if(settleSupplyRoomConfig != null){ + settleAccountsDepart = settleSupplyRoomConfig.getOrgUnitName(); + settleAccountsDepartCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + } //如果科室供应室配置的申请科室对应的默认结算科室编码为空的话,取申请科室的编码及名称 if(StringUtils.isBlank(settleAccountsDepartCoding)){ + settleAccountsDepartCoding = settleAccountDeptCode; + settleAccountsDepart = settleAccountDeptName; + } + }else{ + SupplyRoomConfig settleSupplyRoomConfig = supplyRoomConfigManager.getApplyDepartDefaultSettleDepart(departCoding); + if(settleSupplyRoomConfig != null){ + settleAccountsDepart = settleSupplyRoomConfig.getOrgUnitName(); + settleAccountsDepartCoding = settleSupplyRoomConfig.getOrgUnitCoding(); + } + //如果科室供应室配置的申请科室对应的默认结算科室编码为空的话,取申请科室的编码及名称 + if(StringUtils.isBlank(settleAccountsDepartCoding)){ settleAccountsDepartCoding = departCoding; settleAccountsDepart = depart; } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java =================================================================== diff -u -r32882 -r34831 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 32882) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 34831) @@ -118,6 +118,30 @@ String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, Map applyUrgentTousseMap,Map applyTousseNameToUrgentAmountMap, Map applyTousseNameToMaxUrgentLevelMap,Long useRecordId); + + /** + * 创建申请单(根据申请科室、结算科室、器械包的处理供应室生成一个或多个申请单) + * @param tousseNameAndAmount 器械包map,key为名称,value为数量 + * @param diposableGoodMap 一次性物品map,key为名称,value为数量 + * @param applicant 申请人 + * @param depart 使用记录的科室名称 + * @param departCoding 使用记录的科室编码 + * @param remark 备注 + * @param tousseInstanceCodes 器械包条码(含对应标识牌条码),应用至申请单的备注字段中 + * @param applicationCreateDate 申请时间(使用记录的时间) + * @param operationRoom 使用记录的病房 + * @param sterilizationMode 灭菌方式 + * @param dpf 一次性物品价格浮动系数 + * @param invoicePlanType 单类型 + */ + public List createRecyclingApplicationByTousse( + Map applyTousseMap, + Map diposableGoodMap, String applicant, + String depart, String departCoding, String settleAcountDepart, String settleAcountDepartCode, String hospitalNumber, String remark, + Map tousseInstanceMap, Date applicationDate, + String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, + Map applyUrgentTousseMap,Map applyTousseNameToUrgentAmountMap, + Map applyTousseNameToMaxUrgentLevelMap,Long useRecordId); /** @@ -133,12 +157,14 @@ * @param applicant 申请人 * @param applicationCreateDate 申请时间 * @param operationRoom 手术间 + * @param settleAccountDeptName 结算科室名称 + * @param settleAccountDeptCode 结算科室编码 * @return */ public List createRecyclingApplicationByDisinfectTousses( Map>> ancestorTdToMaterialMd5ToTiListMapMap,Map idToUseRecordMap, boolean needInvoiceForUseRecordOfDepart,String invoicePlanType ,String handleDepartCoding,String handleDepartName, - String departCoding, String depart,String applicant, Date applicationCreateDate,String operationRoom); + String departCoding, String depart,String applicant, Date applicationCreateDate,String operationRoom, String settleAccountDeptCode, String settleAccountDeptName); /** * /** Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r34795 -r34831 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 34795) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 34831) @@ -3142,6 +3142,8 @@ private Map checkedUseRecords(Collection ids) { //器械包(除外来器械包、外来器械拆分小包、自定义器械包外其它类型的TousseDefinition,即tousseType为器械包、消毒物品、敷料包、外部代理灭菌等)map(key为包定义id,value为数量) Map applyTousseMap = new HashMap(); + //使用记录结算科室、器械包Map(SZSDSRMYY-95) + Map> settleAccountDeptCodeTousseMap = new HashMap>(); //加急的器械包(除外来器械包、外来器械拆分小包、自定义器械包外其它类型的TousseDefinition,即tousseType为器械包、消毒物品、敷料包、外部代理灭菌等)map(key为包定义id,value为加急数量) Map applyUrgentTousseMap = new HashMap(); @@ -3511,6 +3513,18 @@ ancestorIdToDisinfectTiListMap.put(ancestorId,tiList); continue; } + + //使用记录转申请单”功能改进可根据表格列“结算科室”自动拆成多张申请单SZSDSRMYY-95 + if(StringUtils.isNotBlank(tousseInstance.getSettleAccountDeptCodeUseRecord())){ + String settleAccountDeptCodeUseRecord = tousseInstance.getSettleAccountDeptCodeUseRecord(); + Map tousseMap = settleAccountDeptCodeTousseMap.get(settleAccountDeptCodeUseRecord); + if(tousseMap == null){ + tousseMap = new HashMap(); + } + increaseMapAmount(tousseMap,tousseInstance.getTousseName()); + settleAccountDeptCodeTousseMap.put(settleAccountDeptCodeUseRecord, tousseMap); + } + //不再根据此变量判断 // if (canTransferToAppFlag){ increaseMapAmount(applyTousseMap,tousseInstance.getTousseName()); @@ -3567,6 +3581,7 @@ Map map = new HashMap(); map.put("applyTousseMap", applyTousseMap);//普通器械包(含敷料包,不含消毒物品、外来器械等)map + map.put("settleAccountDeptCodeTousseMap", settleAccountDeptCodeTousseMap);//使用记录结算科室、普通器械包(含敷料包,不含消毒物品、外来器械等)map map.put("applyUrgentTousseMap", applyUrgentTousseMap); map.put("applyForeignTousseMap", applyForeignTousseMap);//外来器械包 map.put("applyUrgentForeignTousseMap", applyUrgentForeignTousseMap); @@ -3850,6 +3865,9 @@ //器械包map(key为名称,value为数量) Map applyTousseMap = (Map) useRecordsMap .get("applyTousseMap"); + //使用记录结算科室、器械包map(key为结算科室编码, value为(key为名称,value为数量)) + Map> settleAccountDeptCodeTousseMap = (Map>) useRecordsMap + .get("settleAccountDeptCodeTousseMap"); //自定义器械包map(key为包定义id,value为数量) Map applyCustomTousseMap = (Map) useRecordsMap .get("applyCustomTousseMap"); @@ -3933,6 +3951,25 @@ } } + //结算科室map + Map settleAccountDeptMap = new HashMap(); + if(MapUtils.isEmpty(settleAccountDeptCodeTousseMap)){ + settleAccountDeptCodeTousseMap.put("", applyTousseMap); + }else{ + List settleAccountDeptCodeList = new ArrayList(); + for (String settleAccountDeptCode : settleAccountDeptCodeTousseMap.keySet()) { + settleAccountDeptCodeList.add(settleAccountDeptCode); + } + String orgUnitSql = String.format("select po from %s po where %s ", OrgUnit.class.getSimpleName(), + SqlUtils.getStringFieldInLargeCollectionsPredicate("orgUnitCoding", settleAccountDeptCodeList)); + List orgList = objectDao.findByHql(orgUnitSql); + if(CollectionUtils.isNotEmpty(orgList)){ + for (OrgUnit orgUnit : orgList) { + settleAccountDeptMap.put(orgUnit.getOrgUnitCoding(), orgUnit.getName()); + } + } + } + //手术间为空临床科室也合并单 boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank = CssdUtils.getSystemSetConfigByNameBool("allowUseReordToApplicationMergeWhenOperationRoomIsBlank",false); //DGSDBZXYY-31 使用记录转单时,高低温物品自动分单({"mergeRegular":"depart","lowTempSterilizationModes":["低温等离子","环氧乙烷"]}) since:2020-07-14 @@ -3957,45 +3994,51 @@ if(CollectionUtils.isEmpty(lowTempSterilizationModesJSONArray)){ throw new SystemException("配置项mergeRegularOfLowTemperatureToussesAfterExtracted的格式不正确,lowTempSterilizationModes的值为空"); } - - lowTempSterilizationModesJSONArray.stream().forEach(lowTempSterilizationMode -> { - String lowTempSterilizationModeLoop = StringUtils.isBlank((String)lowTempSterilizationMode) ? null : (String)lowTempSterilizationMode; - - tousseNameToSterilingModeMap.entrySet().forEach(entry -> { - String tousseName = entry.getKey(); - String sterilizationMode = entry.getValue(); - if(StringUtils.equals(sterilizationMode, lowTempSterilizationModeLoop)){ - Map applyTousseMapOfLowTempSterilizationMode = sterilizationModeToTousseNameToAmountMap.get(sterilizationMode); - if(applyTousseMapOfLowTempSterilizationMode == null){ - applyTousseMapOfLowTempSterilizationMode = new HashMap(); + + for (String settleAccountDeptCode : settleAccountDeptCodeTousseMap.keySet()) { + Map applyTousseMap1 = settleAccountDeptCodeTousseMap.get(settleAccountDeptCode); + String settleAccountDept = settleAccountDeptMap.get(settleAccountDeptCode); + lowTempSterilizationModesJSONArray.stream().forEach(lowTempSterilizationMode -> { + String lowTempSterilizationModeLoop = StringUtils.isBlank((String)lowTempSterilizationMode) ? null : (String)lowTempSterilizationMode; + + tousseNameToSterilingModeMap.entrySet().forEach(entry -> { + String tousseName = entry.getKey(); + String sterilizationMode = entry.getValue(); + if(StringUtils.equals(sterilizationMode, lowTempSterilizationModeLoop)){ + Map applyTousseMapOfLowTempSterilizationMode = sterilizationModeToTousseNameToAmountMap.get(sterilizationMode); + if(applyTousseMapOfLowTempSterilizationMode == null){ + applyTousseMapOfLowTempSterilizationMode = new HashMap(); + } + applyTousseMapOfLowTempSterilizationMode.put(tousseName, applyTousseMap1.get(tousseName)); + sterilizationModeToTousseNameToAmountMap.put(sterilizationMode, applyTousseMapOfLowTempSterilizationMode); + + applyTousseMap1.remove(tousseName); + applyUrgentTousseMap.remove(tousseName); + settleAccountDeptCodeTousseMap.put(settleAccountDeptCode, applyTousseMap1); } - applyTousseMapOfLowTempSterilizationMode.put(tousseName, applyTousseMap.get(tousseName)); - sterilizationModeToTousseNameToAmountMap.put(sterilizationMode, applyTousseMapOfLowTempSterilizationMode); - - applyTousseMap.remove(tousseName); - applyUrgentTousseMap.remove(tousseName); - } - }); - tousseBarcodeToSterilingModeMap.entrySet().forEach(entry -> { - String tousseBarcode = entry.getKey(); - String sterilizationMode = entry.getValue(); - if(StringUtils.equals(sterilizationMode, lowTempSterilizationModeLoop)){ - Map tousseBarcodeToTdIdMapOfLowTempSterilizationMode = sterilizationModeToTousseBarcodeToTdIdMap.get(sterilizationMode); - if(tousseBarcodeToTdIdMapOfLowTempSterilizationMode == null){ - tousseBarcodeToTdIdMapOfLowTempSterilizationMode = new HashMap(); + }); + tousseBarcodeToSterilingModeMap.entrySet().forEach(entry -> { + String tousseBarcode = entry.getKey(); + String sterilizationMode = entry.getValue(); + if(StringUtils.equals(sterilizationMode, lowTempSterilizationModeLoop)){ + Map tousseBarcodeToTdIdMapOfLowTempSterilizationMode = sterilizationModeToTousseBarcodeToTdIdMap.get(sterilizationMode); + if(tousseBarcodeToTdIdMapOfLowTempSterilizationMode == null){ + tousseBarcodeToTdIdMapOfLowTempSterilizationMode = new HashMap(); + } + tousseBarcodeToTdIdMapOfLowTempSterilizationMode.put(tousseBarcode, tousseBarcodeMap.get(tousseBarcode)); + sterilizationModeToTousseBarcodeToTdIdMap.put(sterilizationMode, tousseBarcodeToTdIdMapOfLowTempSterilizationMode); + + tousseBarcodeMap.remove(tousseBarcode); } - tousseBarcodeToTdIdMapOfLowTempSterilizationMode.put(tousseBarcode, tousseBarcodeMap.get(tousseBarcode)); - sterilizationModeToTousseBarcodeToTdIdMap.put(sterilizationMode, tousseBarcodeToTdIdMapOfLowTempSterilizationMode); - - tousseBarcodeMap.remove(tousseBarcode); - } + }); }); - }); - //最后对符合配置的灭菌方式的包按配置的合并规则进行转换 - lowTempSterilizationModesTousseConvertRecyclingApplication(useRecordList,sterilizationModeToTousseNameToAmountMap,sterilizationModeToTousseBarcodeToTdIdMap, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,tousseNameToIsInvoiceMap,tousseNameToBelongToUseRecordListMap, - lowTempMergeRegular,operationRoom, allowUseReordToApplicationMergeWhenOperationRoomIsBlank, needInvoiceForUseRecordOfDepart,departCoding, departCanMerge, - applicant, depart, applicationCreateDate, dpf); + //最后对符合配置的灭菌方式的包按配置的合并规则进行转换 + lowTempSterilizationModesTousseConvertRecyclingApplication(useRecordList,sterilizationModeToTousseNameToAmountMap,sterilizationModeToTousseBarcodeToTdIdMap, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,tousseNameToIsInvoiceMap,tousseNameToBelongToUseRecordListMap, + lowTempMergeRegular,operationRoom, allowUseReordToApplicationMergeWhenOperationRoomIsBlank, needInvoiceForUseRecordOfDepart,departCoding, settleAccountDeptCode, settleAccountDept, departCanMerge, + applicant, depart, applicationCreateDate, dpf); + } + }catch(Exception e){ e.printStackTrace(); throw new SystemException("配置项mergeRegularOfLowTemperatureToussesAfterExtracted的值格式不正确"); @@ -4047,214 +4090,334 @@ } //申请单类型(2表示分开的申请单,1为通用申请单) if(InvoicePlan.APPLICATION_FORM_TYPE_SPLIT.equals(applicationFormType)){ - invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; - if(applyTousseMap.size() > 0){ - //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 - if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(useRecordConvertRecyclingApplicationMergeRegular) - && useRecordList.size() == 1 - && (StringUtils.isNotBlank(operationRoom) - || (StringUtils.isBlank(operationRoom) && allowUseReordToApplicationMergeWhenOperationRoomIsBlank) - )){ - String operationRoomSql = null; - if(StringUtils.isNotBlank(operationRoom)){ - operationRoomSql = " and operationRoom='"+ operationRoom +"' "; - }else{ - operationRoomSql = " and (operationRoom='' or operationRoom is null)"; - } - //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 - String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord - ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '') "; + for (String settleAccountDeptCode : settleAccountDeptCodeTousseMap.keySet()) { + + Map settleAccountDeptCodeApplyTousseMap = settleAccountDeptCodeTousseMap.get(settleAccountDeptCode); + invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + if(settleAccountDeptCodeApplyTousseMap.size() > 0){ - //特殊感染类型查询条件DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; - - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - RecyclingApplication recyclingApplication = null; - if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ - recyclingApplication = (RecyclingApplication)objectDao.getBySql_ForUpdate(RecyclingApplication.class.getSimpleName(), - "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "' " - + "and (sterilizationMode is null or "+ SqlUtils.getStringFieldNotInCollectionsPredicate("sterilizationMode", lowTempSterilizationModesJSONArray) +")" - + operationRoomSql - + "and type in ('"+ InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM +"') " - + "and (endStatus is null) " + deliverStatusCondition - + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " - + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " - + specialInfectionCondition - + " order by po.id desc"); + //结算科室过滤条件SZSDSRMYY-95 + String settleAcountDepartCodeSql = ""; + if(StringUtils.isNotBlank(settleAccountDeptCode)){ + settleAcountDepartCodeSql = " and settleAccountsDepartCoding = '" + settleAccountDeptCode + "' "; } - //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) - boolean willMergeConvertApplication = false; - if(recyclingApplication != null){ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; + //结算科室名称 + String settleAccountDept = settleAccountDeptMap.get(settleAccountDeptCode); + + //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 + if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(useRecordConvertRecyclingApplicationMergeRegular) + && useRecordList.size() == 1 + && (StringUtils.isNotBlank(operationRoom) + || (StringUtils.isBlank(operationRoom) && allowUseReordToApplicationMergeWhenOperationRoomIsBlank) + )){ + String operationRoomSql = null; + if(StringUtils.isNotBlank(operationRoom)){ + operationRoomSql = " and operationRoom='"+ operationRoom +"' "; + }else{ + operationRoomSql = " and (operationRoom='' or operationRoom is null)"; } - tousseBarcodes += tousseBarcodesOfUseRecord; - //新申请单的备注 - String newRemark = - getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); - //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 - if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength - && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ - willMergeConvertApplication = true; - } - } - if(!willMergeConvertApplication || !departCanMerge){ - //创建器械包申请单 - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); + //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 + String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord + ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " + : " and (deliverStatus is null or deliverStatus = '') "; - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + //特殊感染类型查询条件DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; + + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + RecyclingApplication recyclingApplication = null; + if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ + recyclingApplication = (RecyclingApplication)objectDao.getBySql_ForUpdate(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "' " + + "and (sterilizationMode is null or "+ SqlUtils.getStringFieldNotInCollectionsPredicate("sterilizationMode", lowTempSterilizationModesJSONArray) +")" + + operationRoomSql + + "and type in ('"+ InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM +"') " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + + specialInfectionCondition + + settleAcountDepartCodeSql + + " order by po.id desc"); + } + //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) + boolean willMergeConvertApplication = false; + if(recyclingApplication != null){ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + //新申请单的备注 + String newRemark = + getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); + //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 + if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength + && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ + willMergeConvertApplication = true; + } + } + if(!willMergeConvertApplication || !departCanMerge){ + //创建器械包申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + List tousseTransitionPlanItemList = + getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + //生成预回收记录 + tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + } + } } - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - List tousseTransitionPlanItemList = - getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } + }else{ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + + recyclingApplication.setTousseBarcodes(tousseBarcodes); + recyclingApplication.setUseRecord(firstUseRecord); + //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 + //recyclingApplication.setApplicant(applicant); + //recyclingApplication.setApplicationTime(applicationCreateDate); + recyclingApplication.setSubmitTime(applicationCreateDate); + //住院号叠加 + if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); + }else{ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); + } + }else{ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(hospitalNumbers); + }else{ + //原住院号与新使用记录的住院号都为空白时,不用设置 + } + } + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //版本加1(因为该申请单有新的物品(使用记录登记)合并进来) + VersionOperators.increaseVersion(recyclingApplication); + recyclingApplication.setDescription("该单于"+ ForgonDateUtils.safelyFormatDate(new Date(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "") + "追加如下物品:" + MapTools.mapConvertString(settleAccountDeptCodeApplyTousseMap , "名称" , "数量")); + + //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) + recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); + objectDao.saveOrUpdate(recyclingApplication); + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + //追加申请项(相同物品的,则数量进行叠加) + List tousseTransitionPlanItemList = + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + List list = new ArrayList(); + for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { + //构造与生成预回收相关的数据 + list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + } //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - //生成预回收记录 - tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + if(CollectionUtils.isNotEmpty(list)){ + tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); } } + } else{ + for (UseRecord tempUseRecord : useRecordList) { + recyclingApplication.setUseRecord(tempUseRecord); + //追加申请项(相同物品的,则数量进行叠加) + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + } } + recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + recyclingApplicationListAfterConvert.add(recyclingApplication); } - }else{ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; + }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ - recyclingApplication.setTousseBarcodes(tousseBarcodes); - recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 - //recyclingApplication.setApplicant(applicant); - //recyclingApplication.setApplicationTime(applicationCreateDate); - recyclingApplication.setSubmitTime(applicationCreateDate); - //住院号叠加 - if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); - }else{ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); + //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 + String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord + ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " + : " and (deliverStatus is null or deliverStatus = '') "; + + //若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单,不允许和其他的使用记录合并转换为一张申请单DGSETYY-43 + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; + + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + RecyclingApplication recyclingApplication = null; + if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ + recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" + + "and (sterilizationMode is null or "+ SqlUtils.getStringFieldNotInCollectionsPredicate("sterilizationMode", lowTempSterilizationModesJSONArray) +")" + + "and type in ('"+ InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM +"') " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + + specialInfectionCondition + + settleAcountDepartCodeSql + + "order by po.id desc"); + } + //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) + boolean willMergeConvertApplication = false; + if(recyclingApplication != null){ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; } - }else{ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(hospitalNumbers); - }else{ - //原住院号与新使用记录的住院号都为空白时,不用设置 + tousseBarcodes += tousseBarcodesOfUseRecord; + //新申请单的备注 + String newRemark = + getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); + //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 + if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength + && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ + willMergeConvertApplication = true; } } - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //版本加1(因为该申请单有新的物品(使用记录登记)合并进来) - VersionOperators.increaseVersion(recyclingApplication); - recyclingApplication.setDescription("该单于"+ ForgonDateUtils.safelyFormatDate(new Date(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "") + "追加如下物品:" + MapTools.mapConvertString(applyTousseMap , "名称" , "数量")); - - //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) - recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); - objectDao.saveOrUpdate(recyclingApplication); - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - //追加申请项(相同物品的,则数量进行叠加) - List tousseTransitionPlanItemList = - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + if(!willMergeConvertApplication || !departCanMerge){ + //创建器械包申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - List list = new ArrayList(); - for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { - //构造与生成预回收相关的数据 - list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + List tousseTransitionPlanItemList = + getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + //生成预回收记录 + tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + } + } } - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(list)){ - tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } + }else{ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + + recyclingApplication.setTousseBarcodes(tousseBarcodes); + recyclingApplication.setUseRecord(firstUseRecord); + //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 + //recyclingApplication.setApplicant(applicant); + //recyclingApplication.setApplicationTime(applicationCreateDate); + recyclingApplication.setSubmitTime(applicationCreateDate); + //住院号叠加 + if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); + }else{ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); } + }else{ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(hospitalNumbers); + }else{ + //原住院号与新使用记录的住院号都为空白时,不用设置 + } } - } else{ + //2.插入使用记录转换申请单关联中间表 for (UseRecord tempUseRecord : useRecordList) { - recyclingApplication.setUseRecord(tempUseRecord); + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //版本加1(因为该申请单有新的物品(使用记录登记)合并进来) + VersionOperators.increaseVersion(recyclingApplication); + recyclingApplication.setDescription("该单于"+ ForgonDateUtils.safelyFormatDate(new Date(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "") + "追加如下物品:" + MapTools.mapConvertString(settleAccountDeptCodeApplyTousseMap , "名称" , "数量")); + + //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) + recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); + objectDao.saveOrUpdate(recyclingApplication); + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ //追加申请项(相同物品的,则数量进行叠加) - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + List tousseTransitionPlanItemList = + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + List list = new ArrayList(); + for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { + //构造与生成预回收相关的数据 + list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + } + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(list)){ + tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); + } + } + } else { + for (UseRecord tempUseRecord : useRecordList) { + recyclingApplication.setUseRecord(tempUseRecord); + //追加申请项(相同物品的,则数量进行叠加) + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + } } + recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } - recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.add(recyclingApplication); - } - }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ - - //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 - String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord - ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '') "; - - //若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单,不允许和其他的使用记录合并转换为一张申请单DGSETYY-43 - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; - - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - RecyclingApplication recyclingApplication = null; - if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ - recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), - "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" - + "and (sterilizationMode is null or "+ SqlUtils.getStringFieldNotInCollectionsPredicate("sterilizationMode", lowTempSterilizationModesJSONArray) +")" - + "and type in ('"+ InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM +"') " - + "and (endStatus is null) " + deliverStatusCondition - + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " - + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " - + specialInfectionCondition - + "order by po.id desc"); - } - //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) - boolean willMergeConvertApplication = false; - if(recyclingApplication != null){ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - //新申请单的备注 - String newRemark = - getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); - //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 - if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength - && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ - willMergeConvertApplication = true; - } - } - if(!willMergeConvertApplication || !departCanMerge){ + }else{ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -4268,6 +4431,7 @@ useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); } + //只有当使用记录数量为1时,才启用器械交接 if(useRecordList.size() == 1){ List tousseTransitionPlanItemList = @@ -4279,126 +4443,398 @@ } } } + //将转换后申请单对象保存至集合中 recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } - }else{ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - - recyclingApplication.setTousseBarcodes(tousseBarcodes); - recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 - //recyclingApplication.setApplicant(applicant); - //recyclingApplication.setApplicationTime(applicationCreateDate); - recyclingApplication.setSubmitTime(applicationCreateDate); - //住院号叠加 - if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); - }else{ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); - } - }else{ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(hospitalNumbers); - }else{ - //原住院号与新使用记录的住院号都为空白时,不用设置 - } - } + } + } + } + + //单独一次性物品的单合并暂先不考虑,都重新创建新的单 + if(isDgConvertApplication && applyDiposableGoodsMap.size() > 0){ + //创建一次性物品申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + new HashMap(),applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { //2.插入使用记录转换申请单关联中间表 for (UseRecord tempUseRecord : useRecordList) { UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); } + } + } + } + //如果不分单(即通用申请单),且一次性物品是否转换申请单为是,并且器械包一次性物品转换成申请单是否合并成一张单为否时 + }else if(isDgConvertApplication && !isTousseDgMergeConvert){ + for (String settleAccountDeptCode : settleAccountDeptCodeTousseMap.keySet()) { + + Map settleAccountDeptCodeApplyTousseMap = settleAccountDeptCodeTousseMap.get(settleAccountDeptCode); + if(settleAccountDeptCodeApplyTousseMap.size() > 0){ + + //结算科室过滤条件SZSDSRMYY-95 + String settleAcountDepartCodeSql = ""; + if(StringUtils.isNotBlank(settleAccountDeptCode)){ + settleAcountDepartCodeSql = " and settleAccountsDepartCoding = '" + settleAccountDeptCode + "' "; + } + //结算科室名称 + String settleAccountDept = settleAccountDeptMap.get(settleAccountDeptCode); + + //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 + if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(useRecordConvertRecyclingApplicationMergeRegular) + && useRecordList.size() == 1 + && (StringUtils.isNotBlank(operationRoom) + || (StringUtils.isBlank(operationRoom) && allowUseReordToApplicationMergeWhenOperationRoomIsBlank) + )){ + String operationRoomSql = null; + if(StringUtils.isNotBlank(operationRoom)){ + operationRoomSql = "and operationRoom='"+ operationRoom +"' "; + }else{ + operationRoomSql = "and (operationRoom='' or operationRoom is null)"; + } + //查询该科室的手术间与当前使用记录的手术单相同的申请单 + //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 + String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord + ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " + : " and (deliverStatus is null or deliverStatus = '') "; - //版本加1(因为该申请单有新的物品(使用记录登记)合并进来) - VersionOperators.increaseVersion(recyclingApplication); - recyclingApplication.setDescription("该单于"+ ForgonDateUtils.safelyFormatDate(new Date(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "") + "追加如下物品:" + MapTools.mapConvertString(applyTousseMap , "名称" , "数量")); + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; - //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) - recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); - objectDao.saveOrUpdate(recyclingApplication); - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - //追加申请项(相同物品的,则数量进行叠加) - List tousseTransitionPlanItemList = - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + RecyclingApplication recyclingApplication = null; + if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ + recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" + + operationRoomSql + + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + + specialInfectionCondition + + settleAcountDepartCodeSql + + "order by po.id desc"); + } + //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) + boolean willMergeConvertApplication = false; + if(recyclingApplication != null){ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + //新申请单的备注 + String newRemark = + getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); + //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 + if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength + && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ + willMergeConvertApplication = true; + } + } + if(!willMergeConvertApplication || !departCanMerge){ + //创建器械包申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - List list = new ArrayList(); - for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { - //构造与生成预回收相关的数据 - list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + List tousseTransitionPlanItemList = + getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + //生成预回收记录 + tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + } + } } - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(list)){ - tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } + }else{ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + recyclingApplication.setTousseBarcodes(tousseBarcodes); + recyclingApplication.setUseRecord(firstUseRecord); + + //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 + //recyclingApplication.setApplicant(applicant); + //recyclingApplication.setApplicationTime(applicationCreateDate); + recyclingApplication.setSubmitTime(applicationCreateDate); + //住院号叠加 + if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); + }else{ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); } + }else{ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(hospitalNumbers); + }else{ + //原住院号与新使用记录的住院号都为空白时,不用设置 + } } - } else { + //2.插入使用记录转换申请单关联中间表 for (UseRecord tempUseRecord : useRecordList) { - recyclingApplication.setUseRecord(tempUseRecord); + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) + recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); + objectDao.saveOrUpdate(recyclingApplication); + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ //追加申请项(相同物品的,则数量进行叠加) - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + List tousseTransitionPlanItemList = + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + List list = new ArrayList(); + for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { + //构造与生成预回收相关的数据 + list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + } + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(list)){ + tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); + } + } + } else { + for (UseRecord tempUseRecord : useRecordList) { + recyclingApplication.setUseRecord(tempUseRecord); + //追加申请项(相同物品的,则数量进行叠加) + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + } } + recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } - recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.add(recyclingApplication); - } - }else{ - //创建器械包申请单 - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ + //查询该科室的手术间与当前使用记录的手术单相同的申请单 + //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 + String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord + ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " + : " and (deliverStatus is null or deliverStatus = '') "; + + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '') "; + + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) + RecyclingApplication recyclingApplication = null; + if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 + recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" + + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + + specialInfectionCondition + + settleAcountDepartCodeSql + + "order by po.id desc"); + } + + //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) + boolean willMergeConvertApplication = false; + if(recyclingApplication != null){ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + //新申请单的备注 + String newRemark = + getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); + //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 + if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength + && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ + willMergeConvertApplication = true; + } + } + if(!willMergeConvertApplication || !departCanMerge){ + //创建器械包申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_COMBO_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + List tousseTransitionPlanItemList = + getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + //生成预回收记录 + tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + } + } + } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } + }else{ + //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 + String tousseBarcodes = recyclingApplication.getTousseBarcodes(); + if(StringUtils.isBlank(tousseBarcodes)){ + tousseBarcodes = ";"; + } + tousseBarcodes += tousseBarcodesOfUseRecord; + recyclingApplication.setTousseBarcodes(tousseBarcodes); + recyclingApplication.setUseRecord(firstUseRecord); + + //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 + //recyclingApplication.setApplicant(applicant); + //recyclingApplication.setApplicationTime(applicationCreateDate); + recyclingApplication.setSubmitTime(applicationCreateDate); + //住院号叠加 + if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); + }else{ + recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); + } + }else{ + if(StringUtils.isNotBlank(hospitalNumbers)){ + recyclingApplication.setHospitalNumber(hospitalNumbers); + }else{ + //原住院号与新使用记录的住院号都为空白时,不用设置 + } + } //2.插入使用记录转换申请单关联中间表 for (UseRecord tempUseRecord : useRecordList) { UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); } + //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) + recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); + objectDao.saveOrUpdate(recyclingApplication); + //只有当使用记录数量为1时,才启用器械交接 if(useRecordList.size() == 1){ + //追加申请项(相同物品的,则数量进行叠加) List tousseTransitionPlanItemList = - getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); - //如果预回收项不为空时,保存预回收记录 + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - //生成预回收记录 - tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + List list = new ArrayList(); + for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { + //构造与生成预回收相关的数据 + list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); + } + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(list)){ + tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); + } } + } else { + for (UseRecord tempUseRecord : useRecordList) { + recyclingApplication.setUseRecord(tempUseRecord); + //追加申请项(相同物品的,则数量进行叠加) + recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); + } } + recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } + }else{ + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, + applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : useRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + //只有当使用记录数量为1时,才启用器械交接 + if(useRecordList.size() == 1){ + List tousseTransitionPlanItemList = + getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); + //如果预回收项不为空时,保存预回收记录 + if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ + //生成预回收记录 + tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); + } + } + } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } } } } //单独一次性物品的单合并暂先不考虑,都重新创建新的单 - if(isDgConvertApplication && applyDiposableGoodsMap.size() > 0){ - //创建一次性物品申请单 + if(applyDiposableGoodsMap.size() > 0){ List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( new HashMap(),applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -4415,9 +4851,23 @@ } } } - //如果不分单(即通用申请单),且一次性物品是否转换申请单为是,并且器械包一次性物品转换成申请单是否合并成一张单为否时 - }else if(isDgConvertApplication && !isTousseDgMergeConvert){ - if(applyTousseMap.size() > 0){ + }else{ + for (String settleAccountDeptCode : settleAccountDeptCodeTousseMap.keySet()) { + + Map settleAccountDeptCodeApplyTousseMap = settleAccountDeptCodeTousseMap.get(settleAccountDeptCode); + //否则一次性物品是否转换申请单为否 + if(!isDgConvertApplication){ + applyDiposableGoodsMap = new HashMap(); + } + + //结算科室过滤条件SZSDSRMYY-95 + String settleAcountDepartCodeSql = ""; + if(StringUtils.isNotBlank(settleAccountDeptCode)){ + settleAcountDepartCodeSql = " and settleAccountsDepartCoding = '" + settleAccountDeptCode + "' "; + } + //结算科室名称 + String settleAccountDept = settleAccountDeptMap.get(settleAccountDeptCode); + //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(useRecordConvertRecyclingApplicationMergeRegular) && useRecordList.size() == 1 @@ -4430,28 +4880,31 @@ }else{ operationRoomSql = "and (operationRoom='' or operationRoom is null)"; } - //查询该科室的手术间与当前使用记录的手术单相同的申请单 + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且还未回收) //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '') "; + : " and (deliverStatus is null or deliverStatus = '')"; //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '') "; - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 + String sql = "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" + + operationRoomSql + + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + + specialInfectionCondition + + settleAcountDepartCodeSql + + "order by po.id desc"; + //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) RecyclingApplication recyclingApplication = null; if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), - "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" - + operationRoomSql - + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " - + "and (endStatus is null) " + deliverStatusCondition - + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " - + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " - + specialInfectionCondition - + "order by po.id desc"); + sql); } //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) boolean willMergeConvertApplication = false; @@ -4474,7 +4927,7 @@ if(!willMergeConvertApplication || !departCanMerge){ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); @@ -4514,7 +4967,6 @@ tousseBarcodes += tousseBarcodesOfUseRecord; recyclingApplication.setTousseBarcodes(tousseBarcodes); recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 //recyclingApplication.setApplicant(applicant); //recyclingApplication.setApplicationTime(applicationCreateDate); @@ -4571,21 +5023,21 @@ recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); } } + recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); //将转换后申请单对象保存至集合中 recyclingApplicationListAfterConvert.add(recyclingApplication); } }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ - //查询该科室的手术间与当前使用记录的手术单相同的申请单 + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且还未回收) //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '') "; + : " and (deliverStatus is null or deliverStatus = '')"; //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '') "; + String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) RecyclingApplication recyclingApplication = null; if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 @@ -4596,9 +5048,9 @@ + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + specialInfectionCondition + + settleAcountDepartCodeSql + "order by po.id desc"); } - //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) boolean willMergeConvertApplication = false; if(recyclingApplication != null){ @@ -4620,7 +5072,7 @@ if(!willMergeConvertApplication || !departCanMerge){ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + settleAccountDeptCodeApplyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); @@ -4660,7 +5112,6 @@ tousseBarcodes += tousseBarcodesOfUseRecord; recyclingApplication.setTousseBarcodes(tousseBarcodes); recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 //recyclingApplication.setApplicant(applicant); //recyclingApplication.setApplicationTime(applicationCreateDate); @@ -4722,8 +5173,9 @@ recyclingApplicationListAfterConvert.add(recyclingApplication); } }else{ + //一次性物品和器械包合并转换 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + settleAccountDeptCodeApplyTousseMap,applyDiposableGoodsMap, applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); @@ -4756,370 +5208,6 @@ } } } - - //单独一次性物品的单合并暂先不考虑,都重新创建新的单 - if(applyDiposableGoodsMap.size() > 0){ - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - new HashMap(),applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - } - } - } - }else{ - //否则一次性物品是否转换申请单为否 - if(!isDgConvertApplication){ - applyDiposableGoodsMap = new HashMap(); - } - //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 - if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(useRecordConvertRecyclingApplicationMergeRegular) - && useRecordList.size() == 1 - && (StringUtils.isNotBlank(operationRoom) - || (StringUtils.isBlank(operationRoom) && allowUseReordToApplicationMergeWhenOperationRoomIsBlank) - )){ - String operationRoomSql = null; - if(StringUtils.isNotBlank(operationRoom)){ - operationRoomSql = "and operationRoom='"+ operationRoom +"' "; - }else{ - operationRoomSql = "and (operationRoom='' or operationRoom is null)"; - } - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且还未回收) - //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 - String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord - ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '')"; - - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '') "; - - String sql = "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" - + operationRoomSql - + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " - + "and (endStatus is null) " + deliverStatusCondition - + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " - + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " - + specialInfectionCondition - + "order by po.id desc"; - - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - RecyclingApplication recyclingApplication = null; - if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 - recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), - sql); - } - //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) - boolean willMergeConvertApplication = false; - if(recyclingApplication != null){ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - //新申请单的备注 - String newRemark = - getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); - //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 - if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength - && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ - willMergeConvertApplication = true; - } - } - if(!willMergeConvertApplication || !departCanMerge){ - //创建器械包申请单 - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - List tousseTransitionPlanItemList = - getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - //生成预回收记录 - tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); - } - } - } - - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); - } - }else{ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - recyclingApplication.setTousseBarcodes(tousseBarcodes); - recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 - //recyclingApplication.setApplicant(applicant); - //recyclingApplication.setApplicationTime(applicationCreateDate); - recyclingApplication.setSubmitTime(applicationCreateDate); - //住院号叠加 - if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); - }else{ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); - } - }else{ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(hospitalNumbers); - }else{ - //原住院号与新使用记录的住院号都为空白时,不用设置 - } - } - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) - recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); - objectDao.saveOrUpdate(recyclingApplication); - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - //追加申请项(相同物品的,则数量进行叠加) - List tousseTransitionPlanItemList = - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); - - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - List list = new ArrayList(); - for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { - //构造与生成预回收相关的数据 - list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); - } - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(list)){ - tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); - } - } - } else { - for (UseRecord tempUseRecord : useRecordList) { - recyclingApplication.setUseRecord(tempUseRecord); - //追加申请项(相同物品的,则数量进行叠加) - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); - } - } - - recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.add(recyclingApplication); - } - }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且还未回收) - //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 - String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord - ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " - : " and (deliverStatus is null or deliverStatus = '')"; - - //DGSETYY-43(若使用记录中含有特殊感染类型,则该使用记录只允许单独转换为一张新的申请单) - String specialInfectionCondition = " and (po.specialInfection is null or po.specialInfection = '' ) "; - - RecyclingApplication recyclingApplication = null; - if(StringUtils.isBlank(useRecordList.get(0).getSpecialInfection())){ - //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货、未做预回收),也是使用记录转换的申请单 - recyclingApplication = (RecyclingApplication)objectDao.getBySql(RecyclingApplication.class.getSimpleName(), - "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" - + "and type in ('"+ InvoicePlan.TYPE_COMBO_FORM +"') " - + "and (endStatus is null) " + deliverStatusCondition - + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "' or recyclingStatus is null) " - + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " - + specialInfectionCondition - + "order by po.id desc"); - } - //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) - boolean willMergeConvertApplication = false; - if(recyclingApplication != null){ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - //新申请单的备注 - String newRemark = - getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication); - //判断合并申请单后的备注或包条码的长度是否大于最大长度。如果大于则创建新的申请单 - if(StringUtils.length(tousseBarcodes) < DatabaseUtil.varcharTypeMaxLength - && StringUtils.length(newRemark) < DatabaseUtil.varcharTypeMaxLength){ - willMergeConvertApplication = true; - } - } - if(!willMergeConvertApplication || !departCanMerge){ - //创建器械包申请单 - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_COMBO_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - List tousseTransitionPlanItemList = - getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - //生成预回收记录 - tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); - } - } - } - - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); - } - }else{ - //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 - String tousseBarcodes = recyclingApplication.getTousseBarcodes(); - if(StringUtils.isBlank(tousseBarcodes)){ - tousseBarcodes = ";"; - } - tousseBarcodes += tousseBarcodesOfUseRecord; - recyclingApplication.setTousseBarcodes(tousseBarcodes); - recyclingApplication.setUseRecord(firstUseRecord); - //申请人、提交时间及最后修改时间都取最后一条使用记录的信息 - //recyclingApplication.setApplicant(applicant); - //recyclingApplication.setApplicationTime(applicationCreateDate); - recyclingApplication.setSubmitTime(applicationCreateDate); - //住院号叠加 - if(StringUtils.isNotBlank(recyclingApplication.getHospitalNumber())){ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber() + "," + hospitalNumbers); - }else{ - recyclingApplication.setHospitalNumber(recyclingApplication.getHospitalNumber()); - } - }else{ - if(StringUtils.isNotBlank(hospitalNumbers)){ - recyclingApplication.setHospitalNumber(hospitalNumbers); - }else{ - //原住院号与新使用记录的住院号都为空白时,不用设置 - } - } - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(recyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //备注重新设置(病人巡回洗手护士需要将来自多条使用记录的数据拼接,手术数量与器械包数量进行重新设值) - recyclingApplication.setRemark(getRemarkByRecyclingApplicationAndProjectConfig(recyclingApplication)); - objectDao.saveOrUpdate(recyclingApplication); - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - //追加申请项(相同物品的,则数量进行叠加) - List tousseTransitionPlanItemList = - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); - - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - List list = new ArrayList(); - for (TousseTransitionPlanItem item : tousseTransitionPlanItemList) { - //构造与生成预回收相关的数据 - list.add(tousseTransitionPlanItemManager.build(item.getTousseItemId(), item.getAmount(), item.getUrgentAmount())); - } - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(list)){ - tousseTransitionPlanManager.save(firstUseRecord, recyclingApplication, list, true); - } - } - } else { - for (UseRecord tempUseRecord : useRecordList) { - recyclingApplication.setUseRecord(tempUseRecord); - //追加申请项(相同物品的,则数量进行叠加) - recyclingApplication.appendTousseItemFromUseRecord(objectDao , true , true, false); - } - } - recyclingApplicationManager.saveOrUpdateRecyclingApplication(recyclingApplication, true); - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.add(recyclingApplication); - } - }else{ - //一次性物品和器械包合并转换 - List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, - applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); - - if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ - for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { - //2.插入使用记录转换申请单关联中间表 - for (UseRecord tempUseRecord : useRecordList) { - UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); - useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); - useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); - useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); - useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); - objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); - } - - //只有当使用记录数量为1时,才启用器械交接 - if(useRecordList.size() == 1){ - List tousseTransitionPlanItemList = - getTousseTransitionPlanItemListByRecyclingApplication(newRecyclingApplication , false , false); - //如果预回收项不为空时,保存预回收记录 - if(CollectionUtils.isNotEmpty(tousseTransitionPlanItemList)){ - //生成预回收记录 - tousseTransitionPlanManager.save(firstUseRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); - } - } - } - - //将转换后申请单对象保存至集合中 - recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); - } - } } //使用记录转换申请单时外来器械包是否与普通器械包合并到一个申请单 @@ -5515,11 +5603,58 @@ //如有要转换的消毒物品时,转换申请单 if(MapUtils.isNotEmpty(ancestorIdToDisinfectTiListMap)){ - disinfectTousseConvertRecyclingApplication(ancestorIdToDisinfectTiListMap, - useRecordList, useRecordConvertRecyclingApplicationMergeRegular, - allowUseReordToApplicationMergeWhenOperationRoomIsBlank, - needInvoiceForUseRecordOfDepart,departCoding, departCanMerge, - applicant, depart,applicationCreateDate); + + //要转换的消毒物品,按照结算科室分组 + Map>> settleAcountDeptCodeAncestorIdToDisinfectTiListMap = new HashMap>>(); + + for (Long ancestorId : ancestorIdToDisinfectTiListMap.keySet()) { + List tousseInstanceList = ancestorIdToDisinfectTiListMap.get(ancestorId); + if(CollectionUtils.isNotEmpty(tousseInstanceList)){ + for (int i=0;i> map = settleAcountDeptCodeAncestorIdToDisinfectTiListMap.get(settleAccountDeptCode); + if(map == null){ + map = new HashMap>(); + } + List tiList = map.get(ancestorId); + if(tiList == null){ + tiList = new ArrayList(); + } + tiList.add(tousseInstance); + map.put(ancestorId, tiList); + settleAcountDeptCodeAncestorIdToDisinfectTiListMap.put(settleAccountDeptCode, map); + } + } + } + + //结算科室map + Map disinfectTousseSettleAccountDeptMap = new HashMap(); + if(MapUtils.isNotEmpty(settleAcountDeptCodeAncestorIdToDisinfectTiListMap)){ + List settleAccountDeptCodeList = new ArrayList(); + for (String settleAccountDeptCode : settleAcountDeptCodeAncestorIdToDisinfectTiListMap.keySet()) { + settleAccountDeptCodeList.add(settleAccountDeptCode); + } + String orgUnitSql = String.format("select po from %s po where %s ", OrgUnit.class.getSimpleName(), + SqlUtils.getStringFieldInLargeCollectionsPredicate("orgUnitCoding", settleAccountDeptCodeList)); + List orgList = objectDao.findByHql(orgUnitSql); + if(CollectionUtils.isNotEmpty(orgList)){ + for (OrgUnit orgUnit : orgList) { + disinfectTousseSettleAccountDeptMap.put(orgUnit.getOrgUnitCoding(), orgUnit.getName()); + } + } + } + + for (String settleAccountDeptCode : settleAcountDeptCodeAncestorIdToDisinfectTiListMap.keySet()) { + String settleAccountDeptName = disinfectTousseSettleAccountDeptMap.get(settleAccountDeptCode); + Map> ancestorIdToDisinfectTiListTempMap = settleAcountDeptCodeAncestorIdToDisinfectTiListMap.get(settleAccountDeptCode); + disinfectTousseConvertRecyclingApplication(ancestorIdToDisinfectTiListTempMap, + useRecordList, useRecordConvertRecyclingApplicationMergeRegular, + allowUseReordToApplicationMergeWhenOperationRoomIsBlank, + needInvoiceForUseRecordOfDepart,departCoding, departCanMerge, + applicant, depart,applicationCreateDate, settleAccountDeptCode, settleAccountDeptName); + } + } // throw new SystemException("test"); } @@ -5635,7 +5770,7 @@ Map applyTousseNameToUrgentAmountMap,Map applyTousseNameToMaxUrgentLevelMap, Map tousseNameToIsInvoiceMap,Map> tousseNameToBelongToUseRecordListMap,String lowTempMergeRegular, String operationRoom,boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank, - boolean needInvoiceForUseRecordOfDepart,String departCoding,boolean departCanMerge, + boolean needInvoiceForUseRecordOfDepart,String departCoding, String settleAccountDeptCode, String settleAccountDept, boolean departCanMerge, String applicant, String depart,Date applicationCreateDate,double dpf){ if(MapUtils.isNotEmpty(sterilizationModeToTousseNameToAmountMap)){ sterilizationModeToTousseNameToAmountMap.entrySet().forEach(entry -> { @@ -5650,7 +5785,7 @@ applyUrgentTousseMap,applyTousseNameToMaxUrgentLevelMap,tousseNameToIsInvoiceMap, sterilizationModeToBelongToUseRecordList.stream().distinct().collect(Collectors.toList()), lowTempMergeRegular, operationRoom, allowUseReordToApplicationMergeWhenOperationRoomIsBlank, - needInvoiceForUseRecordOfDepart, departCoding, departCanMerge, + needInvoiceForUseRecordOfDepart, departCoding, settleAccountDeptCode, settleAccountDept, departCanMerge, applicant, depart, applicationCreateDate, dpf); }); } @@ -5668,12 +5803,14 @@ * @param applicant 申请人 * @param depart 申请科室名称 * @param applicationCreateDate 申请时间 + * @param settleAccountDeptName 结算科室名称 + * @param settleAccountDeptCode 结算科室编码 */ private void disinfectTousseConvertRecyclingApplication(Map> ancestorIdToDisinfectTiListMap, List useRecordList,String useRecordConvertRecyclingApplicationMergeRegular, boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank, boolean needInvoiceForUseRecordOfDepart,String departCoding,boolean departCanMerge, - String applicant, String depart,Date applicationCreateDate){ + String applicant, String depart,Date applicationCreateDate, String settleAccountDeptCode, String settleAccountDeptName){ //1.科室是否合并,取决于参数:departCanMerge //2.按什么规则合并(参数1为true时),取决于参数:useRecordConvertRecyclingApplicationMergeRegular //3.如果合并规则为按手术间合并,如果使用记录的手术间为空时,是否合并到手术间为空的申请单(未做回收、未做发货的申请单) @@ -5815,7 +5952,7 @@ List recyclingApplicationListAfterConvert = recyclingApplicationManager.createRecyclingApplicationByDisinfectTousses(linkedAncestorTdToMaterialMd5ToTiListMapMap, idToUseRecordMap, needInvoiceForUseRecordOfDepart, invoicePlanType, handleDepartCoding, orgUnitCodingToOrgUnitMap.get(handleDepartCoding).getName(), - departCoding, depart, applicant, applicationCreateDate, null); + departCoding, depart, applicant, applicationCreateDate, null, settleAccountDeptCode, settleAccountDeptName); //申请单记录使用记录的病人姓名ZJYY-84 setInvoicePlanPatient(recyclingApplicationListAfterConvert, useRecordList); } @@ -5866,7 +6003,7 @@ Map applyTousseNameToUrgentAmountMap,Map applyTousseNameToMaxUrgentLevelMap, Map tousseNameToIsInvoiceMap,List sterilizationModeToBelongToUseRecordList, String lowTempMergeRegular,String operationRoom,boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank, - boolean needInvoiceForUseRecordOfDepart,String departCoding,boolean departCanMerge, + boolean needInvoiceForUseRecordOfDepart,String departCoding, String settleAccountDeptCode, String settleAccountDept, boolean departCanMerge, String applicant, String depart,Date applicationCreateDate,double dpf){ if(MapUtils.isEmpty(applyTousseMap)){ return; @@ -5899,6 +6036,13 @@ //备注 String remark = RecyclingApplicationUtils.getRemarkByUseRecordAndProjectConfig(applyTousseMap, useRecordList,null,false,false,objectDao); List recyclingApplicationListAfterConvert = new ArrayList(); + + //结算科室过滤条件SZSDSRMYY-95 + String settleAccountDeptCodeSql = ""; + if(StringUtils.isNotBlank(settleAccountDeptCode)){ + settleAccountDeptCodeSql = " and settleAccountsDepartCoding = '" + settleAccountDeptCode + "' "; + } + //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(lowTempMergeRegular) && (StringUtils.isNotBlank(operationRoom) @@ -5929,6 +6073,7 @@ + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "') " + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + specialInfectionCondition + + settleAccountDeptCodeSql + "order by po.id desc"); } //会否合并转换申请单(如果找到符合条件的待合并申请,且合并后的备注与条码长度不超4000就会合并) @@ -5952,7 +6097,7 @@ if(!willMergeConvertApplication || !departCanMerge){ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + applyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeToTdIdMap,applicationCreateDate,operationRoom,sterilizationMode,dpf,invoicePlanTypeAfterTousseConvert, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); @@ -6046,6 +6191,7 @@ + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "') " + "and (po.id not in (select invoicePlan.id from "+ TousseItem.class.getSimpleName() +" where prepareRecycleAmount is not null)) " + specialInfectionCondition + + settleAccountDeptCodeSql + "order by po.id desc"); } @@ -6070,7 +6216,7 @@ if(!willMergeConvertApplication || !departCanMerge){ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + applyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeToTdIdMap,applicationCreateDate,null,sterilizationMode,dpf,invoicePlanTypeAfterTousseConvert, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); @@ -6146,7 +6292,7 @@ }else{ //创建新的申请单(可能是器械包申请单、也可能是通用申请单) List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( - applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + applyTousseMap,new HashMap(), applicant, depart, departCoding, settleAccountDept, settleAccountDeptCode, hospitalNumbers, remark, tousseBarcodeToTdIdMap,applicationCreateDate,operationRoom,sterilizationMode,dpf,invoicePlanTypeAfterTousseConvert, applyUrgentTousseMap,applyTousseNameToUrgentAmountMap,applyTousseNameToMaxUrgentLevelMap,firstUseRecordId); Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java =================================================================== diff -u -r34721 -r34831 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 34721) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 34831) @@ -26,6 +26,7 @@ import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageRecordManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; @@ -497,6 +498,15 @@ obj.put("urgentLevelIdForUseRecord", urgentLevelForUseRecord.getId()); obj.put("urgentLevelForUseRecord", JSONObject.fromObject(urgentLevelForUseRecord)); } + //录使用记录时的结算科室SZSDSRMYY-95 + if(StringUtils.isNotBlank(ti.getSettleAccountDeptCodeUseRecord())){ + @SuppressWarnings("unchecked") + List orgUnitList = objectDao.findByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", ti.getSettleAccountDeptCodeUseRecord()); + if(CollectionUtils.isNotEmpty(orgUnitList)){ + obj.put("settleAccountDeptCodeUseRecord", ti.getSettleAccountDeptCodeUseRecord()); + obj.put("settleAccountDeptNameUseRecord", orgUnitList.get(0).getName()); + } + } array.add(obj); //需要循环该使用记录的所有器械包,如果发现有聚合包,且配置允许修改子包修改数量时,需要将子包的使用情况也输出给前端 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java =================================================================== diff -u -r34759 -r34831 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 34759) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 34831) @@ -759,7 +759,13 @@ * 录入到使用记录里的加急对象 */ private UrgentLevel urgentLevelForUseRecord; + /** + * 录入到使用记录里的结算科室SZSDSRMYY-95 + */ + private String settleAccountDeptCodeUseRecord; + + /** * 包定义id赋值时,包定义的一次性物品数量 */ private Integer disposableGoodAmount; @@ -845,6 +851,16 @@ public void setUrgentLevelForUseRecord(UrgentLevel urgentLevelForUseRecord) { this.urgentLevelForUseRecord = urgentLevelForUseRecord; } + + public String getSettleAccountDeptCodeUseRecord() { + return settleAccountDeptCodeUseRecord; + } + + public void setSettleAccountDeptCodeUseRecord( + String settleAccountDeptCodeUseRecord) { + this.settleAccountDeptCodeUseRecord = settleAccountDeptCodeUseRecord; + } + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "errorDamageRemark_id") public ErrorDamageRemark getErrorDamageRemark() {