Index: ssts-web/src/main/java/com/forgon/disinfectsystem/component/grid/GridManagerImpl.java =================================================================== diff -u -r17715 -r18377 --- ssts-web/src/main/java/com/forgon/disinfectsystem/component/grid/GridManagerImpl.java (.../GridManagerImpl.java) (revision 17715) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/component/grid/GridManagerImpl.java (.../GridManagerImpl.java) (revision 18377) @@ -21,6 +21,7 @@ import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecord; import com.forgon.disinfectsystem.receiverecord.service.GodownBriefHandler; import com.forgon.results.handler.ResultBackHandler; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang.StringUtils; @@ -1060,4 +1061,39 @@ } return false; } + + public int getStartParameter(Map> parameterMap) { + int start = 0; + if (parameterMap != null) { + List pageStart = parameterMap.get(GRID_PAGE_START); + if (pageStart != null && pageStart.size() > 0 + && StringUtils.isNotBlank(pageStart.get(0)) + && StringUtils.isNumeric(pageStart.get(0))) { + start = Integer.valueOf(pageStart.get(0)); + } + } + return start; + } + public int getPageSizeParameter(Map> parameterMap) { + int pageSize = 20; + if (parameterMap != null) { + List pageSizeStr = parameterMap.get(GRID_PAGE_SIZE); + if (pageSizeStr != null && pageSizeStr.size() > 0 + && StringUtils.isNotBlank(pageSizeStr.get(0)) + && StringUtils.isNumeric(pageSizeStr.get(0))) { + pageSize = Integer.valueOf(pageSizeStr.get(0)); + } + } + return pageSize; + } + + public String getQueryString(Map> parameterMap){ + List queryList = parameterMap + .get(GRID_MAPPARAM_SEARCH_QUERY_KEY); + if (queryList == null || queryList.size() == 0) { + return null; + } + String query = queryList.get(0); + return query; + } } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java =================================================================== diff -u -r18166 -r18377 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java (.../TousseInstanceTableManager.java) (revision 18166) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseInstanceTableManager.java (.../TousseInstanceTableManager.java) (revision 18377) @@ -8,17 +8,21 @@ import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.Transformer; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; +import com.forgon.Constants; import com.forgon.component.grid.GridManager; import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; @@ -28,24 +32,33 @@ import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseInstanceUtils; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.diposablegoods.util.DisposableGoodsUtils; import com.forgon.disinfectsystem.entity.assestmanagement.DiposableGoodsInstance; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.operationRoom.OperationRoom; +import com.forgon.disinfectsystem.entity.basedatamanager.position.TousseOperation; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; 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.idcardinstance.IDCardInstance; +import com.forgon.disinfectsystem.entity.operationreservation.OperationReservation; import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.disinfectsystem.tousseitem.service.TousseItemUtils; import com.forgon.timeout.model.TimeoutSetting; import com.forgon.timeout.service.TimeoutManager; +import com.forgon.tools.MathTools; import com.forgon.tools.SqlBuilder; import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ForgonDateUtils; /** * @author songwei @@ -727,4 +740,81 @@ } return obj.toString(); } + + + /** + * 查询仪器班物品 + * @return + */ + public String findInstrumentRoomGoodsList( + Map> parameterMap) { +// insertTestTousse2(); + JSONArray jsonArray = new JSONArray(); + String currentOrgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); + // 查找所有的第一次发货的包实例 + String goodsSql = String.format(" where po.location='%s' and po.status in(%s,%s) and po.status2 is null", currentOrgUnitCode,TousseInstance.STATUS_SHIPPED, TousseInstance.STATUS_SIGNED); + int start = gridManager.getStartParameter(parameterMap); + int pageSize = gridManager.getPageSizeParameter(parameterMap); + List objList = new LinkedList(); + + String query = gridManager.getQueryString(parameterMap); + String tousseNameSql = " and 1=1 "; + String idCardInstanceBarcodeSql = " and 1=1 "; + String idCardTousseQuerySql = " and 1=1 "; + String normalTousseQuerySql = " and 1=1 "; + if(StringUtils.isNotBlank(query)){ + idCardTousseQuerySql = String.format(" and (po.tousseName like '%%%s%%' or po.idCardInstanceBarcode like '%%%s%%' or b.barcode like '%%%s%%') ", query,query,query); + normalTousseQuerySql = String.format(" and (po.tousseName like '%%%s%%' or po.idCardInstanceBarcode like '%%%s%%' or b.barcode like '%%%s%%') ", query,query,query); + } + String statusSql = String.format(" case po.status when '%s' then '已签收' else '未签收' end as status ", TousseInstance.STATUS_SIGNED); + String commonSql1 = String.format(" po.location='%s' and po.status in('%s','%s') and po.status2 is null ", currentOrgUnitCode,TousseInstance.STATUS_SHIPPED, TousseInstance.STATUS_SIGNED); + String idCardTousseSql = String.format("( select po.tousseName,1 as amount,%s,po.idCardInstanceBarcode,b.barcode from TousseInstance po inner join BarcodeDevice b on po.id=b.id where %s and po.idCardInstanceBarcode is not null %s ) ", statusSql,commonSql1,idCardTousseQuerySql); + String normalTousseSql = String.format("( select po.tousseName,count(*) as amount,%s,'' as idCardInstanceBarcode,'' as barcode from TousseInstance po inner join BarcodeDevice b on po.id=b.id where %s and po.idCardInstanceBarcode is null %s group by po.tousseName,po.status ) ", statusSql,commonSql1,normalTousseQuerySql); + String sql = String.format(" %s union all %s ",idCardTousseSql,normalTousseSql); + String countSql = String.format(" select count(*) from (%s union all %s) ",idCardTousseSql,normalTousseSql); +// Integer totalResults = objectDao.countBySql(countSql); + + ResultSet resultSet = objectDao.executeSql(sql); + try { + while (resultSet.next()) { + + String tousseName = resultSet.getString("tousseName"); + String idCardInstanceBarcode = resultSet.getString("idCardInstanceBarcode"); + String barcode = resultSet.getString("barcode"); + String status = resultSet.getString("status"); + Long amount = resultSet.getLong("amount"); + + JSONObject obj = new JSONObject(); + + obj.put("tousseName", tousseName); + obj.put("idCardInstanceBarcode", idCardInstanceBarcode); + obj.put("barcode", barcode); + obj.put("status", status); + obj.put("amount", amount); +// jsonArray.add(obj); + objList.add(obj); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + Integer totalResults = objList.size(); + if(start >= totalResults){ + start = totalResults - 1; + } + int end = start + pageSize; + if(end > totalResults){ + end = totalResults; + } + if(start < 0){ + start = 0; + } + if(end < 0){ + end = 0; + } + objList = objList.subList(start, end); + String selectSqlWhereCondition = ""; + return gridManager.converJsonString(totalResults, objList, selectSqlWhereCondition,null); + } } Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r18368 -r18377 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 18368) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 18377) @@ -362,8 +362,7 @@ singleClickExpand:singleClickExpandTree, hidden:SSTS_TousseManagerView || !enableSurgicalInstrumentsManagement, children:[ - {hidden :SSTS_Tousse,text:"器械包位置管理",href:WWWROOT+'/disinfectsystem/toussemanager/position/changePosition.jsp?editMode=true&operation=发货',hrefTarget:linkTarget,leaf:true}, - {hidden :SSTS_Tousse,text:"器械包签收",href:WWWROOT+'/disinfectsystem/toussemanager/position/changePosition.jsp?editMode=true&operation=签收',hrefTarget:linkTarget,leaf:true} + {hidden :SSTS_Tousse,text:"仪器班物品管理",href:WWWROOT+'/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.jsp?editMode=true',hrefTarget:linkTarget,leaf:true} ] },{ text:"干预管理", Index: ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.jsp (revision 18377) @@ -0,0 +1,74 @@ +<%@page import="com.forgon.disinfectsystem.entity.basedatamanager.supplier.Supplier"%> +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> +<%@ include file="/common/includeExtJsAndCss.jsp"%> +<%@ include file="/common/includeExtJs4_2.jsp"%> +<%@ page import="com.forgon.tools.SpringBeanManger" %> +<% + String userName = AcegiHelper.getLoginUser().getUserFullName(); + request.setAttribute("userName",userName); +%> + + + +手术预约信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/component/grid/GridManager.java =================================================================== diff -u -r17135 -r18377 --- forgon-core/src/main/java/com/forgon/component/grid/GridManager.java (.../GridManager.java) (revision 17135) +++ forgon-core/src/main/java/com/forgon/component/grid/GridManager.java (.../GridManager.java) (revision 18377) @@ -79,4 +79,7 @@ public Set getDistinctProperty(Class className, Map> parameterMap, String sql); + public int getStartParameter(Map> parameterMap); + public int getPageSizeParameter(Map> parameterMap); + public String getQueryString(Map> parameterMap); } Index: ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/toussemanager/instrumentGoodsManagement/instrumentRoomGoodsManagement.js (revision 18377) @@ -0,0 +1,394 @@ +var entityName = "手术预约管理"; +var grid; +var operationReservationWindow; + +//明细grid删除按钮 +function renderDeleteButton(v,p,record,rowIndex){ + return ""; +} + +//删除grid明细 +function deleteItem(tousseDefinitionId){ + var gridStore = top.Ext.getCmp('operationReservationGrid').getStore(); + for(var i = 0;i < gridStore.getCount();i++){ + var record = gridStore.getAt(i); + if(record.data.tousseDefinitionId == tousseDefinitionId){ + gridStore.remove(record); + break; + } + } +} +//Ext.form.DateField在IE8下显示不全 +Ext.override(top.Ext.menu.Menu, { + autoWidth: function() { + this.width += "px"; + } +}); + +var goodsItemRecord = Ext.data.Record.create([ + {name : 'itemId'}, + {name : 'tousseDefinitionId'}, + {name : 'name'}, + {name : 'amount'} +]); + + + +function editOperationReservation(id,committedStatus) { + var useRecordOperationRoomAllowBlank = getBoolValueFromJs('sstsConfig.useRecordOperationRoomAllowBlank',true); + var handleDepartStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/systemmanage/getCssdsByApplyDepartAndType.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + root : 'data' + },[ + {name : 'cssdOrgUnitCode',mapping : 'cssdOrgUnitCode'}, + {name : 'name',mapping : 'cssdOrgUnitName'} + ] + ), + listeners:{ + load:function(thiz, records, options){ + if (records.length == 1){ + top.Ext.getCmp("handleDepartCoding").setValue(records[0].data.cssdOrgUnitCode); + top.Ext.getCmp('handleDepart').setValue(records[0].data.name); + }else{ + top.Ext.getCmp("handleDepartCoding").setValue(); + top.Ext.getCmp('handleDepart').setValue(); + } + } + } + }); + + handleDepartStore.on('beforeload', function (store, options) { + if(top.Ext.getCmp("depart").getRawValue() == ""){ + showResult("请选择申请科室!"); + } + var orgUnitCoding = top.Ext.getCmp("departCoding").getValue(); + var new_params = {applyDepartCode : orgUnitCoding, tousseType : ""}; + Ext.apply(store.baseParams, new_params); + }); + + //科室数据 + var departJsonStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + root : 'data' + },[ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'} + ] + ) + }); + + var tousseAndDiposableGoodsStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/tousseDefinitionAction!searchTousseAndDressing.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'spelling',mapping : 'spelling'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'}, + {name : 'amount',mapping : 'amount'}] + ) + }); + + var operationNameStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectsystem/basedatamanager/operationOrgAction!findOrgUnitOperationName.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'operationName',mapping : 'operationName'}, + {name : 'items',mapping : 'items'}] + ) + }); + + operationNameStore.on('beforeload', function (store, options) { + if(top.Ext.getCmp("depart").getRawValue() == ""){ + showResult("请选择申请科室!"); + } + var orgUnitCoding = top.Ext.getCmp("departCoding").getValue(); + var new_params = {orgUnitCoding:orgUnitCoding}; + Ext.apply(store.baseParams, new_params); + }); + + //添加明细 + function addItems(itemId,tousseDefinitionId,name,amount){} + + var form = new top.Ext.FormPanel({}); + + operationReservationWindow = new top.Ext.Window( { + id : 'operationReservationWin', + layout : 'fit', + title : '手术预约单信息', + width : 700, + modal : true, + autoHeight : true, + border :false, + plain : true, + items : [ form ] + }); + operationReservationWindow.show(); + + if(id != ""){} +} + +// 删除 +function deleteOperationReservation(grid) { + var records = grid.getSelectionModel().getSelections(); + + if (records.length == 0) { + showResult("请选择要删除的单据!"); + return false; + } + var ids = ""; + for ( var i = 0, len = records.length; i < len; i++) { + if (ids != "") { + ids += ";"; + } + ids += records[i].data['id']; + } + top.Ext.MessageBox.confirm("请确认","是否确定要删除选中的手术预约单信息?", + function(button, text) { + if ("yes" == button){ + Ext.Ajax.request({ + url : WWWROOT + '/disinfectsystem/operationReservationAction!deleteOperationReservation.do', + params : {ids : ids}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + showResult(result.message); + grid.dwrReload(); + }, + failure : function(response, options) { + showResult(response.responseText); + } + }); + } + } + ); +} +function batchPrintOperationReservation(grid){ + var records = grid.getSelectionModel().getSelections(); + + if (records.length == 0) { + showResult("请选择要打印的单据!"); + return false; + } + var ids = ""; + var firstDate = null; + for ( var i = 0, len = records.length; i < len; i++) { + if (ids != "") { + ids += ";"; + } + ids += records[i].data['id']; + var operationDate = records[i].data.operationTime.substr(0,10); + if(!firstDate){ + //未设置第一个时间值,用当前的时间值来设置第一个时间值,后面的单,手术时间必须与这个相等 + if(operationDate){ + firstDate = operationDate; + } + } + if(firstDate){ + var currentDate = firstDate; + if(operationDate){ + currentDate = operationDate; + } + + if(!dateEquals(currentDate,firstDate)){ + showResult("请选择手术日期相同的单据!"); + return false; + } + } + } + top.Ext.MessageBox.confirm("请确认","是否确定要打印选中的手术预约单信息?", + function(button, text) { + if ("yes" == button){ + Ext.Ajax.request({ + url : WWWROOT + '/disinfectsystem/operationReservationAction!batchPrintOperationReservation.do', + params : {ids : ids}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + if(!result.success){ + showResult(result.message); + }else{ + printOperationReservations(result); + } + }, + failure : function(response, options) { + showResult("打印失败"); + } + }); + } + } + ); +} +/** + * 批量提交手术预约单 + */ +function batchSubmintOperationReservation(grid) { + var records = grid.getSelectionModel().getSelections(); + + if (records.length == 0) { + showResult("请选择要提交的单据!"); + return false; + } + var ids = ""; + for ( var i = 0, len = records.length; i < len; i++) { + var committedStatus = records[i].data['committedStatus']; + if(committedStatus){ + continue; + } + if (ids != "") { + ids += ";"; + } + ids += records[i].data['id']; + } + top.Ext.MessageBox.confirm("请确认","是否确定要提交选中的手术预约单信息?", + function(button, text) { + if ("yes" == button){ + Ext.Ajax.request({ + url : WWWROOT + '/disinfectsystem/operationReservationAction!batchSubmitOperationReservation.do', + params : {ids : ids}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + showResult(result.message); + grid.dwrReload(); + }, + failure : function(response, options) { + showResult(response.responseText); + } + }); + } + } + ); +} + +function editRecord(id,committedStatus){ + editOperationReservation(id,committedStatus); +} + +function modify(v,data){ + editRecord(data['id'],data['committedStatus']); +} + +Ext.onReady(function() { + Ext.QuickTips.init(); + + Ext4.tip.QuickTipManager.init(); + Ext4.apply(Ext4.tip.QuickTipManager.getQuickTip(), { + dismissDelay: 0, + showDelay: 0 + }); + + function renderColor(v, p, record){ + var status = record.data['deliverStatus']; + var color = ""; + if("待发货" == status){//待发货 黄色 + color = "yellow"; + }else if("部分发货" == status){ //部分发货 粉红色 + color = "#F5A7FA"; + } + return "

" + v + "

"; + } + + function renderCommittedStatus(v, p, record){ + var color = ""; + var status = '否'; + //器械包申请单状态 + + if(v == true || v == 'true'){ + status = "是"; + }else{ + color = "yellow"; + } + return "

" + status + "

"; + } + + var columns = [ + {id:'tousseName',header : "仪器名称",width : 120,sortable: false,dataIndex : 'tousseName'}, + {header : "数量",width : 120,sortable: false,dataIndex : 'amount'}, + {header : "当前状态",width : 200,sortable: false,dataIndex : 'status'}, + {header : "标识牌条码",width : 200,sortable: false,dataIndex : 'idCardInstanceBarcode'}, + {header : "仪器包条码",width : 200,sortable: false,dataIndex : 'barcode'} + ]; + + var readerDetail = [ + {name : 'tousseName'}, + {name : 'amount'}, + {name : 'status'}, + {name : 'idCardInstanceBarcode'}, + {name : 'barcode'} + ]; + + var filters = new Ext.grid.GridFilters({ + filters:[ +// {type: 'string', dataIndex: 'tousseName'}, +// {type: 'string', dataIndex: 'amount'}, +// {type: 'string', dataIndex: 'status'}, +// {type: 'string', dataIndex: 'idCardInstanceBarcode'}, +// {type: 'string', dataIndex: 'barcode'} + ]} + ); + + var sign = true; + var tbar = [{ + text : '器械包位置管理', + hidden : SSTS_OR_Create, + iconCls : 'btn_ext_application_add', + handler : function() { + var url = WWWROOT+'/disinfectsystem/toussemanager/position/changePosition.jsp?editMode=true&operation=发货'; + document.location.href = url; + } + },'-', { + text : '器械包签收', + hidden : SSTS_OR_Delete, + iconCls : 'btn_ext_application_add', + handler : function() { + var url = WWWROOT+'/disinfectsystem/toussemanager/position/changePosition.jsp?editMode=true&operation=签收'; + document.location.href = url; + } + }]; + + grid = new Ext.ux.ForgonPageGrid( { + tbar : tbar, + pageSize : 20, + defaultSortField : '', + title : '仪器班物品' + '列表', + defaultSortDirection : 'ASC', + isCheckboxSelectionModel : true, + rememberSelected : false, + isShowSearchField : true, + columns : columns, + plugins: filters, + autoExpandColumn : 'tousseName', + renderTo : 'gridDiv', + frame : false + }, readerDetail, + TousseInstanceTableManager.findInstrumentRoomGoodsList, + null + ); + + var viewport = new Ext.Viewport( { + layout : 'border', + items : [{ + region : 'center', + margins : '0 0 0 0', + layout : 'fit', + items : grid + }] + }); +}); \ No newline at end of file