Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r28381 -r28465 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 28381) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 28465) @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -64,6 +65,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilisation.Sterilisation; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.SubComboTousseUseRecord; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -2590,13 +2592,22 @@ List useRecordList = new ArrayList(); //器械包实例(如有标识牌时同时记录绑定的标识牌)条码,包定义为需要转申请单的才记录(key为包实例条码(如果有标识牌则还会新增一条key为标识牌条码的键值对元素),value为包定义id) Map tousseBarcodeToDefinitionIdMap = new HashMap(); - int i = 1; + //器械包实例条码(及标识牌条码)对应灭菌方式的map(key为条码,value为灭菌方式) + Map tousseBarcodeToSterilingModeMap = new HashMap(); + + //器械包名称对应的灭菌方式的map,key为器械包名称、value为灭菌方式 + Map tousseNameToSterilingModeMap = new HashMap(); + //器械包名称对应是否发货的map,key为器械包名称、value为是否发货 + Map tousseNameToIsInvoiceMap = new HashMap(); + //器械包名称对应的灭菌方式的map,key为器械包名称、value为所属使用记录集合 + Map> tousseNameToBelongToUseRecordListMap = new HashMap>(); + // 是否启用真正使用功能 boolean enableActualUsed = CssdUtils.getSystemSetConfigByNameBool("enableActualUsed"); //使用记录转换申请单时外来器械包是否与普通器械包合并到一个申请单 boolean foreignTousseAndInsideTousseMergeToTheSameComboApplicationAfterUseRecordConvert = CssdUtils.getSystemSetConfigByNameBool("foreignTousseAndInsideTousseMergeToTheSameComboApplicationAfterUseRecordConvert"); - Map temp = new HashMap<>(); + for (Long id : ids) { UseRecord useRecord = getForUpdate(id); useRecordList.add(useRecord); @@ -2617,6 +2628,23 @@ //循环使用记录所有的包实例,除了聚合包 List tousseInstanceList = tousseInstanceManager .findTousseInstanceListByUseRecordId(id); + + //所有器械包实例的灭菌程序(去除重复值) + List sterilingModeListOfAllTousseInstances = + tousseInstanceList.stream().map(ti -> { + return ti.getTousseDefinition().getSterilingMethod(); + }).distinct().collect(Collectors.toList()); + List sterilisationList = + objectDao.getCollection(Sterilisation.class.getSimpleName(), "sterilisation", sterilingModeListOfAllTousseInstances); + //灭菌程序对应灭菌方式的map + Map sterilisationToSterilizationModeMap = new HashMap(); + if(CollectionUtils.isNotEmpty(sterilisationList)){ + sterilisationList.stream().forEach(sterilisation -> { + sterilisationToSterilizationModeMap.put(sterilisation.getSterilisation(), sterilisation.getSterilizationMode()); + }); + } + //每个包实例的数量 + int amountOfOneTousseInstance = 1; for (TousseInstance tousseInstance : tousseInstanceList) { //如果是聚合包,也暂时不转换为申请单 if(tousseInstance.isComboTousse()){ @@ -2627,18 +2655,27 @@ continue; } //是否转换成申请单 + String tousseName = tousseInstance.getTousseName(); TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); if(tousseDefinition == null){ throw new RuntimeException(tousseInstance.getTousseName()+",包定义已经不存在!"); } - //如果没有启用是否真正使用功能,那下面这句就为true,不影响之前的功能,否则就看是否真正使用的值,如果已经使用的,就看包定义是否转换。如果没有使用,则需要转换,而不管理包定义是否转换 boolean actualUsed = enableActualUsed?(!tousseInstance.actualNotUsed()):true; if (!TousseDefinition.STR_YES.equals(tousseDefinition.getIsConvertApplyGoods()) && actualUsed) { continue; } + List tousseNameBelongToUseRecordList = tousseNameToBelongToUseRecordListMap.get(tousseName); + if(tousseNameBelongToUseRecordList == null){ + tousseNameBelongToUseRecordList = new ArrayList(); + } + tousseNameBelongToUseRecordList.add(useRecord); + tousseNameToBelongToUseRecordListMap.put(tousseName, tousseNameBelongToUseRecordList); + tousseNameToIsInvoiceMap.put(tousseName, tousseDefinition.getIsInvoice()); //器械包map tousseBarcodeToDefinitionIdMap.put(tousseInstance.getBarcode(), tousseDefinition.getId()); + tousseBarcodeToSterilingModeMap.put(tousseInstance.getBarcode(), + sterilisationToSterilizationModeMap.get(tousseInstance.getTousseDefinition().getSterilingMethod())); //查询该包实例是否为发货到借物单(且该借物单未终止)的物品,如果是,则返回对应的借物单的id(未启用配置项的通用处理).以下逻辑不再使用 /*Long borrowId = recyclingApplicationManager.getNotEndedBorrowIdByTousseInstanceId(tousseInstance.getId()); if (borrowId != null){ @@ -2658,6 +2695,8 @@ tousseDefinitionId = idCardDefinition.getTousseDefinitionID(); } tousseBarcodeToDefinitionIdMap.put(clothInstance.getBarcode(), tousseDefinitionId); + tousseBarcodeToSterilingModeMap.put(clothInstance.getBarcode(), + sterilisationToSterilizationModeMap.get(tousseInstance.getTousseDefinition().getSterilingMethod())); } //外部代理灭菌、消毒物品、灭菌物品(可能系统不再用灭菌物品这个类型了)不转申请单 if(tousseDefinition.isForeignProxyTousse() || tousseDefinition.isDisinfection() @@ -2740,10 +2779,10 @@ } } else if (tousseDefinition.isCustomTousse()) { applyCustomTousseMap.put(tousseDefinition.getId(), - MathTools.add(applyCustomTousseMap.get(tousseDefinition.getId()), i).intValue()); + MathTools.add(applyCustomTousseMap.get(tousseDefinition.getId()), amountOfOneTousseInstance).intValue()); if(StringTools.equals("是", tousseInstance.getIsUrgentForUseRecord())){ applyUrgentCustomTousseMap.put(tousseDefinition.getId(), - MathTools.add(applyUrgentCustomTousseMap.get(tousseDefinition.getId()),i).intValue()); + MathTools.add(applyUrgentCustomTousseMap.get(tousseDefinition.getId()),amountOfOneTousseInstance).intValue()); } } else { //不再根据此变量判断 @@ -2752,6 +2791,9 @@ if(StringTools.equals(Constants.STR_YES, tousseInstance.getIsUrgentForUseRecord())){ increaseMapAmount(applyUrgentTousseMap,tousseInstance.getTousseName()); } + //器械包名对应的灭菌方式 + tousseNameToSterilingModeMap.put(tousseInstance.getTousseName(), + sterilisationToSterilizationModeMap.get(tousseInstance.getTousseDefinition().getSterilingMethod())); // } } } @@ -2793,6 +2835,10 @@ map.put("applyDiposableGoodsMap", applyDiposableGoodsMap);//一次性物品 map.put("useRecordList", useRecordList); map.put("recordid_tousseInstanceCodes", tousseBarcodeToDefinitionIdMap);//器械包条码 + map.put("tousseNameToSterilingModeMap",tousseNameToSterilingModeMap); + map.put("tousseBarcodeToSterilingModeMap",tousseBarcodeToSterilingModeMap); + map.put("tousseNameToIsInvoiceMap",tousseNameToIsInvoiceMap); + map.put("tousseNameToBelongToUseRecordListMap",tousseNameToBelongToUseRecordListMap); return map; } @@ -2882,7 +2928,6 @@ String patientNames = ""; SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); boolean departCanMerge = supplyRoomConfigManager.verifDepartCanMergeApplication(departCoding, config); - boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank = CssdUtils.getSystemSetConfigByNameBool("allowUseReordToApplicationMergeWhenOperationRoomIsBlank",false); //通常只有一条使用记录(也支持多条) List useRecordList = (List) useRecordsMap .get("useRecordList"); @@ -2915,10 +2960,7 @@ boolean tousseAmountOnlyCountNeedConvertGoods = CssdUtils.getSystemSetConfigByNameBool("useRecordToRecycAppTousseAmountOfRemarkOnlyCountNeedConvertGoods"); //是否仅统计需要回收的物品数量 boolean tousseAmountOnlyCountNeedRecyclingGoods = CssdUtils.getSystemSetConfigByNameBool("useRecordToRecycAppTousseAmountOfRemarkOnlyCountNeedRecyclingGoods"); - //针对当前使用记录生成申请单的备注 - String remark = getRemarkByUseRecordAndProjectConfig(useRecordList , - Collections.singletonList(TousseDefinition.PACKAGE_TYPE_INSIDE) , - tousseAmountOnlyCountNeedConvertGoods , tousseAmountOnlyCountNeedRecyclingGoods); + //器械包map(key为名称,value为数量) Map applyTousseMap = (Map) useRecordsMap .get("applyTousseMap"); @@ -2937,9 +2979,18 @@ Map applyUrgentCustomTousseMap = (Map) useRecordsMap .get("applyUrgentCustomTousseMap"); - //查询config.js的合并机制(规则):中大附一为按手术间进行合并 - String useRecordConvertRecyclingApplicationMergeRegular = CssdUtils.getSystemSetConfigByName("useRecordConvertRecyclingApplicationMergeRegular"); + //器械包名称对应的灭菌方式的map,key为器械包够名称、value为是否发货 + Map tousseNameToSterilingModeMap = (Map)useRecordsMap.get("tousseNameToSterilingModeMap"); + + //器械包名称对应是否需要发货的map,key为器械包够名称、value为是否发货 + Map tousseNameToIsInvoiceMap = (Map)useRecordsMap.get("tousseNameToIsInvoiceMap"); + + //器械包条码(有标识牌的还包括标识牌条码)对应的灭菌方式的map,key为器械包够味儿、value为灭菌方式 + Map tousseBarcodeToSterilingModeMap = (Map)useRecordsMap.get("tousseBarcodeToSterilingModeMap"); + Map> tousseNameToBelongToUseRecordListMap = + (Map>)useRecordsMap.get("tousseNameToBelongToUseRecordListMap"); + //一次性物品是否转换申请单 if(isDgConvertApplication == null){ isDgConvertApplication = false; @@ -2961,7 +3012,76 @@ } } } + + //手术间为空临床科室也合并单 + boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank = CssdUtils.getSystemSetConfigByNameBool("allowUseReordToApplicationMergeWhenOperationRoomIsBlank",false); + //DGSDBZXYY-31 使用记录转单时,高低温物品自动分单({"mergeRegular":"depart","lowTempSterilizationModes":["低温等离子","环氧乙烷"]}) since:2020-07-14 + String mergeRegularOfLowTemperatureToussesAfterExtracted = + CssdUtils.getSystemSetConfigByName("mergeRegularOfLowTemperatureToussesAfterExtracted"); + //低温物品的申请单合并规则 + String lowTempMergeRegular = null; + //低温灭菌方式配置集合 + JSONArray lowTempSterilizationModesJSONArray = null; + //将使用记录中要转换的器械包实例按上面配的灭菌方式进行分类 + Map> sterilizationModeToTousseNameToAmountMap = new HashMap>(); + Map> sterilizationModeToTousseBarcodeToTdIdMap = new HashMap>(); + if(StringUtils.isNotBlank(mergeRegularOfLowTemperatureToussesAfterExtracted)){ + try{ + JSONObject mergeRegularOfLowTemperatureToussesAfterExtractedJSONObject = + JSONObject.fromObject(mergeRegularOfLowTemperatureToussesAfterExtracted); + //低温物品的申请单合并规则 + lowTempMergeRegular = mergeRegularOfLowTemperatureToussesAfterExtractedJSONObject.optString("mergeRegular"); + //低温灭菌方式配置集合 + lowTempSterilizationModesJSONArray = JSONArray.fromObject(mergeRegularOfLowTemperatureToussesAfterExtractedJSONObject.optString("lowTempSterilizationModes")); + 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(); + } + 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(); + } + tousseBarcodeToTdIdMapOfLowTempSterilizationMode.put(tousseBarcode, tousseBarcodeMap.get(tousseBarcode)); + sterilizationModeToTousseBarcodeToTdIdMap.put(sterilizationMode, tousseBarcodeToTdIdMapOfLowTempSterilizationMode); + + tousseBarcodeMap.remove(tousseBarcode); + } + }); + }); + //最后对符合配置的灭菌方式的包按配置的合并规则进行转换 + lowTempSterilizationModesTousseConvertRecyclingApplication(useRecordList,sterilizationModeToTousseNameToAmountMap,sterilizationModeToTousseBarcodeToTdIdMap,applyUrgentTousseMap, + tousseNameToIsInvoiceMap,tousseNameToBelongToUseRecordListMap,lowTempMergeRegular,operationRoom, allowUseReordToApplicationMergeWhenOperationRoomIsBlank, + needInvoiceForUseRecordOfDepart,departCoding, departCanMerge, + applicant, depart, applicationCreateDate, dpf); + }catch(Exception e){ + e.printStackTrace(); + throw new SystemException("配置项mergeRegularOfLowTemperatureToussesAfterExtracted的值格式不正确"); + } + } + //2.查询该使用记录使用的物品(器械包、消毒物品、敷料包)是否有需要发货 boolean includeNeedInvoiceItemsForUseRecord = false; List tousseInstanceWillBeConvertedTousseItemList = new ArrayList(); @@ -2973,7 +3093,9 @@ } if(CollectionUtils.isNotEmpty(tousseInstanceWillBeConvertedTousseItemList)){ for (TousseInstance tousseInstance : tousseInstanceWillBeConvertedTousseItemList) { - if(StringUtils.equals(tousseInstance.getTousseDefinition().getIsInvoice(), Constants.STR_YES)){ + String sterilingModeOfTousse = tousseBarcodeToSterilingModeMap.get(tousseInstance.getBarcode()); + if((MapUtils.isEmpty(sterilizationModeToTousseBarcodeToTdIdMap) || !sterilizationModeToTousseBarcodeToTdIdMap.keySet().contains(sterilingModeOfTousse)) && + StringUtils.equals(tousseInstance.getTousseDefinition().getIsInvoice(), Constants.STR_YES)){ includeNeedInvoiceItemsForUseRecord = true; break; } @@ -2986,11 +3108,19 @@ tousseBarcodesOfUseRecord += toussBarcode + ";"; } + //针对当前使用记录生成申请单的备注 + String remark = getRemarkByUseRecordAndProjectConfig(applyTousseMap, useRecordList , + Collections.singletonList(TousseDefinition.PACKAGE_TYPE_INSIDE) , + tousseAmountOnlyCountNeedConvertGoods , tousseAmountOnlyCountNeedRecyclingGoods); + //器械包实例录使用记录后转换申请单后将会生成的单类型(用于外来器械录使用记录转换后的申请单类型,仅用于东莞中医院外来器械与普通器械包录单后合并的需求) String invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_COMBO_FORM; //当前登录用户 LoginUserData loginUserData = AcegiHelper.getLoginUser(); + + //查询config.js的合并机制(规则):中大附一为按手术间进行合并 + String useRecordConvertRecyclingApplicationMergeRegular = CssdUtils.getSystemSetConfigByName("useRecordConvertRecyclingApplicationMergeRegular"); //申请单类型(2表示分开的申请单,1为通用申请单) if(InvoicePlan.APPLICATION_FORM_TYPE_SPLIT.equals(applicationFormType)){ invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; @@ -3014,7 +3144,8 @@ //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货),也是使用记录转换的申请单 RecyclingApplication recyclingApplication = (RecyclingApplication)objectDao.getBySql_ForUpdate(RecyclingApplication.class.getSimpleName(), - "where 1=1 and useRecord is not null and departCoding='"+ departCoding + "'" + "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 @@ -3041,7 +3172,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3147,6 +3278,7 @@ //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货),也是使用记录转换的申请单 RecyclingApplication 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) +")" + "and type in ('"+ InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM +"') " + "and (endStatus is null) " + deliverStatusCondition + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "') order by po.id desc"); @@ -3172,7 +3304,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3272,7 +3404,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3310,7 +3442,7 @@ //创建一次性物品申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( new HashMap(),applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3377,7 +3509,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3506,7 +3638,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,null,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3603,7 +3735,7 @@ }else{ List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3640,7 +3772,7 @@ if(applyDiposableGoodsMap.size() > 0){ List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( new HashMap(),applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3709,7 +3841,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3837,7 +3969,7 @@ //创建器械包申请单 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,null,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,null,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -3934,7 +4066,7 @@ //一次性物品和器械包合并转换 List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( applyTousseMap,applyDiposableGoodsMap, applicant, depart, departCoding, hospitalNumbers, remark, - tousseBarcodeMap,applicationCreateDate,operationRoom,dpf,InvoicePlan.TYPE_COMBO_FORM, + tousseBarcodeMap,applicationCreateDate,operationRoom,null,dpf,InvoicePlan.TYPE_COMBO_FORM, applyUrgentTousseMap,firstUseRecordId); if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ @@ -4324,7 +4456,7 @@ depart, departCoding, remark,operationRoom,patientName,applicationCreateDate);*/ } - remark = getRemarkByUseRecordAndProjectConfig(useRecordList , + remark = getRemarkByUseRecordAndProjectConfig(applyCustomTousseMap,useRecordList , Collections.singletonList(TousseDefinition.PACKAGE_TYPE_CUSTOM) , tousseAmountOnlyCountNeedConvertGoods , tousseAmountOnlyCountNeedRecyclingGoods); //自定义器械包生成申请单 @@ -4353,8 +4485,327 @@ //使用记录转换申请单后对器械包实例更新tousseItemId字段值 updateTousseItemIdForTousseInstanceOfUseRecordAfterConvert(useRecordList , recyclingApplicationListAfterConvert); } - + /** + * 低温物品转换申请单 + * @param useRecordList + * @param sterilizationModeToTousseNameToAmountMap + * @param sterilizationModeToTousseBarcodeToTdIdMap + * @param applyUrgentTousseMap + * @param lowTempMergeRegular + */ + private void lowTempSterilizationModesTousseConvertRecyclingApplication(List useRecordList ,Map> sterilizationModeToTousseNameToAmountMap, + Map> sterilizationModeToTousseBarcodeToTdIdMap, Map applyUrgentTousseMap, + Map tousseNameToIsInvoiceMap,Map> tousseNameToBelongToUseRecordListMap,String lowTempMergeRegular, + String operationRoom,boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank, + boolean needInvoiceForUseRecordOfDepart,String departCoding,boolean departCanMerge, + String applicant, String depart,Date applicationCreateDate,double dpf){ + if(MapUtils.isNotEmpty(sterilizationModeToTousseNameToAmountMap)){ + sterilizationModeToTousseNameToAmountMap.entrySet().forEach(entry -> { + String sterilizationMode = entry.getKey(); + Set tousseNameList = sterilizationModeToTousseNameToAmountMap.get(sterilizationMode).keySet(); + List sterilizationModeToBelongToUseRecordList = new ArrayList(); + tousseNameList.stream().forEach(tousseName -> { + sterilizationModeToBelongToUseRecordList.addAll(tousseNameToBelongToUseRecordListMap.get(tousseName)); + }); + lowTempSterilizationModeTousseConvertRecyclingApplication(sterilizationMode, useRecordList,entry.getValue(), + sterilizationModeToTousseBarcodeToTdIdMap.get(sterilizationMode), applyUrgentTousseMap, tousseNameToIsInvoiceMap, + sterilizationModeToBelongToUseRecordList.stream().distinct().collect(Collectors.toList()), + lowTempMergeRegular, operationRoom, allowUseReordToApplicationMergeWhenOperationRoomIsBlank, + needInvoiceForUseRecordOfDepart, departCoding, departCanMerge, + applicant, depart, applicationCreateDate, dpf); + }); + } + } + + /** + * 低温物品转换申请单 + * @param operationRoom + * @param sterilizationMode + * @param useRecordList + * @param applyTousseMap + * @param tousseBarcodeToTdIdMap + * @param applyUrgentTousseMap + * @param lowTempMergeRegular + */ + private void lowTempSterilizationModeTousseConvertRecyclingApplication(String sterilizationMode,List useRecordList,Map applyTousseMap, + Map tousseBarcodeToTdIdMap,Map applyUrgentTousseMap,Map tousseNameToIsInvoiceMap, + List sterilizationModeToBelongToUseRecordList,String lowTempMergeRegular,String operationRoom,boolean allowUseReordToApplicationMergeWhenOperationRoomIsBlank, + boolean needInvoiceForUseRecordOfDepart,String departCoding,boolean departCanMerge, + String applicant, String depart,Date applicationCreateDate,double dpf){ + if(MapUtils.isEmpty(applyTousseMap)){ + return; + } + //使用记录里所有的包条码 + String tousseBarcodesOfUseRecord = StringUtils.join(tousseBarcodeToTdIdMap.keySet(),";") + ";"; + + //器械包实例录使用记录后转换申请单后将会生成的单类型(用于外来器械录使用记录转换后的申请单类型,仅用于东莞中医院外来器械与普通器械包录单后合并的需求) + String invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_COMBO_FORM; + + //当前登录用户 + LoginUserData loginUserData = AcegiHelper.getLoginUser(); + + String applicationFormType = CssdUtils.getSystemSetConfigByName("applicationFormType"); + + //申请单类型(2表示分开的申请单,1为通用申请单) + if(InvoicePlan.APPLICATION_FORM_TYPE_SPLIT.equals(applicationFormType)){ + invoicePlanTypeAfterTousseConvert = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + } + + boolean includeNeedInvoiceItemsForUseRecord = false; + if(applyTousseMap.values().contains(Constants.STR_YES)){ + includeNeedInvoiceItemsForUseRecord = true; + } + UseRecord firstUseRecord = sterilizationModeToBelongToUseRecordList.get(0); + Long firstUseRecordId = firstUseRecord.getId(); + String hospitalNumbers = null; + //备注 + String remark = getRemarkByUseRecordAndProjectConfig(applyTousseMap, useRecordList,null,false,false); + List recyclingApplicationListAfterConvert = new ArrayList(); + //只有当使用记录的数量为1且使用记录的手术间不为空时才按手术间进行合并 + if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(lowTempMergeRegular) + && (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 = '') "; + + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货),也是使用记录转换的申请单 + RecyclingApplication recyclingApplication = (RecyclingApplication)objectDao.getBySql_ForUpdate(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and sterilizationMode='"+ sterilizationMode +"' and departCoding='"+ departCoding + "'" + + operationRoomSql + + "and type = '"+ invoicePlanTypeAfterTousseConvert +"' " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "') 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, + tousseBarcodeToTdIdMap,applicationCreateDate,operationRoom,sterilizationMode,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + applyUrgentTousseMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : sterilizationModeToBelongToUseRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + + } + //将转换后申请单对象保存至集合中 + 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 : sterilizationModeToBelongToUseRecordList) { + 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); + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); + } + }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(lowTempMergeRegular)){ + + //如果条件1为不需要发货或条件2中没有要发货的物品,则只查询发货状态为null的物品;否则查询待发货的单 + String deliverStatusCondition = needInvoiceForUseRecordOfDepart && includeNeedInvoiceItemsForUseRecord + ? " and deliverStatus='" + InvoicePlan.DELIVERSTATUS_AWAITDELIVER + "' " + : " and (deliverStatus is null or deliverStatus = '') "; + + //查询该科室的手术间与当前使用记录的手术单相同的申请单(且未终止、待回收、未发货),也是使用记录转换的申请单 + RecyclingApplication recyclingApplication = (RecyclingApplication)objectDao.getBySql_ForUpdate(RecyclingApplication.class.getSimpleName(), + "where 1=1 and useRecord is not null and sterilizationMode='"+ sterilizationMode +"' and departCoding='"+ departCoding + "'" + + "and type = '"+ invoicePlanTypeAfterTousseConvert +"' " + + "and (endStatus is null) " + deliverStatusCondition + + "and (recyclingStatus='" + InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE + "') 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, + tousseBarcodeToTdIdMap,applicationCreateDate,null,sterilizationMode,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + applyUrgentTousseMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : sterilizationModeToBelongToUseRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + } + //将转换后申请单对象保存至集合中 + 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 : sterilizationModeToBelongToUseRecordList) { + 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); + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); + } + }else{ + //创建器械包申请单 + List recyclingApplicationList = recyclingApplicationManager.createRecyclingApplicationByTousse( + applyTousseMap,new HashMap(), applicant, depart, departCoding, hospitalNumbers, remark, + tousseBarcodeToTdIdMap,applicationCreateDate,operationRoom,sterilizationMode,dpf,InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, + applyUrgentTousseMap,firstUseRecordId); + + if(CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (RecyclingApplication newRecyclingApplication : recyclingApplicationList) { + //2.插入使用记录转换申请单关联中间表 + for (UseRecord tempUseRecord : sterilizationModeToBelongToUseRecordList) { + UseRecordToRecycleApplication useRecordConvertRecyclingApplication = new UseRecordToRecycleApplication(); + useRecordConvertRecyclingApplication.setConvertUserCode(loginUserData.getUserName()); + useRecordConvertRecyclingApplication.setConvertUserName(loginUserData.getUserFullName()); + useRecordConvertRecyclingApplication.setInvoicePlanId(newRecyclingApplication.getId()); + useRecordConvertRecyclingApplication.setUseRecordId(tempUseRecord.getId()); + objectDao.saveOrUpdate(useRecordConvertRecyclingApplication); + } + } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); + } + } + //使用记录转换申请单后对器械包实例更新tousseItemId字段值 + updateTousseItemIdForTousseInstanceOfUseRecordAfterConvert(sterilizationModeToBelongToUseRecordList , recyclingApplicationListAfterConvert); + } + + /** * 使用记录转换申请单后对器械包实例更新tousseItemId字段值 * 考虑到敷料包及不转换的器械包也需要转换但不需要回收,所以也需要更新tousseItemId * @param useRecord @@ -4419,13 +4870,14 @@ * 2.中山眼科:巡回护士:[护士名字];病人:[病人名字] * 3.其它项目:洗手护士:[护士名字];巡回护士:[护士名字];病人:[病人名字] * 通常一条使用记录也只有一个巡回护士、一个洗手护士、一个病人名称 - * @param useRecordList + * @param applyTousseMap 器械包使用数量 + * @param useRecordList 使用记录集合 * @param includeTousseTypeList 包含的器械包类型(统计备注中的器械包数量用) * @param onlyCountNeedConvertGoods 是否仅统计需要转换的物品数量(用于备注中的统计器械包数量用) * @param onlyCountNeedRecyclingGoods 是否仅统计需要回收的物品数量(用于备注中的统计器械包数量用) * @return */ - private String getRemarkByUseRecordAndProjectConfig(List useRecordList , List includeTousseTypeList , + private String getRemarkByUseRecordAndProjectConfig(Map applyTousseMap ,List useRecordList , List includeTousseTypeList , boolean onlyCountNeedConvertGoods , boolean onlyCountNeedRecyclingGoods){ String useRecordConvertRecyclingApplicationRemark = CssdUtils.getSystemSetConfigByName("useRecordConvertRecyclingApplicationRemark"); String circuitNurseRemark = null; @@ -4466,7 +4918,13 @@ hospitalNumber += " " + useRecord.getHospitalNum(); } } - tousseAmount += useRecord.countTousseAmount(objectDao, includeTousseTypeList, onlyCountNeedConvertGoods, onlyCountNeedRecyclingGoods); + if(MapUtils.isNotEmpty(applyTousseMap)){ + tousseAmount += (int)applyTousseMap.values().stream().reduce((x,y) -> { + return MathTools.add((Integer)x, (Integer)y).intValue(); + }).orElse(0); + }else{ + tousseAmount += useRecord.countTousseAmount(objectDao, includeTousseTypeList, onlyCountNeedConvertGoods, onlyCountNeedRecyclingGoods); + } } useRecordConvertRecyclingApplicationRemark = useRecordConvertRecyclingApplicationRemark.replace("@circuitNurse", circuitNurseRemark == null ? "" : circuitNurseRemark); useRecordConvertRecyclingApplicationRemark = useRecordConvertRecyclingApplicationRemark.replace("@patientName", patientNameRemark == null ? "" : patientNameRemark); @@ -4500,7 +4958,13 @@ } patientNameRemark += useRecord.getPatientName() + " "; } - tousseAmount += useRecord.countTousseAmount(objectDao, includeTousseTypeList, onlyCountNeedConvertGoods, onlyCountNeedRecyclingGoods); + if(MapUtils.isNotEmpty(applyTousseMap)){ + tousseAmount += (int)applyTousseMap.values().stream().reduce((x,y) -> { + return MathTools.add((Integer)x, (Integer)y).intValue(); + }).orElse(0); + }else{ + tousseAmount += useRecord.countTousseAmount(objectDao, includeTousseTypeList, onlyCountNeedConvertGoods, onlyCountNeedRecyclingGoods); + } } if(washHandNurseRemark != null){ washHandNurseRemark = washHandNurseRemark + ";"; @@ -4713,13 +5177,15 @@ String returnMsg = "保存成功"; // 获取使用记录参数 Map useRecordsMap = checkedUseRecords(ids); - String operationRoom = ""; String patientName = ""; //List configList = supplyRoomConfigManager.getSupplyRoomList(SupplyRoomConfig.SUPPLYROOM_TYPE_SECOND_SUPPLYROOM); List useRecordList = (List) useRecordsMap .get("useRecordList"); String msg = null; + //手术间,如果每条使用记录的手术间都相同,则值为使用记录的手术间,否则为null + String operationRoom = null; + int useRecordIndex = 0; for (UseRecord useRecord : useRecordList) { if(useRecord.getStatus().equals(UseRecord.STATUS_APPLIED)){ @@ -4756,7 +5222,19 @@ applicant = useRecord.getOperator(); depart = useRecord.getDepart(); departCoding = useRecord.getDepartCoding(); - operationRoom = useRecord.getOperationRoom(); + + //第一轮循环时,赋值为第一条使用记录的手术间 + if(useRecordIndex == 0){ + operationRoom = useRecord.getOperationRoom(); + }else{ + if(StringUtils.isBlank(operationRoom)){ + operationRoom = null; + }else{ + if(!StringUtils.equals(operationRoom, useRecord.getOperationRoom())){ + operationRoom = null; + } + } + } patientName = useRecord.getPatientName(); /*boolean isSencondSupplyRoom = false; if (configList != null && configList.size() > 0) { @@ -4770,6 +5248,7 @@ useRecord.setStatusSequence(UseRecord.STATUS_SEQ_APPLIED); saveOrUpdateUseRecord(useRecord); + useRecordIndex++; // 二级供应室库存处理 /*if (isSencondSupplyRoom) {废弃原因:二级库存已改为基数管理 // 二级供应室是否回收器械包 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r28315 -r28465 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 28315) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 28465) @@ -1593,7 +1593,7 @@ idToTousseDefinitionMap = tousseDefinitionManager.getIdToTousseDefinitionMap(ids); } for (Entry entry : tousseNameAndAmount.entrySet()) { - + Integer amount = entry.getValue(); TousseItem tousseItem = new TousseItem(); String tousseDefinitionIdAndName = entry.getKey(); // String[] tousseDefinitionIdAndNameArray = tousseDefinitionIdAndName.split("_");//如果包名称里面有下划线,那就惨了 @@ -1602,8 +1602,8 @@ tousseItem.setTousseDefinitionId(Long.parseLong(tousseDefinitionIdAndName.substring(0,index))); String tousseName = tousseDefinitionIdAndName.substring(index+1); tousseItem.setTousseName(tousseName); - tousseItem.setAmount(0); - tousseItem.setEditAmount(entry.getValue()); + tousseItem.setAmount(amount); + tousseItem.setEditAmount(amount); tousseItem.setInvoicePlan(recyclingApplication); tousseItem.setDiposable(TousseItem.DIPOSABLE_NO); TousseDefinition td = null; @@ -5480,7 +5480,7 @@ public List createRecyclingApplicationByTousse( Map tousseNameAndAmountMap,Map diposableGoodMap, String applicant, String depart, String departCoding, String hospitalNumber, String remark, - Map tousseInstanceMap,Date applicationCreateDate,String operationRoom,double dpf,String invoicePlanType, + Map tousseInstanceMap,Date applicationCreateDate,String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, Map applyUrgentTousseMap,Long useRecordId) { List list = null; if ((tousseNameAndAmountMap != null && tousseNameAndAmountMap.size() > 0) || (diposableGoodMap != null && diposableGoodMap.size() > 0)) { @@ -5537,6 +5537,7 @@ recyclingApplication.setOperationRoom(operationRoom); recyclingApplication.setOrSpelling(GB2Alpha.string2Alpha(operationRoom)); recyclingApplication.setOrWBCode(GB2WB.getWBCode(operationRoom)); + recyclingApplication.setSterilizationMode(sterilizationMode); recyclingApplication.setSequence(supplyRoomConfigManager.getOrgUnitSequence(departCoding)); recyclingApplication.setReaders(";ORGUNIT_" + recyclingApplication.getDepartCoding() + ";"); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java =================================================================== diff -u -r28029 -r28465 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 28029) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 28465) @@ -513,7 +513,13 @@ * 加急对象 */ private UrgentLevel urgentLevel; + /** + * 灭菌方式(用于"DGSDBZXYY-31 使用记录转单时,高低温物品自动分单"此问题,转换申请单后,将相应的转换的灭菌方式赋值到转换后的申请单) + */ + private String sterilizationMode; + + /** * 发货计划的ID,数据库的主键,自增类型 */ @Override @@ -1590,6 +1596,14 @@ this.urgentLevel = urgentLevel; } + public String getSterilizationMode() { + return sterilizationMode; + } + + public void setSterilizationMode(String sterilizationMode) { + this.sterilizationMode = sterilizationMode; + } + @Override public String toString() { return "{id:'" + id + "', serialNumber:'" + serialNumber Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java =================================================================== diff -u -r28122 -r28465 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 28122) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 28465) @@ -102,6 +102,7 @@ * @param tousseInstanceCodes 器械包条码(含对应标识牌条码),应用至申请单的备注字段中 * @param applicationCreateDate 申请时间(使用记录的时间) * @param operationRoom 使用记录的病房 + * @param sterilizationMode 灭菌方式 * @param dpf 一次性物品价格浮动系数 * @param invoicePlanType 单类型 */ @@ -110,7 +111,7 @@ Map diposableGoodMap, String applicant, String depart, String departCoding, String hospitalNumber, String remark, Map tousseInstanceMap, Date applicationDate, - String operationRoom,double dpf,String invoicePlanType, + String operationRoom,String sterilizationMode,double dpf,String invoicePlanType, Map applyUrgentTousseMap,Long useRecordId); /** Index: ssts-toussereturndisinfect/src/main/java/com/forgon/disinfectsystem/tousseReturnDisinfectRecord/service/TousseReturnDisinfectRecordManagerImpl.java =================================================================== diff -u -r26662 -r28465 --- ssts-toussereturndisinfect/src/main/java/com/forgon/disinfectsystem/tousseReturnDisinfectRecord/service/TousseReturnDisinfectRecordManagerImpl.java (.../TousseReturnDisinfectRecordManagerImpl.java) (revision 26662) +++ ssts-toussereturndisinfect/src/main/java/com/forgon/disinfectsystem/tousseReturnDisinfectRecord/service/TousseReturnDisinfectRecordManagerImpl.java (.../TousseReturnDisinfectRecordManagerImpl.java) (revision 28465) @@ -308,7 +308,7 @@ tousseReturnDisinfectRecord.getOrgUnitName(), tousseReturnDisinfectRecord.getOrgUnitCoding(), null,null,insideTousseBarcodeToTousseDefinitionIdMap,tousseReturnDisinfectRecord.getOperateDate(), - null,0d,formType,null,null); + null,null,0d,formType,null,null); if(CollectionUtils.isNotEmpty(applicationList)){ for(RecyclingApplication recyclingApplication : applicationList){ Index: ssts-web/src/main/webapp/disinfectsystem/config/dgsdbzxyy/config.js =================================================================== diff -u -r28430 -r28465 --- ssts-web/src/main/webapp/disinfectsystem/config/dgsdbzxyy/config.js (.../config.js) (revision 28430) +++ ssts-web/src/main/webapp/disinfectsystem/config/dgsdbzxyy/config.js (.../config.js) (revision 28465) @@ -1,4 +1,4 @@ -var sstsConfig = { +var sstsConfig = { hiddenOrgunitSyncButton:true, hiddenUserSyncButton:true, // 回收时科室显示结算科室 @@ -69,6 +69,8 @@ useRecordConvertRecyclingApplicationMergeRegular:"operationRoom", //手术间为空临床科室也合并单 allowUseReordToApplicationMergeWhenOperationRoomIsBlank:true, + //使用记录转申请单时低温物品拆分后的合并方式 + mergeRegularOfLowTemperatureToussesAfterExtracted:{"mergeRegular":"depart","lowTempSterilizationModes":["低温等离子","环氧乙烷"]}, //手术间必填 useRecordOperationRoomAllowBlank: false,