Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r33656 -r33662 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33656) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33662) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.recyclingapplication.service; +import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; @@ -4473,8 +4474,472 @@ @Override public JSONArray getWaitDeliverInvoicePlanDetailByIDAndTousseName(String invoicePlanIDs, String tousseType, String tousseName) { - // TODO Auto-generated method stub - return null; + + List invoicePlanIDList = null; + if(StringUtils.isNotBlank(invoicePlanIDs)){ + String[] tempIDs = StringUtils.split(invoicePlanIDs, ';'); + invoicePlanIDList = Arrays.asList(tempIDs); + } + + //外来器械包拆分小包,直接查询包实例 + if(StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_SPLIT)){ + return buildForeignTousseSplitVoJSONArray(invoicePlanIDList, tousseName); + } + + String querySql = String.format("select id,type,serialNumber, departCoding, applicationTime, applicant from %s po where 1=1 and %s order by applicationTime", InvoicePlan.class.getSimpleName() , SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoicePlanIDList)); + List> list = jdbcTemplate.queryForList(querySql); + JSONArray invoicePlanArray = new JSONArray(); + if(CollectionUtils.isNotEmpty(list)){ + //查询申请单上的应发货物品明细(包含已经生成器械包实例的数量) + Map> invoicePlanIDToGoodsVoMap = getDeliverGoodsMapByInvoicePlan(invoicePlanIDList, tousseName, tousseType); + //查询申请单关联的包实例(只查询已经生成器械包实例的数量) + Map> invoicePlanIDToTousseInstanceVoMap = getTousseInstanceVoByInvoicePlan(invoicePlanIDList, tousseName, tousseType); + + for (Map map : list) { + + Long invoicePlanID = ((BigDecimal) map.get("id")).longValue(); + int count = 0; + Object applicationTime = map.get("applicationTime"); + String applicationTimeStr = ""; + if(applicationTime != null){ + applicationTimeStr = DateTools.getFormatDateStr((Date)applicationTime, DateTools.COMMON_DATE_HMS); + } + JSONObject invoicePlanTemp = new JSONObject(); + invoicePlanTemp.put("id", map.get("id")); + invoicePlanTemp.put("serialNumber", map.get("serialNumber")); + invoicePlanTemp.put("applicationTime", applicationTimeStr); + invoicePlanTemp.put("uiProvider", "col"); + invoicePlanTemp.put("cls", "master-task"); + invoicePlanTemp.put("iconCls", "task-folder"); + String type = (String)map.get("type"); + invoicePlanTemp.put("invoicePlanType", type); + String applicant = (String)map.get("applicant"); + if(StringUtils.equals(applicant, "退货重发")){ + //退货重发的申请单(根据申请人判断,申请人为“退货重发”的申请单),申请单类型显示为“退货重发” + invoicePlanTemp.put("invoicePlanType", applicant); + } + + List goodsVoList = new ArrayList(); + + if(StringUtils.isNotBlank(tousseName)){ + + //查询申请单上的发货物品 + List goodsVoCollection = invoicePlanIDToGoodsVoMap.get(invoicePlanID); + //已经装配产生包实例的发货物品 + List tousseInstanceVoCollection = invoicePlanIDToTousseInstanceVoMap.get(invoicePlanID); + + if(CollectionUtils.isEmpty(goodsVoCollection)){ + continue; + } + + Collection tempVoCollection = getTousseInstanceBarcode(tousseInstanceVoCollection, goodsVoCollection); + if(CollectionUtils.isNotEmpty(tempVoCollection)){ + goodsVoList.addAll(tempVoCollection); + for (ApplicationGoodsVo applicationGoodsVo : tempVoCollection) { + count += applicationGoodsVo.getCount(); + } + } + } + invoicePlanTemp.put("count", count); + invoicePlanTemp.put("children", goodsVoList); + invoicePlanArray.add(invoicePlanTemp); + } + } + return invoicePlanArray; } + /** + * "外来器械拆分小包"直接查器械包实例 + * @param invoicePlanIDList 申请单ID + * @param tousseName 物品名称 + * @return + */ + private JSONArray buildForeignTousseSplitVoJSONArray(List invoicePlanIDList, String tousseName) { + JSONArray invoicePlanArray = new JSONArray(); + String querySql = String.format("select id,type,serialNumber, departCoding, applicationTime from %s po where 1=1 and %s order by applicationTime", InvoicePlan.class.getSimpleName() , SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoicePlanIDList)); + List> list = jdbcTemplate.queryForList(querySql); + for (Map map : list) { + Long invoicePlanID = ((BigDecimal) map.get("id")).longValue(); + int count = 0; + Object applicationTime = map.get("applicationTime"); + String applicationTimeStr = ""; + if(applicationTime != null){ + applicationTimeStr = DateTools.getFormatDateStr((Date)applicationTime, DateTools.COMMON_DATE_HMS); + } + JSONObject invoicePlanTemp = new JSONObject(); + invoicePlanTemp.put("id", map.get("id")); + invoicePlanTemp.put("serialNumber", map.get("serialNumber")); + invoicePlanTemp.put("applicationTime", applicationTimeStr); + invoicePlanTemp.put("uiProvider", "col"); + invoicePlanTemp.put("cls", "master-task"); + invoicePlanTemp.put("iconCls", "task-folder"); + List goodsVoList = new ArrayList(); + + if(StringUtils.isNotBlank(tousseName)){ + //拆分小包直接查包实例状态 + String sql = "select tis.tousseName, tis.status, bd.barcode tousseBarcode, 1 amount " + + "from TousseInstance tis " + + "join barcodeDevice bd on bd.id = tis.id " + + "join TousseDefinition td on td.id = tis.tousseDefinition_id " + + "where 1=1 " + + "and tis.invoicePlanID = " + invoicePlanID + +" and td.tousseType = '" + TousseDefinition.PACKAGE_TYPE_SPLIT + "' " + + "and td.name = '" + tousseName + "' " + + "order by tis.validUntil "; + + List voList = getApplicationGoodsVoBySql(sql); + goodsVoList.addAll(voList); + if(CollectionUtils.isNotEmpty(voList)){ + for (ApplicationGoodsVo applicationGoodsVo : voList) { + count += applicationGoodsVo.getCount(); + } + } + invoicePlanTemp.put("count", count); + invoicePlanTemp.put("children", goodsVoList); + invoicePlanArray.add(invoicePlanTemp); + } + } + return invoicePlanArray; + } + + /** + * 查询待发货物品的申请单明细(包含已经生成包实例的物品) + * @param invoicePlanIDList + * @param tousseName + * @param tousseType + * @return + */ + private Map> getDeliverGoodsMapByInvoicePlan(List invoicePlanIDList, String tousseName, String tousseType) { + Map> result = new HashMap>(); + Collection voList = getDeliverGoodsByInvoicePlan(invoicePlanIDList, tousseName, tousseType); + for (ApplicationGoodsVo applicationGoodsVo : voList) { + Long key = applicationGoodsVo.getInvoicePlanIDList().get(0); + List tempList = result.get(key); + if(tempList == null){ + tempList = new ArrayList(); + } + tempList.add(applicationGoodsVo); + result.put(key, tempList); + } + return result; + } + + /** + * 查询待发货申请单明细(包含已经生成包实例的物品) + * @param invoicePlanIDList + * @param tousseName + * @param tousseType + * @return + */ + private Collection getDeliverGoodsByInvoicePlan(List invoicePlanIDList, String tousseName, String tousseType) { + Collection list = new ArrayList(); + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + //发货数量依据:申请单或回收单 + String invoiceOrigin = config.getInvoiceOrigin(); + //器械包发货时间 + String tousseDeliverOccasion = config.getTousseDeliverOccasion(); + + //申请单的过滤条件 + //申请单表的别名 + String invoicePlanTableAlias = "po"; + //申请单过滤公共条件(按申请单id,申请科室等),用于所有类型场景的申请单过滤条件 + String invoicePlanCommonCondition = null; + + if(CollectionUtils.isNotEmpty(invoicePlanIDList)){ + invoicePlanCommonCondition = SqlUtils.getNonStringFieldInLargeCollectionsPredicate(invoicePlanTableAlias +".id", invoicePlanIDList); + }else{ + throw new SystemException("参数invoicePlanId不能为空"); + } + + //申请项的过滤条件 + //申请项表的别名 + String tousseItemTableAlias = "ti"; + String tousseItemCondition = + buildWaitSendInvoicePlanSqlContionOnlyTousseItem(tousseType, tousseItemTableAlias , invoicePlanTableAlias, + invoiceOrigin,tousseDeliverOccasion); + + //应发货数量 + String shouldSendAmountCaseSql = + CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, + invoiceOrigin, tousseDeliverOccasion); + //数量合计语句 + String tousseItemWaitSendAmountSumSql = "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) "; + + //如果存在外来器械单的查询条件时 + if(StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_FOREIGN)){ + //数量合计语句(外来器械包) + tousseItemWaitSendAmountSumSql = "(ti.recyclingAmount - ti.sendOutAmount)"; + if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_BEFORERECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(ti.amount - ti.sendOutAmount)"; + }else if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERPRERECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(ti.amount - ti.sendOutAmount)"; + }if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERRECYCLING, config.getTousseDeliverOccasion()) ){ + tousseItemWaitSendAmountSumSql = "(ti.recyclingAmount - ti.sendOutAmount)"; + } + + } + + //查询待发货申请单的申请项 + String queryTousseItemSql = String.format( + "select "+ invoicePlanTableAlias +".id invoicePlanId," + + tousseItemTableAlias +".tousseName," + + tousseItemTableAlias +".tousseType," + + invoicePlanTableAlias +".applicationTime," + + invoicePlanTableAlias +".recyclingStatus," + + shouldSendAmountCaseSql +" amount " + + "from %s "+ tousseItemTableAlias +" " + + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " + + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " + + "and " + tousseItemTableAlias + ".tousseName = '" + tousseName + "' " + + "and " + tousseItemTableAlias + ".diposable = '" + Constants.STR_NO + "' " + + "order by "+ invoicePlanTableAlias +".applicationTime", + TousseItem.class.getSimpleName(), InvoicePlan.class.getSimpleName(), + invoicePlanCommonCondition, tousseItemCondition); + + Collection list1 = getWaitDeliverGoodsBySql(queryTousseItemSql); + if(CollectionUtils.isNotEmpty(list1)){ + list.addAll(list1); + } + + return list; + } + + /** + * 构造发货计划申请项的过滤条件(自定义器械申请单的相关过滤),无where开头 + * @param tousseTypes 物品类型,多个以逗号分隔 + * @param tousseItemTableAlias 申请项表的别名(防止多个表是同名字段时语句报错) + * @param invoicePlanTableAlias 申请单表的别名,如果不存在此参数则忽略 + * @return String 示例如下: 条件1 and 条件2 。。。 + */ + private String buildWaitSendInvoicePlanSqlContionOnlyTousseItem( + String tousseTypes, 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"); + if (StringUtils.isNotBlank(tousseTypes)) { + Set tousseTypeSet = buildTousseTypeSet(tousseTypes); + if(CollectionUtils.isNotEmpty(tousseTypeSet)){ + tousseItemCondition = String.format("%s and %s",tousseItemCondition,SqlUtils.getStringFieldInLargeCollectionsPredicate(tableColumnAliasPre +"tousseType", tousseTypeSet)); + } + } + return tousseItemCondition; + } + + /** + * 查询申请单关联的器械包实例 + * @param invoicePlanIDList + * @param tousseName + * @param tousseType + * @return + */ + private Map> getTousseInstanceVoByInvoicePlan( + List invoicePlanIDList, String tousseName, String tousseType) { + List tousseInstanceVoList = new ArrayList(); + + String invoicePlanCommonCondition = " and ((" + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIDList) + + " and tis.proxyDisinfection_id is null) or (tis.proxyDisinfection_id is not null and " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tis.proxyDisinfection_id", invoicePlanIDList) + "))"; + + String firstBarcodeSql = null; + if(dbConnection.isSqlServer()){ + firstBarcodeSql = "(select top 1 barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id) "; + } else if(dbConnection.isOracle()){ + firstBarcodeSql = "(select barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id and rownum <= 1) "; + } + + String sql = "select * from (" + + "(select ip.id invoicePlanID, ip.recyclingStatus, ti.tousseName, tis.status, bd.barcode tousseBarcode, 1 amount " + + "from InvoicePlan ip " + + "join TousseItem ti on ip.id = ti.recyclingApplication_ID " + + "join TousseInstance tis on ip.id = tis.invoicePlanID " + + "join TousseDefinition td on td.id = tis.tousseDefinition_id " + + "join TousseDefinition tdancestor on tdancestor.id = td.ancestorID " + + "join barcodeDevice bd on bd.id = tis.id " + + "where 1=1 " + + "and tdancestor.isTraceable = '是' " + + "and ti.tousseName = '" + tousseName + "' " + + "and (tdancestor.id = ti.tousseDefinitionId or td.id = ti.tousseDefinitionId )" + + "and tis.tousseFixedBarcode = 0 " + + invoicePlanCommonCondition + ")" + + "union all " + + "(select ip.id invoicePlanID, ip.recyclingStatus, ti.tousseName, tis.status, " + + firstBarcodeSql + " tousseBarcode, " + + "count(ti.id) amount " + + "from InvoicePlan ip " + + "join TousseItem ti on ip.id = ti.recyclingApplication_ID " + + "join TousseInstance tis on ip.id = tis.invoicePlanID " + + "join TousseDefinition td on td.id = tis.tousseDefinition_id " + + "join TousseDefinition tdancestor on tdancestor.id = td.ancestorID " + + "join barcodeDevice bd on bd.id = tis.id " + + "where 1=1 " + + "and tdancestor.isTraceable = '否' " + + "and ti.tousseName = '" + tousseName + "' " + + "and (tdancestor.id = ti.tousseDefinitionId or td.id = ti.tousseDefinitionId )" + + "and tis.tousseFixedBarcode = 0 " + + invoicePlanCommonCondition + + " group by ti.tousseName,tis.status, tdancestor.id, ip.id, ip.recyclingStatus)) r"; + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + ApplicationGoodsVo vo = new ApplicationGoodsVo(); + Long invoicePlanID = rs.getLong("invoicePlanID"); + String tousseName1 = rs.getString("tousseName"); + String status = rs.getString("status"); + String recyclingStatus = rs.getString("recyclingStatus"); + String tousseBarcode = rs.getString("tousseBarcode"); + int amount = rs.getInt("amount"); + vo.setBarcode(tousseBarcode); + vo.setName(tousseName1); + vo.setStatus(status); + if(StringUtils.isBlank(status)){ + vo.setStatus(recyclingStatus); + } + vo.setCount(amount); + vo.addInvoicePlanID(invoicePlanID); + tousseInstanceVoList.add(vo); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + Map> result = new HashMap>(); + if(CollectionUtils.isNotEmpty(tousseInstanceVoList)){ + tousseInstanceVoList.sort((t1, t2) -> StringUtils.compare(t1.getBarcode(), t2.getBarcode())); + for (ApplicationGoodsVo applicationGoodsVo : tousseInstanceVoList) { + Long key = applicationGoodsVo.getInvoicePlanIDList().get(0); + List tempList = result.get(key); + if(tempList == null){ + tempList = new ArrayList(); + } + tempList.add(applicationGoodsVo); + result.put(key, tempList); + } + } + + return result; + } + + /** + * 已经装配的待发货物品需要设置器械包条码 + * @param tousseInstanceVoList + * @param goodsVoList + * @return + */ + private List getTousseInstanceBarcode(List tousseInstanceVoList, List goodsVoList) { + + if(CollectionUtils.isEmpty(goodsVoList) || CollectionUtils.isEmpty(tousseInstanceVoList)){ + return goodsVoList; + } + + List result = new ArrayList(); + Map tousseInstanceGoodsAmountMap = new HashMap(); + if(CollectionUtils.isNotEmpty(tousseInstanceVoList)){ + result.addAll(tousseInstanceVoList); + for (ApplicationGoodsVo applicationGoodsVo : tousseInstanceVoList) { + Integer amount = tousseInstanceGoodsAmountMap.get(applicationGoodsVo.getName()); + amount = (amount == null ? 0 : amount); + tousseInstanceGoodsAmountMap.put(applicationGoodsVo.getName(), amount + applicationGoodsVo.getCount()); + } + } + + for (ApplicationGoodsVo applicationGoodsVo : goodsVoList) { + String nameKey = applicationGoodsVo.getName(); + Integer amount = tousseInstanceGoodsAmountMap.get(nameKey); + if(amount != null){ + if(amount < applicationGoodsVo.getCount()){ + applicationGoodsVo.setCount(applicationGoodsVo.getCount() - amount); + result.add(applicationGoodsVo); + } + }else{ + result.add(applicationGoodsVo); + } + } + + return result; + } + + /** + * sql语句查询ApplicationGoodsVo + * @param queryTousseItemSql + * @return + */ + private Collection getWaitDeliverGoodsBySql(String queryTousseItemSql) { + logger.debug("getWaitDeliverGoodsBySql queryTousseItemSql:"+queryTousseItemSql); + List> list = jdbcTemplate.queryForList(queryTousseItemSql); + Collection result = null; + if(CollectionUtils.isNotEmpty(list)){ + result = new ArrayList(); + for (Map map : list) { + ApplicationGoodsVo vo = new ApplicationGoodsVo(); + String tousseName = (String)map.get("tousseName"); + String tousseType = (String)map.get("tousseType"); + vo.setName(tousseName); + vo.setShowTousseName(tousseName); + vo.setGoodsType(tousseType); + //待发货数量 + Number amount = (Number)map.get("amount"); + if(amount != null){ + vo.setCount(vo.getCount() + amount.intValue()); + vo.setApplicationAmount(vo.getApplicationAmount() + amount.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.setApplicationDateTime(applicationTime); + } + String recyclingStatus = (String)map.get("recyclingStatus"); + vo.setStatus(recyclingStatus); + if(map.get("WashAndDisinfectRecord_ID") != null){ + vo.setStatus("已清洗"); + } + result.add(vo); + } + } + return result; + } + + /** + * 查询ApplicationGoodsVo + * @param sql + */ + private List getApplicationGoodsVoBySql(String sql) { + List goodsVoList = new ArrayList(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + ApplicationGoodsVo vo = new ApplicationGoodsVo(); + String tousseName = rs.getString("tousseName"); + String status = rs.getString("status"); + String tousseBarcode = rs.getString("tousseBarcode"); + int amount = rs.getInt("amount"); + vo.setBarcode(tousseBarcode); + vo.setName(tousseName); + vo.setStatus(status); + vo.setCount(amount); + goodsVoList.add(vo); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return goodsVoList; + } + } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java =================================================================== diff -u -r33636 -r33662 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33636) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33662) @@ -1,6 +1,5 @@ package com.forgon.disinfectsystem.recyclingapplication.service; -import java.math.BigDecimal; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -11,6 +10,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -38,8 +38,6 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; -import com.forgon.disinfectsystem.entity.becleanitem.ClassifiedItem; -import com.forgon.disinfectsystem.entity.becleanitem.ClassifyBasket; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.invoicemanager.enums.BorrowConfirmStatus; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; @@ -1458,477 +1456,7 @@ } return invoicePlanArray; } - - @Override - public JSONArray getWaitDeliverInvoicePlanDetailByIDAndTousseName(String invoicePlanIDs, String tousseType, String tousseName) { - - List invoicePlanIDList = null; - if(StringUtils.isNotBlank(invoicePlanIDs)){ - String[] tempIDs = StringUtils.split(invoicePlanIDs, ';'); - invoicePlanIDList = Arrays.asList(tempIDs); - } - - //外来器械包拆分小包,直接查询包实例 - if(StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_SPLIT)){ - return buildForeignTousseSplitVoJSONArray(invoicePlanIDList, tousseName); - } - - String querySql = String.format("select id,type,serialNumber, departCoding, applicationTime, applicant from %s po where 1=1 and %s order by applicationTime", InvoicePlan.class.getSimpleName() , SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoicePlanIDList)); - List> list = jdbcTemplate.queryForList(querySql); - JSONArray invoicePlanArray = new JSONArray(); - if(CollectionUtils.isNotEmpty(list)){ - //查询申请单上的待发货物品(包含已经生成器械包实例的数量) - Map> invoicePlanIDToGoodsVoMap = getWaitDeliverGoodsMapByInvoicePlan(invoicePlanIDList, tousseName, tousseType); - //查询申请单上的待发货物品(只查询已经生成器械包实例的数量) - Map> invoicePlanIDToTousseInstanceVoMap = getWaitDeliverTousseInstanceVoByInvoicePlan(invoicePlanIDList, tousseName, tousseType); - - for (Map map : list) { - - Long invoicePlanID = ((BigDecimal) map.get("id")).longValue(); - int count = 0; - Object applicationTime = map.get("applicationTime"); - String applicationTimeStr = ""; - if(applicationTime != null){ - applicationTimeStr = DateTools.getFormatDateStr((Date)applicationTime, DateTools.COMMON_DATE_HMS); - } - JSONObject invoicePlanTemp = new JSONObject(); - invoicePlanTemp.put("id", map.get("id")); - invoicePlanTemp.put("serialNumber", map.get("serialNumber")); - invoicePlanTemp.put("applicationTime", applicationTimeStr); - invoicePlanTemp.put("uiProvider", "col"); - invoicePlanTemp.put("cls", "master-task"); - invoicePlanTemp.put("iconCls", "task-folder"); - String type = (String)map.get("type"); - invoicePlanTemp.put("invoicePlanType", type); - String applicant = (String)map.get("applicant"); - if(StringUtils.equals(applicant, "退货重发")){ - //退货重发的申请单(根据申请人判断,申请人为“退货重发”的申请单),申请单类型显示为“退货重发” - invoicePlanTemp.put("invoicePlanType", applicant); - } - - List goodsVoList = new ArrayList(); - - if(StringUtils.isNotBlank(tousseName)){ - //查询申请单上的待发货物品 - List goodsVoCollection = invoicePlanIDToGoodsVoMap.get(invoicePlanID); - //已经装配产生包实例的待发货物品 - List tousseInstanceVoCollection = invoicePlanIDToTousseInstanceVoMap.get(invoicePlanID); - - if(CollectionUtils.isEmpty(goodsVoCollection)){ - continue; - } - - Collection tempVoCollection = getTousseInstanceBarcode(tousseInstanceVoCollection, goodsVoCollection); - if(CollectionUtils.isNotEmpty(tempVoCollection)){ - goodsVoList.addAll(tempVoCollection); - for (ApplicationGoodsVo applicationGoodsVo : tempVoCollection) { - count += applicationGoodsVo.getCount(); - } - } - } - invoicePlanTemp.put("count", count); - invoicePlanTemp.put("children", goodsVoList); - invoicePlanArray.add(invoicePlanTemp); - } - } - return invoicePlanArray; - } - - private Map> getWaitDeliverTousseInstanceVoByInvoicePlan( - List invoicePlanIDList, String tousseName, String tousseType) { - List tousseInstanceVoList = new ArrayList(); - - String invoicePlanCommonCondition = " and ((" + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ip.id", invoicePlanIDList) - + " and tis.proxyDisinfection_id is null) or (tis.proxyDisinfection_id is not null and " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("tis.proxyDisinfection_id", invoicePlanIDList) + "))"; - - String firstBarcodeSql = null; - if(dbConnection.isSqlServer()){ - firstBarcodeSql = "(select top 1 barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id) "; - } else if(dbConnection.isOracle()){ - firstBarcodeSql = "(select barcode from TousseInstance ti1 join barcodeDevice b1 on b1.id=ti1.id where ti1.tousseFixedBarcode=1 and ti1.tousseDefinition_id=tdancestor.id and rownum <= 1) "; - } - - String tousseInstanceStatusCondition = String.format("%s", - SqlUtils.getStringFieldInLargeCollectionsPredicate("tis.status", - Arrays.asList(new String[]{ - TousseInstance.STATUS_PACKED, - TousseInstance.STATUS_REVIEWED, - TousseInstance.STATUS_STERILING, - TousseInstance.STATUS_DELAY_CONFIRM, - TousseInstance.STATUS_STERILED, - TousseInstance.STATUS_DISINFECTED - }))); - - String sql = "select * from (" - + "(select ip.id invoicePlanID, ip.recyclingStatus, ti.tousseName, tis.status, bd.barcode tousseBarcode, 1 amount " - + "from InvoicePlan ip " - + "join TousseItem ti on ip.id = ti.recyclingApplication_ID " - + "join TousseInstance tis on ip.id = tis.invoicePlanID " - + "join TousseDefinition td on td.id = tis.tousseDefinition_id " - + "join TousseDefinition tdancestor on tdancestor.id = td.ancestorID " - + "join barcodeDevice bd on bd.id = tis.id " - + "where 1=1 " - + "and tdancestor.isTraceable = '是' " - //+ "and " + tousseInstanceStatusCondition - + "and ti.tousseName = '" + tousseName + "' " - + "and (tdancestor.id = ti.tousseDefinitionId or td.id = ti.tousseDefinitionId )" - + "and tis.tousseFixedBarcode = 0 " - //+ "and tis.invoice_id is null and tis.invoice2_id is null " - + invoicePlanCommonCondition + " )" - + "union all " - + "(select ip.id invoicePlanID, ip.recyclingStatus, ti.tousseName, tis.status, " - + firstBarcodeSql + " tousseBarcode, " - + "count(ti.id) amount " - + "from InvoicePlan ip " - + "join TousseItem ti on ip.id = ti.recyclingApplication_ID " - + "join TousseInstance tis on ip.id = tis.invoicePlanID " - + "join TousseDefinition td on td.id = tis.tousseDefinition_id " - + "join TousseDefinition tdancestor on tdancestor.id = td.ancestorID " - + "join barcodeDevice bd on bd.id = tis.id " - + "where 1=1 " - + "and tdancestor.isTraceable = '否' " - //+ "and " + tousseInstanceStatusCondition - + "and ti.tousseName = '" + tousseName + "' " - + "and (tdancestor.id = ti.tousseDefinitionId or td.id = ti.tousseDefinitionId )" - + "and tis.tousseFixedBarcode = 0 " - //+ "and tis.invoice_id is null and tis.invoice2_id is null " - + invoicePlanCommonCondition - + " group by ti.tousseName,tis.status, tdancestor.id, ip.id, ip.recyclingStatus)) r"; - ResultSet rs = null; - try { - rs = objectDao.executeSql(sql); - while(rs.next()){ - ApplicationGoodsVo vo = new ApplicationGoodsVo(); - Long invoicePlanID = rs.getLong("invoicePlanID"); - String tousseName1 = rs.getString("tousseName"); - String status = rs.getString("status"); - String recyclingStatus = rs.getString("recyclingStatus"); - String tousseBarcode = rs.getString("tousseBarcode"); - int amount = rs.getInt("amount"); - vo.setBarcode(tousseBarcode); - vo.setName(tousseName1); - vo.setStatus(status); - if(StringUtils.isBlank(status)){ - vo.setStatus(recyclingStatus); - } - vo.setCount(amount); - vo.addInvoicePlanID(invoicePlanID); - tousseInstanceVoList.add(vo); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - - Map> result = new HashMap>(); - if(CollectionUtils.isNotEmpty(tousseInstanceVoList)){ - for (ApplicationGoodsVo applicationGoodsVo : tousseInstanceVoList) { - Long key = applicationGoodsVo.getInvoicePlanIDList().get(0); - List tempList = result.get(key); - if(tempList == null){ - tempList = new ArrayList(); - } - tempList.add(applicationGoodsVo); - result.put(key, tempList); - } - } - - return result; - } - - - /** - * "外来器械拆分小包"直接查器械包实例 - * @param list - * @param tousseName - * @return - */ - private JSONArray buildForeignTousseSplitVoJSONArray(List invoicePlanIDList, String tousseName) { - JSONArray invoicePlanArray = new JSONArray(); - String querySql = String.format("select id,type,serialNumber, departCoding, applicationTime from %s po where 1=1 and %s order by applicationTime", InvoicePlan.class.getSimpleName() , SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoicePlanIDList)); - List> list = jdbcTemplate.queryForList(querySql); - for (Map map : list) { - Long invoicePlanID = ((BigDecimal) map.get("id")).longValue(); - int count = 0; - Object applicationTime = map.get("applicationTime"); - String applicationTimeStr = ""; - if(applicationTime != null){ - applicationTimeStr = DateTools.getFormatDateStr((Date)applicationTime, DateTools.COMMON_DATE_HMS); - } - JSONObject invoicePlanTemp = new JSONObject(); - invoicePlanTemp.put("id", map.get("id")); - invoicePlanTemp.put("serialNumber", map.get("serialNumber")); - invoicePlanTemp.put("applicationTime", applicationTimeStr); - invoicePlanTemp.put("uiProvider", "col"); - invoicePlanTemp.put("cls", "master-task"); - invoicePlanTemp.put("iconCls", "task-folder"); - List goodsVoList = new ArrayList(); - - if(StringUtils.isNotBlank(tousseName)){ - //查询发货前的状态的器械包实例 - String tousseInstanceStatusCondition = String.format("%s", - SqlUtils.getStringFieldInLargeCollectionsPredicate("tis.status", - Arrays.asList(new String[]{ - TousseInstance.STATUS_PACKED, - TousseInstance.STATUS_REVIEWED, - TousseInstance.STATUS_STERILING, - TousseInstance.STATUS_DELAY_CONFIRM, - TousseInstance.STATUS_STERILED, - TousseInstance.STATUS_DISINFECTED - }))); - //拆分小包直接查包实例状态 - String sql = "select tis.tousseName, tis.status, bd.barcode tousseBarcode, 1 amount " - + "from TousseInstance tis " - + "join barcodeDevice bd on bd.id = tis.id " - + "join TousseDefinition td on td.id = tis.tousseDefinition_id " - + "where 1=1 " - //+ "and " + tousseInstanceStatusCondition - + "and tis.invoicePlanID = " + invoicePlanID - +" and td.tousseType = '" + TousseDefinition.PACKAGE_TYPE_SPLIT + "' " - + "and td.name = '" + tousseName + "'"; - - List voList = getApplicationGoodsVoBySql(sql); - goodsVoList.addAll(voList); - if(CollectionUtils.isNotEmpty(voList)){ - for (ApplicationGoodsVo applicationGoodsVo : voList) { - count += applicationGoodsVo.getCount(); - } - } - invoicePlanTemp.put("count", count); - invoicePlanTemp.put("children", goodsVoList); - invoicePlanArray.add(invoicePlanTemp); - } - } - return invoicePlanArray; - } - - /** - * 查询待发货物品的申请单明细(包含已经生成包实例的物品) - * @param invoicePlanIDList - * @param tousseName - * @param tousseType - * @return - */ - private Map> getWaitDeliverGoodsMapByInvoicePlan(List invoicePlanIDList, String tousseName, String tousseType) { - Map> result = new HashMap>(); - Collection voList = getWaitDeliverGoodsByInvoicePlan(invoicePlanIDList, tousseName, tousseType); - for (ApplicationGoodsVo applicationGoodsVo : voList) { - Long key = applicationGoodsVo.getInvoicePlanIDList().get(0); - List tempList = result.get(key); - if(tempList == null){ - tempList = new ArrayList(); - } - tempList.add(applicationGoodsVo); - result.put(key, tempList); - } - return result; - } - - /** - * 查询待发货物品的申请单明细(包含已经生成包实例的物品) - * @param invoicePlanIDList - * @param tousseName - * @param tousseType - * @return - */ - public Collection getWaitDeliverGoodsByInvoicePlan(List invoicePlanIDList, String tousseName, String tousseType) { - Collection list = new ArrayList(); - SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); - //发货数量依据:申请单或回收单 - String invoiceOrigin = config.getInvoiceOrigin(); - //器械包发货时间 - String tousseDeliverOccasion = config.getTousseDeliverOccasion(); - - //申请单的过滤条件 - //申请单表的别名 - String invoicePlanTableAlias = "po"; - //申请单过滤公共条件(按申请单id,申请科室等),用于所有类型场景的申请单过滤条件 - String invoicePlanCommonCondition = null; - - if(CollectionUtils.isNotEmpty(invoicePlanIDList)){ - invoicePlanCommonCondition = SqlUtils.getNonStringFieldInLargeCollectionsPredicate(invoicePlanTableAlias +".id", invoicePlanIDList); - }else{ - throw new SystemException("参数invoicePlanId不能为空"); - } - - //申请项的过滤条件 - //申请项表的别名 - String tousseItemTableAlias = "ti"; - String tousseItemCondition = - buildWaitSendInvoicePlanSqlContionOnlyTousseItem(tousseType, null, - null, null , tousseItemTableAlias , invoicePlanTableAlias, - invoiceOrigin,tousseDeliverOccasion); - - //清洗篮筐物品的过滤条件,用于判断物品是否清洗 - String classifiedItemTableAlias = "ci"; - String classifiedItemCondition = " " + classifiedItemTableAlias + ".invoicePlanId="+ invoicePlanTableAlias +".id and (case when " + classifiedItemTableAlias + ".itemType = '器械包' then " + classifiedItemTableAlias + ".tousseDefinitionID else " + classifiedItemTableAlias + ".toussedefinition_id end) = " + tousseItemTableAlias + ".tousseDefinitionId "; - //清洗篮筐实例的过滤条件,用于判断物品是否清洗 - String classifyBasketTableAlias = "cb"; - - //应发货数量 - String shouldSendAmountCaseSql = - CssdUtils.buildTousseItemShouldDeliverAmountSql(invoicePlanTableAlias, tousseItemTableAlias, - invoiceOrigin, tousseDeliverOccasion); - //数量合计语句 - String tousseItemWaitSendAmountSumSql = "(" + shouldSendAmountCaseSql +" - "+ tousseItemTableAlias +".sendoutAmount) "; - - //如果存在外来器械单的查询条件时 - if(StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_FOREIGN)){ - //数量合计语句(外来器械包) - tousseItemWaitSendAmountSumSql = "(ti.recyclingAmount - ti.sendOutAmount)"; - if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_BEFORERECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(ti.amount - ti.sendOutAmount)"; - }else if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERPRERECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(ti.amount - ti.sendOutAmount)"; - }if(StringUtils.equals(SupplyRoomConfig.TOUSSEDELIVEROCCASION_AFTERRECYCLING, config.getTousseDeliverOccasion()) ){ - tousseItemWaitSendAmountSumSql = "(ti.recyclingAmount - ti.sendOutAmount)"; - } - - } - - //查询待发货申请单的申请项 - String queryTousseItemSql = String.format( - "select "+ invoicePlanTableAlias +".id invoicePlanId," - + tousseItemTableAlias +".tousseName," - + tousseItemTableAlias +".tousseType," - + invoicePlanTableAlias +".applicationTime," - + invoicePlanTableAlias +".recyclingStatus," - //+ "cw.washAndDisinfectRecord_ID," - + shouldSendAmountCaseSql +" amount " - + "from %s "+ tousseItemTableAlias +" " - + "join %s "+ invoicePlanTableAlias +" on "+ tousseItemTableAlias +".recyclingApplication_ID="+ invoicePlanTableAlias +".id " - //+ "left join %s " + classifiedItemTableAlias + " on " + classifiedItemCondition - //+ "left join %s " + classifyBasketTableAlias + " on " + classifyBasketTableAlias + ".id="+ classifiedItemTableAlias +".classifybasket_id " - //+ "left join ClassifyBasket_WashRecord cw on cw.ClassifyBasket_ID = " + classifyBasketTableAlias + ".id " - + "where %s and %s and " + tousseItemWaitSendAmountSumSql +" > 0 " - + "and " + tousseItemTableAlias + ".tousseName = '" + tousseName + "' " - + "and " + tousseItemTableAlias + ".diposable = '" + Constants.STR_NO + "' " - //+ "group by po.id,ti.tousseName,ti.tousseType,po.applicationTime,po.recyclingStatus,cw.washAndDisinfectRecord_ID,ti.amount,ti.sendOutAmount " - //+ ",po.type,ti.invoiceAmountMode,ti.recyclingAmount, ti.invoiceAmountMode,ti.isRecycling,ti.prepareRecycleAmount,ti.tallyAmount,ci.amount " - + "order by "+ invoicePlanTableAlias +".applicationTime", - TousseItem.class.getSimpleName(), InvoicePlan.class.getSimpleName(), - //ClassifiedItem.class.getSimpleName(), ClassifyBasket.class.getSimpleName(), - invoicePlanCommonCondition, tousseItemCondition); - - Collection list1 = getWaitDeliverGoodsBySql(queryTousseItemSql); - if(CollectionUtils.isNotEmpty(list1)){ - list.addAll(list1); - } - - return list; - } - - /** - * sql语句查询ApplicationGoodsVo - * @param queryTousseItemSql - * @return - */ - private Collection getWaitDeliverGoodsBySql(String queryTousseItemSql) { - logger.debug("getWaitDeliverGoodsBySql queryTousseItemSql:"+queryTousseItemSql); - List> list = jdbcTemplate.queryForList(queryTousseItemSql); - Collection result = null; - if(CollectionUtils.isNotEmpty(list)){ - result = new ArrayList(); - for (Map map : list) { - ApplicationGoodsVo vo = new ApplicationGoodsVo(); - String tousseName = (String)map.get("tousseName"); - String tousseType = (String)map.get("tousseType"); - vo.setName(tousseName); - vo.setShowTousseName(tousseName); - vo.setGoodsType(tousseType); - //待发货数量 - Number amount = (Number)map.get("amount"); - if(amount != null){ - vo.setCount(vo.getCount() + amount.intValue()); - vo.setApplicationAmount(vo.getApplicationAmount() + amount.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.setApplicationDateTime(applicationTime); - } - String recyclingStatus = (String)map.get("recyclingStatus"); - vo.setStatus(recyclingStatus); - if(map.get("WashAndDisinfectRecord_ID") != null){ - vo.setStatus("已清洗"); - } - result.add(vo); - } - } - return result; - } - - private List getApplicationGoodsVoBySql(String sql) { - List goodsVoList = new ArrayList(); - ResultSet rs = null; - try { - rs = objectDao.executeSql(sql); - while(rs.next()){ - ApplicationGoodsVo vo = new ApplicationGoodsVo(); - String tousseName = rs.getString("tousseName"); - String status = rs.getString("status"); - String tousseBarcode = rs.getString("tousseBarcode"); - int amount = rs.getInt("amount"); - vo.setBarcode(tousseBarcode); - vo.setName(tousseName); - vo.setStatus(status); - vo.setCount(amount); - goodsVoList.add(vo); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - return goodsVoList; - } - - /** - * 已经装配的待发货物品需要设置器械包条码 - * @param tousseInstanceVoList - * @param goodsVoList - * @return - */ - private List getTousseInstanceBarcode(List tousseInstanceVoList, List goodsVoList) { - - if(CollectionUtils.isEmpty(goodsVoList) || CollectionUtils.isEmpty(tousseInstanceVoList)){ - return goodsVoList; - } - - List result = new ArrayList(); - Map tousseInstanceGoodsAmountMap = new HashMap(); - if(CollectionUtils.isNotEmpty(tousseInstanceVoList)){ - result.addAll(tousseInstanceVoList); - for (ApplicationGoodsVo applicationGoodsVo : tousseInstanceVoList) { - Integer amount = tousseInstanceGoodsAmountMap.get(applicationGoodsVo.getName()); - amount = (amount == null ? 0 : amount); - tousseInstanceGoodsAmountMap.put(applicationGoodsVo.getName(), amount + applicationGoodsVo.getCount()); - } - } - - for (ApplicationGoodsVo applicationGoodsVo : goodsVoList) { - String nameKey = applicationGoodsVo.getName(); - Integer amount = tousseInstanceGoodsAmountMap.get(nameKey); - if(amount != null){ - if(amount < applicationGoodsVo.getCount()){ - applicationGoodsVo.setCount(applicationGoodsVo.getCount() - amount); - result.add(applicationGoodsVo); - } - }else{ - result.add(applicationGoodsVo); - } - } - - return result; - } - private void addApplicationGoodsVoStatus( Collection list, String departCoding) { if(CollectionUtils.isNotEmpty(list)){