Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseInstanceVO.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseInstanceVO.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseInstanceVO.java (revision 16675) @@ -0,0 +1,88 @@ +package com.forgon.disinfectsystem.entity.recall; + +/** + * 统计待召回的器械包实例信息 + * @author shuyongfu + * @since 2017-01-05 + */ +public class RecallTousseInstanceVO { + + /** + * 条码 + */ + private String barcode; + + /** + * 器械包实例id + */ + private Long tousseInstanceId; + + /** + * 数量(默认为1) + */ + private int tousseAmount = 1; + + /** + * 状态 + */ + private String status; + + /** + * 灭菌完成时间 + */ + private String sterileEndTime; + + /** + * 灭菌炉次 + */ + private String sterileFrequency; + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSterileEndTime() { + return sterileEndTime; + } + + public void setSterileEndTime(String sterileEndTime) { + this.sterileEndTime = sterileEndTime; + } + + public String getSterileFrequency() { + return sterileFrequency; + } + + public void setSterileFrequency(String sterileFrequency) { + this.sterileFrequency = sterileFrequency; + } + + public Long getTousseInstanceId() { + return tousseInstanceId; + } + + public void setTousseInstanceId(Long tousseInstanceId) { + this.tousseInstanceId = tousseInstanceId; + } + + public int getTousseAmount() { + return tousseAmount; + } + + public void setTousseAmount(int tousseAmount) { + this.tousseAmount = tousseAmount; + } + +} Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java =================================================================== diff -u -r14304 -r16675 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java (.../RecallRecordAction.java) (revision 14304) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/action/RecallRecordAction.java (.../RecallRecordAction.java) (revision 16675) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.recall.action; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -10,9 +11,17 @@ import java.util.List; import java.util.Map; +import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import jxl.Workbook; +import jxl.write.Label; +import jxl.write.WritableCellFormat; +import jxl.write.WritableFont; +import jxl.write.WritableSheet; +import jxl.write.WritableWorkbook; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; @@ -23,6 +32,8 @@ import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; +import com.forgon.tools.Constants; +import com.forgon.tools.StrutsResponseUtils; import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.service.OrgUnitManager; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; @@ -175,12 +186,12 @@ } JSONArray jsonArray = JSONArray.fromObject(treeInfo); String msg = "保存成功"; - HttpServletResponse response = StrutsParamUtils.getResponse(); recallRecordManager.saveOrUpdate( jsonArray, recallRecord); - response.setCharacterEncoding("UTF-8"); - response.getWriter().print("{success:true,msg:'" + msg + "'}"); - response.getWriter().close(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("success" , true); + jsonObject.put("msg" , msg); + StrutsResponseUtils.output(jsonObject); } catch (Exception e) { e.printStackTrace(); } @@ -305,7 +316,139 @@ e.printStackTrace(); } } + + /** + * 导出待召回的记录 + * 请求参数如下: + * sterilizerName 灭菌炉 + * startDate + * endDate + * sterilizingFrequency_start + * sterilizingFrequency_end + */ + public void exportWaitRecallTousseInstanceInfo() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + String fileName = "器械包召回记录.xls"; + ServletOutputStream servletOutputStream = response + .getOutputStream(); + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", "attachment;filename=" + + new String(fileName.getBytes(Constants.CHARSET_GBK), Constants.CHARSET_ISO)); + String sterilizerName = StrutsParamUtils.getPraramValue("sterilizerName", ""); + String sterilizationStartDate = StrutsParamUtils.getPraramValue("startDate", ""); + String sterilizationEndDate = StrutsParamUtils.getPraramValue("endDate", ""); + String sterilizingFrequency_start = StrutsParamUtils.getPraramValue( + "sterilizingFrequency_start", ""); + String sterilizingFrequency_end = StrutsParamUtils.getPraramValue("sterilizingFrequency_end", ""); + + List tousseInstanceList = recallRecordManager.searchToussesForRecall( + sterilizerName, sterilizationStartDate, sterilizationEndDate, sterilizingFrequency_end, + sterilizingFrequency_start); + + createExportFileByJxl(servletOutputStream , tousseInstanceList , sterilizerName, sterilizationStartDate, sterilizationEndDate, sterilizingFrequency_end, + sterilizingFrequency_start); + servletOutputStream.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.getOutputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 基础jxl组件的导出下载实现方法 + */ + private void createExportFileByJxl(OutputStream ops ,List tousseList, + String sterilizerName, String sterilizationStartDate, String sterilizationEndDate, String + sterilizingFrequency_end,String sterilizingFrequency_start){ + WritableWorkbook book = null; + try { + // 打开文件 + book = Workbook.createWorkbook(ops); + + if(tousseList!=null && !tousseList.isEmpty()){ + int length=tousseList.size();//查询结果记录数 + int sheetSize=60000; + int sheetNum=1; + if(length%sheetSize>0){ + sheetNum=length/sheetSize+1; + }else{ + sheetNum=length/sheetSize; + } + //需导出的列头定义(与器械包信息页面列表保持一致) + String ss[] = {"科室名称","器械包名称","条码","状态"}; + Label label; + //循环sheet数量 + for(int kk=0;kk recallRecordItems = recallRecordManager - .getRecallRecordItemForDepart(); + List recallRecordItems = null; + if(StringUtils.isNotBlank(waitRecallBarcodes)){ + recallRecordItems = recallRecordManager + .getRecallRecordItemByBarcodes(waitRecallBarcodes); + }else{ + recallRecordItems = recallRecordManager + .getRecallRecordItemForDepart(); + } List recalledTousseVOs = new ArrayList(); // 由于数据结构的原因需要对item对象做一些处理。页面需要显示具体的器械包, // 器械包的信息是item里面的一个list所以需要下面的for循环进行转换 @@ -352,8 +504,10 @@ for (TousseInstance ti : instances) { RecalledTousseVO tousseVO = new RecalledTousseVO(); tousseVO.setBarcode(ti.getBarcode()); - tousseVO.setRecallInfoPublishTimeStr(dateFormat - .format(record.getPublishDate())); + if(record != null){ + tousseVO.setRecallInfoPublishTimeStr(dateFormat + .format(record.getPublishDate())); + } tousseVO.setTousseName(ti.getTousseDefinitionName()); tousseVO.setStatus(ti.getStatus()); tousseVO.setRecaller(ti.getRecaller()); @@ -365,9 +519,11 @@ }else{ RecalledTousseVO tousseVO = new RecalledTousseVO(); tousseVO.setBarcode(""); - tousseVO.setRecallInfoPublishTimeStr(dateFormat - .format(record.getPublishDate())); - tousseVO.setTousseName(record.getObjectName()); + if(record != null){ + tousseVO.setRecallInfoPublishTimeStr(dateFormat + .format(record.getPublishDate())); + tousseVO.setTousseName(record.getObjectName()); + } tousseVO.setStatus("待召回"); tousseVO.setAmount(recallRecordItem.getAmount()); recalledTousseVOs.add(tousseVO); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseItemVO.java =================================================================== diff -u -r12331 -r16675 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseItemVO.java (.../RecallTousseItemVO.java) (revision 12331) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recall/RecallTousseItemVO.java (.../RecallTousseItemVO.java) (revision 16675) @@ -1,12 +1,22 @@ package com.forgon.disinfectsystem.entity.recall; +import java.util.ArrayList; +import java.util.List; + +/** + * 统计待召回的器械包名称及数量 + * @author shuyongfu + * @since 2017-01-05 + */ public class RecallTousseItemVO { private String tousseName; private int tousseAmount; private String tousseIds; + + private List tousseInstanceVOs = new ArrayList(); public String getTousseIds() { return tousseIds; @@ -32,4 +42,12 @@ this.tousseAmount = tousseAmount; } + public List getTousseInstanceVOs() { + return tousseInstanceVOs; + } + + public void setTousseInstanceVOs(List tousseInstanceVOs) { + this.tousseInstanceVOs = tousseInstanceVOs; + } + } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java =================================================================== diff -u -r12331 -r16675 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java (.../RecallRecordManager.java) (revision 12331) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManager.java (.../RecallRecordManager.java) (revision 16675) @@ -28,11 +28,27 @@ public void deleteRecallRecords(String ids); public List getRecallRecordItemForDepart(); + + /** + * 根据待召回的条码查询相关器械包信息 + * @param waitRecallBarcodes 待召回的条码集,用逗号分隔 + * @return + */ + public List getRecallRecordItemByBarcodes(String waitRecallBarcodes); public List searchToussesForRecall(String sterileName, String startDate, String endDate, String sterilizingFrequency_end, String sterilizingFrequency_start); + /** + * 按灭菌炉名称、开始时间、结束时间、开始炉次、结束炉次搜索器械包 + * @param sterileName 灭菌炉名称 + * @param startDate 开始时间 + * @param endDate 结束时间 + * @param sterilizingFrequency_end 结束炉次 + * @param sterilizingFrequency_start 开始炉次 + * @return + */ public String searchToussesForRecallForJsonString(String sterileName, String startDate, String endDate, String sterilizingFrequency_end, String sterilizingFrequency_start); Index: ssts-web/src/main/webapp/disinfectsystem/recallRecord/recallRecordView.js =================================================================== diff -u -r15509 -r16675 --- ssts-web/src/main/webapp/disinfectsystem/recallRecord/recallRecordView.js (.../recallRecordView.js) (revision 15509) +++ ssts-web/src/main/webapp/disinfectsystem/recallRecord/recallRecordView.js (.../recallRecordView.js) (revision 16675) @@ -44,8 +44,10 @@ //如果搜索结果数据不为空,则将保存按钮启用,否则禁用 if(recallTousseColumnTree && recallTousseColumnTree.root && recallTousseColumnTree.root.childNodes.length > 0){ top.Ext.getCmp('saveBtn').enable(); + top.Ext.getCmp('btnExport').enable(); }else{ top.Ext.getCmp('saveBtn').disable(); + top.Ext.getCmp('btnExport').disable(); } }); @@ -82,6 +84,36 @@ } /** + * 获取待召回的器械包条码 + * @returns + */ +function getWaitRecallBarcodes(){ + var barcodeArray = []; + var treeRoot = recallTousseColumnTree.root; + if(treeRoot.childNodes.length!=0){ + treeRoot.eachChild(function(pNode){ + //pNode对象还是科室这一层 + if(pNode.attributes.children.length!=0){ + for(var i = 0;i < pNode.attributes.children.length;i++){ + //tousseNode是器械包名称这一层 + var tousseNode = pNode.attributes.children[i]; + for(var j = 0;j < tousseNode.children.length;j++){ + //barcodeNode是器械包条码这一层 + var barcodeNode = tousseNode.children[j]; + var barcode = barcodeNode.departName; + barcodeArray.push(barcode); + } + } + } + }); + }else{ + showResult("请选择要召回的器械包"); + return; + } + return barcodeArray.join(","); +} + +/** * 开始时间或者截止时间改变 * @param field * @param newValue @@ -112,9 +144,13 @@ bodyStyle : 'border:1px solid #afd7af', columns : [{ header : '科室名称', - width : 450, + width : 300, dataIndex : 'departName' },{ + header : '状态', + width : 150, + dataIndex : 'status' + },{ header : '数量', width : 110, dataIndex : 'objAmount' @@ -139,12 +175,33 @@ text:'待灭菌物品列表' }), tbar:[{ + id : 'btnRecall', text:'器械包召回', iconCls :'Arrowrotateclockwise', + hidden : !id,//新增召回信息时器械包召回按钮隐藏,打开已存在的数据时放开 handler: function(){ top.addTab('recallTousses','召回器械包',WWWROOT + '/disinfectsystem/recallRecord/recallRecordViewForDepart.jsp'); recallRecordWin.close(); } + },{ + id : 'btnExport', + text:'导出', + iconCls :'btn_ext_download', + disabled : !id, + handler: function(){ + var sterilizerName = top.Ext.getCmp('sterilizerName').getValue(); + var startDate = top.Ext.getCmp('startDate').getRawValue(); + var endDate = top.Ext.getCmp('endDate').getRawValue(); + var sterilizingFrequency_start = top.Ext.getCmp('sterilizingFrequency_start').getValue(); + var sterilizingFrequency_end = top.Ext.getCmp('sterilizingFrequency_end').getValue(); + //var waitRecallBarcodes = getWaitRecallBarcodes();//由于get请求的内容长度有限,所以不通过url传输 + location.href = WWWROOT + + "/disinfectSystem/recallRecordAction!exportWaitRecallTousseInstanceInfo.do?sterilizerName=" + sterilizerName + + "&startDate=" + startDate + + "&endDate=" + endDate + + "&sterilizingFrequency_start=" + sterilizingFrequency_start + + "&sterilizingFrequency_end=" + sterilizingFrequency_end; + } }] }); formObj = new top.Ext.FormPanel({ Index: ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java =================================================================== diff -u -r15489 -r16675 --- ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 15489) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/recall/service/RecallRecordManagerImpl.java (.../RecallRecordManagerImpl.java) (revision 16675) @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -16,7 +17,10 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.hibernate.Query; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.vo.LoginUserData; @@ -32,6 +36,7 @@ import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.recall.RecallRecord; import com.forgon.disinfectsystem.entity.recall.RecallRecordItem; +import com.forgon.disinfectsystem.entity.recall.RecallTousseInstanceVO; import com.forgon.disinfectsystem.entity.recall.RecallTousseItemVO; import com.forgon.disinfectsystem.entity.recall.RecallTousseVO; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; @@ -56,6 +61,7 @@ import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.SqlUtils; /** * @@ -271,11 +277,30 @@ String orgUnitCode = AcegiHelper.getLoginUser() .getCurrentOrgUnitCode(); String sql = "where po.recallRecord.status = '" - + RecallRecord.STATUS_UNFINISHED + "' and po.departCode = '" - + orgUnitCode + "'"; + + RecallRecord.STATUS_UNFINISHED + "'"; + boolean isSupplyRoomUser = supplyRoomConfigManager.isSupplyRoomUser(AcegiHelper.getLoginUser()); + //如果不为供应室用户,则限制只能查本科室的召回记录 + if(!isSupplyRoomUser){ + sql += " and po.departCode = '"+ orgUnitCode + "'"; + } return objectDao.findBySql( RecallRecordItem.class.getName(), sql); } + + @Override + public List getRecallRecordItemByBarcodes(String waitRecallBarcodes){ + List resultList = new ArrayList(); + List barcodeList = Arrays.asList(waitRecallBarcodes.split(",")); + Query query = objectDao.getHibernateSession().createQuery("from TousseInstance where barcode in (:barcodeList)"); + query.setParameterList("barcodeList", barcodeList); + List list = query.list(); + if(CollectionUtils.isNotEmpty(list)){ + RecallRecordItem item = new RecallRecordItem(); + item.setTousseInstances(list); + resultList.add(item); + } + return resultList; + } @Override public List searchToussesForRecall(String sterileName, @@ -302,7 +327,8 @@ } } } - ListIterator it = instances.listIterator(); + //去掉按器械包状态的验证 + /*ListIterator it = instances.listIterator(); while (it.hasNext()) { TousseInstance instance = it.next(); if (!TousseInstance.STATUS_SHIPPED.equals(instance @@ -313,54 +339,85 @@ it.remove(); } } - } + }*/ return instances; } } return null; } + /** + * 将包实例转换成json格式 + * @param instances 包实例集合 + * @return [ + * {departName:'科室名称1',objAmount:4,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'包实例名称1',objAmount:2,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'条码1',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''}, + * {departName:'条码2',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''} + * ]}, + * {departName:'包实例名称2',objAmount:2,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'条码3',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''}, + * {departName:'条码4',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''} + * ]} + * ]} + * ,{departName:'科室名称2',objAmount:4,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'包实例名称3',objAmount:2,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'条码5',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''}, + * {departName:'条码6',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''} + * ]}, + * {departName:'包实例名称4',objAmount:2,departCode:'',uiProvider:'',cls:'',iconCls:'',children:[ + * {departName:'条码7',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''}, + * {departName:'条码8',objAmount:1,departCode:'',uiProvider:'',cls:'',iconCls:''} + * ]} + * ]} + * ] + */ private String convertToJsonString(List instances) { - StringBuffer jsonStr = new StringBuffer(); + JSONArray jsonArray = new JSONArray(); // 按科室统计 - List tousseVos = staticsTousses(instances); - jsonStr.append("["); - int loopI = 1; - for (RecallTousseVO tousseVO : tousseVos) { - jsonStr.append("{" - + "departName:'" - + tousseVO.getDepartName() - + "',objAmount:" - + tousseVO.getAmount() - + ",departCode:'" - + tousseVO.getDepartCode() - + "',uiProvider:'col',cls:'master-task',iconCls:'task-folder'," - + "children:["); - int loop = 1; - for (RecallTousseItemVO itemVO : tousseVO.getTousseItemVOs()) { - jsonStr.append("{departName:'").append(itemVO.getTousseName()) - .append("',objAmount:") - .append(itemVO.getTousseAmount()) - .append(",departCode:'").append("") - .append("',tousseIds:'").append(itemVO.getTousseIds()) - .append("',uiProvider:'col',").append("leaf:true,") - .append("iconCls:'task'}"); - if (loop != tousseVO.getTousseItemVOs().size()) { - jsonStr.append(","); + List tousseVosGroupByDepart = staticsTousses(instances); + JSONObject departJson = null; + for (RecallTousseVO tousseVOGroupByDepart : tousseVosGroupByDepart) { + List tousseVosGroupByTousseName = tousseVOGroupByDepart.getTousseItemVOs(); + departJson = new JSONObject(); + departJson.put("departName", tousseVOGroupByDepart.getDepartName()); + departJson.put("objAmount", tousseVOGroupByDepart.getAmount()); + departJson.put("departCode", tousseVOGroupByDepart.getDepartCode()); + departJson.put("uiProvider", "col"); + departJson.put("cls", "master-task"); + departJson.put("iconCls", "task-folder"); + + JSONArray tousseItemJsonArray = new JSONArray(); + for (RecallTousseItemVO tousseVOGroupByTousseName : tousseVosGroupByTousseName) { + JSONObject tousseItemJsonObject = new JSONObject(); + tousseItemJsonObject.put("departName",tousseVOGroupByTousseName.getTousseName()); + tousseItemJsonObject.put("objAmount",tousseVOGroupByTousseName.getTousseAmount()); + tousseItemJsonObject.put("tousseIds", tousseVOGroupByTousseName.getTousseIds()); + tousseItemJsonObject.put("uiProvider", "col"); + tousseItemJsonObject.put("iconCls", "task"); + + + JSONArray tousseInstanceJsonArray = new JSONArray(); + for (RecallTousseInstanceVO tousseVOGroupByBarcode : tousseVOGroupByTousseName.getTousseInstanceVOs()) { + JSONObject tousseInstanceJsonObject = new JSONObject(); + tousseInstanceJsonObject.put("departName",tousseVOGroupByBarcode.getBarcode()); + tousseInstanceJsonObject.put("status",tousseVOGroupByBarcode.getStatus()); + tousseInstanceJsonObject.put("sterileEndTime",tousseVOGroupByBarcode.getSterileEndTime()); + tousseInstanceJsonObject.put("sterileFrequency",tousseVOGroupByBarcode.getSterileFrequency()); + tousseInstanceJsonObject.put("objAmount",tousseVOGroupByBarcode.getTousseAmount()); + tousseInstanceJsonObject.put("uiProvider", "col"); + tousseInstanceJsonObject.put("leaf", true); + tousseInstanceJsonArray.add(tousseInstanceJsonObject); } - loop++; + tousseItemJsonObject.put("children", tousseInstanceJsonArray); + tousseItemJsonArray.add(tousseItemJsonObject); } - jsonStr.append("]"); - jsonStr.append("}"); - if (loopI != tousseVos.size()) { - jsonStr.append(","); - } - loopI++; + departJson.put("children", tousseItemJsonArray); + jsonArray.add(departJson); } - jsonStr.append("]"); - return jsonStr.toString(); + return jsonArray.toString(); } - + /** * 按照科室来统计召回的包的数量 * @@ -369,80 +426,102 @@ */ private List staticsTousses(List instances) { // {科室:xxx,amount:xxx,children:[{xx包:[2,01876#01877]},{xx包:20}]} - // key :科室名称; - // value.key :包名称 - // value.value:长度为2的数组,value[0]为包数量,value[1]为包ids,以'#'分隔 - Map> departMap = new HashMap>(); - //科室-科室代码 - Map departCodeAndNameMap = new HashMap(); + // map.key :科室名称; + // map.value.key :包名称 + // map.value.value.key :包条码 + // map.value.value.value:RecallTousseInstanceVO + Map>> departMap = new HashMap>>(); List tousseVOs = new ArrayList(); - String firstRoomName = supplyRoomConfigManager - .getFirstSupplyRoomConfig().getOrgUnitName(); - String firstRoomCode = supplyRoomConfigManager - .getFirstSupplyRoomConfig().getOrgUnitCoding(); if (instances != null) { for (TousseInstance instance : instances) { - String depart = instance.getLocation(); String departName = instance.getLocationForDisplay(); - - // 位置为空,说明还没发货,还在供应室 - if (StringUtils.isBlank(depart)) { - // 拿到当前第一供应室的名字 - depart = firstRoomCode; - departName = firstRoomName; - } - if (!departCodeAndNameMap.containsKey(depart)) { - departCodeAndNameMap.put(depart, departName); - } + String departCode = instance.getLocation(); + String departMapKey = departName + ";" + departCode;//用科室名称+编码作为其map的key String realName = instance.getTousseName(); // ~~~~~~~~~~~~~~~~~~~~~~~~统计科室的包数量~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// - if (departMap.containsKey(depart)) { - Map tousseMap = departMap.get(depart); + if (departMap.containsKey(departMapKey)) { + Map> tousseMap = departMap.get(departMapKey); if (tousseMap.containsKey(realName)) { - String[] arr = tousseMap.get(realName); - arr[0] = String.valueOf(Integer.parseInt(arr[0]) + 1); - if (arr[1].length() == 0) { - arr[1] += instance.getId().toString(); - } else { - arr[1] += "#" + instance.getId().toString(); - } - tousseMap.put(realName, arr); + Map tousseInstanceMap = tousseMap.get(realName); + RecallTousseInstanceVO tousseInstanceVO = new RecallTousseInstanceVO(); + tousseInstanceVO.setBarcode(instance.getBarcode()); + tousseInstanceVO.setTousseInstanceId(instance.getId()); + tousseInstanceVO.setStatus(instance.getStatus()); + tousseInstanceVO.setSterileEndTime(instance.getSterileEndTime()); + tousseInstanceVO.setSterileFrequency(instance.getSterileFrequency()); + tousseInstanceMap.put(instance.getBarcode(), tousseInstanceVO); + tousseMap.put(realName, tousseInstanceMap); } else { - String[] arr = new String[2]; - arr[0] = String.valueOf("1"); - arr[1] = instance.getId().toString(); - tousseMap.put(realName, arr); + Map tousseInstanceMap = new HashMap(); + RecallTousseInstanceVO tousseInstanceVO = new RecallTousseInstanceVO(); + tousseInstanceVO.setBarcode(instance.getBarcode()); + tousseInstanceVO.setTousseInstanceId(instance.getId()); + tousseInstanceVO.setStatus(instance.getStatus()); + tousseInstanceVO.setSterileEndTime(instance.getSterileEndTime()); + tousseInstanceVO.setSterileFrequency(instance.getSterileFrequency()); + tousseInstanceMap.put(instance.getBarcode(), tousseInstanceVO); + tousseMap.put(realName, tousseInstanceMap); } } else { - Map map = new HashMap(); - if (map.containsKey(realName)) { - String[] arr = map.get(realName); - arr[0] = String.valueOf(Integer.parseInt(arr[0]) + 1); - arr[1] = String.valueOf(instance.getId()); - map.put(realName, arr); + Map> tousseItemMap = new HashMap>(); + if (tousseItemMap.containsKey(realName)) { + Map tousseInstanceMap = tousseItemMap.get(realName); + RecallTousseInstanceVO tousseInstanceVO = new RecallTousseInstanceVO(); + tousseInstanceVO.setBarcode(instance.getBarcode()); + tousseInstanceVO.setTousseInstanceId(instance.getId()); + tousseInstanceVO.setStatus(instance.getStatus()); + tousseInstanceVO.setSterileEndTime(instance.getSterileEndTime()); + tousseInstanceVO.setSterileFrequency(instance.getSterileFrequency()); + tousseInstanceMap.put(instance.getBarcode(), tousseInstanceVO); + tousseItemMap.put(realName, tousseInstanceMap); } else { - String[] arr = new String[2]; - arr[0] = String.valueOf(1); - arr[1] = String.valueOf(instance.getId()); - map.put(realName, arr); + Map tousseInstanceMap = new HashMap(); + RecallTousseInstanceVO tousseInstanceVO = new RecallTousseInstanceVO(); + tousseInstanceVO.setBarcode(instance.getBarcode()); + tousseInstanceVO.setTousseInstanceId(instance.getId()); + tousseInstanceVO.setStatus(instance.getStatus()); + tousseInstanceVO.setSterileEndTime(instance.getSterileEndTime()); + tousseInstanceVO.setSterileFrequency(instance.getSterileFrequency()); + tousseInstanceMap.put(instance.getBarcode(), tousseInstanceVO); + tousseItemMap.put(realName, tousseInstanceMap); } - departMap.put(depart, map); + departMap.put(departMapKey, tousseItemMap); } // ~~~~~~~~~~~~~~~~~~~~~~~~统计科室的包数量~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// } - for (Entry> entry : departMap - .entrySet()) { + for (Entry>> entry : departMap.entrySet()) { RecallTousseVO tousseVO = new RecallTousseVO(); - tousseVO.setDepartName(departCodeAndNameMap.get(entry.getKey())); - tousseVO.setDepartCode(entry.getKey()); - Map toussesMap = entry.getValue(); + String departMapKey = entry.getKey(); + if(StringUtils.isNotBlank(departMapKey)){ + String[] departNameAndCode = departMapKey.split(";"); + if(departNameAndCode != null && departNameAndCode.length > 1){ + tousseVO.setDepartName(departNameAndCode[0]); + tousseVO.setDepartCode(departNameAndCode[1]); + }else{ + tousseVO.setDepartName(null); + tousseVO.setDepartCode(null); + } + }else{ + tousseVO.setDepartName(null); + tousseVO.setDepartCode(null); + } + Map> toussesMap = entry.getValue(); int sum = 0; - for (Entry ent : toussesMap.entrySet()) { + for (Entry> ent : toussesMap.entrySet()) { + RecallTousseItemVO itemVO = new RecallTousseItemVO(); itemVO.setTousseName(ent.getKey()); - itemVO.setTousseAmount(Integer.parseInt(ent.getValue()[0])); - sum += Integer.parseInt(ent.getValue()[0]); - itemVO.setTousseIds(ent.getValue()[1]); + Map tousseInstanceMap = ent.getValue(); + JSONArray tousseIdArray = new JSONArray(); + for(Entry tiEntry : tousseInstanceMap.entrySet()){ + RecallTousseInstanceVO instanceVO = tiEntry.getValue(); + instanceVO.setTousseAmount(1); + tousseIdArray.add(instanceVO.getTousseInstanceId()); + itemVO.getTousseInstanceVOs().add(instanceVO); + } + itemVO.setTousseAmount(tousseInstanceMap.size()); + itemVO.setTousseIds(tousseIdArray.join("#")); + sum += itemVO.getTousseAmount(); tousseVO.getTousseItemVOs().add(itemVO); } tousseVO.setAmount(sum);