Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r33314 -r33575 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33314) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 33575) @@ -4464,5 +4464,11 @@ } return result; } + + @Override + public JSONArray getWaitDeliverInvoicePlanDetailByIDAndTousseName(String invoicePlanIDs, String tousseType, String tousseName) { + // TODO Auto-generated method stub + return null; + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java =================================================================== diff -u -r33064 -r33575 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java (.../ApplicationGoodsVo.java) (revision 33064) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java (.../ApplicationGoodsVo.java) (revision 33575) @@ -3,6 +3,7 @@ */ package com.forgon.disinfectsystem.recyclingapplication.vo; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -119,6 +120,23 @@ * 整箱申请数量GYEY-761 */ private Integer fullCaseApplicationAmount; + + /** + * 器械包条码或者固定条码 + */ + private String barcode; + + /** + * 申请时间 + */ + private Date applicationDateTime; + + /** + * 前台列表点+展开下级节点时,需要的参数 + */ + private String uiProvider = "col"; + private String leaf = "true"; + private String iconCls = "task"; public boolean isBeforeToday() { return beforeToday; @@ -385,6 +403,22 @@ this.fullCaseApplicationAmount = fullCaseApplicationAmount; } + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public Date getApplicationDateTime() { + return applicationDateTime; + } + + public void setApplicationDateTime(Date applicationDateTime) { + this.applicationDateTime = applicationDateTime; + } + /** * 紧急程度grade最高的排前面 */ @@ -399,4 +433,28 @@ } return 0; } + + public String getUiProvider() { + return uiProvider; + } + + public void setUiProvider(String uiProvider) { + this.uiProvider = uiProvider; + } + + public String getLeaf() { + return leaf; + } + + public void setLeaf(String leaf) { + this.leaf = leaf; + } + + public String getIconCls() { + return iconCls; + } + + public void setIconCls(String iconCls) { + this.iconCls = iconCls; + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java =================================================================== diff -u -r33323 -r33575 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33323) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanOptimizeManagerImpl.java (.../InvoicePlanOptimizeManagerImpl.java) (revision 33575) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.recyclingapplication.service; +import java.math.BigDecimal; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -10,7 +11,6 @@ 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,6 +38,8 @@ 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; @@ -1456,7 +1458,461 @@ } 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 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"); + 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 + "'" + + 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 + "'" + + 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," + + tousseItemWaitSendAmountSumSql +" 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 " + + "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 tousseInstanceGoodsMap = new HashMap(); + for (ApplicationGoodsVo applicationGoodsVo : tousseInstanceVoList) { + tousseInstanceGoodsMap.put(applicationGoodsVo.getName(), applicationGoodsVo); + } + + for (ApplicationGoodsVo applicationGoodsVo : goodsVoList) { + String nameKey = applicationGoodsVo.getName(); + ApplicationGoodsVo tousseInstanceGoodsVo = tousseInstanceGoodsMap.get(nameKey); + if(tousseInstanceGoodsVo != null){ + if(tousseInstanceGoodsVo.getCount() + == applicationGoodsVo.getCount()){ + result.add(tousseInstanceGoodsVo); + }else{ + applicationGoodsVo.setCount(applicationGoodsVo.getCount() - tousseInstanceGoodsVo.getCount()); + result.add(applicationGoodsVo); + result.add(tousseInstanceGoodsVo); + } + } + } + + return result; + } + private void addApplicationGoodsVoStatus( Collection list, String departCoding) { if(CollectionUtils.isNotEmpty(list)){ @@ -1529,6 +1985,8 @@ boolean tousseTypeApplyToInvoiceForm = CssdUtils.getSystemSetConfigByNameBool("invoicePlanExtractedView_TousseTypeApplyToInvoiceForm", false); //发货界面使用简称:物品名称的提示(如果启用则将一次性物品ttsName也一同查出) boolean invoicePlanExtractedForm_useTtsName = CssdUtils.getSystemSetConfigByNameBool("invoicePlanExtractedForm_useTtsName"); + //开启显示待发货物品的来源信息功能(如果开启,则统计物品时,也要查申请单ID) + boolean enableShowToSendGoodsSourcesInfo = CssdUtils.getSystemSetConfigByNameBool("enableShowToSendGoodsSourcesInfo", false); //申请单的过滤条件 //申请单表的别名 @@ -1916,6 +2374,26 @@ DisposableGoods.class.getSimpleName() ,invoicePlanCommonGoodsCondition , tousseItemCommonGoodsExcludeDisinfectGoodsCondition , TousseItem.TYPE_DIPOSABLE_GOODS); commonGoodsButNotDisinfectGoodsApplicationGoodsVoList = getWaitDeliverGoodsForCommonGoodsButNotDisinfectGoods(queryNotDisinfectTousseItemSql); + if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) + && enableShowToSendGoodsSourcesInfo){ + if(!DatabaseUtil.isPoIdValid(invoicePlanId)){ + //查询物品关联的申请单ID + String queryNotDisinfectTousseItemInvoicePlanIDSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanID, tousseName " + + "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(), + invoicePlanCommonGoodsCondition , + tousseItemCommonGoodsExcludeDisinfectGoodsCondition); + queryTousseItemInvoicePlanID(queryNotDisinfectTousseItemInvoicePlanIDSql, commonGoodsButNotDisinfectGoodsApplicationGoodsVoList); + }else{ + List invoicePlanIDList = new ArrayList(); + invoicePlanIDList.add(invoicePlanId); + for (ApplicationGoodsVo vo : commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) { + vo.setInvoicePlanIDList(invoicePlanIDList); + } + } + } //1.常规物品不为空但代理灭菌单物品为空时 if(CollectionUtils.isNotEmpty(commonGoodsButNotDisinfectGoodsApplicationGoodsVoList) && CollectionUtils.isEmpty(proxyDisinfectionApplicationGoodsVoList)){ //所有的器械包(敷料包)的名称的集合 @@ -2002,6 +2480,26 @@ TousseDefinition.class.getSimpleName() ,invoicePlanCommonGoodsCondition , tousseItemDisinfectGoodsCondition); Collection list2 = getWaitDeliverGoodsForDisinfectGoods(queryDisinfectTousseItemSql); + if(CollectionUtils.isNotEmpty(list2) + && enableShowToSendGoodsSourcesInfo){ + if(!DatabaseUtil.isPoIdValid(invoicePlanId)){ + //查询物品关联的申请单ID + String queryDisinfectTousseItemInvoicePlanIDSql = String.format("select "+ invoicePlanTableAlias +".id invoicePlanID, tousseName " + + "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(), + invoicePlanCommonGoodsCondition , + tousseItemDisinfectGoodsCondition); + queryTousseItemInvoicePlanID(queryDisinfectTousseItemInvoicePlanIDSql, list2); + }else{ + List invoicePlanIDList = new ArrayList(); + invoicePlanIDList.add(invoicePlanId); + for (ApplicationGoodsVo vo : list2) { + vo.setInvoicePlanIDList(invoicePlanIDList); + } + } + } if(CollectionUtils.isNotEmpty(list2)){ //所有的消毒物品的名称的集合 List tousseNameList = list2.stream().filter(ti -> { @@ -2248,6 +2746,41 @@ } /** + * 查询物品关联的申请单ID + * @param sql + * @param applicationGoodsVoList + */ + private void queryTousseItemInvoicePlanID(String sql, + Collection applicationGoodsVoList) { + if(CollectionUtils.isEmpty(applicationGoodsVoList) || StringUtils.isBlank(sql)){ + return; + } + List> list = jdbcTemplate.queryForList(sql); + if(CollectionUtils.isNotEmpty(list)){ + Map> tousseNameToInvoicePlanIDMap = new HashMap>(); + for (Map map : list) { + String tousseName = (String)map.get("tousseName"); + Number invoicePlanIdNumber = (Number)map.get("invoicePlanId"); + if(invoicePlanIdNumber != null){ + List invoicePlanIDList = tousseNameToInvoicePlanIDMap.get(tousseName); + if(invoicePlanIDList == null){ + invoicePlanIDList = new ArrayList(); + } + invoicePlanIDList.add(invoicePlanIdNumber.longValue()); + tousseNameToInvoicePlanIDMap.put(tousseName, invoicePlanIDList); + } + } + if(MapUtils.isNotEmpty(tousseNameToInvoicePlanIDMap)){ + for (ApplicationGoodsVo vo : applicationGoodsVoList) { + String tousseName = vo.getName(); + List invoicePlanIDList = tousseNameToInvoicePlanIDMap.get(tousseName); + vo.setInvoicePlanIDList(invoicePlanIDList); + } + } + } + } + + /** * 发货计划:外来器械申请单的待发货物品查询 * @param invoicePlanId * @param orgUnitCoding Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java =================================================================== diff -u -r28684 -r33575 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java (.../InvoicePlanAction.java) (revision 28684) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java (.../InvoicePlanAction.java) (revision 33575) @@ -499,6 +499,26 @@ .getInvoicePlansByOrgAndTousseType(departCodeList,applyDate ,tousseTypes,disposableGoodsType,sterilingMethods,tousseGroupIds,appFormType); StrutsResponseUtils.output(jsonArray); } + + /** + * 查询待发货物品关联的申请单流水号及待发货物品的状态和数量 + */ + public void getWaitDeliverInvoicePlanDetailByIDAndTousseName() { + //待发货物品名称 + String tousseName = StrutsParamUtils.getPraramValue("tousseName", ""); + //待发货物品关联的申请单ID(1;2;3) + String invoicePlanIDs = StrutsParamUtils.getPraramValue("invoicePlanIDs", ""); + String tousseType = null; + try { + //待发货物品类型(器械包、消毒物品、外来器械包等) + tousseType = URLDecoder.decode(StrutsParamUtils.getPraramValue("tousseType", ""),"utf-8"); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + JSONArray jsonArray = invoicePlanOptimizeManager + .getWaitDeliverInvoicePlanDetailByIDAndTousseName(invoicePlanIDs, tousseType, tousseName); + StrutsResponseUtils.output(jsonArray); + } /** * 按条件加载科室申请的所有物品 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java =================================================================== diff -u -r33163 -r33575 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 33163) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 33575) @@ -470,4 +470,13 @@ * @return */ public String valideApplication(InvoicePlan recyclingApplication, Integer oldVersion, boolean isInterfereAmount); + + /** + * 发货计划新增功能【待发货物品来源】,可查看【物品状态】、【条码】、【申请时间】、【单号】 + * @param invoicePlanIDs 申请单ID集合(1;2;3) + * @param tousseType 器械包类型 + * @param tousseName 物品名称 + * @return + */ + public JSONArray getWaitDeliverInvoicePlanDetailByIDAndTousseName(String invoicePlanIDs, String tousseType, String tousseName); }