Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java =================================================================== diff -u -r33902 -r33921 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 33902) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 33921) @@ -1781,7 +1781,7 @@ + "', deliverStatus:'" + deliverStatus + "', committedStatus:'" + committedStatus + "', printed:'" + printed + "', type:'" + type + "', endStatus:'" + endStatus + "', lastInvoiceTime:'" - + lastInvoiceTime + "}"; + + lastInvoiceTime + "'}"; } /** Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r33907 -r33921 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33907) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33921) @@ -767,7 +767,107 @@ } } + /** + * 根据申请单查询是否包含已灭菌/已消毒状态的器械包实例 + * @param orgUnitCodingList + * @param appFormType + * @param tousseGroupIds + * @param sterilingMethods + * @param disposableGoodsType + * @param tousseTypes + * @param applyDate + * @return + */ + private Map getDepartInvoicePlanTousseInstanceStatus(Collection invoicePlanIdList) { + //根据申请单id查出申请单对象(将代理灭菌单拆分出来,代理灭菌单查询语句与非代理灭菌单的查询语句不一致) + if(CollectionUtils.isNotEmpty(invoicePlanIdList)){ + List invoicePlanList = getCollection(invoicePlanIdList); + if(CollectionUtils.isNotEmpty(invoicePlanList)){ + List proxyDisinfectionIdList = new ArrayList(); + List notProxyDisinfectionIdList = new ArrayList(); + for(InvoicePlan invoicePlan : invoicePlanList){ + if(invoicePlan instanceof ProxyDisinfection){ + proxyDisinfectionIdList.add(invoicePlan.getId()); + }else{ + notProxyDisinfectionIdList.add(invoicePlan.getId()); + } + } + Map statusMap = new HashMap(); + if(CollectionUtils.isNotEmpty(proxyDisinfectionIdList)){ + Map statusMap1 = getDepartTousseInstanceStatusMap(invoicePlanIdList, true); + if(MapUtils.isNotEmpty(statusMap1)){ + statusMap.putAll(statusMap1); + } + } + if(CollectionUtils.isNotEmpty(notProxyDisinfectionIdList)){ + Map statusMap2 = getDepartTousseInstanceStatusMap(invoicePlanIdList, false); + if(MapUtils.isNotEmpty(statusMap2)){ + statusMap.putAll(statusMap2); + } + } + return statusMap; + }else{ + return getDepartTousseInstanceStatusMap(null, false); + } + }else{ + return getDepartTousseInstanceStatusMap(null, false); + } + } + + + /** + * 根据申请单id集合及是否代理灭菌单查询其对应的包实例是否有已灭菌状态 + * @param invoicePlanIdList + * @param isProxyDisinfection + * @return + */ + protected Map getDepartTousseInstanceStatusMap(Collection invoicePlanIdList,boolean isProxyDisinfection){ + Map statusMap = new HashMap(); + //非代理灭菌单类型的申请单 + String sql = String.format("select ti.departCoding, count(0) from %s ti " + + "join %s ip on ti.invoicePlanID = ip.id " + + "where (1=1) " + + "and ti.orgUnitCoding='%s' " + + "and %s " + + "and ti.status in ('%s','%s') " + + "group by ti.departCoding having count(0) > 0", + TousseInstance.class.getSimpleName(), + InvoicePlan.class.getSimpleName(), + AcegiHelper.getCurrentOrgUnitCode(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIdList), + TousseInstance.STATUS_STERILED, TousseInstance.STATUS_DISINFECTED); + //代理灭菌单类型的申请单 + if(isProxyDisinfection){ + sql = String.format("select ip.departCoding, count(0) from %s ti " + + "join %s ip on ti.proxyDisinfection_id = ip.id " + + "where (1=1) " + + "and ip.handleDepartCoding='%s' " + + "and %s " + + "and ti.status in ('%s','%s') " + + "group by ip.departCoding having count(0) > 0", + TousseInstance.class.getSimpleName(), + InvoicePlan.class.getSimpleName(), + AcegiHelper.getCurrentOrgUnitCode(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIdList), + TousseInstance.STATUS_STERILED, TousseInstance.STATUS_DISINFECTED); + } + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + String departCoding = rs.getString("departCoding"); + statusMap.put(departCoding, ApplicationGoodsVo.STATUS_STERILED); + } + } catch (Exception e) { + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return statusMap; + } + + /** * 获取申请单集合的申请物品包定义map<器械包定义id,器械包定义> * @param invoicePlans 申请单集合 * @param queryDisposableGoods 是否按器械包分组过滤 @@ -1044,7 +1144,7 @@ * 根据科室分组(科室编码间采用分号分隔),申请日期(开始日期与结束日期间采用分号分隔),物品类型等查询发货计划 * @param departCodes 科室分组,如9002195;9002197;9002196;9002189 * @param applyDate 开始与结束日期,如2015-09-22;2015-09-22 - * @param tousseType 物品类型,如是或否,是代码为一次性物品,否代码非一次性物品 + * @param tousseType 物品类型,如是或否,是代表为一次性物品,否代表非一次性物品 * @return */ @Override @@ -1062,40 +1162,81 @@ Collection resultCol = new ArrayList(); String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); // Map> invoicePlanVoToInvoicePlanListMap = new HashMap>(); - for (final InvoicePlan invoicePlan : invoicePlans) { - InvoicePlanVo vo = CollectionUtils.find(resultCol, - new Predicate() { - @Override - public boolean evaluate(InvoicePlanVo vo) { - return StringUtils.equals(vo.getDepartCode(), - invoicePlan.getInvoiceGroupByDepartCoding(groupBy)); - } - }); - - // 东莞东华医院要求:发货计划只能看到供应室审核了的借物单,所以这里要判断单据类型是否借物单,如果不是借物单且审核状态不为待审核则按原来的方式运行, - // 审核状态只有东莞东华医院申请借物单时才会有,其他医院这个状态都是空 - if (!this.checkIsShowNoConBorrow(invoicePlan.getType(),invoicePlan.getBorrowConfirmStatus())){ - continue; - } - if (vo == null) { - vo = new InvoicePlanVo(); - resultCol.add(vo); - vo.setDepart(invoicePlan.getInvoiceGroupByDepart(groupBy)); - vo.setDepartCode(invoicePlan.getInvoiceGroupByDepartCoding(groupBy)); - } - vo.incrementAmount(invoicePlan.getType()); - vo.compareAndSetMaxUrgency(invoicePlan.getUrgencyNum()); - vo.setMaxUrgentLevel(invoicePlan.getUrgentLevel()); - vo.setContainUrgentItem(invoicePlan.getUrgent()); - if(invoicePlan.isBorrowingSingle()){ - vo.setHighLight(true); - } + + if(CollectionUtils.isNotEmpty(invoicePlans)){ + //各科室下的各个单类型的数量汇总(第一层map的key为科室编码、value为第二层的map对象;第二层map的key为单类型、第二层value为单数量) + List departCodingList = new ArrayList(); + Map departCodingGradeMap = new HashMap(); + for (final InvoicePlan invoicePlan : invoicePlans) { + String depart = invoicePlan.getInvoiceGroupByDepart(groupBy); + String departCode = invoicePlan.getInvoiceGroupByDepartCoding(groupBy); + InvoicePlanVo vo = CollectionUtils.find(resultCol, + new Predicate() { + @Override + public boolean evaluate(InvoicePlanVo vo) { + return StringUtils.equals(vo.getDepartCode(),departCode); + } + }); + + // 东莞东华医院要求:发货计划只能看到供应室审核了的借物单,所以这里要判断单据类型是否借物单,如果不是借物单且审核状态不为待审核则按原来的方式运行, + // 审核状态只有东莞东华医院申请借物单时才会有,其他医院这个状态都是空 + if (!this.checkIsShowNoConBorrow(invoicePlan.getType(),invoicePlan.getBorrowConfirmStatus())){ + continue; + } + if (vo == null) { + vo = new InvoicePlanVo(); + resultCol.add(vo); + vo.setDepart(depart); + vo.setDepartCode(departCode); + } + vo.incrementAmount(invoicePlan.getType()); + vo.compareAndSetMaxUrgency(invoicePlan.getUrgencyNum()); + vo.setMaxUrgentLevel(invoicePlan.getUrgentLevel()); + vo.setContainUrgentItem(invoicePlan.getUrgent()); + if(invoicePlan.isBorrowingSingle()){ + vo.setHighLight(true); + } + + if(!departCodingList.contains(departCode)){ + departCodingList.add(departCode); + } + //申请单的加急级别 + UrgentLevel urgentLevel = invoicePlan.getUrgentLevel(); + Integer gradeOfInvoicePlan = (urgentLevel == null ? null : urgentLevel.getGrade()); + Integer gradeOfDepartCoding = departCodingGradeMap.get(departCode); + if(gradeOfInvoicePlan != null && gradeOfInvoicePlan.intValue() > IntegerUtils.parse(gradeOfDepartCoding)){ + departCodingGradeMap.put(departCode, gradeOfInvoicePlan); + } // List invoicePlanList = invoicePlanVoToInvoicePlanListMap.get(vo); // if(invoicePlanList == null){ // invoicePlanList = new LinkedList(); // invoicePlanVoToInvoicePlanListMap.put(vo, invoicePlanList); // } // invoicePlanList.add(invoicePlan); + } + Map orgUnitMap = new HashMap(); + List orgUnitList = + orgUnitManager.getCollection("orgUnitCoding", departCodingList); + if(CollectionUtils.isNotEmpty(orgUnitList)){ + for (OrgUnit orgUnit : orgUnitList) { + orgUnitMap.put(orgUnit.getOrgUnitCoding(), orgUnit); + } + } + // 在发货计划模块的待发货科室列表,如果某科室存在状态为已灭菌或者已消毒的待发货物品时,将该科室所在行的科室列单元格的背景颜色改为和物品已灭菌/已消毒背景色一致 + int colorChangeRuleOfInvoicPlanToSendGoodsList = + ConfigUtils.getSystemSetConfigByNameInt("colorChangeRuleOfInvoicPlanToSendGoodsList", 0); + Map statusMap = new HashMap(); + if(colorChangeRuleOfInvoicPlanToSendGoodsList == 2){ + statusMap = getDepartInvoicePlanStatus(departCodingList, applyDate, tousseType,disposableGoodsType, sterilingMethods,tousseGroupIds, appFormType); + if(MapUtils.isNotEmpty(statusMap)){ + for(InvoicePlanVo vo : resultCol){ + String status = statusMap.get(vo.getDepartCode()); + if(StringUtils.isNotBlank(status)){ + vo.setStatus(status); + } + } + } + } } // // for (InvoicePlanVo invoicePlanVo : resultCol) { @@ -1111,6 +1252,1351 @@ return resultCol; } + /** + * 根据科室编码对应加急级别map得到级别对应加急级别对象的map + * @param departCodingGradeMap + * @return + */ + protected Map getGradeToUrgentLevelMapByDepartCodingGradeMap(Map departCodingGradeMap){ + Map gradeToUrgentLevelMap = null; + if(departCodingGradeMap != null && MapUtils.isNotEmpty(departCodingGradeMap)){ + Collection gradeList = departCodingGradeMap.values(); + if(CollectionUtils.isNotEmpty(gradeList)){ + @SuppressWarnings("unchecked") + List urgentLevelList = + objectDao.findBySql(UrgentLevel.class.getSimpleName(), + String.format("where %s" , + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("grade", gradeList))); + if(CollectionUtils.isNotEmpty(urgentLevelList)){ + for (UrgentLevel urgentLevel : urgentLevelList) { + if(gradeToUrgentLevelMap == null){ + gradeToUrgentLevelMap = new HashMap(); + } + gradeToUrgentLevelMap.put(urgentLevel.getGrade(), urgentLevel); + } + } + } + } + return gradeToUrgentLevelMap; + } + + /** + * 判断科室的申请单是否包含已灭菌/已消毒的物品(SZSDSRMYY-51) + * @param orgUnitCodingList + * @param applyDate + * @param tousseTypes + * @param disposableGoodsType + * @param sterilingMethods + * @param tousseGroupIds + * @param appFormType + * @return + */ + protected Map getDepartInvoicePlanStatus(List orgUnitCodingList, String applyDate, String tousseTypes, + String disposableGoodsType, String sterilingMethods, String tousseGroupIds, String appFormType) { + + Map result = new HashMap(); + Collection list = new ArrayList(); + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + //发货数量依据:申请单或回收单 + String invoiceOrigin = config.getInvoiceOrigin(); + //器械包发货时间 + String tousseDeliverOccasion = config.getTousseDeliverOccasion(); + + //申请单的过滤条件 + //申请单表的别名 + String invoicePlanTableAlias = "po"; + //申请单过滤公共条件(按申请单id,申请科室等),用于所有类型场景的申请单过滤条件 + String invoicePlanCommonCondition = null; + //外来器械包申请单过滤条件(未装配的查申请项、装配过的查包实例)、还需要查出相关的申请单id + String invoicePlanForeignTousseCondition = null; + //需要绑定申请单的各种物品场景的过滤条件(用于外部代理灭菌包、自定义器械包)、还需要查出相关的申请单id + String invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = null; + //需要绑定申请单的各种物品场景的过滤条件(用于代理灭菌的包等)、还需要查出相关的申请单id + String invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = null; + //公共类型的申请单的过滤条件(一次性物品、器械包、敷料包、消毒物品等)、只统计物品不查申请单. + String invoicePlanCommonGoodsCondition = null; + + String orgUnitCoding = ""; + if(CollectionUtils.isNotEmpty(orgUnitCodingList)){ + invoicePlanCommonCondition = String.format(invoicePlanTableAlias +".%s", + InvoiceUtils.getInvoiceGroupByConfig()); + invoicePlanCommonCondition = SqlUtils.getStringFieldInLargeCollectionsPredicate(invoicePlanCommonCondition, orgUnitCodingList); + }else{ + return result; + } + + /* + * 1.如果appFormType为null,则分开查询外来器械包申请单、需要绑定申请单的各种物品、公共类型的申请单的过滤条件(一次性物品、器械包、敷料包等)、消毒物品的过滤查询等分开查询 + * 2.如果appFormType为外来器械包申请单 + * 3.如果appFormType为代理灭菌单、外部代理灭菌单、自定义器械包申请单 + * 4.如果appFormType为以上申请单外的申请单 + * 4.1器械包、敷料包、一次性物品 + * 4.2消毒物品 + */ + //要排除的申请单类型集合 + List excludeInvoicePlanTypeList = + Arrays.asList(new String[]{ + InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION, + InvoicePlan.TYPE_PROXYDISINFECTION, + InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION, + InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM + }); + if(StringUtils.isNotBlank(appFormType)){ + if(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION.equals(appFormType)){ + invoicePlanForeignTousseCondition = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication(null, + applyDate, invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + }else if(InvoicePlan.TYPE_PROXYDISINFECTION.equals(appFormType) + || InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION.equals(appFormType) + || InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM.equals(appFormType)){ + invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction(null, applyDate, + invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionForProxyDisinfection(null, applyDate, + invoicePlanTableAlias, invoiceOrigin, tousseDeliverOccasion)); + }else{ + invoicePlanCommonGoodsCondition = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(orgUnitCoding, applyDate, + appFormType , excludeInvoicePlanTypeList , invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + } + }else{ + invoicePlanForeignTousseCondition = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication(null, + applyDate, invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction(null, applyDate, + invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionForProxyDisinfection(null, applyDate, + invoicePlanTableAlias, invoiceOrigin, tousseDeliverOccasion)); + invoicePlanCommonGoodsCondition = String.format("%s and %s", + invoicePlanCommonCondition, + buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(orgUnitCoding, applyDate, + appFormType , excludeInvoicePlanTypeList , invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); + } + + List tousseTypeList = null; + if(StringUtils.isNotBlank(tousseTypes)){ + tousseTypeList = Arrays.asList(tousseTypes.split(",")); + } + boolean includeForeignTousseType = false; + if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_FOREIGN)){ + includeForeignTousseType = true; + } + //1.如果存在外来器械单的查询条件时 + if(StringUtils.isNotBlank(invoicePlanForeignTousseCondition) && includeForeignTousseType){ + //申请项的过滤条件 + //申请项表的别名 + String tousseItemTableAlias = "ti"; + String tousseItemCondition = + buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(TousseDefinition.PACKAGE_TYPE_FOREIGN, null, + sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, + invoiceOrigin,tousseDeliverOccasion); + + //包实例表的别名 + String tousseInstanceTableAlias = "tis"; + //因为后面括号里这个问题要求把包实例的状态列进条件里,所以不再使用此条件,改为下面一行的1=1(SZSDSRMYY-46 添加外来器械申请单后,要根据科室供应室设置里的器械包发货时间来决定该发货计划的显示) + String tousseInstanceCondition = String.format("%s", + SqlUtils.getStringFieldInLargeCollectionsPredicate(tousseInstanceTableAlias + ".status", + Arrays.asList(new String[]{ + TousseInstance.STATUS_PACKED, + TousseInstance.STATUS_REVIEWED, + TousseInstance.STATUS_STERILING, + TousseInstance.STATUS_DELAY_CONFIRM, + TousseInstance.STATUS_STERILED + }))); + + //数量合计语句(外来器械包) + String tousseItemWaitSendAmountSumSql = "(recyclingAmount - sendOutAmount)"; + if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_BEFORERECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(amount - sendOutAmount)"; + }else if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERPRERECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(amount - sendOutAmount)"; + }if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERRECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(recyclingAmount - sendOutAmount)"; + } + + //先查未装配生成包实例的申请单 + String queryTousseItemSql = String.format( + "select "+ invoicePlanTableAlias +".id invoicePlanId," + + invoicePlanTableAlias +".departCoding," + + tousseItemTableAlias +".id tousseItemId," + + tousseItemTableAlias +".tousseName," + + tousseItemTableAlias +".tousseType," + + tousseItemTableAlias +".diposable," + + invoicePlanTableAlias +".applicationTime," + + tousseItemWaitSendAmountSumSql +" amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 ", + TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + tousseItemCondition,String.format("%s and %s", invoicePlanForeignTousseCondition, + String.format(invoicePlanTableAlias +".id not in (select foreignTousseApp_id from %s where foreignTousseApp_id is not null)",TousseInstance.class.getSimpleName()))); + + //再查已经装配生成包实例的申请单。由于后面括号里这个问题要求不再把包实例的状态列进条件里,所以不再使用此条件(SZSDSRMYY-46 添加外来器械申请单后,要根据科室供应室设置里的器械包发货时间来决定该发货计划的显示) + queryTousseItemSql += String.format(" union all " + + "select "+ invoicePlanTableAlias +".id invoicePlanId," + + invoicePlanTableAlias +".departCoding," + + "null tousseItemId," + + tousseInstanceTableAlias +".tousseName," + + "td.tousseType,'%s' diposable," + + invoicePlanTableAlias +".applicationTime," + + "1 amount " + + "from %s "+ tousseInstanceTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseInstanceTableAlias +".foreignTousseApp_id="+ invoicePlanTableAlias +".id " + + "left join %s td on "+ tousseInstanceTableAlias +".tousseDefinition_id=td.id " + + "where %s and %s order by applicationTime", Constants.STR_NO, + TousseInstance.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + TousseDefinition.class.getSimpleName() ,invoicePlanForeignTousseCondition,tousseInstanceCondition); + + Collection list1 = getWaitDeliverGoodsForForeignTousse(queryTousseItemSql); + if(CollectionUtils.isNotEmpty(list1)){ + list.addAll(list1); + } + } + + //如果存在需返回申请单id的查询条件时(用于外部代理灭菌单、自定义器械包申请单) + if(StringUtils.isNotBlank(invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction)){ + //申请项的过滤条件 + //申请项表的别名 + String tousseItemTableAlias = "ti"; + String tousseItemCondition = + buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(tousseTypes, null, + sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, + invoiceOrigin,tousseDeliverOccasion); + + //应发货数量 + String shouldSendAmountCaseSql = + CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, + invoiceOrigin, tousseDeliverOccasion); + + //查询待发货申请单的申请项 + String queryTousseItemSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanId," + + invoicePlanTableAlias +".departCoding," + + invoicePlanTableAlias +".type invoicePlanType," + + tousseItemTableAlias +".tousseName," + + tousseItemTableAlias +".tousseType," + + tousseItemTableAlias +".diposable," + + invoicePlanTableAlias +".applicationTime," + + "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "where %s and %s and " + shouldSendAmountCaseSql +" > 0 " + + "order by "+ invoicePlanTableAlias +".applicationTime", + TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction,tousseItemCondition); + + Collection list1 = getWaitDeliverGoodsForNeedReturnInvoicePlanId(queryTousseItemSql); + if(CollectionUtils.isNotEmpty(list1)){ + list.addAll(list1); + } + } + + //代理灭菌单的待发货物品集合 + Collection proxyDisinfectionApplicationGoodsVoList = null; + //如果存在需返回申请单id的查询条件时(用于代理灭菌单) + if(StringUtils.isNotBlank(invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection)){ + //申请项的过滤条件 + //申请项表的别名 + String tousseItemTableAlias = "ti"; + String tousseItemCondition = + buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(tousseTypes, null, + sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, + invoiceOrigin,tousseDeliverOccasion); + + //应发货数量 + String shouldSendAmountCaseSql = + CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, + invoiceOrigin, tousseDeliverOccasion); + + //查询待发货申请单的申请项 + String queryTousseItemSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanId," + + invoicePlanTableAlias +".departCoding," + + invoicePlanTableAlias +".type invoicePlanType," + + tousseItemTableAlias +".tousseName," + + tousseItemTableAlias +".tousseType," + + tousseItemTableAlias +".diposable," + + invoicePlanTableAlias +".applicationTime," + + "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "where %s and %s and " + shouldSendAmountCaseSql +" > 0 " + + "order by "+ invoicePlanTableAlias +".applicationTime", + TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection,tousseItemCondition); + + proxyDisinfectionApplicationGoodsVoList = getWaitDeliverGoodsForNeedReturnInvoicePlanId(queryTousseItemSql); + } + + //如果存在公共物品类型的查询条件时(分开成消毒物品与(器械包、一次性物品、敷料包)) + if(StringUtils.isNotBlank(invoicePlanCommonGoodsCondition)){ + //器械包、敷料包、一次性物品的待发货物品查询(仅查询通用申请单、器械包申请单、回收申请单、一次性物品申请单里的器械包、敷料包、一次性物品,不需要返回申请单id) + Collection commonGoodsButNotDisinfectGoodsApplicationGoodsVoList = null; + //申请项的过滤条件 + //申请项表的别名 + String tousseItemTableAlias = "ti"; + //应发货数量 + String shouldSendAmountCaseSql = + CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, + invoiceOrigin, tousseDeliverOccasion); + + //数量合计语句 + String tousseItemWaitSendAmountSumSql = "((case " + + "when "+ tousseItemTableAlias +".tousseType='"+ DisposableGoods.TYPE_NAME +"' " + + "then case when ("+ tousseItemTableAlias +".transferScale is not null and "+ tousseItemTableAlias +".transferScale > 0) then "+ tousseItemTableAlias +".amount/"+ tousseItemTableAlias +".transferScale " + + "else "+ tousseItemTableAlias +".amount end " + + "else "+ shouldSendAmountCaseSql +" " + + "end) - (case when ("+ tousseItemTableAlias +".transferScale is not null and "+ tousseItemTableAlias +".transferScale > 0) then "+ tousseItemTableAlias +".sendOutAmount/"+ tousseItemTableAlias +".transferScale else "+ tousseItemTableAlias +".sendOutAmount end))"; + + //1.器械包、敷料包、一次性物品的待发货查询 + if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_INSIDE) + || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DRESSING) || tousseTypeList.contains(DisposableGoods.TYPE_NAME)){ + List queryTousseTypeList = new ArrayList(); + if(CollectionUtils.isEmpty(tousseTypeList)){ + queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); + queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); + queryTousseTypeList.add(DisposableGoods.TYPE_NAME); + }else{ + if(tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_INSIDE)){ + queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); + } + if(tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DRESSING)){ + queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); + } + if(tousseTypeList.contains(DisposableGoods.TYPE_NAME)){ + queryTousseTypeList.add(DisposableGoods.TYPE_NAME); + } + } + //通用物品类型,即器械包、敷料包、一次性物品(排除消毒物品) + String tousseItemCommonGoodsExcludeDisinfectGoodsCondition = + buildWaitSendInvoicePlanSqlConditionOnlyTousseItem( + StringUtils.join(queryTousseTypeList, ","), + disposableGoodsType, sterilingMethods, tousseGroupIds , + tousseItemTableAlias , invoicePlanTableAlias,invoiceOrigin, + tousseDeliverOccasion); + + String queryNotDisinfectTousseItemSql = String.format("select disposableGoodsId,tousseName,tousseType,diposable," + + invoicePlanTableAlias +".departCoding," + + "min("+ invoicePlanTableAlias +".applicationTime) applicationTime," + + "dg.ttsName ,sum"+ tousseItemWaitSendAmountSumSql +" amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "left join %s dg on dg.id="+ tousseItemTableAlias +".disposableGoodsId " + + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " + + "group by disposableGoodsId,tousseName,tousseType,diposable,dg.ttsName,po.departCoding " + + "order by " + + "(case when tousseType='%s' then 1 else 2 end)," + + "min("+ invoicePlanTableAlias +".applicationTime)", + TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + DisposableGoods.class.getSimpleName() ,invoicePlanCommonGoodsCondition , + tousseItemCommonGoodsExcludeDisinfectGoodsCondition , TousseItem.TYPE_DIPOSABLE_GOODS); + commonGoodsButNotDisinfectGoodsApplicationGoodsVoList = getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods(queryNotDisinfectTousseItemSql); + //1.常规物品不为空但代理灭菌单物品为空时 + if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isEmpty(proxyDisinfectionApplicationGoodsVoList)){ + //所有的器械包(敷料包)的名称的集合 + List tousseNameList = commonGoodsButNotDisinfectGoodsApplicationGoodsVoList.stream().filter(ti -> { + return StringUtils.equals(Constants.STR_NO, ti.getDiposable()); + }).map(ApplicationGoodsVo::getName).collect(Collectors.toList()); + if(CollectionUtils.isNotEmpty(tousseNameList)){ + List tdList = tousseDefinitionManager.getCollection(String.format(" forDisplay=1 and %s ", + SqlUtils.getStringFieldInLargeCollectionsPredicate("name", tousseNameList)), new HashMap<>()); + if(CollectionUtils.isNotEmpty(tdList)){ + Map tousseNameToTdMap = new HashMap<>(); + tdList.stream().forEach(td -> { + tousseNameToTdMap.put(td.getName(), td); + }); + //对于器械包、消毒物品、敷料包设置其是否追溯属性(根据对应的器械包祖先包定义) + for(ApplicationGoodsVo vo : commonGoodsButNotDisinfectGoodsApplicationGoodsVoList){ + if(StringUtils.equals(Constants.STR_NO, vo.getDiposable())){ + TousseDefinition td = tousseNameToTdMap.get(vo.getName()); + if(td != null){ + vo.setIsTraceable(td.getIsTraceable()); + }else{ + //抛出异常 + //throw new SystemException("未找到器械包名称为"+ vo.getName() +"的包定义,可能已被删除或改名,请重新刷新"); + vo.setIsTraceable(Constants.STR_YES); + } + } + } + } + } + list.addAll(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList); + }else if(CollectionUtils.isEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ + //2.常规物品为空但代理灭菌单物品不为空时 + list.addAll(proxyDisinfectionApplicationGoodsVoList); + }else if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ + //记录常规物品集合中不在代理灭菌物品集合里的物品集合 + Collection commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList = new ArrayList(); + //3.常规物品不为空但代理灭菌单物品不为空时,需要对相同名称物品进行数量合并 + for(ApplicationGoodsVo commonGoodsButNotDisinfectGoodsApplicationGoodsVo : commonGoodsButNotDisinfectGoodsApplicationGoodsVoList){ + boolean foundInProxyDisinfectionApplicationGoodsVoList = false; + for(ApplicationGoodsVo proxyDisinfectionApplicationGoodsVo : proxyDisinfectionApplicationGoodsVoList){ + if(StringUtils.equals(commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getName(), proxyDisinfectionApplicationGoodsVo.getName())){ + proxyDisinfectionApplicationGoodsVo.setCount(MathTools.add(proxyDisinfectionApplicationGoodsVo.getCount(), commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getCount()).intValue()); + proxyDisinfectionApplicationGoodsVo.setApplicationAmount(MathTools.add(proxyDisinfectionApplicationGoodsVo.getApplicationAmount(), commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getApplicationAmount()).intValue()); + foundInProxyDisinfectionApplicationGoodsVoList = true; + break; + } + } + if(!foundInProxyDisinfectionApplicationGoodsVoList){ + commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList.add(commonGoodsButNotDisinfectGoodsApplicationGoodsVo); + } + } + if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ + list.addAll(proxyDisinfectionApplicationGoodsVoList); + } + if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList)){ + list.addAll(commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList); + } + } + }else{ + if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ + list.addAll(proxyDisinfectionApplicationGoodsVoList); + } + } + + //2.消毒物品 + if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DISINFECTION)){ + + String tousseItemDisinfectGoodsCondition = + buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(TousseDefinition.PACKAGE_TYPE_DISINFECTION, null, sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias,invoiceOrigin,tousseDeliverOccasion); + String queryDisinfectTousseItemSql = String.format("select "+ tousseItemTableAlias +".tousseName," + + tousseItemTableAlias +".tousseType,'%s' diposable," + + invoicePlanTableAlias +".departCoding," + + "td.id tdId,td.materialsMD5,td.materialAmount,td.isApplyEntireTousse," + + "min("+invoicePlanTableAlias +".applicationTime) applicationTime," + + "sum"+ tousseItemWaitSendAmountSumSql +" amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "left join %s td on td.id="+ tousseItemTableAlias +".tousseDefinitionId " + + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " + + "group by "+ tousseItemTableAlias +".tousseName,"+ tousseItemTableAlias +".tousseType, td.id ,td.materialsMD5,td.materialAmount,td.isApplyEntireTousse,po.departCoding " + + "order by min(" + invoicePlanTableAlias +".applicationTime)", Constants.STR_NO, + TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), + TousseDefinition.class.getSimpleName() ,invoicePlanCommonGoodsCondition , + tousseItemDisinfectGoodsCondition); + Collection list2 = getWaitDeliverGoodsForDisinfectGoods(queryDisinfectTousseItemSql); + if(CollectionUtils.isNotEmpty(list2)){ + list.addAll(list2); + } + } + }else{ + if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ + list.addAll(proxyDisinfectionApplicationGoodsVoList); + } + } + + // 申请单id + Set invoicePlanIdSet = new HashSet(); + if(CollectionUtils.isNotEmpty(list)){ + for (ApplicationGoodsVo vo : list) { + if(StringUtils.equals(DisposableGoods.TYPE_NAME, vo.getGoodsType())){ + result.put(vo.getDepartCoding(), ApplicationGoodsVo.STATUS_STERILED); + continue; + } + List invoicePlanIdList = vo.getInvoicePlanIDList(); + if(CollectionUtils.isNotEmpty(invoicePlanIdList)){ + for (Long id : invoicePlanIdList) { + invoicePlanIdSet.add(id); + } + } + } + } + + // 根据申请单查器械包实例是否包含已灭菌/已消毒的物品 + Map resultMap1 = getDepartInvoicePlanTousseInstanceStatus(invoicePlanIdSet); + + // 科室对应的物品 + Map> departToGoodsMap = new HashMap>(); + if(CollectionUtils.isNotEmpty(list)){ + for (ApplicationGoodsVo vo : list) { + String departCoding = vo.getDepartCoding(); + if(resultMap1 != null && resultMap1.containsKey(departCoding)){ + continue; + } + if(result != null && result.containsKey(departCoding)){ + continue; + } + List voList = departToGoodsMap.get(departCoding); + if(CollectionUtils.isEmpty(voList)){ + voList = new ArrayList(); + } + voList.add(vo); + departToGoodsMap.put(departCoding, voList); + } + } + + if(!departToGoodsMap.isEmpty()){ + for (String departCode : departToGoodsMap.keySet()) { + List voList = departToGoodsMap.get(departCode); + if(CollectionUtils.isNotEmpty(voList)){ + addApplicationGoodsVoStatus(voList, departCode); + for (ApplicationGoodsVo applicationGoodsVo : voList) { + if(StringUtils.equals(applicationGoodsVo.getStatus(), ApplicationGoodsVo.STATUS_STERILED)){ + result.put(departCode, ApplicationGoodsVo.STATUS_STERILED); + break; + } + } + } + } + } + + if(resultMap1 != null && !resultMap1.isEmpty()){ + for (String departCode : resultMap1.keySet()) { + result.put(departCode, resultMap1.get(departCode)); + } + } + + return result; + } + + /** + * 构造发货计划单的过滤条件(外来器械申请单的单层面相关,不包含申请项相关的过滤),无where开头 + * @param departCodes 科室编码 + * @param applyDate 申请日期 + * @param alias 表的别名(防止多个表是同名字段时语句报错) + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication( + String departCodes, String applyDate,String alias, + String invoiceOrigin , String tousseDeliverOccasion){ + String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( + departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); + String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; + //过滤相关的单类型 + String condition = String.format("%s and %s='%s'",commonCondition, + tableColumnAliasPre +"type",InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); + return condition; + } + + /** + * 构造发货计划单的通用过滤条件 + * @param departCodes 科室编码 + * @param applyDate 申请日期 + * @param alias 表的别名(防止多个表是同名字段时语句报错) + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanCommonSqlCondition( + String departCodes, String applyDate,String alias, + String invoiceOrigin , String tousseDeliverOccasion){ + //表名的字段的前缀 + String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; + List departCodeList = null; + if(StringUtils.isNotBlank(departCodes)){ + departCodeList = Arrays.asList(departCodes.split(";")); + } + // 默认是过滤申请科室,也可以配置为结算科室 + String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); + //条件1.根据科室分组的科室编码过滤,参数:departCodes + String where1 = "1=1"; + if(CollectionUtils.isNotEmpty(departCodeList)){ + where1 = SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre + groupBy, departCodeList); + } + + //条件2.根据申请日期过滤 如果申请时间范围不为空时,参数:applyDate + String where2 = "1=1"; + if (StringUtils.isNotBlank(applyDate)) { + try { + where2 = this.setTimeCondition(applyDate,tableColumnAliasPre); + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + } + + //条件3.根据发货单状态过滤 + String where3 = String.format( + "("+ tableColumnAliasPre +"deliverStatus='%s' or "+ tableColumnAliasPre +"deliverStatus='%s') and ("+ tableColumnAliasPre +"endStatus is null or "+ tableColumnAliasPre +"endStatus!='%s')", + InvoicePlan.DELIVERSTATUS_AWAITDELIVER, + InvoicePlan.DELIVERSTATUS_PARTDELIVERED,InvoicePlan.STATUS_END); + //条件4.根据申请单的提交状态过滤 + String where4 = tableColumnAliasPre +"committedStatus = 1"; + LoginUserData loginUser = AcegiHelper.getLoginUser(); + String userDeptCode = loginUser.getCurrentOrgUnitCode(); + //条件5.根据申请单的处理科室编码过滤 + String where5 = tableColumnAliasPre +"handleDepartCoding = '" + userDeptCode + "'"; + + String condition = String + .format(" (%s) and (%s) and (%s) and (%s) and (%s)", + where1, where2, where3, where4, where5); + return condition; + } + + /** + * 构造发货计划单的过滤条件(用于外部代理灭菌单、自定义器械申请单需要返回该单的id的情形),无where开头 + * @param departCodes 科室编码 + * @param applyDate 申请日期 + * @param alias 表的别名(防止多个表是同名字段时语句报错) + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction( + String departCodes, String applyDate,String alias, + String invoiceOrigin , String tousseDeliverOccasion){ + String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( + departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); + String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; + //条件8.过滤相关的单类型 + String condition = String.format("%s and %s",commonCondition, + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"type", + Arrays.asList(new String[]{InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION,InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM}))); + return condition; + } + + /** + * 构造发货计划单的过滤条件(用于代理灭菌单需要返回该单的id的情形),无where开头 + * @param departCodes 科室编码 + * @param applyDate 申请日期 + * @param alias 表的别名(防止多个表是同名字段时语句报错) + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanSqlConditionForProxyDisinfection( + String departCodes, String applyDate,String alias, + String invoiceOrigin , String tousseDeliverOccasion){ + String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( + departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); + String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; + //条件8.过滤相关的单类型 + String condition = String.format("%s and %s",commonCondition, tableColumnAliasPre +"type = '"+ InvoicePlan.TYPE_PROXYDISINFECTION +"'"); + return condition; + } + + /** + * 构造发货计划单的过滤条件(仅申请单层面相关,不包含申请项相关的过滤),无where开头 + * @param departCodes 科室编码 + * @param applyDate 申请日期 + * @param appFormType 申请单类型 + * @param excludeInvoicePlanTypeList 要排除的申请单类型集合 + * @param alias 表的别名(防止多个表是同名字段时语句报错) + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(String departCodes, + String applyDate,String appFormType,List excludeInvoicePlanTypeList, + String alias,String invoiceOrigin , String tousseDeliverOccasion){ + //表2的字段的前缀 + String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; + List departCodeList = null; + if(StringUtils.isNotBlank(departCodes)){ + departCodeList = Arrays.asList(departCodes.split(";")); + } + // 默认是过滤申请科室,也可以配置为结算科室 + String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); + //条件1.根据科室分组的科室编码过滤,参数:departCodes + String where1 = "1=1"; + if(CollectionUtils.isNotEmpty(departCodeList)){ + where1 = SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre + groupBy, departCodeList); + } + + //条件2.根据申请日期过滤 如果申请时间范围不为空时,参数:applyDate + String where2 = "1=1"; + if (StringUtils.isNotBlank(applyDate)) { + try { + where2 = this.setTimeCondition(applyDate,tableColumnAliasPre); + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + } + + //条件3.根据申请单类型过滤,参数:appFormType + String where3 = "1=1"; + if(StringUtils.isNotBlank(appFormType)){ + where3 = String.format(tableColumnAliasPre +"type='%s'", appFormType); + } + //条件3附加补充1.是否隐藏未打印的一次性物品申请单(如果为是,则未打印的一次性物品申请单在发货计划中不显示) + boolean hideUnprintedDisposableGoodsInvoicePlan = + CssdUtils.getSystemSetConfigByNameBool("hideUnprintedDisposableGoodsInvoicePlan"); + if(hideUnprintedDisposableGoodsInvoicePlan){ + if(StringUtils.isBlank(appFormType)){ + where3 = String.format("%s and ("+ tableColumnAliasPre +"type <> '%s' or ("+ tableColumnAliasPre +"type = '%s' and "+ tableColumnAliasPre +"printed = %s))", where3 , + InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM , + InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM , + InvoicePlan.PRINT_STATUS_PRINTED); + }else if(StringUtils.equals(appFormType, InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM)){ + where3 = String.format("%s and "+ tableColumnAliasPre +"printed = %s", where3 , InvoicePlan.PRINT_STATUS_PRINTED); + } + } + + /* + * 条件3附加补充2.东莞东华医院要求:发货计划只能看到供应室审核了的借物单,所以这里要判断单据类型是否借物单, + * 如果不是借物单且审核状态不为待审核则按原来的方式运行,即借物单的审核状态不为待审核(为其它值或空都可以) + * 此过滤不需要配置项 + */ + if(StringUtils.isBlank(appFormType)){ + where3 = String.format("%s and ("+ tableColumnAliasPre +"type <> '%s' or ("+ tableColumnAliasPre +"type = '%s' and ("+ tableColumnAliasPre +"borrowConfirmStatus is null or "+ tableColumnAliasPre +"borrowConfirmStatus <> '%s')))", where3 , + InvoicePlan.TYPE_BORROWINGSINGLE , + InvoicePlan.TYPE_BORROWINGSINGLE , + BorrowConfirmStatus.WAITINGCONFIRM.getDesc()); + }else if(StringUtils.equals(appFormType, InvoicePlan.TYPE_BORROWINGSINGLE)){ + where3 = String.format("%s and ("+ tableColumnAliasPre +"borrowConfirmStatus is null or "+ tableColumnAliasPre +"borrowConfirmStatus <> '%s')", where3 , InvoicePlan.PRINT_STATUS_PRINTED); + } + + //条件4.如果科室供应室配置为回收后发货,则申请单的回收状态不能为待回收(??先注释,因为单上可能同时有不回收和要回收的包,此时单状态为待回收,但还是有物品需要发货) + /*String where4 = "1=1"; + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + if(config.getAfterRecyclingTousseDeliver()){ + where3 = String.format("recyclingStatus is null or recyclingStatus <> '%s')", InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE); + }*/ + + //条件5.根据发货单状态过滤 + String where5 = String.format( + "("+ tableColumnAliasPre +"deliverStatus='%s' or "+ tableColumnAliasPre +"deliverStatus='%s') and ("+ tableColumnAliasPre +"endStatus is null or "+ tableColumnAliasPre +"endStatus!='%s')", + InvoicePlan.DELIVERSTATUS_AWAITDELIVER, + InvoicePlan.DELIVERSTATUS_PARTDELIVERED,InvoicePlan.STATUS_END); + //条件6.根据申请单的提交状态过滤 + String where6 = tableColumnAliasPre +"committedStatus = 1"; + LoginUserData loginUser = AcegiHelper.getLoginUser(); + String userDeptCode = loginUser.getCurrentOrgUnitCode(); + //条件7.根据申请单的处理科室编码过滤 + String where7 = tableColumnAliasPre +"handleDepartCoding = '" + userDeptCode + "'"; + + //条件8.过滤相关的单类型 + List excludeTypelist = new ArrayList(); + excludeTypelist.add(InvoicePlan.TYPE_QUALITY_MONITOR_RECYCLE_APPLICATION); + excludeTypelist.add(InvoicePlan.TYPE_SECOND_SUPPLY_ROOM); + excludeTypelist.add(InvoicePlan.TYPE_EXPENSIVEGOODS_FORM); +// String second_supply_room_sql = String.format(" (type != '%s' or (type = '%s' and departCoding in(select orgUnitCoding from %s where supplyRoomType='%s' and showInvoicePlan='%s'))) ", +// InvoicePlan.TYPE_SECOND_SUPPLY_ROOM,InvoicePlan.TYPE_SECOND_SUPPLY_ROOM,SupplyRoomConfig.class.getSimpleName(), +// SupplyRoomConfig.SUPPLYROOM_TYPE_SECOND_SUPPLYROOM,com.forgon.tools.Constants.STR_YES); + String second_supply_room_sql = "1=1"; + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + if (config != null) { + //外来器械跑代理灭菌流程(过滤二级供应室申请的外来器械申请单) + //外来器械包默认处理科室及任务组 + JSONObject foreignTousseHandleDepartAndTaskGroupJsonobject = config.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(userDeptCode); + if (foreignTousseHandleDepartAndTaskGroupJsonobject == null || !StringUtils.equals(foreignTousseHandleDepartAndTaskGroupJsonobject.optString("departCode"), userDeptCode)) { + excludeTypelist.add(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); + } + } + excludeTypelist.add(InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION); + + //如果存在需要排除的申请单类型,则进行排除 + if(CollectionUtils.isNotEmpty(excludeInvoicePlanTypeList)){ + excludeTypelist.addAll(excludeInvoicePlanTypeList); + } + String where8 = "1=1"; + if(StringUtils.isBlank(appFormType)){ + //如果单类型的值为空(未传),且启用了借物单单独发货功能时,则需要排除掉借物单的这种类型(@see 业务详见:NFYY-62) + if(CssdUtils.getSystemSetConfigByNameBool("enableBorrowInvoicePlanSeperateSend")){ + excludeTypelist.add(InvoicePlan.TYPE_BORROWINGSINGLE); + } + where8 = SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"type", + excludeTypelist); + } + + String condition = String + .format(" (%s) and (%s) and (%s) and (%s) and (%s) and (%s) and (%s) and (%s)", + where1, where2, where3, where5, where6, where7, where8,second_supply_room_sql); + return condition; + } + + + /** + * 构造发货计划申请项的过滤条件(自定义器械申请单的相关过滤),无where开头 + * @param tousseTypes 物品类型,多个以逗号分隔 + * @param disposableGoodsType 一次性物品类型 + * @param sterilingMethods 灭菌程序 + * @param tousseGroupIds 器械包分组 + * @param tousseItemTableAlias 申请项表的别名(防止多个表是同名字段时语句报错) + * @param invoicePlanTableAlias 申请单表的别名,如果不存在此参数则忽略 + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + protected String buildWaitSendInvoicePlanSqlConditionOnlyTousseItem( + String tousseTypes,String disposableGoodsType, + String sterilingMethods, String tousseGroupIds, + String tousseItemTableAlias , String invoicePlanTableAlias, + String invoiceOrigin , String tousseDeliverOccasion){ + //表的字段的前缀 + String tableColumnAliasPre = (StringUtils.isNotBlank(tousseItemTableAlias)) ? tousseItemTableAlias + "." : ""; + //根据物品类型、一次性物品类型、灭菌程序、器械包分组过滤。参数:tousseType、disposableGoodsType、sterilingMethods、tousseGroupIds + String tousseItemCondition = tableColumnAliasPre +"isInvoice = '"+ Constants.STR_YES +"' and ("+ tableColumnAliasPre +"isTerminated is null or "+ tableColumnAliasPre +"isTerminated <> 1)"; + //剩余应发货数量大于0(即待发货数量(可能是申请数量、回收数量、清点数量等)减已发货数量) + //应发货数量 + String shouldSendAmountCaseSql = + CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, + invoiceOrigin, tousseDeliverOccasion); + tousseItemCondition += String.format(" and (%s - %s) > 0", shouldSendAmountCaseSql,tableColumnAliasPre + "sendOutAmount"); + //增加待发货物品的过滤条件1:开平市中心医院KPSZXYY-13 回收申请单、通用申请单需要打印后才产生发货计划 + boolean hideUnprintedTousseItems = CssdUtils.getSystemSetConfigByNameBool("hideUnprintedTousseItems"); + List hideUnprintedTousseItemTousseTypeList = null; + if(hideUnprintedTousseItems){ + hideUnprintedTousseItemTousseTypeList = new ArrayList(); + hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); + hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); + hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); + } + + //一次性物品类型转换成集合 + List disposableGoodsTypeList = null; + if (StringUtils.isNotBlank(disposableGoodsType)) { + disposableGoodsTypeList = Arrays.asList(disposableGoodsType.split(",")); + } + + //器械包分组转换成集合 + List tousseGroupIdList = null; + if (StringUtils.isNotBlank(tousseGroupIds)) { + tousseGroupIdList = Arrays.asList(tousseGroupIds.split(",")); + } + + //灭菌程序转换成集合 + List sterilingMethodList = null; + if (StringUtils.isNotBlank(sterilingMethods)) { + sterilingMethodList = Arrays.asList(sterilingMethods.split(",")); + } + + if (StringUtils.isNotBlank(tousseTypes)) { + if(TousseItem.DIPOSABLE_YES.equals(tousseTypes)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"diposable='%s' and "+ tableColumnAliasPre +"tousseType = '%s'", + tousseItemCondition , TousseItem.DIPOSABLE_YES , TousseItem.TYPE_DIPOSABLE_GOODS); + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ + tousseItemCondition = String.format("%s and %s", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + } + }else if(TousseItem.DIPOSABLE_NO.equals(tousseTypes)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"diposable='%s'", + tousseItemCondition , TousseItem.DIPOSABLE_NO); + if(hideUnprintedTousseItems){ + tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, + SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); + } + //如果器械包分组与灭菌程序都不为空时 + if(CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s ) and " + + tableColumnAliasPre + + "tousseDefinitionId in(select id from %s " + + "where ancestorID in(select id from %s where %s )) ", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + TousseDefinition.class.getSimpleName(),TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else{ + if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) ", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName() , + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); + } + } + }else{ + Set tousseTypeSet = buildTousseTypeSet(tousseTypes); + if(CollectionUtils.isNotEmpty(tousseTypeSet)){ + tousseItemCondition = String.format("%s and %s",tousseItemCondition,SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", tousseTypeSet)); + //1.检查是否同时包含一次性物品与非一次性物品 + if(tousseTypeSet.contains(TousseItem.TYPE_DIPOSABLE_GOODS)){ + if(tousseTypeSet.size() > 1){ + //1.同时包含一次性物品与非一次性物品 + if(hideUnprintedTousseItems){ + tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, + SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); + } + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + || CollectionUtils.isNotEmpty(tousseGroupIdList) + || CollectionUtils.isNotEmpty(sterilingMethodList)){ + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " + + tableColumnAliasPre + + "tousseDefinitionId in (elect id from %s where ancestorID in (select id from %s where %s )) " + + " or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + TousseDefinition.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName() , + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " + + tableColumnAliasPre + + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) " + + " or "+ tableColumnAliasPre +"disposableGoodsId is not null)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + TousseDefinition.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ + tousseItemCondition = String.format("%s and (%s or "+ tableColumnAliasPre +"tousseDefinitionId is not null)", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in(select id from %s where ancestorID in (select id from %s where %s)) or "+ tableColumnAliasPre +"disposableGoodsId is not null)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or "+ tableColumnAliasPre +"disposableGoodsId is not null)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); + } + } + }else{ + //2.只包含一次性物品 + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ + tousseItemCondition = String.format("%s and %s", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + } + } + }else{ + //3.只包含非一次性物品 + if(hideUnprintedTousseItems){ + tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, + SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); + } + if(CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " + + tableColumnAliasPre + + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) ", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName() , + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else{ + if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in(select id from %s where ancestorID in (select id from %s where %s))", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); + } + } + } + } + } + }else{ + if(hideUnprintedTousseItems){ + tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, + SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); + } + //disposableGoodsType、sterilingMethods、tousseGroupIds三个选项参数只要有一个不为空时 + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + || CollectionUtils.isNotEmpty(tousseGroupIdList) + || CollectionUtils.isNotEmpty(sterilingMethodList)){ + if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s ) and " + + tableColumnAliasPre + + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) " + + " or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName() , + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(tousseGroupIdList) + && CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " + + tableColumnAliasPre + + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) ", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ + tousseItemCondition = String.format("%s and %s", tousseItemCondition , + SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); + }else if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in ( select id from %s where ancestorID in (select id from %s where %s))", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); + }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ + tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", + tousseItemCondition , TousseDefinition.class.getSimpleName() , + SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); + } + } + } + return tousseItemCondition; + } + + /** + * 发货计划:外来器械申请单的待发货物品查询 + * @param invoicePlanId + * @param orgUnitCoding + * @param applyDate + * @param tousseType + * @param disposableGoodsType + * @param sterilingMethods + * @param tousseGroupIds + * @param appFormType + * @return + */ + protected Collection getWaitDeliverGoodsForForeignTousse(String queryTousseItemSql) { + logger.debug("getWaitDeliverGoodsForForeignTousse queryTousseItemSql:"+queryTousseItemSql); + List> list = jdbcTemplate.queryForList(queryTousseItemSql); + Collection result = null; + if(CollectionUtils.isNotEmpty(list)){ + result = new ArrayList(); + Map tousseNameToVoMap = new HashMap(); + Date out_beginTime = new Date(); + Date out_endTime = new Date(); + supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); + for (Map map : list) { + String tousseName = (String)map.get("tousseName"); + ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName); + //判断该vo对象是否已经存在于map中,如果不存在则将vo添加至集合中。防止集中存在重复的vo + boolean voExistsInMap = false; + //外来器械 + if (vo == null) { + vo = new ApplicationGoodsVo(); + tousseNameToVoMap.put(tousseName, vo); + }else{ + voExistsInMap = true; + } + String tousseType = (String)map.get("tousseType"); + vo.setName(tousseName); + vo.setShowTousseName(tousseName); + vo.setGoodsType(tousseType); + String departCoding = (String)map.get("departCoding"); + vo.setDepartCoding(departCoding); + //待发货数量 + Number amount = (Number)map.get("amount"); + if(amount != null){ + vo.setCount(vo.getCount() + amount.intValue()); + vo.setApplicationAmount(vo.getApplicationAmount() + amount.intValue()); + } + vo.setDiposable((String)map.get("diposable")); + //加急级别 + Number grade = (Number)map.get("grade"); + if(grade != null){ + vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); + } + + //加急数量 + Number urgentAmount = (Number)map.get("urgentAmount"); + if(urgentAmount != null){ + vo.setUrgentAmount(vo.getUrgentAmount() + urgentAmount.intValue()); + } + //申请单id + Number invoicePlanIdNumber = (Number)map.get("invoicePlanId"); + if(invoicePlanIdNumber != null){ + vo.addInvoicePlanID(invoicePlanIdNumber.longValue()); + //申请项id + Number tousseItemIdNumber = (Number)map.get("tousseItemId"); + if(tousseItemIdNumber != null){ + vo.addTousseItemId(invoicePlanIdNumber.longValue(), + tousseItemIdNumber.longValue()); + } + } + //申请时间 + Date applicationTime = (Date)map.get("applicationTime"); + if(applicationTime != null){ + vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( + out_beginTime)); + } + vo.setInvoicePlanType(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); + if(!voExistsInMap){ + result.add(vo); + } + } + } + return result; + } + + /** + * 发货计划:需要返回申请单id的待发货物品查询(外来器械申请单除外,不包含在内) + * @param queryTousseItemSql 查询语句 + * @return + */ + protected Collection getWaitDeliverGoodsForNeedReturnInvoicePlanId(String queryTousseItemSql) { + logger.debug("getWaitDeliverGoodsForNeedReturnInvoicePlanId queryTousseItemSql:"+queryTousseItemSql); + List> list = jdbcTemplate.queryForList(queryTousseItemSql); + Collection result = null; + if(CollectionUtils.isNotEmpty(list)){ + Map tousseNameToVoMap = new HashMap(); + Date out_beginTime = new Date(); + Date out_endTime = new Date(); + supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); + for (Map map : list) { + String tousseName = (String)map.get("tousseName"); + ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName); + if (vo == null) { + vo = new ApplicationGoodsVo(); + tousseNameToVoMap.put(tousseName, vo); + } + String tousseType = (String)map.get("tousseType"); + vo.setName(tousseName); + vo.setShowTousseName(tousseName); + vo.setGoodsType(tousseType); + String departCoding = (String)map.get("departCoding"); + vo.setDepartCoding(departCoding); + //待发货数量 + Number amount = (Number)map.get("amount"); + if(amount != null){ + vo.setCount(vo.getCount() + amount.intValue()); + vo.setApplicationAmount(vo.getApplicationAmount() + amount.intValue()); + } + vo.setDiposable((String)map.get("diposable")); + //加急级别 + Number grade = (Number)map.get("grade"); + if(grade != null){ + vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); + } + //加急数量 + Number urgentAmount = (Number)map.get("urgentAmount"); + if(urgentAmount != null){ + vo.setUrgentAmount(vo.getUrgentAmount() + urgentAmount.intValue()); + } + //申请单id + Number invoicePlanIdNumber = (Number)map.get("invoicePlanId"); + if(invoicePlanIdNumber != null){ + vo.addInvoicePlanID(invoicePlanIdNumber.longValue()); + } + //申请时间 + Date applicationTime = (Date)map.get("applicationTime"); + if(applicationTime != null){ + vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( + out_beginTime)); + } + vo.setInvoicePlanType((String)map.get("invoicePlanType")); + } + result = tousseNameToVoMap.values(); + } + return result; + } + + /** + * 发货计划:通用物品类型的待发货物品查询(器械包、敷料包、一次性物品) + * @param queryTousseItemSql 查询语句 + * @return + */ + protected Collection getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods(String queryTousseItemSql) { + logger.debug("getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods queryTousseItemSql:"+queryTousseItemSql); + List> list = jdbcTemplate.queryForList(queryTousseItemSql); + Collection result = null; + if(CollectionUtils.isNotEmpty(list)){ + result = new ArrayList(); + Date out_beginTime = new Date(); + Date out_endTime = new Date(); + supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); + for (Map map : list) { + ApplicationGoodsVo vo = new ApplicationGoodsVo(); + Object disposableGoodsId = map.get("disposableGoodsId"); + if(disposableGoodsId != null){ + vo.setDisposableGoodsId(((Number)disposableGoodsId).longValue()); + } + String showName = (String)map.get("tousseName"); + String tousseType = (String)map.get("tousseType"); + vo.setName(showName); + vo.setShowTousseName(showName); + vo.setGoodsType(tousseType); + vo.setDiposable((String)map.get("diposable")); + String departCoding = (String)map.get("departCoding"); + vo.setDepartCoding(departCoding); + //待发货数量 + vo.setCount(((Number)map.get("amount")).intValue()); + vo.setApplicationAmount(vo.getCount()); + //加急级别 + Number grade = (Number)map.get("grade"); + if(grade != null){ + vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); + } + //加急数量 + if(map.get("urgentAmount") != null){ + vo.setUrgentAmount(((Number)map.get("urgentAmount")).intValue()); + } + //申请时间 + Date applicationTime = (Date)map.get("applicationTime"); + if(applicationTime != null){ + vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( + out_beginTime)); + } + //整箱申请数量 + vo.setFullCaseApplicationAmount((Integer)map.get("fullCaseApplicationAmount")); + result.add(vo); + } + } + return result; + } + + /** + * 发货计划:消毒物品的待发货物品查询(需返回材料md5及数量) + * @param queryTousseItemSql 查询语句 + * @return + */ + protected Collection getWaitDeliverGoodsForDisinfectGoods(String queryTousseItemSql) { + logger.debug("getWaitDeliverGoodsForDisinfectGoods queryTousseItemSql:"+queryTousseItemSql); + List> list = jdbcTemplate.queryForList(queryTousseItemSql); + Collection result = null; + if(CollectionUtils.isNotEmpty(list)){ + Date out_beginTime = new Date(); + Date out_endTime = new Date(); + supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); + Map tousseNameToVoMap = new HashMap(); + for (Map map : list) { + String tousseName = (String)map.get("tousseName"); + String departCoding = (String)map.get("departCoding"); + departCoding = departCoding == null ? "" : departCoding; + ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName + departCoding); + if (vo == null) { + vo = new ApplicationGoodsVo(); + tousseNameToVoMap.put(tousseName + departCoding, vo); + } + String tousseType = (String)map.get("tousseType"); + vo.setName(tousseName); + vo.setShowTousseName(tousseName); + vo.setGoodsType(tousseType); + vo.setDiposable((String)map.get("diposable")); + vo.setDepartCoding(departCoding); + //待发货数量 + vo.setCount(MathTools.add(vo.getCount(), (Number)map.get("amount")).intValue()); + //加急级别 + Number grade = (Number)map.get("grade"); + if(grade != null){ + vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); + } + //加急数量 + vo.setUrgentAmount(MathTools.add(vo.getUrgentAmount(), (Number)map.get("urgentAmount")).intValue()); + //申请时间 + Date applicationTime = (Date)map.get("applicationTime"); + if(applicationTime != null){ + vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( + out_beginTime)); + } + + Number tdId = (Number)map.get("tdId"); + TousseDefinition tousseDefinition = tousseDefinitionManager.get(tdId.longValue()); + + //消毒物品-非整包申请的消毒物品,显示材料数量,并且将材料明细设置到tousseVO里面 + TousseItemVoForApplicationGoodsVo tousseItemVo = new TousseItemVoForApplicationGoodsVo(); + tousseItemVo.setCount(vo.getCount()); + // 非整包申请的消毒物品,显示材料数量,并且将材料明细设置到tousseVO里面 + if(!tousseDefinition.applyEntireTousse()){ + int materialTotalAmount = vo.getMaterialAmount(); + int materiallAmount = CssdUtils.getMaterialTotalAmount(tousseDefinition,false); + materialTotalAmount += materiallAmount; + vo.setMaterialAmount(materialTotalAmount); + vo.setIsCleanedEntirely(tousseDefinition.getIsApplyEntireTousse()); + // 将材料明细设置到tousseVO里面 + List materialInstances = tousseDefinition.getMaterialInstances(); + if(materialInstances != null){ + for (MaterialInstance materialInstance : materialInstances) { + String materialName = materialInstance.getMaterialName(); + int materialAmount = materialInstance.getCount(); + MaterialVO materialVO = vo.findMaterialVOByName(materialName); + if(materialVO == null){ + materialVO = new MaterialVO(); + materialVO.setName(materialName); + vo.getMaterials().add(materialVO); + } + materialVO.setAmount(materialVO.getAmount() + materialAmount); + } + } + + tousseItemVo.setMaterialAmount(materiallAmount); + } + + tousseItemVo.setName(vo.getName()); + tousseItemVo.setTousseDefinitionId(tousseDefinition.getId()); + tousseItemVo.setMaterialsMD5(tousseDefinition.getMaterialsMD5()); + vo.getTousseItems().add(tousseItemVo); + } + result = tousseNameToVoMap.values(); + } + return result; + } + + protected void addApplicationGoodsVoStatus( + Collection list, String departCoding) { + if(CollectionUtils.isNotEmpty(list)){ + List tousseNameList = list.stream().filter(vo -> { + return !StringUtils.equals(DisposableGoods.TYPE_NAME, vo.getGoodsType()); + }).map(ApplicationGoodsVo::getName).collect(Collectors.toList()); + //包名称对应已灭菌库存数量map + Map tousseNameToSteriledAmountMap = new HashMap(); + if(CollectionUtils.isNotEmpty(tousseNameList)){ + ResultSet rs = null; + String querySql = String.format("select ti.tousseName,count(0) cnt from %s ti " + + "join %s td on td.id = ti.tousseDefinition_id " + + "where ti.orgUnitCoding='%s' and %s " + + "and ti.status in ('%s','%s') " + + "and ( td.limitInvoiceDepart is null or td.limitInvoiceDepart <> '%s' " + + "or (td.limitInvoiceDepart = '%s' and (ti.departCoding is null or ti.departCoding = '' or ti.departCoding = '%s'))) " + + "group by ti.tousseName having count(0) > 0", + TousseInstance.class.getSimpleName(),TousseDefinition.class.getSimpleName(),AcegiHelper.getCurrentOrgUnitCode(), + SqlUtils.getStringFieldInLargeCollectionsPredicate("ti.tousseName", tousseNameList), + TousseInstance.STATUS_STERILED,TousseInstance.STATUS_DISINFECTED, + Constants.STR_YES, Constants.STR_YES, + departCoding == null ? "" : departCoding + ); + try { + rs = objectDao.executeSql(querySql); + while(rs.next()){ + tousseNameToSteriledAmountMap.put(rs.getString("tousseName"), + ((Number)rs.getInt("cnt")).intValue()); + } + } catch (Exception e) { + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + } + for (ApplicationGoodsVo vo : list) { + if(StringUtils.equals(vo.getGoodsType(), DisposableGoods.TYPE_NAME)){ + vo.setStatus(ApplicationGoodsVo.STATUS_STERILED); + }else{ + if(tousseNameToSteriledAmountMap.containsKey(vo.getName())){ + vo.setStatus(ApplicationGoodsVo.STATUS_STERILED); + }else{ + vo.setStatus(ApplicationGoodsVo.STATUS_UNSTERILED); + } + } + } + } + } + @Override public Collection getExpensiveGoodsInvoicePlanVOs( Collection departCodes, String applyDate) { @@ -1145,7 +2631,6 @@ } return expressInvoiceInvoicePlanVoList; - } @Override public Collection getExpressInvoiceInvoiePlans(Collection departCodes, String applyDate, String tousseTypeArg){ @@ -1594,7 +3079,9 @@ invoicePlanTemp.put("id",""); invoicePlanTemp.put("typeAndserialNumber","全部"); invoicePlanArray.add(invoicePlanTemp); - filterInvoicePlan(invoicePlans,tousseGroupIds, disposableGoodsType, applyDate, sterilingMethods); + if(InvoiceUtils.willFilterInvoicePlanByRecyclingTime(applyDate)){ + filterInvoicePlan(invoicePlans,tousseGroupIds, disposableGoodsType, applyDate, sterilingMethods); + } if(CollectionUtils.isNotEmpty(invoicePlans)){ for(InvoicePlan invoicePlan : invoicePlans){ invoicePlanTemp = new JSONObject(); @@ -2636,6 +4123,45 @@ throw new RuntimeException(e); } } + + /** + * 设置时间的条件 + * @param applyDate 要设定的时间 + * @param tableColumnAliasPre 字段的表别名前缀,包含. + * @return + */ + protected String setTimeCondition(String applyDate,String tableColumnAliasPre){ + SimpleDateFormat sdf = new SimpleDateFormat(DateTools.COMMON_DATE_HMS); + try { + tableColumnAliasPre = StringUtils.isEmpty(tableColumnAliasPre) ? "" : tableColumnAliasPre; + String[] applyDateArray = StringUtils.split(applyDate, Constants.IDS_SEPARATOR); + //如果convertTime方法转换出错,尝试重新再转换(花都区人民医院要求:发货时间精确到上午和下午的时分,而之前默认的方法是精确到时分秒,所以要尝试再次转换) + //Date out_beginTime = DateTools.convertTime(applyDateArray[0] + " 00:00:00", sdf, DateTools.COMMON_DATE_HM); + Date out_beginTime = ForgonDateUtils.safelyParseDate(applyDateArray[0]); + String timeSearchFmt = CssdUtils.getSystemSetConfigByName("timeSearchFmt"); + DateStrategyContext dateStrategyContext = new DateStrategyContext(); + dateStrategyContext.setDateState(timeSearchFmt); + Date out_endTime = dateStrategyContext.handleTodayEndOfTime(applyDateArray[1], sdf, DateTools.COMMON_DATE_HM); + String where7 = String.format("("+ tableColumnAliasPre +"applicationTime between %s and %s or "+ tableColumnAliasPre +"id in (select recyclingApplication_id from %s where recyclingTime between %s and %s))", + dateQueryAdapter.dateAdapter(out_beginTime), + dateQueryAdapter.dateAdapter(out_endTime), + RecyclingRecord.class.getSimpleName(), + dateQueryAdapter.dateAdapter(out_beginTime), + dateQueryAdapter.dateAdapter(out_endTime)); + //如果配置按申请时间过滤,且有传时间范围参数时,则只按申请时间过滤(NFYY-59) + if(InvoiceUtils.willFilterInvoicePlanByApplicationTime(applyDate)){ + where7 = String.format("("+ tableColumnAliasPre +"applicationTime between %s and %s)", + dateQueryAdapter.dateAdapter(out_beginTime), + dateQueryAdapter.dateAdapter(out_endTime)); + } + logger.info("where7:" + where7); + return where7; + } + catch (Exception e) { + logger.error(e); + throw new RuntimeException(e); + } + } /** Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java =================================================================== diff -u -r33905 -r33921 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33905) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33921) @@ -102,6 +102,9 @@ getInvoicePlans_NEW(departCodes, applyDate, tousseTypes, disposableGoodsType, sterilingMethods,tousseGroupIds , appFormType, enableUrgentFunction, invoiceOrigin , tousseDeliverOccasion); + + + //优化后可能会用不上暂时先注释掉 /*Collection resultCol = new ArrayList(); String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); @@ -230,24 +233,7 @@ orgUnitMap.put(orgUnit.getOrgUnitCoding(), orgUnit); } } - Map gradeToUrgentLevelMap = null; - if(departCodingGradeMap != null && MapUtils.isNotEmpty(departCodingGradeMap)){ - Collection gradeList = departCodingGradeMap.values(); - if(CollectionUtils.isNotEmpty(gradeList)){ - List urgentLevelList = - objectDao.findBySql(UrgentLevel.class.getSimpleName(), - String.format("where %s" , - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("grade", gradeList))); - if(CollectionUtils.isNotEmpty(urgentLevelList)){ - for (UrgentLevel urgentLevel : urgentLevelList) { - if(gradeToUrgentLevelMap == null){ - gradeToUrgentLevelMap = new HashMap(); - } - gradeToUrgentLevelMap.put(urgentLevel.getGrade(), urgentLevel); - } - } - } - } + Map gradeToUrgentLevelMap = getGradeToUrgentLevelMapByDepartCodingGradeMap(departCodingGradeMap); // colorChangeRuleOfInvoicPlanToSendGoodsList值为"2"时,启用已灭菌(含已消毒)物品变色功能(SZSDSRMYY-51) // 在发货计划模块的待发货科室列表,如果某科室存在状态为已灭菌或者已消毒的待发货物品时,将该科室所在行的科室列单元格的背景颜色改为和物品已灭菌/已消毒背景色一致 @@ -297,582 +283,6 @@ } /** - * 判断科室的申请单是否包含已灭菌/已消毒的物品(SZSDSRMYY-51) - * @param orgUnitCodingList - * @param applyDate - * @param tousseTypes - * @param disposableGoodsType - * @param sterilingMethods - * @param tousseGroupIds - * @param appFormType - * @return - */ - private Map getDepartInvoicePlanStatus(List orgUnitCodingList, String applyDate, String tousseTypes, - String disposableGoodsType, String sterilingMethods, String tousseGroupIds, String appFormType) { - - Map result = new HashMap(); - Collection list = new ArrayList(); - SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); - //发货数量依据:申请单或回收单 - String invoiceOrigin = config.getInvoiceOrigin(); - //器械包发货时间 - String tousseDeliverOccasion = config.getTousseDeliverOccasion(); - - //申请单的过滤条件 - //申请单表的别名 - String invoicePlanTableAlias = "po"; - //申请单过滤公共条件(按申请单id,申请科室等),用于所有类型场景的申请单过滤条件 - String invoicePlanCommonCondition = null; - //外来器械包申请单过滤条件(未装配的查申请项、装配过的查包实例)、还需要查出相关的申请单id - String invoicePlanForeignTousseCondition = null; - //需要绑定申请单的各种物品场景的过滤条件(用于外部代理灭菌包、自定义器械包)、还需要查出相关的申请单id - String invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = null; - //需要绑定申请单的各种物品场景的过滤条件(用于代理灭菌的包等)、还需要查出相关的申请单id - String invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = null; - //公共类型的申请单的过滤条件(一次性物品、器械包、敷料包、消毒物品等)、只统计物品不查申请单. - String invoicePlanCommonGoodsCondition = null; - - String orgUnitCoding = ""; - if(CollectionUtils.isNotEmpty(orgUnitCodingList)){ - invoicePlanCommonCondition = String.format(invoicePlanTableAlias +".%s", - InvoiceUtils.getInvoiceGroupByConfig()); - invoicePlanCommonCondition = SqlUtils.getStringFieldInLargeCollectionsPredicate(invoicePlanCommonCondition, orgUnitCodingList); - }else{ - return result; - } - - /* - * 1.如果appFormType为null,则分开查询外来器械包申请单、需要绑定申请单的各种物品、公共类型的申请单的过滤条件(一次性物品、器械包、敷料包等)、消毒物品的过滤查询等分开查询 - * 2.如果appFormType为外来器械包申请单 - * 3.如果appFormType为代理灭菌单、外部代理灭菌单、自定义器械包申请单 - * 4.如果appFormType为以上申请单外的申请单 - * 4.1器械包、敷料包、一次性物品 - * 4.2消毒物品 - */ - //要排除的申请单类型集合 - List excludeInvoicePlanTypeList = - Arrays.asList(new String[]{ - InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION, - InvoicePlan.TYPE_PROXYDISINFECTION, - InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION, - InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM - }); - if(StringUtils.isNotBlank(appFormType)){ - if(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION.equals(appFormType)){ - invoicePlanForeignTousseCondition = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication(null, - applyDate, invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - }else if(InvoicePlan.TYPE_PROXYDISINFECTION.equals(appFormType) - || InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION.equals(appFormType) - || InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM.equals(appFormType)){ - invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction(null, applyDate, - invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionForProxyDisinfection(null, applyDate, - invoicePlanTableAlias, invoiceOrigin, tousseDeliverOccasion)); - }else{ - invoicePlanCommonGoodsCondition = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(orgUnitCoding, applyDate, - appFormType , excludeInvoicePlanTypeList , invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - } - }else{ - invoicePlanForeignTousseCondition = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication(null, - applyDate, invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction(null, applyDate, - invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionForProxyDisinfection(null, applyDate, - invoicePlanTableAlias, invoiceOrigin, tousseDeliverOccasion)); - invoicePlanCommonGoodsCondition = String.format("%s and %s", - invoicePlanCommonCondition, - buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(orgUnitCoding, applyDate, - appFormType , excludeInvoicePlanTypeList , invoicePlanTableAlias , invoiceOrigin , tousseDeliverOccasion)); - } - - List tousseTypeList = null; - if(StringUtils.isNotBlank(tousseTypes)){ - tousseTypeList = Arrays.asList(tousseTypes.split(",")); - } - boolean includeForeignTousseType = false; - if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_FOREIGN)){ - includeForeignTousseType = true; - } - //1.如果存在外来器械单的查询条件时 - if(StringUtils.isNotBlank(invoicePlanForeignTousseCondition) && includeForeignTousseType){ - //申请项的过滤条件 - //申请项表的别名 - String tousseItemTableAlias = "ti"; - String tousseItemCondition = - buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(TousseDefinition.PACKAGE_TYPE_FOREIGN, null, - sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, - invoiceOrigin,tousseDeliverOccasion); - - //包实例表的别名 - String tousseInstanceTableAlias = "tis"; - //因为后面括号里这个问题要求把包实例的状态列进条件里,所以不再使用此条件,改为下面一行的1=1(SZSDSRMYY-46 添加外来器械申请单后,要根据科室供应室设置里的器械包发货时间来决定该发货计划的显示) - String tousseInstanceCondition = String.format("%s", - SqlUtils.getStringFieldInLargeCollectionsPredicate(tousseInstanceTableAlias + ".status", - Arrays.asList(new String[]{ - TousseInstance.STATUS_PACKED, - TousseInstance.STATUS_REVIEWED, - TousseInstance.STATUS_STERILING, - TousseInstance.STATUS_DELAY_CONFIRM, - TousseInstance.STATUS_STERILED - }))); - - //数量合计语句(外来器械包) - String tousseItemWaitSendAmountSumSql = "(recyclingAmount - sendOutAmount)"; - if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_BEFORERECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(amount - sendOutAmount)"; - }else if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERPRERECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(amount - sendOutAmount)"; - }if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERRECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(recyclingAmount - sendOutAmount)"; - } - - //先查未装配生成包实例的申请单 - String queryTousseItemSql = String.format( - "select "+ invoicePlanTableAlias +".id invoicePlanId," - + invoicePlanTableAlias +".departCoding," - + tousseItemTableAlias +".id tousseItemId," - + tousseItemTableAlias +".tousseName," - + tousseItemTableAlias +".tousseType," - + tousseItemTableAlias +".diposable," - + invoicePlanTableAlias +".applicationTime," - + tousseItemWaitSendAmountSumSql +" amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 ", - TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - tousseItemCondition,String.format("%s and %s", invoicePlanForeignTousseCondition, - String.format(invoicePlanTableAlias +".id not in (select foreignTousseApp_id from %s where foreignTousseApp_id is not null)",TousseInstance.class.getSimpleName()))); - - //再查已经装配生成包实例的申请单。由于后面括号里这个问题要求不再把包实例的状态列进条件里,所以不再使用此条件(SZSDSRMYY-46 添加外来器械申请单后,要根据科室供应室设置里的器械包发货时间来决定该发货计划的显示) - queryTousseItemSql += String.format(" union all " - + "select "+ invoicePlanTableAlias +".id invoicePlanId," - + invoicePlanTableAlias +".departCoding," - + "null tousseItemId," - + tousseInstanceTableAlias +".tousseName," - + "td.tousseType,'%s' diposable," - + invoicePlanTableAlias +".applicationTime," - + "1 amount " - + "from %s "+ tousseInstanceTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseInstanceTableAlias +".foreignTousseApp_id="+ invoicePlanTableAlias +".id " - + "left join %s td on "+ tousseInstanceTableAlias +".tousseDefinition_id=td.id " - + "where %s and %s order by applicationTime", Constants.STR_NO, - TousseInstance.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - TousseDefinition.class.getSimpleName() ,invoicePlanForeignTousseCondition,tousseInstanceCondition); - - Collection list1 = getWaitDeliverGoodsForForeignTousse(queryTousseItemSql); - if(CollectionUtils.isNotEmpty(list1)){ - list.addAll(list1); - } - } - - //如果存在需返回申请单id的查询条件时(用于外部代理灭菌单、自定义器械包申请单) - if(StringUtils.isNotBlank(invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction)){ - //申请项的过滤条件 - //申请项表的别名 - String tousseItemTableAlias = "ti"; - String tousseItemCondition = - buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(tousseTypes, null, - sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, - invoiceOrigin,tousseDeliverOccasion); - - //应发货数量 - String shouldSendAmountCaseSql = - CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, - invoiceOrigin, tousseDeliverOccasion); - - //查询待发货申请单的申请项 - String queryTousseItemSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanId," - + invoicePlanTableAlias +".departCoding," - + invoicePlanTableAlias +".type invoicePlanType," - + tousseItemTableAlias +".tousseName," - + tousseItemTableAlias +".tousseType," - + tousseItemTableAlias +".diposable," - + invoicePlanTableAlias +".applicationTime," - + "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - + "where %s and %s and " + shouldSendAmountCaseSql +" > 0 " - + "order by "+ invoicePlanTableAlias +".applicationTime", - TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - invoicePlanNeedReturnApplicationIdConditionForForeignProxyAndCustomeTousseAppliaction,tousseItemCondition); - - Collection list1 = getWaitDeliverGoodsForNeedReturnInvoicePlanId(queryTousseItemSql); - if(CollectionUtils.isNotEmpty(list1)){ - list.addAll(list1); - } - } - - //代理灭菌单的待发货物品集合 - Collection proxyDisinfectionApplicationGoodsVoList = null; - //如果存在需返回申请单id的查询条件时(用于代理灭菌单) - if(StringUtils.isNotBlank(invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection)){ - //申请项的过滤条件 - //申请项表的别名 - String tousseItemTableAlias = "ti"; - String tousseItemCondition = - buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(tousseTypes, null, - sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias, - invoiceOrigin,tousseDeliverOccasion); - - //应发货数量 - String shouldSendAmountCaseSql = - CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, - invoiceOrigin, tousseDeliverOccasion); - - //查询待发货申请单的申请项 - String queryTousseItemSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanId," - + invoicePlanTableAlias +".departCoding," - + invoicePlanTableAlias +".type invoicePlanType," - + tousseItemTableAlias +".tousseName," - + tousseItemTableAlias +".tousseType," - + tousseItemTableAlias +".diposable," - + invoicePlanTableAlias +".applicationTime," - + "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - + "where %s and %s and " + shouldSendAmountCaseSql +" > 0 " - + "order by "+ invoicePlanTableAlias +".applicationTime", - TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - invoicePlanNeedReturnApplicationIdConditionForProxyDisinfection,tousseItemCondition); - - proxyDisinfectionApplicationGoodsVoList = getWaitDeliverGoodsForNeedReturnInvoicePlanId(queryTousseItemSql); - } - - //如果存在公共物品类型的查询条件时(分开成消毒物品与(器械包、一次性物品、敷料包)) - if(StringUtils.isNotBlank(invoicePlanCommonGoodsCondition)){ - //器械包、敷料包、一次性物品的待发货物品查询(仅查询通用申请单、器械包申请单、回收申请单、一次性物品申请单里的器械包、敷料包、一次性物品,不需要返回申请单id) - Collection commonGoodsButNotDisinfectGoodsApplicationGoodsVoList = null; - //申请项的过滤条件 - //申请项表的别名 - String tousseItemTableAlias = "ti"; - //应发货数量 - String shouldSendAmountCaseSql = - CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, - invoiceOrigin, tousseDeliverOccasion); - - //数量合计语句 - String tousseItemWaitSendAmountSumSql = "((case " - + "when "+ tousseItemTableAlias +".tousseType='"+ DisposableGoods.TYPE_NAME +"' " - + "then case when ("+ tousseItemTableAlias +".transferScale is not null and "+ tousseItemTableAlias +".transferScale > 0) then "+ tousseItemTableAlias +".amount/"+ tousseItemTableAlias +".transferScale " - + "else "+ tousseItemTableAlias +".amount end " - + "else "+ shouldSendAmountCaseSql +" " - + "end) - (case when ("+ tousseItemTableAlias +".transferScale is not null and "+ tousseItemTableAlias +".transferScale > 0) then "+ tousseItemTableAlias +".sendOutAmount/"+ tousseItemTableAlias +".transferScale else "+ tousseItemTableAlias +".sendOutAmount end))"; - - //1.器械包、敷料包、一次性物品的待发货查询 - if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_INSIDE) - || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DRESSING) || tousseTypeList.contains(DisposableGoods.TYPE_NAME)){ - List queryTousseTypeList = new ArrayList(); - if(CollectionUtils.isEmpty(tousseTypeList)){ - queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); - queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); - queryTousseTypeList.add(DisposableGoods.TYPE_NAME); - }else{ - if(tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_INSIDE)){ - queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); - } - if(tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DRESSING)){ - queryTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); - } - if(tousseTypeList.contains(DisposableGoods.TYPE_NAME)){ - queryTousseTypeList.add(DisposableGoods.TYPE_NAME); - } - } - //通用物品类型,即器械包、敷料包、一次性物品(排除消毒物品) - String tousseItemCommonGoodsExcludeDisinfectGoodsCondition = - buildWaitSendInvoicePlanSqlConditionOnlyTousseItem( - StringUtils.join(queryTousseTypeList, ","), - disposableGoodsType, sterilingMethods, tousseGroupIds , - tousseItemTableAlias , invoicePlanTableAlias,invoiceOrigin, - tousseDeliverOccasion); - - String queryNotDisinfectTousseItemSql = String.format("select disposableGoodsId,tousseName,tousseType,diposable," - + invoicePlanTableAlias +".departCoding," - + "min("+ invoicePlanTableAlias +".applicationTime) applicationTime," - + "dg.ttsName ,sum"+ tousseItemWaitSendAmountSumSql +" amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - + "left join %s dg on dg.id="+ tousseItemTableAlias +".disposableGoodsId " - + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " - + "group by disposableGoodsId,tousseName,tousseType,diposable,dg.ttsName,po.departCoding " - + "order by " - + "(case when tousseType='%s' then 1 else 2 end)," - + "min("+ invoicePlanTableAlias +".applicationTime)", - TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - DisposableGoods.class.getSimpleName() ,invoicePlanCommonGoodsCondition , - tousseItemCommonGoodsExcludeDisinfectGoodsCondition , TousseItem.TYPE_DIPOSABLE_GOODS); - commonGoodsButNotDisinfectGoodsApplicationGoodsVoList = getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods(queryNotDisinfectTousseItemSql); - //1.常规物品不为空但代理灭菌单物品为空时 - if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isEmpty(proxyDisinfectionApplicationGoodsVoList)){ - //所有的器械包(敷料包)的名称的集合 - List tousseNameList = commonGoodsButNotDisinfectGoodsApplicationGoodsVoList.stream().filter(ti -> { - return StringUtils.equals(Constants.STR_NO, ti.getDiposable()); - }).map(ApplicationGoodsVo::getName).collect(Collectors.toList()); - if(CollectionUtils.isNotEmpty(tousseNameList)){ - List tdList = tousseDefinitionManager.getCollection(String.format(" forDisplay=1 and %s ", - SqlUtils.getStringFieldInLargeCollectionsPredicate("name", tousseNameList)), new HashMap<>()); - if(CollectionUtils.isNotEmpty(tdList)){ - Map tousseNameToTdMap = new HashMap<>(); - tdList.stream().forEach(td -> { - tousseNameToTdMap.put(td.getName(), td); - }); - //对于器械包、消毒物品、敷料包设置其是否追溯属性(根据对应的器械包祖先包定义) - for(ApplicationGoodsVo vo : commonGoodsButNotDisinfectGoodsApplicationGoodsVoList){ - if(StringUtils.equals(Constants.STR_NO, vo.getDiposable())){ - TousseDefinition td = tousseNameToTdMap.get(vo.getName()); - if(td != null){ - vo.setIsTraceable(td.getIsTraceable()); - }else{ - //抛出异常 - //throw new SystemException("未找到器械包名称为"+ vo.getName() +"的包定义,可能已被删除或改名,请重新刷新"); - vo.setIsTraceable(Constants.STR_YES); - } - } - } - } - } - list.addAll(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList); - }else if(CollectionUtils.isEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ - //2.常规物品为空但代理灭菌单物品不为空时 - list.addAll(proxyDisinfectionApplicationGoodsVoList); - }else if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ - //记录常规物品集合中不在代理灭菌物品集合里的物品集合 - Collection commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList = new ArrayList(); - //3.常规物品不为空但代理灭菌单物品不为空时,需要对相同名称物品进行数量合并 - for(ApplicationGoodsVo commonGoodsButNotDisinfectGoodsApplicationGoodsVo : commonGoodsButNotDisinfectGoodsApplicationGoodsVoList){ - boolean foundInProxyDisinfectionApplicationGoodsVoList = false; - for(ApplicationGoodsVo proxyDisinfectionApplicationGoodsVo : proxyDisinfectionApplicationGoodsVoList){ - if(StringUtils.equals(commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getName(), proxyDisinfectionApplicationGoodsVo.getName())){ - proxyDisinfectionApplicationGoodsVo.setCount(MathTools.add(proxyDisinfectionApplicationGoodsVo.getCount(), commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getCount()).intValue()); - proxyDisinfectionApplicationGoodsVo.setApplicationAmount(MathTools.add(proxyDisinfectionApplicationGoodsVo.getApplicationAmount(), commonGoodsButNotDisinfectGoodsApplicationGoodsVo.getApplicationAmount()).intValue()); - foundInProxyDisinfectionApplicationGoodsVoList = true; - break; - } - } - if(!foundInProxyDisinfectionApplicationGoodsVoList){ - commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList.add(commonGoodsButNotDisinfectGoodsApplicationGoodsVo); - } - } - if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ - list.addAll(proxyDisinfectionApplicationGoodsVoList); - } - if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList)){ - list.addAll(commonGoodsButNotDisinfectGoodsApplicationGoodsVoListNotInProxyDisinfectionApplicationGoodsVoList); - } - } - }else{ - if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ - list.addAll(proxyDisinfectionApplicationGoodsVoList); - } - } - - //2.消毒物品 - if(CollectionUtils.isEmpty(tousseTypeList) || tousseTypeList.contains(TousseDefinition.PACKAGE_TYPE_DISINFECTION)){ - - String tousseItemDisinfectGoodsCondition = - buildWaitSendInvoicePlanSqlConditionOnlyTousseItem(TousseDefinition.PACKAGE_TYPE_DISINFECTION, null, sterilingMethods, tousseGroupIds , tousseItemTableAlias , invoicePlanTableAlias,invoiceOrigin,tousseDeliverOccasion); - String queryDisinfectTousseItemSql = String.format("select "+ tousseItemTableAlias +".tousseName," - + tousseItemTableAlias +".tousseType,'%s' diposable," - + invoicePlanTableAlias +".departCoding," - + "td.id tdId,td.materialsMD5,td.materialAmount,td.isApplyEntireTousse," - + "min("+invoicePlanTableAlias +".applicationTime) applicationTime," - + "sum"+ tousseItemWaitSendAmountSumSql +" amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - + "left join %s td on td.id="+ tousseItemTableAlias +".tousseDefinitionId " - + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " - + "group by "+ tousseItemTableAlias +".tousseName,"+ tousseItemTableAlias +".tousseType, td.id ,td.materialsMD5,td.materialAmount,td.isApplyEntireTousse,po.departCoding " - + "order by min(" + invoicePlanTableAlias +".applicationTime)", Constants.STR_NO, - TousseItem.class.getSimpleName() , InvoicePlan.class.getSimpleName(), - TousseDefinition.class.getSimpleName() ,invoicePlanCommonGoodsCondition , - tousseItemDisinfectGoodsCondition); - Collection list2 = getWaitDeliverGoodsForDisinfectGoods(queryDisinfectTousseItemSql); - if(CollectionUtils.isNotEmpty(list2)){ - list.addAll(list2); - } - } - }else{ - if(CollectionUtils.isNotEmpty(proxyDisinfectionApplicationGoodsVoList)){ - list.addAll(proxyDisinfectionApplicationGoodsVoList); - } - } - - // 申请单id - Set invoicePlanIdSet = new HashSet(); - if(CollectionUtils.isNotEmpty(list)){ - for (ApplicationGoodsVo vo : list) { - if(StringUtils.equals(DisposableGoods.TYPE_NAME, vo.getGoodsType())){ - result.put(vo.getDepartCoding(), ApplicationGoodsVo.STATUS_STERILED); - continue; - } - List invoicePlanIdList = vo.getInvoicePlanIDList(); - if(CollectionUtils.isNotEmpty(invoicePlanIdList)){ - for (Long id : invoicePlanIdList) { - invoicePlanIdSet.add(id); - } - } - } - } - - // 根据申请单查器械包实例是否包含已灭菌/已消毒的物品 - Map resultMap1 = getDepartInvoicePlanTousseInstanceStatus(invoicePlanIdSet); - - // 科室对应的物品 - Map> departToGoodsMap = new HashMap>(); - if(CollectionUtils.isNotEmpty(list)){ - for (ApplicationGoodsVo vo : list) { - String departCoding = vo.getDepartCoding(); - if(resultMap1 != null && resultMap1.containsKey(departCoding)){ - continue; - } - if(result != null && result.containsKey(departCoding)){ - continue; - } - List voList = departToGoodsMap.get(departCoding); - if(CollectionUtils.isEmpty(voList)){ - voList = new ArrayList(); - } - voList.add(vo); - departToGoodsMap.put(departCoding, voList); - } - } - - if(!departToGoodsMap.isEmpty()){ - for (String departCode : departToGoodsMap.keySet()) { - List voList = departToGoodsMap.get(departCode); - if(CollectionUtils.isNotEmpty(voList)){ - addApplicationGoodsVoStatus(voList, departCode); - for (ApplicationGoodsVo applicationGoodsVo : voList) { - if(StringUtils.equals(applicationGoodsVo.getStatus(), ApplicationGoodsVo.STATUS_STERILED)){ - result.put(departCode, ApplicationGoodsVo.STATUS_STERILED); - break; - } - } - } - } - } - - if(resultMap1 != null && !resultMap1.isEmpty()){ - for (String departCode : resultMap1.keySet()) { - result.put(departCode, resultMap1.get(departCode)); - } - } - - return result; - } - - /** - * 根据申请单查询是否包含已灭菌/已消毒状态的器械包实例 - * @param orgUnitCodingList - * @param appFormType - * @param tousseGroupIds - * @param sterilingMethods - * @param disposableGoodsType - * @param tousseTypes - * @param applyDate - * @return - */ - private Map getDepartInvoicePlanTousseInstanceStatus(Collection invoicePlanIdList) { - //根据申请单id查出申请单对象(将代理灭菌单拆分出来,代理灭菌单查询语句与非代理灭菌单的查询语句不一致) - if(CollectionUtils.isNotEmpty(invoicePlanIdList)){ - List invoicePlanList = getCollection(invoicePlanIdList); - if(CollectionUtils.isNotEmpty(invoicePlanList)){ - List proxyDisinfectionIdList = new ArrayList(); - List notProxyDisinfectionIdList = new ArrayList(); - for(InvoicePlan invoicePlan : invoicePlanList){ - if(invoicePlan instanceof ProxyDisinfection){ - proxyDisinfectionIdList.add(invoicePlan.getId()); - }else{ - notProxyDisinfectionIdList.add(invoicePlan.getId()); - } - } - Map statusMap = new HashMap(); - if(CollectionUtils.isNotEmpty(proxyDisinfectionIdList)){ - Map statusMap1 = getDepartTousseInstanceStatusMap(invoicePlanIdList, true); - if(MapUtils.isNotEmpty(statusMap1)){ - statusMap.putAll(statusMap1); - } - } - if(CollectionUtils.isNotEmpty(notProxyDisinfectionIdList)){ - Map statusMap2 = getDepartTousseInstanceStatusMap(invoicePlanIdList, false); - if(MapUtils.isNotEmpty(statusMap2)){ - statusMap.putAll(statusMap2); - } - } - return statusMap; - }else{ - return getDepartTousseInstanceStatusMap(null, false); - } - }else{ - return getDepartTousseInstanceStatusMap(null, false); - } - } - - /** - * 根据申请单id集合及是否代理灭菌单查询其对应的包实例是否有已灭菌状态 - * @param invoicePlanIdList - * @param isProxyDisinfection - * @return - */ - private Map getDepartTousseInstanceStatusMap(Collection invoicePlanIdList,boolean isProxyDisinfection){ - Map statusMap = new HashMap(); - //非代理灭菌单类型的申请单 - String sql = String.format("select ti.departCoding, count(0) from %s ti " - + "join %s ip on ti.invoicePlanID = ip.id " - + "where (1=1) " - + "and ti.orgUnitCoding='%s' " - + "and %s " - + "and ti.status in ('%s','%s') " - + "group by ti.departCoding having count(0) > 0", - TousseInstance.class.getSimpleName(), - InvoicePlan.class.getSimpleName(), - AcegiHelper.getCurrentOrgUnitCode(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIdList), - TousseInstance.STATUS_STERILED, TousseInstance.STATUS_DISINFECTED); - //代理灭菌单类型的申请单 - if(isProxyDisinfection){ - sql = String.format("select ip.departCoding, count(0) from %s ti " - + "join %s ip on ti.proxyDisinfection_id = ip.id " - + "where (1=1) " - + "and ip.handleDepartCoding='%s' " - + "and %s " - + "and ti.status in ('%s','%s') " - + "group by ip.departCoding having count(0) > 0", - TousseInstance.class.getSimpleName(), - InvoicePlan.class.getSimpleName(), - AcegiHelper.getCurrentOrgUnitCode(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIdList), - TousseInstance.STATUS_STERILED, TousseInstance.STATUS_DISINFECTED); - } - ResultSet rs = null; - try { - rs = objectDao.executeSql(sql); - while(rs.next()){ - String departCoding = rs.getString("departCoding"); - statusMap.put(departCoding, ApplicationGoodsVo.STATUS_STERILED); - } - } catch (Exception e) { - e.printStackTrace(); - }finally{ - DatabaseUtil.closeResultSetAndStatement(rs); - } - return statusMap; - } - - /** * 构造发货计划过滤条件,包括按申请项及申请项,where开头 * @param departCodes 科室编码 * @param applyDate 申请日期 @@ -903,510 +313,7 @@ return condition; } - /** - * 构造发货计划单的过滤条件(仅申请单层面相关,不包含申请项相关的过滤),无where开头 - * @param departCodes 科室编码 - * @param applyDate 申请日期 - * @param appFormType 申请单类型 - * @param excludeInvoicePlanTypeList 要排除的申请单类型集合 - * @param alias 表的别名(防止多个表是同名字段时语句报错) - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanSqlConditionOnlyInvoicePlan(String departCodes, - String applyDate,String appFormType,List excludeInvoicePlanTypeList, - String alias,String invoiceOrigin , String tousseDeliverOccasion){ - //表2的字段的前缀 - String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; - List departCodeList = null; - if(StringUtils.isNotBlank(departCodes)){ - departCodeList = Arrays.asList(departCodes.split(";")); - } - // 默认是过滤申请科室,也可以配置为结算科室 - String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); - //条件1.根据科室分组的科室编码过滤,参数:departCodes - String where1 = "1=1"; - if(CollectionUtils.isNotEmpty(departCodeList)){ - where1 = SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre + groupBy, departCodeList); - } - - //条件2.根据申请日期过滤 如果申请时间范围不为空时,参数:applyDate - String where2 = "1=1"; - if (StringUtils.isNotBlank(applyDate)) { - try { - where2 = this.setTimeCondition(applyDate,tableColumnAliasPre); - } - catch (Exception e) { - logger.error(e, e); - throw new RuntimeException(e); - } - } - - //条件3.根据申请单类型过滤,参数:appFormType - String where3 = "1=1"; - if(StringUtils.isNotBlank(appFormType)){ - where3 = String.format(tableColumnAliasPre +"type='%s'", appFormType); - } - //条件3附加补充1.是否隐藏未打印的一次性物品申请单(如果为是,则未打印的一次性物品申请单在发货计划中不显示) - boolean hideUnprintedDisposableGoodsInvoicePlan = - CssdUtils.getSystemSetConfigByNameBool("hideUnprintedDisposableGoodsInvoicePlan"); - if(hideUnprintedDisposableGoodsInvoicePlan){ - if(StringUtils.isBlank(appFormType)){ - where3 = String.format("%s and ("+ tableColumnAliasPre +"type <> '%s' or ("+ tableColumnAliasPre +"type = '%s' and "+ tableColumnAliasPre +"printed = %s))", where3 , - InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM , - InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM , - InvoicePlan.PRINT_STATUS_PRINTED); - }else if(StringUtils.equals(appFormType, InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM)){ - where3 = String.format("%s and "+ tableColumnAliasPre +"printed = %s", where3 , InvoicePlan.PRINT_STATUS_PRINTED); - } - } - - /* - * 条件3附加补充2.东莞东华医院要求:发货计划只能看到供应室审核了的借物单,所以这里要判断单据类型是否借物单, - * 如果不是借物单且审核状态不为待审核则按原来的方式运行,即借物单的审核状态不为待审核(为其它值或空都可以) - * 此过滤不需要配置项 - */ - if(StringUtils.isBlank(appFormType)){ - where3 = String.format("%s and ("+ tableColumnAliasPre +"type <> '%s' or ("+ tableColumnAliasPre +"type = '%s' and ("+ tableColumnAliasPre +"borrowConfirmStatus is null or "+ tableColumnAliasPre +"borrowConfirmStatus <> '%s')))", where3 , - InvoicePlan.TYPE_BORROWINGSINGLE , - InvoicePlan.TYPE_BORROWINGSINGLE , - BorrowConfirmStatus.WAITINGCONFIRM.getDesc()); - }else if(StringUtils.equals(appFormType, InvoicePlan.TYPE_BORROWINGSINGLE)){ - where3 = String.format("%s and ("+ tableColumnAliasPre +"borrowConfirmStatus is null or "+ tableColumnAliasPre +"borrowConfirmStatus <> '%s')", where3 , InvoicePlan.PRINT_STATUS_PRINTED); - } - - //条件4.如果科室供应室配置为回收后发货,则申请单的回收状态不能为待回收(??先注释,因为单上可能同时有不回收和要回收的包,此时单状态为待回收,但还是有物品需要发货) - /*String where4 = "1=1"; - SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); - if(config.getAfterRecyclingTousseDeliver()){ - where3 = String.format("recyclingStatus is null or recyclingStatus <> '%s')", InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE); - }*/ - - //条件5.根据发货单状态过滤 - String where5 = String.format( - "("+ tableColumnAliasPre +"deliverStatus='%s' or "+ tableColumnAliasPre +"deliverStatus='%s') and ("+ tableColumnAliasPre +"endStatus is null or "+ tableColumnAliasPre +"endStatus!='%s')", - InvoicePlan.DELIVERSTATUS_AWAITDELIVER, - InvoicePlan.DELIVERSTATUS_PARTDELIVERED,InvoicePlan.STATUS_END); - //条件6.根据申请单的提交状态过滤 - String where6 = tableColumnAliasPre +"committedStatus = 1"; - LoginUserData loginUser = AcegiHelper.getLoginUser(); - String userDeptCode = loginUser.getCurrentOrgUnitCode(); - //条件7.根据申请单的处理科室编码过滤 - String where7 = tableColumnAliasPre +"handleDepartCoding = '" + userDeptCode + "'"; - - //条件8.过滤相关的单类型 - List excludeTypelist = new ArrayList(); - excludeTypelist.add(InvoicePlan.TYPE_QUALITY_MONITOR_RECYCLE_APPLICATION); - excludeTypelist.add(InvoicePlan.TYPE_SECOND_SUPPLY_ROOM); - excludeTypelist.add(InvoicePlan.TYPE_EXPENSIVEGOODS_FORM); -// String second_supply_room_sql = String.format(" (type != '%s' or (type = '%s' and departCoding in(select orgUnitCoding from %s where supplyRoomType='%s' and showInvoicePlan='%s'))) ", -// InvoicePlan.TYPE_SECOND_SUPPLY_ROOM,InvoicePlan.TYPE_SECOND_SUPPLY_ROOM,SupplyRoomConfig.class.getSimpleName(), -// SupplyRoomConfig.SUPPLYROOM_TYPE_SECOND_SUPPLYROOM,com.forgon.tools.Constants.STR_YES); - String second_supply_room_sql = "1=1"; - SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); - if (config != null) { - //外来器械跑代理灭菌流程(过滤二级供应室申请的外来器械申请单) - //外来器械包默认处理科室及任务组 - JSONObject foreignTousseHandleDepartAndTaskGroupJsonobject = config.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(userDeptCode); - if (foreignTousseHandleDepartAndTaskGroupJsonobject == null || !StringUtils.equals(foreignTousseHandleDepartAndTaskGroupJsonobject.optString("departCode"), userDeptCode)) { - excludeTypelist.add(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); - } - } - excludeTypelist.add(InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION); - - //如果存在需要排除的申请单类型,则进行排除 - if(CollectionUtils.isNotEmpty(excludeInvoicePlanTypeList)){ - excludeTypelist.addAll(excludeInvoicePlanTypeList); - } - String where8 = "1=1"; - if(StringUtils.isBlank(appFormType)){ - //如果单类型的值为空(未传),且启用了借物单单独发货功能时,则需要排除掉借物单的这种类型(@see 业务详见:NFYY-62) - if(CssdUtils.getSystemSetConfigByNameBool("enableBorrowInvoicePlanSeperateSend")){ - excludeTypelist.add(InvoicePlan.TYPE_BORROWINGSINGLE); - } - where8 = SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"type", - excludeTypelist); - } - - String condition = String - .format(" (%s) and (%s) and (%s) and (%s) and (%s) and (%s) and (%s) and (%s)", - where1, where2, where3, where5, where6, where7, where8,second_supply_room_sql); - return condition; - } - - - /** - * 构造发货计划单的通用过滤条件 - * @param departCodes 科室编码 - * @param applyDate 申请日期 - * @param alias 表的别名(防止多个表是同名字段时语句报错) - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanCommonSqlCondition( - String departCodes, String applyDate,String alias, - String invoiceOrigin , String tousseDeliverOccasion){ - //表名的字段的前缀 - String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; - List departCodeList = null; - if(StringUtils.isNotBlank(departCodes)){ - departCodeList = Arrays.asList(departCodes.split(";")); - } - // 默认是过滤申请科室,也可以配置为结算科室 - String groupBy = InvoiceUtils.getInvoiceGroupByConfig(); - //条件1.根据科室分组的科室编码过滤,参数:departCodes - String where1 = "1=1"; - if(CollectionUtils.isNotEmpty(departCodeList)){ - where1 = SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre + groupBy, departCodeList); - } - - //条件2.根据申请日期过滤 如果申请时间范围不为空时,参数:applyDate - String where2 = "1=1"; - if (StringUtils.isNotBlank(applyDate)) { - try { - where2 = this.setTimeCondition(applyDate,tableColumnAliasPre); - } - catch (Exception e) { - logger.error(e, e); - throw new RuntimeException(e); - } - } - - //条件3.根据发货单状态过滤 - String where3 = String.format( - "("+ tableColumnAliasPre +"deliverStatus='%s' or "+ tableColumnAliasPre +"deliverStatus='%s') and ("+ tableColumnAliasPre +"endStatus is null or "+ tableColumnAliasPre +"endStatus!='%s')", - InvoicePlan.DELIVERSTATUS_AWAITDELIVER, - InvoicePlan.DELIVERSTATUS_PARTDELIVERED,InvoicePlan.STATUS_END); - //条件4.根据申请单的提交状态过滤 - String where4 = tableColumnAliasPre +"committedStatus = 1"; - LoginUserData loginUser = AcegiHelper.getLoginUser(); - String userDeptCode = loginUser.getCurrentOrgUnitCode(); - //条件5.根据申请单的处理科室编码过滤 - String where5 = tableColumnAliasPre +"handleDepartCoding = '" + userDeptCode + "'"; - - String condition = String - .format(" (%s) and (%s) and (%s) and (%s) and (%s)", - where1, where2, where3, where4, where5); - return condition; - } - - /** - * 构造发货计划单的过滤条件(外来器械申请单的单层面相关,不包含申请项相关的过滤),无where开头 - * @param departCodes 科室编码 - * @param applyDate 申请日期 - * @param alias 表的别名(防止多个表是同名字段时语句报错) - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanSqlConditionOnlyForeignTousseApplication( - String departCodes, String applyDate,String alias, - String invoiceOrigin , String tousseDeliverOccasion){ - String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( - departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); - String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; - //过滤相关的单类型 - String condition = String.format("%s and %s='%s'",commonCondition, - tableColumnAliasPre +"type",InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); - return condition; - } - - /** - * 构造发货计划单的过滤条件(用于外部代理灭菌单、自定义器械申请单需要返回该单的id的情形),无where开头 - * @param departCodes 科室编码 - * @param applyDate 申请日期 - * @param alias 表的别名(防止多个表是同名字段时语句报错) - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanSqlConditionForForeignProxyAndCustomeTousseAppliaction( - String departCodes, String applyDate,String alias, - String invoiceOrigin , String tousseDeliverOccasion){ - String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( - departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); - String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; - //条件8.过滤相关的单类型 - String condition = String.format("%s and %s",commonCondition, - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"type", - Arrays.asList(new String[]{InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION,InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM}))); - return condition; - } - - /** - * 构造发货计划单的过滤条件(用于代理灭菌单需要返回该单的id的情形),无where开头 - * @param departCodes 科室编码 - * @param applyDate 申请日期 - * @param alias 表的别名(防止多个表是同名字段时语句报错) - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanSqlConditionForProxyDisinfection( - String departCodes, String applyDate,String alias, - String invoiceOrigin , String tousseDeliverOccasion){ - String commonCondition = buildWaitSendInvoicePlanCommonSqlCondition( - departCodes, applyDate, alias, invoiceOrigin , tousseDeliverOccasion); - String tableColumnAliasPre = (StringUtils.isNotBlank(alias)) ? alias + "." : ""; - //条件8.过滤相关的单类型 - String condition = String.format("%s and %s",commonCondition, tableColumnAliasPre +"type = '"+ InvoicePlan.TYPE_PROXYDISINFECTION +"'"); - return condition; - } - - /** - * 构造发货计划申请项的过滤条件(自定义器械申请单的相关过滤),无where开头 - * @param tousseTypes 物品类型,多个以逗号分隔 - * @param disposableGoodsType 一次性物品类型 - * @param sterilingMethods 灭菌程序 - * @param tousseGroupIds 器械包分组 - * @param tousseItemTableAlias 申请项表的别名(防止多个表是同名字段时语句报错) - * @param invoicePlanTableAlias 申请单表的别名,如果不存在此参数则忽略 - * @return String 示例如下: 条件1 and 条件2 。。。 - */ - private String buildWaitSendInvoicePlanSqlConditionOnlyTousseItem( - String tousseTypes,String disposableGoodsType, - String sterilingMethods, String tousseGroupIds, - String tousseItemTableAlias , String invoicePlanTableAlias, - String invoiceOrigin , String tousseDeliverOccasion){ - //表的字段的前缀 - String tableColumnAliasPre = (StringUtils.isNotBlank(tousseItemTableAlias)) ? tousseItemTableAlias + "." : ""; - //根据物品类型、一次性物品类型、灭菌程序、器械包分组过滤。参数:tousseType、disposableGoodsType、sterilingMethods、tousseGroupIds - String tousseItemCondition = tableColumnAliasPre +"isInvoice = '"+ Constants.STR_YES +"' and ("+ tableColumnAliasPre +"isTerminated is null or "+ tableColumnAliasPre +"isTerminated <> 1)"; - //剩余应发货数量大于0(即待发货数量(可能是申请数量、回收数量、清点数量等)减已发货数量) - //应发货数量 - String shouldSendAmountCaseSql = - CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, - invoiceOrigin, tousseDeliverOccasion); - tousseItemCondition += String.format(" and (%s - %s) > 0", shouldSendAmountCaseSql,tableColumnAliasPre + "sendOutAmount"); - //增加待发货物品的过滤条件1:开平市中心医院KPSZXYY-13 回收申请单、通用申请单需要打印后才产生发货计划 - boolean hideUnprintedTousseItems = CssdUtils.getSystemSetConfigByNameBool("hideUnprintedTousseItems"); - List hideUnprintedTousseItemTousseTypeList = null; - if(hideUnprintedTousseItems){ - hideUnprintedTousseItemTousseTypeList = new ArrayList(); - hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_INSIDE); - hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); - hideUnprintedTousseItemTousseTypeList.add(TousseDefinition.PACKAGE_TYPE_DRESSING); - } - - //一次性物品类型转换成集合 - List disposableGoodsTypeList = null; - if (StringUtils.isNotBlank(disposableGoodsType)) { - disposableGoodsTypeList = Arrays.asList(disposableGoodsType.split(",")); - } - - //器械包分组转换成集合 - List tousseGroupIdList = null; - if (StringUtils.isNotBlank(tousseGroupIds)) { - tousseGroupIdList = Arrays.asList(tousseGroupIds.split(",")); - } - - //灭菌程序转换成集合 - List sterilingMethodList = null; - if (StringUtils.isNotBlank(sterilingMethods)) { - sterilingMethodList = Arrays.asList(sterilingMethods.split(",")); - } - - if (StringUtils.isNotBlank(tousseTypes)) { - if(TousseItem.DIPOSABLE_YES.equals(tousseTypes)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"diposable='%s' and "+ tableColumnAliasPre +"tousseType = '%s'", - tousseItemCondition , TousseItem.DIPOSABLE_YES , TousseItem.TYPE_DIPOSABLE_GOODS); - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ - tousseItemCondition = String.format("%s and %s", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - } - }else if(TousseItem.DIPOSABLE_NO.equals(tousseTypes)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"diposable='%s'", - tousseItemCondition , TousseItem.DIPOSABLE_NO); - if(hideUnprintedTousseItems){ - tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, - SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); - } - //如果器械包分组与灭菌程序都不为空时 - if(CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s ) and " - + tableColumnAliasPre - + "tousseDefinitionId in(select id from %s " - + "where ancestorID in(select id from %s where %s )) ", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - TousseDefinition.class.getSimpleName(),TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else{ - if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) ", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName() , - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); - } - } - }else{ - Set tousseTypeSet = buildTousseTypeSet(tousseTypes); - if(CollectionUtils.isNotEmpty(tousseTypeSet)){ - tousseItemCondition = String.format("%s and %s",tousseItemCondition,SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", tousseTypeSet)); - //1.检查是否同时包含一次性物品与非一次性物品 - if(tousseTypeSet.contains(TousseItem.TYPE_DIPOSABLE_GOODS)){ - if(tousseTypeSet.size() > 1){ - //1.同时包含一次性物品与非一次性物品 - if(hideUnprintedTousseItems){ - tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, - SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); - } - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - || CollectionUtils.isNotEmpty(tousseGroupIdList) - || CollectionUtils.isNotEmpty(sterilingMethodList)){ - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " - + tableColumnAliasPre - + "tousseDefinitionId in (elect id from %s where ancestorID in (select id from %s where %s )) " - + " or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - TousseDefinition.class.getSimpleName(), - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName() , - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " - + tableColumnAliasPre - + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) " - + " or "+ tableColumnAliasPre +"disposableGoodsId is not null)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - TousseDefinition.class.getSimpleName(), - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ - tousseItemCondition = String.format("%s and (%s or "+ tableColumnAliasPre +"tousseDefinitionId is not null)", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in(select id from %s where ancestorID in (select id from %s where %s)) or "+ tableColumnAliasPre +"disposableGoodsId is not null)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or "+ tableColumnAliasPre +"disposableGoodsId is not null)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); - } - } - }else{ - //2.只包含一次性物品 - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ - tousseItemCondition = String.format("%s and %s", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - } - } - }else{ - //3.只包含非一次性物品 - if(hideUnprintedTousseItems){ - tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, - SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); - } - if(CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " - + tableColumnAliasPre - + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) ", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName() , - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else{ - if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in(select id from %s where ancestorID in (select id from %s where %s))", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); - } - } - } - } - } - }else{ - if(hideUnprintedTousseItems){ - tousseItemCondition = String.format("%s and (%s and "+ tableColumnAliasPre +"isPrinted=%s or %s)", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList),1, - SqlUtils.getStringFieldNotInCollectionsPredicate(tableColumnAliasPre +"tousseType", hideUnprintedTousseItemTousseTypeList)); - } - //disposableGoodsType、sterilingMethods、tousseGroupIds三个选项参数只要有一个不为空时 - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - || CollectionUtils.isNotEmpty(tousseGroupIdList) - || CollectionUtils.isNotEmpty(sterilingMethodList)){ - if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s ) and " - + tableColumnAliasPre - + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) " - + " or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName() , - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where ancestorID in (select id from %s where %s)) or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and ("+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) or %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(tousseGroupIdList) - && CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s) and " - + tableColumnAliasPre - + "tousseDefinitionId in(select id from %s where ancestorID in(select id from %s where %s)) ", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(disposableGoodsTypeList)){ - tousseItemCondition = String.format("%s and %s", tousseItemCondition , - SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"disposableGoodsType", disposableGoodsTypeList)); - }else if(CollectionUtils.isNotEmpty(tousseGroupIdList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in ( select id from %s where ancestorID in (select id from %s where %s))", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - TousseDefinition.class.getSimpleName(), - SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tousseGroupID", tousseGroupIdList)); - }else if(CollectionUtils.isNotEmpty(sterilingMethodList)){ - tousseItemCondition = String.format("%s and "+ tableColumnAliasPre +"tousseDefinitionId in (select id from %s where %s)", - tousseItemCondition , TousseDefinition.class.getSimpleName() , - SqlUtils.getStringFieldInLargeCollectionsPredicate("sterilingMethod", sterilingMethodList)); - } - } - } - return tousseItemCondition; - } - - @Override + /*@Override public JSONArray getInvoicePlansByOrgAndTousseType( Collection departCodeList, String applyDate, String tousseTypes,String disposableGoodsType,String sterilingMethods, String tousseGroupIds,String appFormType) { String departCodes = null; @@ -1442,57 +349,8 @@ } } return invoicePlanArray; - } + }*/ - private void addApplicationGoodsVoStatus( - Collection list, String departCoding) { - if(CollectionUtils.isNotEmpty(list)){ - List tousseNameList = list.stream().filter(vo -> { - return !StringUtils.equals(DisposableGoods.TYPE_NAME, vo.getGoodsType()); - }).map(ApplicationGoodsVo::getName).collect(Collectors.toList()); - //包名称对应已灭菌库存数量map - Map tousseNameToSteriledAmountMap = new HashMap(); - if(CollectionUtils.isNotEmpty(tousseNameList)){ - ResultSet rs = null; - String querySql = String.format("select ti.tousseName,count(0) cnt from %s ti " - + "join %s td on td.id = ti.tousseDefinition_id " - + "where ti.orgUnitCoding='%s' and %s " - + "and ti.status in ('%s','%s') " - + "and ( td.limitInvoiceDepart is null or td.limitInvoiceDepart <> '%s' " - + "or (td.limitInvoiceDepart = '%s' and (ti.departCoding is null or ti.departCoding = '' or ti.departCoding = '%s'))) " - + "group by ti.tousseName having count(0) > 0", - TousseInstance.class.getSimpleName(),TousseDefinition.class.getSimpleName(),AcegiHelper.getCurrentOrgUnitCode(), - SqlUtils.getStringFieldInLargeCollectionsPredicate("ti.tousseName", tousseNameList), - TousseInstance.STATUS_STERILED,TousseInstance.STATUS_DISINFECTED, - Constants.STR_YES, Constants.STR_YES, - departCoding == null ? "" : departCoding - ); - try { - rs = objectDao.executeSql(querySql); - while(rs.next()){ - tousseNameToSteriledAmountMap.put(rs.getString("tousseName"), - ((Number)rs.getInt("cnt")).intValue()); - } - } catch (Exception e) { - e.printStackTrace(); - }finally{ - DatabaseUtil.closeResultSetAndStatement(rs); - } - } - for (ApplicationGoodsVo vo : list) { - if(StringUtils.equals(vo.getGoodsType(), DisposableGoods.TYPE_NAME)){ - vo.setStatus(ApplicationGoodsVo.STATUS_STERILED); - }else{ - if(tousseNameToSteriledAmountMap.containsKey(vo.getName())){ - vo.setStatus(ApplicationGoodsVo.STATUS_STERILED); - }else{ - vo.setStatus(ApplicationGoodsVo.STATUS_UNSTERILED); - } - } - } - } - } - @Override public Collection getWaitDeliverGoods( Long invoicePlanId, String orgUnitCoding, Long warehouseId, String applyDate, @@ -2311,330 +1169,4 @@ } } - /** - * 发货计划:外来器械申请单的待发货物品查询 - * @param invoicePlanId - * @param orgUnitCoding - * @param applyDate - * @param tousseType - * @param disposableGoodsType - * @param sterilingMethods - * @param tousseGroupIds - * @param appFormType - * @return - */ - private Collection getWaitDeliverGoodsForForeignTousse(String queryTousseItemSql) { - logger.debug("getWaitDeliverGoodsForForeignTousse queryTousseItemSql:"+queryTousseItemSql); - List> list = jdbcTemplate.queryForList(queryTousseItemSql); - Collection result = null; - if(CollectionUtils.isNotEmpty(list)){ - result = new ArrayList(); - Map tousseNameToVoMap = new HashMap(); - Date out_beginTime = new Date(); - Date out_endTime = new Date(); - supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); - for (Map map : list) { - String tousseName = (String)map.get("tousseName"); - ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName); - //判断该vo对象是否已经存在于map中,如果不存在则将vo添加至集合中。防止集中存在重复的vo - boolean voExistsInMap = false; - //外来器械 - if (vo == null) { - vo = new ApplicationGoodsVo(); - tousseNameToVoMap.put(tousseName, vo); - }else{ - voExistsInMap = true; - } - String tousseType = (String)map.get("tousseType"); - vo.setName(tousseName); - vo.setShowTousseName(tousseName); - vo.setGoodsType(tousseType); - String departCoding = (String)map.get("departCoding"); - vo.setDepartCoding(departCoding); - //待发货数量 - Number amount = (Number)map.get("amount"); - if(amount != null){ - vo.setCount(vo.getCount() + amount.intValue()); - vo.setApplicationAmount(vo.getApplicationAmount() + amount.intValue()); - } - vo.setDiposable((String)map.get("diposable")); - //加急级别 - Number grade = (Number)map.get("grade"); - if(grade != null){ - vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); - } - - //加急数量 - Number urgentAmount = (Number)map.get("urgentAmount"); - if(urgentAmount != null){ - vo.setUrgentAmount(vo.getUrgentAmount() + urgentAmount.intValue()); - } - //申请单id - Number invoicePlanIdNumber = (Number)map.get("invoicePlanId"); - if(invoicePlanIdNumber != null){ - vo.addInvoicePlanID(invoicePlanIdNumber.longValue()); - //申请项id - Number tousseItemIdNumber = (Number)map.get("tousseItemId"); - if(tousseItemIdNumber != null){ - vo.addTousseItemId(invoicePlanIdNumber.longValue(), - tousseItemIdNumber.longValue()); - } - } - //申请时间 - Date applicationTime = (Date)map.get("applicationTime"); - if(applicationTime != null){ - vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( - out_beginTime)); - } - vo.setInvoicePlanType(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION); - if(!voExistsInMap){ - result.add(vo); - } - } - } - return result; - } - - /** - * 发货计划:需要返回申请单id的待发货物品查询(外来器械申请单除外,不包含在内) - * @param queryTousseItemSql 查询语句 - * @return - */ - private Collection getWaitDeliverGoodsForNeedReturnInvoicePlanId(String queryTousseItemSql) { - logger.debug("getWaitDeliverGoodsForNeedReturnInvoicePlanId queryTousseItemSql:"+queryTousseItemSql); - List> list = jdbcTemplate.queryForList(queryTousseItemSql); - Collection result = null; - if(CollectionUtils.isNotEmpty(list)){ - Map tousseNameToVoMap = new HashMap(); - Date out_beginTime = new Date(); - Date out_endTime = new Date(); - supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); - for (Map map : list) { - String tousseName = (String)map.get("tousseName"); - ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName); - if (vo == null) { - vo = new ApplicationGoodsVo(); - tousseNameToVoMap.put(tousseName, vo); - } - String tousseType = (String)map.get("tousseType"); - vo.setName(tousseName); - vo.setShowTousseName(tousseName); - vo.setGoodsType(tousseType); - String departCoding = (String)map.get("departCoding"); - vo.setDepartCoding(departCoding); - //待发货数量 - Number amount = (Number)map.get("amount"); - if(amount != null){ - vo.setCount(vo.getCount() + amount.intValue()); - vo.setApplicationAmount(vo.getApplicationAmount() + amount.intValue()); - } - vo.setDiposable((String)map.get("diposable")); - //加急级别 - Number grade = (Number)map.get("grade"); - if(grade != null){ - vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); - } - //加急数量 - Number urgentAmount = (Number)map.get("urgentAmount"); - if(urgentAmount != null){ - vo.setUrgentAmount(vo.getUrgentAmount() + urgentAmount.intValue()); - } - //申请单id - Number invoicePlanIdNumber = (Number)map.get("invoicePlanId"); - if(invoicePlanIdNumber != null){ - vo.addInvoicePlanID(invoicePlanIdNumber.longValue()); - } - //申请时间 - Date applicationTime = (Date)map.get("applicationTime"); - if(applicationTime != null){ - vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( - out_beginTime)); - } - vo.setInvoicePlanType((String)map.get("invoicePlanType")); - } - result = tousseNameToVoMap.values(); - } - return result; - } - - /** - * 发货计划:通用物品类型的待发货物品查询(器械包、敷料包、一次性物品) - * @param queryTousseItemSql 查询语句 - * @return - */ - private Collection getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods(String queryTousseItemSql) { - logger.debug("getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods queryTousseItemSql:"+queryTousseItemSql); - List> list = jdbcTemplate.queryForList(queryTousseItemSql); - Collection result = null; - if(CollectionUtils.isNotEmpty(list)){ - result = new ArrayList(); - Date out_beginTime = new Date(); - Date out_endTime = new Date(); - supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); - for (Map map : list) { - ApplicationGoodsVo vo = new ApplicationGoodsVo(); - Object disposableGoodsId = map.get("disposableGoodsId"); - if(disposableGoodsId != null){ - vo.setDisposableGoodsId(((Number)disposableGoodsId).longValue()); - } - String showName = (String)map.get("tousseName"); - String tousseType = (String)map.get("tousseType"); - vo.setName(showName); - vo.setShowTousseName(showName); - vo.setGoodsType(tousseType); - vo.setDiposable((String)map.get("diposable")); - String departCoding = (String)map.get("departCoding"); - vo.setDepartCoding(departCoding); - //待发货数量 - vo.setCount(((Number)map.get("amount")).intValue()); - vo.setApplicationAmount(vo.getCount()); - //加急级别 - Number grade = (Number)map.get("grade"); - if(grade != null){ - vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); - } - //加急数量 - if(map.get("urgentAmount") != null){ - vo.setUrgentAmount(((Number)map.get("urgentAmount")).intValue()); - } - //申请时间 - Date applicationTime = (Date)map.get("applicationTime"); - if(applicationTime != null){ - vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( - out_beginTime)); - } - //整箱申请数量 - vo.setFullCaseApplicationAmount((Integer)map.get("fullCaseApplicationAmount")); - result.add(vo); - } - } - return result; - } - - /** - * 发货计划:消毒物品的待发货物品查询(需返回材料md5及数量) - * @param queryTousseItemSql 查询语句 - * @return - */ - private Collection getWaitDeliverGoodsForDisinfectGoods(String queryTousseItemSql) { - logger.debug("getWaitDeliverGoodsForDisinfectGoods queryTousseItemSql:"+queryTousseItemSql); - List> list = jdbcTemplate.queryForList(queryTousseItemSql); - Collection result = null; - if(CollectionUtils.isNotEmpty(list)){ - Date out_beginTime = new Date(); - Date out_endTime = new Date(); - supplyRoomConfigManager.getTodayTimeQuantum(out_beginTime, out_endTime); - Map tousseNameToVoMap = new HashMap(); - for (Map map : list) { - String tousseName = (String)map.get("tousseName"); - String departCoding = (String)map.get("departCoding"); - departCoding = departCoding == null ? "" : departCoding; - ApplicationGoodsVo vo = tousseNameToVoMap.get(tousseName + departCoding); - if (vo == null) { - vo = new ApplicationGoodsVo(); - tousseNameToVoMap.put(tousseName + departCoding, vo); - } - String tousseType = (String)map.get("tousseType"); - vo.setName(tousseName); - vo.setShowTousseName(tousseName); - vo.setGoodsType(tousseType); - vo.setDiposable((String)map.get("diposable")); - vo.setDepartCoding(departCoding); - //待发货数量 - vo.setCount(MathTools.add(vo.getCount(), (Number)map.get("amount")).intValue()); - //加急级别 - Number grade = (Number)map.get("grade"); - if(grade != null){ - vo.setMaxUrgentLevelGrade(Math.max(grade.intValue(), vo.getMaxUrgentLevelGrade())); - } - //加急数量 - vo.setUrgentAmount(MathTools.add(vo.getUrgentAmount(), (Number)map.get("urgentAmount")).intValue()); - //申请时间 - Date applicationTime = (Date)map.get("applicationTime"); - if(applicationTime != null){ - vo.setBeforeToday(vo.isBeforeToday() || applicationTime.before( - out_beginTime)); - } - - Number tdId = (Number)map.get("tdId"); - TousseDefinition tousseDefinition = tousseDefinitionManager.get(tdId.longValue()); - - //消毒物品-非整包申请的消毒物品,显示材料数量,并且将材料明细设置到tousseVO里面 - TousseItemVoForApplicationGoodsVo tousseItemVo = new TousseItemVoForApplicationGoodsVo(); - tousseItemVo.setCount(vo.getCount()); - // 非整包申请的消毒物品,显示材料数量,并且将材料明细设置到tousseVO里面 - if(!tousseDefinition.applyEntireTousse()){ - int materialTotalAmount = vo.getMaterialAmount(); - int materiallAmount = CssdUtils.getMaterialTotalAmount(tousseDefinition,false); - materialTotalAmount += materiallAmount; - vo.setMaterialAmount(materialTotalAmount); - vo.setIsCleanedEntirely(tousseDefinition.getIsApplyEntireTousse()); - // 将材料明细设置到tousseVO里面 - List materialInstances = tousseDefinition.getMaterialInstances(); - if(materialInstances != null){ - for (MaterialInstance materialInstance : materialInstances) { - String materialName = materialInstance.getMaterialName(); - int materialAmount = materialInstance.getCount(); - MaterialVO materialVO = vo.findMaterialVOByName(materialName); - if(materialVO == null){ - materialVO = new MaterialVO(); - materialVO.setName(materialName); - vo.getMaterials().add(materialVO); - } - materialVO.setAmount(materialVO.getAmount() + materialAmount); - } - } - - tousseItemVo.setMaterialAmount(materiallAmount); - } - - tousseItemVo.setName(vo.getName()); - tousseItemVo.setTousseDefinitionId(tousseDefinition.getId()); - tousseItemVo.setMaterialsMD5(tousseDefinition.getMaterialsMD5()); - vo.getTousseItems().add(tousseItemVo); - } - result = tousseNameToVoMap.values(); - } - return result; - } - - /** - * 设置时间的条件 - * @param applyDate 要设定的时间 - * @param tableColumnAliasPre 字段的表别名前缀,包含. - * @return - */ - protected String setTimeCondition(String applyDate,String tableColumnAliasPre){ - SimpleDateFormat sdf = new SimpleDateFormat(DateTools.COMMON_DATE_HMS); - try { - tableColumnAliasPre = StringUtils.isEmpty(tableColumnAliasPre) ? "" : tableColumnAliasPre; - String[] applyDateArray = StringUtils.split(applyDate, Constants.IDS_SEPARATOR); - //如果convertTime方法转换出错,尝试重新再转换(花都区人民医院要求:发货时间精确到上午和下午的时分,而之前默认的方法是精确到时分秒,所以要尝试再次转换) - //Date out_beginTime = DateTools.convertTime(applyDateArray[0] + " 00:00:00", sdf, DateTools.COMMON_DATE_HM); - Date out_beginTime = ForgonDateUtils.safelyParseDate(applyDateArray[0]); - String timeSearchFmt = CssdUtils.getSystemSetConfigByName("timeSearchFmt"); - DateStrategyContext dateStrategyContext = new DateStrategyContext(); - dateStrategyContext.setDateState(timeSearchFmt); - Date out_endTime = dateStrategyContext.handleTodayEndOfTime(applyDateArray[1], sdf, DateTools.COMMON_DATE_HM); - String where7 = String.format("("+ tableColumnAliasPre +"applicationTime between %s and %s or "+ tableColumnAliasPre +"id in (select recyclingApplication_id from %s where recyclingTime between %s and %s))", - dateQueryAdapter.dateAdapter(out_beginTime), - dateQueryAdapter.dateAdapter(out_endTime), - RecyclingRecord.class.getSimpleName(), - dateQueryAdapter.dateAdapter(out_beginTime), - dateQueryAdapter.dateAdapter(out_endTime)); - //如果配置按申请时间过滤,且有传时间范围参数时,则只按申请时间过滤(NFYY-59) - if(InvoiceUtils.willFilterInvoicePlanByApplicationTime(applyDate)){ - where7 = String.format("("+ tableColumnAliasPre +"applicationTime between %s and %s)", - dateQueryAdapter.dateAdapter(out_beginTime), - dateQueryAdapter.dateAdapter(out_endTime)); - } - logger.info("where7:" + where7); - return where7; - } - catch (Exception e) { - logger.error(e); - throw new RuntimeException(e); - } - } - }