Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java =================================================================== diff -u -r13165 -r13522 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java (.../GodownEntryAction.java) (revision 13165) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java (.../GodownEntryAction.java) (revision 13522) @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.PrintWriter; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -22,14 +23,23 @@ import com.forgon.Constants; import com.forgon.component.grid.GridManager; import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodBatchStockManager; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.diposablegoods.service.GodownEntryItemManager; import com.forgon.disinfectsystem.diposablegoods.service.GodownEntryManager; import com.forgon.disinfectsystem.diposablegoods.service.IdentificationOfDiposableGoodsManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.tools.MapTools; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.json.JsonPropertyFilter; @@ -54,6 +64,8 @@ private DateQueryAdapter dateQueryAdapter; private IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager; + private BarcodeManager barcodeManager; + public IdentificationOfDiposableGoodsManager getIdentificationOfDiposableGoodsManager() { return identificationOfDiposableGoodsManager; } @@ -90,6 +102,10 @@ this.gridManager = gridManager; } + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + @SuppressWarnings("unchecked") public String viewGodownEntryList() { HttpServletRequest request = StrutsParamUtils.getRequest(); @@ -159,6 +175,127 @@ } printMsgToClient(saveResult, out, result.toString(), null); } + + /** + * 扫描高值耗材条码加载一次性物品定义及库存 + */ + public void loadScanedGoods(){ + String barcode = StrutsParamUtils.getPraramValue("barcode", null); + String warehouseID = StrutsParamUtils.getPraramValue("warehouseID", null); + JSONObject obj = new JSONObject(); + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = null; + try { + out = response.getWriter(); + obj.put("success", true); + if (StringUtils.isNotBlank(barcode)) { + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if (bd != null && bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + + //判断该高值耗材关联的一次性物品定义的物品类型是否为高值耗材(防止入库时定义为高值耗材,后来修改定义为非高值耗材) + if(expensiveDisposablegoods.getDisposableGoodsID() == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材未找到一次性物品定义", barcode)); + return; + } + DisposableGoods disposableGoods = + diposableGoodsManager.getDisposableGoodsById(String.valueOf(expensiveDisposablegoods.getDisposableGoodsID())); + if(disposableGoods == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材一次性物品定义已被删除", barcode)); + return; + } + + if(!DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材对应一次性物品不为高值耗材", barcode)); + return; + } + + //判断高值耗材状态是否为已入库 + if(!ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材状态为%s", barcode,expensiveDisposablegoods.getStatus())); + return; + } + + //判断高值耗材是否属于所选仓库 + if(!StringUtils.equals(warehouseID, String.valueOf(expensiveDisposablegoods.getWarehouseID()))){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材不属于所选仓库", barcode)); + return; + } + + if(!ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材的状态为%s,不能进行调拨", barcode,expensiveDisposablegoods.getStatus())); + return; + } + + if(!StringUtils.equals(warehouseID, String.valueOf(expensiveDisposablegoods.getWarehouseID()))){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材不属于所选仓库", barcode)); + return; + } + + Long disposableGoodsBatchId = expensiveDisposablegoods.getDisposableGoodsBatchID(); + if(disposableGoodsBatchId == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材数据异常,批次定义id为空", barcode)); + return; + } + DisposableGoodsBatch batch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchId); + if(batch == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材批次定义已被删除", barcode)); + return; + } + + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + if(disposableGoodsBatchStock == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材批次库存已被删除", barcode)); + return; + } + + obj.put("name", CssdUtils.getDiposableGoodsName(disposableGoods)); + obj.put("disposableGoodsID", expensiveDisposablegoods.getDisposableGoodsID()); + obj.put("disposableGoodsStockID", expensiveDisposablegoods.getDisposableGoodsStockID()); + obj.put("disposableGoodsBatchID", disposableGoodsBatchId); + obj.put("disposableGoodsBatchStockID", disposableGoodsBatchStock.getId()); + obj.put("batchNumber", disposableGoodsBatchStock.getBatchNumber()); + obj.put("cost", disposableGoodsBatchStock.getCost()); + obj.put("externalCode", disposableGoods.getExternalCode()); + obj.put("minApplyAmount", disposableGoods.getMinApplyAmount()); + obj.put("unit", disposableGoods.getUnit()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); + obj.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + obj.put("packageSpec", disposableGoods.getPackageSpec()); + obj.put("spelling", disposableGoods.getSpelling()); + + obj.put("supplierName", disposableGoodsBatchStock.getSupplierName()); + obj.put("expDate", disposableGoodsBatchStock.getExpDateStr()); + obj.put("sterileBatchNumber", disposableGoodsBatchStock.getSterileBatchNumber()); + obj.put("manufacturer", disposableGoodsBatchStock.getManufacturer()); + obj.put("producingArea", disposableGoodsBatchStock.getProducingArea()); + }else{ + obj.put("success", false); + obj.put("error", "只能扫描高值耗材的条码。"); + } + }else{ + obj.put("success", false); + obj.put("error", "条码不能为空"); + } + } catch (IOException e) { + e.printStackTrace(); + }finally{ + out.print(obj.toString()); + out.close(); + } + } /** * 保存调拨单 Index: ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp =================================================================== diff -u -r13125 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp (.../materialInvoiceView.jsp) (revision 13125) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp (.../materialInvoiceView.jsp) (revision 13522) @@ -24,6 +24,7 @@ + Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/dwr/table/UseRecordTableManager.java =================================================================== diff -u -r12331 -r13522 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/dwr/table/UseRecordTableManager.java (.../UseRecordTableManager.java) (revision 12331) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/dwr/table/UseRecordTableManager.java (.../UseRecordTableManager.java) (revision 13522) @@ -56,21 +56,42 @@ String returnJson = ""; Map sqlWhereParamMap = gridManager .getParamFromView(parameterMap); - String departCoding = sqlWhereParamMap.get("departCoding"); - String sql = "where po.departCoding = '" + departCoding + "'"; + SupplyRoomConfig firstSupplyRoom = supplyRoomConfigManager .getFirstSupplyRoomConfig(); LoginUserData loginUser = AcegiHelper.getLoginUser(); + String sql = " where 1=1 "; //供应室用户查看所有临床科室使用记录 if (firstSupplyRoom != null && StringUtils.equals(firstSupplyRoom.getOrgUnitCoding(),loginUser.getCurrentOrgUnitCode())) { - sql = "where 1=1"; + //非供应室用户 没有权限的只能看到自己录入的使用记录,有查看所有权限的只能看到本科室的所有使用记录 }else{ boolean seeAll = operationManager.isCurrentUserHaveAnyOperation("SSTS_UseRecord_SeeAll"); if (!seeAll) { sql += " and po.operator = '" + loginUser.getUserFullName() + "'"; } } + + //按科室过滤 + String departCoding = sqlWhereParamMap.get("departCoding"); + if(StringUtils.isNotBlank(departCoding)){ + sql += " and po.departCoding = '" + departCoding + "'"; + } + + String status = sqlWhereParamMap.get("status"); + //按状态条件过滤 + if(StringUtils.isNotBlank(status)){ + String[] statusArray = status.split(";"); + String statusCondigion = "("; + for (int i = 0; i < statusArray.length; i++) { + statusCondigion += "'" + statusArray[i] + "'"; + if(i < statusArray.length - 1){ + statusCondigion += ","; + } + } + statusCondigion += ")"; + sql += " and po.status in " + statusCondigion; + } returnJson = gridManager.renderGrid(parameterMap, UseRecord.class.getSimpleName(), sql, new String[] { "tousseDefinition" }); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/UseMaterialGoodsItem.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/UseMaterialGoodsItem.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/UseMaterialGoodsItem.java (revision 13522) @@ -0,0 +1,102 @@ +package com.forgon.disinfectsystem.vo; + +/** + * 使用材料明细 + * 由于复大肿瘤的器械材料的高值耗材的需求,现需加上 + * @author shuyongfu + * @since 2016-05-20 + */ +public class UseMaterialGoodsItem { + + /** + * 材料发货明细id + */ + private Long materialInvoiceItemId; + + /** + * 材料定义id + */ + private Long materialDefinitionId; + + /** + * 外部编码 + */ + private String externalCode; + + /** + * 材料名称(含规格) + */ + private String name; + + /** + * 材料分类,即普通物品与高值耗材 + */ + private String goodsType; + + /** + * 材料发货单流水号 + */ + private String materialInvoiceSerialNumber; + + /** + * 数量 + */ + private Integer amount; + + public Long getMaterialInvoiceItemId() { + return materialInvoiceItemId; + } + + public void setMaterialInvoiceItemId(Long materialInvoiceItemId) { + this.materialInvoiceItemId = materialInvoiceItemId; + } + + public String getExternalCode() { + return externalCode; + } + + public void setExternalCode(String externalCode) { + this.externalCode = externalCode; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + + public String getGoodsType() { + return goodsType; + } + + public void setGoodsType(String goodsType) { + this.goodsType = goodsType; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getMaterialInvoiceSerialNumber() { + return materialInvoiceSerialNumber; + } + + public void setMaterialInvoiceSerialNumber(String materialInvoiceSerialNumber) { + this.materialInvoiceSerialNumber = materialInvoiceSerialNumber; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordView.jsp =================================================================== diff -u -r12331 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordView.jsp (.../useRecordView.jsp) (revision 12331) +++ ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordView.jsp (.../useRecordView.jsp) (revision 13522) @@ -1,5 +1,6 @@ <%@page import="java.util.List"%> <%@page import="com.forgon.systemsetting.service.HttpOptionManager"%> +<%@page import="com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager"%> <%@ page contentType="text/html; charset=UTF-8"%> <%@ include file="/common/taglibs.jsp"%> <%@ page import="com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance,com.forgon.disinfectsystem.entity.useRecord.UseRecord" %> @@ -23,6 +24,14 @@ } tem += "]"; request.setAttribute("specialInfectionList", tem); + + //判断当前科室是否为一级供应室,如果是则parm_s_departCoding的隐藏域不传值 + SupplyRoomConfigManager supplyRoomConfigManager = (SupplyRoomConfigManager)SpringBeanManger.getBean("supplyRoomConfigManager"); + String firstRoomOrgCode = supplyRoomConfigManager.getFirstSupplyRoomConfig().getOrgUnitCoding(); + String parm_s_departCoding = currentOrgUnitCode; + if(currentOrgUnitCode.equals(firstRoomOrgCode)){ + parm_s_departCoding = ""; + } %> @@ -120,7 +129,7 @@
- +
\ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js =================================================================== diff -u -r13080 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js (.../useRecordForm.js) (revision 13080) +++ ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js (.../useRecordForm.js) (revision 13522) @@ -19,6 +19,11 @@ singleSelect : false }); +//sm属性需要单独定义出来,不能与器械包的共用 +var materialGridSm = new top.Ext.grid.CheckboxSelectionModel({ + singleSelect : false +}); + var rd = new Ext.data.JsonReader( { fields : [ {name : 'id'}, @@ -27,6 +32,7 @@ {name : 'amount'}, {name : 'batchNo'}, {name : 'packageType'}, + {name : 'goodsType'}, {name : 'validUntil'}, {name : 'showTousseName'}, {name : 'tousseType'}, @@ -42,6 +48,23 @@ reader : rd }); +//器械材料数据源 +var materialStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/useRecordAction!loadMaterialGoodsByUseRecordId.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'externalCode'}, + {name : 'name'}, + {name : 'amount'}, + {name : 'goodsType'}, + {name : 'materialInvoiceSerialNumber'} + ] + }) +}); + var userReader = new Ext.data.JsonReader( { fields : [ {name : 'id'}, @@ -96,6 +119,11 @@ var result = response.responseText; if (result != "" && result != "{}") { var goodsInfo = Ext.util.JSON.decode(result); + + if(!goodsInfo.success || goodsInfo.success != true){ + showResult(goodsInfo.error); + return; + } if(goodsInfo.tousseType != '一次性物品'){ //检测该器械包有没有被召回 if('msg' in goodsInfo){ @@ -160,14 +188,15 @@ packageType : '', validUntil : goodsInfo.validUntil, tousseType : goodsInfo.tousseType, + goodsType : goodsInfo.goodsType, foreignTousseApp_id : '' }); tousseInstanceStore.add(record); useAmount++; top.Ext.getCmp('useAmount').setValue(useAmount); } } else { - showResult('找不到该条码的器械包!'); + showResult('找不到该条码的器械包或一次性物品!'); } }, failure : function(response, options) { @@ -238,7 +267,7 @@ var result = Ext.decode(response.responseText); var success = result.success; if (false == success) { - showResult('条码为:' + result.barcode + '的器械包状态必须为' + showResult('条码为:' + result.barcode + '的' + result.tousseType + '状态必须为' + hadShipped + '。'); pass = false; } @@ -639,6 +668,18 @@ else {// 已申请,只显示取消按钮 tbar = [ cancelBtn ]; } + + materialStore.on("beforeload", function(thiz, options) { + thiz.baseParams["useRecordId"] = id; + }); + materialStore.on("load", function(store,recordArry, options) { + var count = materialStore.getCount(); + if(count > 0){ + top.Ext.getCmp('tousseInstanceGrid').setHeight(165); + top.Ext.getCmp('materialGridFieldset').show(); + } + }); + materialStore.load(); } else {// 添加 if (sstsConfig.useRecordAuditMode == 2){ if(sstsConfig.useRecordNewAfterSubmit == 1){ @@ -668,15 +709,18 @@ listeners : { focus : function(thiz){ var record = top.Ext.getCmp('tousseInstanceGrid').getSelectionModel().getSelected(); - if(record.data.tousseType == '一次性物品'){ + if(record.data.tousseType == '一次性物品' && record.data.goodsType != '高值耗材'){ thiz.selectText(); - }else{ + }else if(record.data.tousseType != '一次性物品'){ top.Ext.MessageBox.alert("提示","不能修改器械包数量!"); + }else if(record.data.goodsType == '高值耗材'){ + top.Ext.MessageBox.alert("提示","不能修改高值耗材数量!"); } } } })}, {header : "包装类型",dataIndex : 'packageType',width : 90,menuDisabled : true}, + {header : "物品类型",dataIndex : 'goodsType',hidden : true}, {header : "批次",dataIndex : 'batchNo',width : 60,menuDisabled : true}, {header : "有效期",dataIndex : 'validUntil',menuDisabled : true,width : 60}, {header : "图片",dataIndex : 'tousseDefinitionName',menuDisabled : true,width : 35,renderer : function(v, p, record){ @@ -703,6 +747,15 @@ dataIndex : 'button' }]); + //器械材料 + var materialCm = new Ext.grid.ColumnModel([materialGridSm, + {header : "外部编码",dataIndex : 'externalCode',hidden : true,width : 150}, + {header : "名称",dataIndex : 'name',id:'name',width : 380}, + {header : "数量",dataIndex : 'amount',width : 100}, + {header : "物品类型",dataIndex : 'goodsType',width : 150}, + {header : "器械材料发货单号",dataIndex : 'materialInvoiceSerialNumber',id:'materialInvoiceSerialNumber',width : 150} + ]); + formObj = new top.Ext.FormPanel({ id : 'useRecordForm', frame : true, @@ -1198,15 +1251,15 @@ }] }, { xtype : "fieldset", - title : "器械包信息", + title : "器械包及一次性物品信息", layout : 'column', autoHeight : true, items : [new top.Ext.grid.EditorGridPanel({ id : 'tousseInstanceGrid', store : tousseInstanceStore, cm : tousseCm, height : 265, - width:840, + width:835, autoExpandColumn : 'delAction', frame : false, viewConfig: { @@ -1245,6 +1298,27 @@ anchor : '99%' }] })] + }, { + xtype : "fieldset", + id : "materialGridFieldset", + hidden : true, + title : "器械材料信息", + layout : 'column', + autoHeight : true, + items : [new top.Ext.grid.EditorGridPanel({ + id : 'materialGrid', + store : materialStore, + cm : materialCm, + height : 100, + width:835, + autoExpandColumn : 'materialInvoiceSerialNumber', + frame : false, + viewConfig: { + forceFit:true + }, + bodyStyle : 'border:1px solid #afd7af', + selModel :materialGridSm + })] }], buttons : tbar }); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java =================================================================== diff -u -r12590 -r13522 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 12590) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 13522) @@ -33,16 +33,22 @@ import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.barcode.dwr.table.BarcodeTableManager; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ContainerManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; @@ -88,6 +94,8 @@ private PackingManager packingManager; + private BarcodeManager barcodeManager; + public void setPackingManager(PackingManager packingManager) { this.packingManager = packingManager; } @@ -135,6 +143,10 @@ this.containerManager = containerManager; } + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + //更新数据库器械包错误的失效日期 public void updateTousseValidUntil(){ String sql = "where DATEDIFF(day,operationTime,validUntil) > 200 and (packageType = '纸塑' or packageType = '无纺布')"; @@ -342,9 +354,18 @@ if (TousseInstance.STATUS_SHIPPED.equals(status) || TousseInstance.STATUS_SIGNED.equals(status)) { continue; } else { - result = "{success:false,barcode:" + barcode + "}"; + result = "{success:false,barcode:" + barcode + " , tousseType:\""+TousseDefinition.PACKAGE_TYPE_INSIDE+"\"}"; break; } + }else{ + //如果不为器械包,则判断是否为高值耗材的一次性物品 + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if(bd != null && bd instanceof ExpensiveDisposablegoods){ + ExpensiveDisposablegoods ed = (ExpensiveDisposablegoods)bd; + if(!ExpensiveDisposablegoods.STATUS_DELIVERED.equals(ed.getStatus())){ + result = "{success:false,barcode:" + barcode + ", tousseType:\"" + DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS +"\"}"; + } + } } } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java =================================================================== diff -u -r13521 -r13522 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java (.../MaterialInvoiceItem.java) (revision 13521) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java (.../MaterialInvoiceItem.java) (revision 13522) @@ -5,6 +5,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -33,8 +34,25 @@ private Double settlementPrice = 0d;// 发货物品小结价格 private String goodsType;//材料类型,普通器械、高值耗材 + /** + * 使用记录id + * 由于高值耗材需要关联使用记录 + */ + private Long userecordId; /** + * 使用记录名称(格式:病人号:***;住院号(或诊疗号):***;),只用于页面显示 + * 不映射到数据库表 + */ + private String userecordName; + + /** + * 使用记录所属部门编码 + * 不映射到数据库表 + */ + private String userecordDepartCoding; + + /** * 仓库ID */ private Long wareHouseId; @@ -103,7 +121,7 @@ public void setWareHouseName(String wareHouseName) { this.wareHouseName = wareHouseName; } - + public String getGoodsType() { return goodsType; } @@ -112,4 +130,30 @@ this.goodsType = goodsType; } + public Long getUserecordId() { + return userecordId; + } + + public void setUserecordId(Long userecordId) { + this.userecordId = userecordId; + } + + @Transient + public String getUserecordName() { + return userecordName; + } + + public void setUserecordName(String userecordName) { + this.userecordName = userecordName; + } + + @Transient + public String getUserecordDepartCoding() { + return userecordDepartCoding; + } + + public void setUserecordDepartCoding(String userecordDepartCoding) { + this.userecordDepartCoding = userecordDepartCoding; + } + } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java =================================================================== diff -u -r13519 -r13522 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 13519) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 13522) @@ -21,9 +21,11 @@ import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedatamanager.invoice.service.InvoiceUtils; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; @@ -32,6 +34,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryDiposableGoodsItem; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; @@ -80,6 +83,8 @@ private WareHouseManager wareHouseManager; + private BarcodeManager barcodeManager; + public void setWriteBackInventoryHelper( WriteBackInventoryHelper writeBackInventoryHelper) { this.writeBackInventoryHelper = writeBackInventoryHelper; @@ -135,6 +140,10 @@ objectDao.saveOrUpdate(godownEntry); } + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + public GodownEntry getGodownEntryById(String id) { return (GodownEntry) objectDao.getByProperty( GodownEntry.class.getSimpleName(), "id", Long.valueOf(id)); @@ -495,9 +504,30 @@ warehousingByGodownEntryItemModifyOnlyAmount(entry, warehouseID, warehouseName, idToDisposableGoodsMap, idToDisposableGoodsStockMap, idToBatchStockMap, godownEntryItem); + //根据条码设置高值耗所属仓库 + setExpensiveGoodsWarehouse(godownEntryItem.getBarcode() , warehouseID, warehouseName); objectDao.update(godownEntryItem);// 更新item } } + + /** + * 根据条码设置高值耗所属仓库 + * @param barcode + * @param warehouseID + * @param warehouseName + */ + private void setExpensiveGoodsWarehouse(String barcode , Long warehouseID,String warehouseName){ + if(StringUtils.isNotBlank(barcode)){ + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if (bd != null && bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + expensiveDisposablegoods.setWarehouseID(warehouseID); + expensiveDisposablegoods.setWarehouseName(warehouseName); + objectDao.saveOrUpdate(expensiveDisposablegoods); + } + } + } private void warehousingByGodownEntryItem(GodownEntry entry, Long warehouseID, String warehouseName, @@ -1705,6 +1735,29 @@ if(outAmount <= 0){ throw new RuntimeException("退库数量必须大于0!"); } + + DisposableGoods disposableGoods = diposableGoodsManager.getDisposableGoodsById(String.valueOf(disposableGoodsID)); + //判断是否为高值耗材 + if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + if(outAmount != 1){ + outAmount = 1; + } + GodownEntryDiposableGoodsItem diposableGoodsItem = new GodownEntryDiposableGoodsItem(); + diposableGoodsItem.setAmount(outAmount); + diposableGoodsItem.setDisposableGoodsID(disposableGoodsID); + diposableGoodsItem.setDisposableGoodsStockID(disposableGoodsStockID); + diposableGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchID); + diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + diposableGoodsItem.setGodownEntryID(entry.getId());// 关联退库单ID + diposableGoodsItem.setGodownEntryItemID(godownEntryItem.getId());// 关联退库itemID + + // 库存调整 + disposableGoodsBatchStock.adjustAmount(-outAmount); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(diposableGoods); + objectDao.save(diposableGoodsItem);// 保存diposableGoodsItem + outAmount = 0; + } // 这是用户在页面看到的退库价格,必须从这些价格的标识号里面退库 Double outPrice = godownEntryItem.getCost(); // 开始退库 Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/GodownEntryTableManager.java =================================================================== diff -u -r13509 -r13522 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/GodownEntryTableManager.java (.../GodownEntryTableManager.java) (revision 13509) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/GodownEntryTableManager.java (.../GodownEntryTableManager.java) (revision 13522) @@ -378,6 +378,14 @@ GodownEntryItem godownEntryItem = godownEntryItemManager.getLastGodownEntryByDisposableGoodsId(disposableGoodsId); JSONObject jsonObject = new JSONObject(); + + //查一次性物品定义的类别 + DisposableGoods disposableGoods = + diposableGoodsManager.getDisposableGoodsById(disposableGoodsId); + if(disposableGoods != null && StringUtils.isNotBlank(disposableGoods.getGrade())){ + jsonObject.put("grade", disposableGoods.getGrade()); + } + jsonObject.put("certification", ""); jsonObject.put("producingArea", ""); jsonObject.put("supplierName", ""); @@ -405,24 +413,10 @@ if(StringUtils.isNotBlank(godownEntryItem.getSterileBatchNumber())){ jsonObject.put("sterileBatchNumber", godownEntryItem.getSterileBatchNumber()); } - //尖别 - if(StringUtils.isNotBlank(godownEntryItem.getGrade())){ + //类别 + if(StringUtils.isBlank(jsonObject.optString("grade")) && StringUtils.isNotBlank(godownEntryItem.getGrade())){ jsonObject.put("grade", godownEntryItem.getGrade()); - }else{ - //查一次性物品定义的类别 - DisposableGoods disposableGoods = - diposableGoodsManager.getDisposableGoodsById(disposableGoodsId); - if(disposableGoods != null && StringUtils.isNotBlank(disposableGoods.getGrade())){ - jsonObject.put("grade", disposableGoods.getGrade()); - } } - }else{ - //查一次性物品定义的类别 - DisposableGoods disposableGoods = - diposableGoodsManager.getDisposableGoodsById(disposableGoodsId); - if(disposableGoods != null && StringUtils.isNotBlank(disposableGoods.getGrade())){ - jsonObject.put("grade", disposableGoods.getGrade()); - } } return jsonObject.toString(); } Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/appropriationView.js =================================================================== diff -u -r13181 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/appropriationView.js (.../appropriationView.js) (revision 13181) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/appropriationView.js (.../appropriationView.js) (revision 13522) @@ -150,6 +150,7 @@ {name : 'id',mapping : 'id'}, {name : 'spelling',mapping : 'spelling'}, {name : 'name',mapping : 'name'}, + {name : 'goodsType',mapping : 'goodsType'}, {name : 'referencePrice',mapping : 'referencePrice'}, {name : 'supplierName',mapping : 'supplierName'}, ]), @@ -326,6 +327,87 @@ // top.Ext.getCmp('name1').focus(); } +//添加高值耗材的明细 +function addExpensiveDisposableGoodsItemsFromBarcode(disposableGoodsStockID,name,amount,batch,priceAmount){ + if(isUndefinedOrNull(batch)){ + showResult("请填写批次!"); + return false; + } + var batchNumber = batch.batchNumber; + if(name == null || name == ''){ + showResult("请填写物品名称!"); + return false; + } + + if(amount == null || amount == ''){ + showResult("请填写数量!"); + return false; + } + + if(!top.Ext.getCmp('amount2').isValid()){ + showResult("请正确填写数量!"); + return false; + } + if(top.Ext.getCmp('batchNumber2').getValue() == null || top.Ext.getCmp('batchNumber2').getValue() == ''){ + showResult("请填写批次!"); + return false; + } + if(isUndefinedOrNull(priceAmount)){ + showResult("请选择价格!"); + return false; + } + // 物品是否重复(高值耗材扫条码增加按条码的判断) + var godownEntryItemGridStore = top.Ext.getCmp('appropriateItemGrid').getStore(); + for(var i = 0;i < godownEntryItemGridStore.getCount();i++){ + var godownEntryItem = godownEntryItemGridStore.getAt(i).data; + if(godownEntryItem.disposableGoodsStockID == disposableGoodsStockID + && godownEntryItem.batchNumber == batchNumber + && godownEntryItem.cost == priceAmount.price + && godownEntryItem.barcode == top.Ext.getCmp('tempBarcodeHidden').getValue()){ + showResult("该物品已经存在,不能重复添加!"); + return false; + } + } +// var cost = top.Ext.getCmp('cost').getValue(); + var expDate = top.Ext.getCmp('expDate').getValue(); + var supplierName = top.Ext.getCmp('supplierName').getValue(); + var sterileBatchNumber = top.Ext.getCmp('sterileBatchNumber').getValue(); + var manufacturer = top.Ext.getCmp('manufacturer').getValue(); + var producingArea = top.Ext.getCmp('producingArea').getValue(); + var certification = top.Ext.getCmp('certification').getValue(); + //添加操作 + var godownEntryItem = new GodownEntryItemRecord({ + disposableGoodsID: batch.disposableGoodsID, + disposableGoodsStockID: batch.disposableGoodsStockID, + disposableGoodsBatchID: batch.disposableGoodsBatchID, + disposableGoodsBatchStockID: batch.id, + localID:g_localID++, + id : "", + disposableGoodsStockID : disposableGoodsStockID, + identificationID : '', + batchID : batch.id, + name : name, + amount : amount, + canOutAmount : priceAmount.amount, + cost : priceAmount.price, + batchNumber : batch.batchNumber, + expDate : expDate, + supplierName : supplierName, + sterileBatchNumber : sterileBatchNumber, + manufacturer : manufacturer, + producingArea : producingArea, + barcode : top.Ext.getCmp('tempBarcodeHidden').getValue() + }); + top.Ext.getCmp('appropriateItemGrid').getStore().insert(0,godownEntryItem); + scanedBarcodes += top.Ext.getCmp('tempBarcodeHidden').getValue(); + top.Ext.getCmp('tempBarcodeHidden').setValue(''); + currentBarcodeBatchStock = {}; + top.Ext.getCmp('name2').setValue(''); + top.Ext.getCmp('amount2').setValue(''); + top.Ext.getCmp('batchNumber2').setValue(''); + top.Ext.getCmp('price2').setValue(''); +} + function renderDeleteButton(v,p,record){ return ""; } @@ -334,6 +416,10 @@ var godownEntryItemGridStore = top.Ext.getCmp('appropriateItemGrid').getStore(); for(var i = 0;i +<%@ include file="/common/taglibs.jsp"%> +<%@ include file="/common/includeExtJsAndCss.jsp"%> +<%@ page import="com.forgon.disinfectsystem.entity.useRecord.UseRecord" %> +<% + String statusAudited = UseRecord.STATUS_AUDITED;//已审核 + String statusApplied = UseRecord.STATUS_APPLIED;//已申请 + String statusCondigion = statusAudited + ";" + statusApplied; +%> + + + +使用记录 + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+ + \ No newline at end of file Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java =================================================================== diff -u -r12640 -r13522 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 12640) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 13522) @@ -26,7 +26,9 @@ import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; +import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; /** * @@ -43,7 +45,14 @@ public UseRecord getUseRecordById(Long id); public List getUseRecordList(String departCoding, int firstIndex, int maxResults); + /** + * 根据使用记录id查询器械材料使用记录 + * @param userecordId + * @return + */ + public List findMaterialGoodsListByUseRecordId(Long userecordId); + /** * 通过部门名称和用户名查询使用记录所使用的包的数量 * @param depart * @param userName @@ -126,4 +135,12 @@ * @return */ public String getUseRecordJsonById(String id); + + /** + * 根据发货单的id查询发货单信息 + * 由于InvoiceManager所在的发货模块没有被使用记录模块依赖导致不能注入,所以在此定义方法 + * @param id + * @return + */ + public Invoice getInvoiceById(Long id); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java =================================================================== diff -u -r13519 -r13522 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java (.../ExpensiveDisposablegoods.java) (revision 13519) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java (.../ExpensiveDisposablegoods.java) (revision 13522) @@ -24,6 +24,7 @@ public static final String STATUS_DELIVERED = "已发货"; public static final String STATUS_RECEIVED = "已领用"; public static final String STATUS_RETURNED = "已退货"; + public static final String STATUS_USED = "已使用"; private String identification; // 标识号 private Date entryDate; // 入库时间 Index: ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js =================================================================== diff -u -r13125 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js (.../materialInvoiceView.js) (revision 13125) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js (.../materialInvoiceView.js) (revision 13522) @@ -28,7 +28,10 @@ {name : 'materialDefinitionId'}, {name : 'materialName'}, {name : 'amount'}, - {name : 'storage'} + {name : 'storage'}, + {name : 'userecordId'}, + {name : 'userecordName'}, + {name : 'userecordDepartCoding'} ]); //添加材料发货 @@ -92,9 +95,31 @@ } } }); + + //使用记录数据源(高值耗材发货时必须选择使用记录) + var userecordStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/materialDefinitionAction!getMaterialDefinitionDataForMaterial.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'patientName',mapping : 'patientName'}, + {name : 'hospitalNum',mapping : 'hospitalNum'}, + {name : 'treatmentNum',mapping : 'treatmentNum'} + ]), + listeners : { + beforeload : function(store,option) { + store.baseParams['departCoding'] = top.Ext.getCmp('departCoding').getValue(); + } + } + }); //添加明细 - function addItems(materialDefinitionId,name,amount,storage){ + function addItems(materialDefinitionId,name,amount,storage,userecordId,userecordName,userecordDepartCoding){ if(name == null || name == ''){ showResult("请填写物品名称!"); return false; @@ -116,8 +141,9 @@ } for(var i = 0;i < top.Ext.getCmp('materialInvoiceItemGrid').getStore().getCount();i++){ - if(top.Ext.getCmp('materialInvoiceItemGrid').getStore().getAt(i).data.materialDefinitionId == materialDefinitionId){ - showResult("该物品已经存在,不能重复添加!"); + if(top.Ext.getCmp('materialInvoiceItemGrid').getStore().getAt(i).data.materialDefinitionId == materialDefinitionId + && top.Ext.getCmp('materialInvoiceItemGrid').getStore().getAt(i).data.userecordDepartCoding == userecordDepartCoding){ + showResult("该物品以及关联的使用记录已经存在,不能重复添加!"); return false; } } @@ -127,13 +153,19 @@ id : "", materialDefinitionId : materialDefinitionId, materialName : name, - amount : amount + amount : amount, + userecordId : userecordId, + userecordName : userecordName, + userecordDepartCoding : userecordDepartCoding }); top.Ext.getCmp('materialInvoiceItemGrid').getStore().add(materialInvoiceItem); top.Ext.getCmp('name1').setValue(''); top.Ext.getCmp('amount1').setValue(''); top.Ext.getCmp('materialDefinitionId').setValue(''); + top.Ext.getCmp('userecordId').setValue(''); + top.Ext.getCmp('userecordName').setValue(''); + top.Ext.getCmp('userecordDepartCoding').setValue(''); top.Ext.getCmp('name1').focus(); } @@ -169,6 +201,14 @@ name : 'departCoding', id : 'departCoding' },{ + xtype : 'hidden', + name : 'userecordId', + id : 'userecordId' + },{ + xtype : 'hidden', + name : 'userecordDepartCoding', + id : 'userecordDepartCoding' + },{ id:'serialNum', columnWidth : .33, layout : 'form', @@ -300,6 +340,9 @@ {name : 'id'}, {name : 'materialDefinitionId'}, {name : 'materialName'}, + {name : 'userecordId'}, + {name : 'userecordName'}, + {name : 'userecordDepartCoding'}, {name : 'amount'}, {name : 'deleteButton'} ] @@ -329,14 +372,34 @@ } }) }, - {header : " 数量",dataIndex : 'amount',width : 90,menuDisabled : true, + {header : "使用记录id",dataIndex : 'userecordId',hidden : true}, + {header : "使用记录的科室编码",dataIndex : 'userecordDepartCoding',hidden : true}, + {header : "使用记录",dataIndex : 'userecordName',width : 120/*,menuDisabled : true, editor : new Ext.form.TextField({ + readOnly : true, + listeners : { + render : function(p) { + p.getEl().on('click', function(q){ + if(top.Ext.getCmp('departCoding').getValue() == ''){ + alert('请先选择科室!'); + return; + } + + //点击时弹出window显示使用记录列表进行选择 + openUserecordWindow(p.getEl()); + }); + } + } + })*/ + }, + {header : " 数量",dataIndex : 'amount',width : 40,menuDisabled : true, + editor : new Ext.form.TextField({ regex: /^\d+$/, regexText:'只能输入数字', allowBlank : false }) }, - {header : "删除",width : 90,menuDisabled : true,dataIndex : 'deleteButton', id:'expandColumn', renderer:renderDeleteButton} + {header : "删除",width : 40,menuDisabled : true,dataIndex : 'deleteButton', id:'expandColumn', renderer:renderDeleteButton} ]), width :735, height : 250, @@ -371,13 +434,12 @@ hideTrigger : true, typeAhead : false, allowBlank : true, - width : 350, + width : 320, listeners : { select : function(combo, record, index) { top.Ext.getCmp('name1').setValue(record.data.name); top.Ext.getCmp('materialDefinitionId').setValue(record.data.id); top.Ext.getCmp('storage').setValue(record.data.storage); - storage }, specialkey : function(field, ee) { if (ee.getKey() == Ext.EventObject.ENTER) { @@ -386,13 +448,36 @@ } } },{ + text : '  ' + },{ + xtype : 'textfield', + id : 'userecordName', + name : 'userecordName', + width : 200, + anchor : '95%', + emptyText : '点击选择使用记录', + readOnly : true, + listeners : { + render : function(p) { + p.getEl().on('click', function(q){ + if(top.Ext.getCmp('departCoding').getValue() == ''){ + alert('请先选择科室!'); + return; + } + + //点击时弹出window显示使用记录列表进行选择 + openUserecordWindow(p.getEl()); + }); + } + } + },{ text : ' 数量:' },{ xtype : 'textfield', maxLength : '16', id : 'amount1', name : 'amount1', - width : 70, + width : 40, regex: /^\d+$/, regexText:'只能输入数字', anchor : '95%', @@ -403,7 +488,10 @@ var name = top.Ext.getCmp('name1').getValue(); var amount = top.Ext.getCmp('amount1').getValue(); var storage = top.Ext.getCmp('storage').getValue(); - addItems(materialDefinitionId,name,amount,storage); + var userecordId = top.Ext.getCmp('userecordId').getValue(); + var userecordName = top.Ext.getCmp('userecordName').getValue(); + var userecordDepartCoding = top.Ext.getCmp('departCoding').getValue(); + addItems(materialDefinitionId,name,amount,storage,userecordId,userecordName,userecordDepartCoding); } } } @@ -415,7 +503,10 @@ var name = top.Ext.getCmp('name1').getValue(); var amount = top.Ext.getCmp('amount1').getValue(); var storage = top.Ext.getCmp('storage').getValue(); - addItems(materialDefinitionId,name,amount,storage); + var userecordId = top.Ext.getCmp('userecordId').getValue(); + var userecordName = top.Ext.getCmp('userecordName').getValue(); + var userecordDepartCoding = top.Ext.getCmp('departCoding').getValue(); + addItems(materialDefinitionId,name,amount,storage,userecordId,userecordName,userecordDepartCoding); } } ] @@ -424,6 +515,11 @@ id : 'btnSave', text : '保存', handler : function() { + + if (!form.getForm().isValid()) { + showResult('请正确填写表单各值'); + return false; + } var itemGrid = top.Ext.getCmp('materialInvoiceItemGrid'); var store = itemGrid.getStore(); @@ -432,6 +528,13 @@ return false; } + for(var i = 0;i < top.Ext.getCmp('materialInvoiceItemGrid').getStore().getCount();i++){ + if(top.Ext.getCmp('materialInvoiceItemGrid').getStore().getAt(i).data.userecordDepartCoding != top.Ext.getCmp('departCoding').getValue()){ + showResult("使用记录所选科室与发货单所选科室不一致!"); + return false; + } + } + var jsonArray = new Array(); for(var i = 0;i < store.getCount();i++){ var record = store.getAt(i); @@ -441,23 +544,20 @@ jsonArray[len].materialDefinitionId = record.data.materialDefinitionId; jsonArray[len].materialName = record.data.materialName; jsonArray[len].amount = record.data.amount; + jsonArray[len].userecordId = record.data.userecordId; } top.Ext.getCmp("materialInvoiceItem").setValue(Ext.encode(jsonArray)); + //alert("materialInvoiceItem=" + top.Ext.getCmp("materialInvoiceItem").getValue());return false; - if (!form.getForm().isValid()) { - showResult('请正确填写表单各值'); - return false; - } - form.form.submit({ url : WWWROOT + '/disinfectSystem/materialInvoiceAction!saveMaterialInvoice.do', method : 'POST', waitMsg : '正在保存数据,请稍候', waitTitle : '提交表单', success : function(form, action) { - window.close(); + invoiceWindow.close(); showResult(action.result.message); grid.dwrReload(); @@ -470,12 +570,12 @@ },{ text : '取消', handler : function() { - window.close(); + invoiceWindow.close(); } }] }); - var window = new top.Ext.Window( { + var invoiceWindow = new top.Ext.Window( { id : 'materialInvoiceWin', layout : 'fit', title : '材料发货单信息', @@ -486,7 +586,7 @@ plain : true, items : [ form ] }); - window.show(); + invoiceWindow.show(); //myMask.show(); top.Ext.getCmp("btnSave").setDisabled(false); sourceWarehouseStore.load(); @@ -686,7 +786,10 @@ id : action.result.data.materialInvoiceItemList[i].id, materialDefinitionId : action.result.data.materialInvoiceItemList[i].materialDefinitionId, materialName : materialName, - amount : action.result.data.materialInvoiceItemList[i].amount + amount : action.result.data.materialInvoiceItemList[i].amount, + userecordId : action.result.data.materialInvoiceItemList[i].userecordId, + userecordName : action.result.data.materialInvoiceItemList[i].userecordName, + userecordDepartCoding : action.result.data.materialInvoiceItemList[i].userecordDepartCoding }); top.Ext.getCmp('materialInvoiceItemGrid').getStore().add(materialInvoiceItem); @@ -697,6 +800,42 @@ }); } +var selectedUserecordObject; +function openUserecordWindow(currentElement){ + var arg = {'departCoding':top.Ext.getCmp('departCoding').getValue(),'depart':top.Ext.getCmp('depart').getValue()}; //要传进去的其他参数 + arg.win = window; //把当前窗口的引用当参数传进去 + selectedUserecordObject = window.showModalDialog(WWWROOT+'/disinfectsystem/invoice/selectUserecordWindowView.jsp', arg, 'dialogWidth:1000px;dialogHeight:600px;center:yes;help:no'); + if(selectedUserecordObject){ + var selectedUserecordJsonObject = Ext.decode(selectedUserecordObject); + if(selectedUserecordJsonObject){ + if(selectedUserecordJsonObject.id){ + top.Ext.getCmp("userecordId").setValue(selectedUserecordJsonObject.id); + } + + var showText = ""; + //id:" + d.data.id + ",patientName:'" + d.data.patientName + "',hospitalNum:'" + d.data.hospitalNum + "',treatmentNum:'" + d.data.treatmentNum + "' + if(selectedUserecordJsonObject.patientName){ + showText += "病人名:" + selectedUserecordJsonObject.patientName + ";"; + } + if(selectedUserecordJsonObject.hospitalNum){ + showText += "住院号:" + selectedUserecordJsonObject.hospitalNum + ";"; + } + if(selectedUserecordJsonObject.treatmentNum){ + showText += "诊疗号:" + selectedUserecordJsonObject.treatmentNum + ";"; + } + if(showText != ''){ + var extElementId = currentElement.id; + top.Ext.getCmp(extElementId).setValue(showText); + //document.getElementById(extElementId).value = showText; + } + } + }else{ + top.Ext.getCmp("userecordId").setValue(""); + top.Ext.getCmp("userecordName").setValue(""); + } + +} + /** * 修改记录 * modifyRecord函数 触发modify函数调用,并传入当前列的值以及record.data对象 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseDiposableGoodsItem.java =================================================================== diff -u -r12581 -r13522 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseDiposableGoodsItem.java (.../UseDiposableGoodsItem.java) (revision 12581) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseDiposableGoodsItem.java (.../UseDiposableGoodsItem.java) (revision 13522) @@ -18,6 +18,11 @@ private Long id; + /** + * 新增加一次性物品定义字段,需要对旧数据的该字段进行升级处理 + */ + private Long disposableGoodsId; + private String name; private Integer amount; @@ -38,6 +43,14 @@ this.id = id; } + public Long getDisposableGoodsId() { + return disposableGoodsId; + } + + public void setDisposableGoodsId(Long disposableGoodsId) { + this.disposableGoodsId = disposableGoodsId; + } + public String getName() { return name; } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java =================================================================== diff -u -r12672 -r13522 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 12672) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 13522) @@ -16,22 +16,30 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.useRecord.UseDiposableGoodsItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.useRecord.service.UseRecordManager; +import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; import com.forgon.tools.StrutsParamUtils; @@ -65,6 +73,8 @@ private BarcodeManager barcodeManager; + private DiposableGoodsManager diposableGoodsManager; + public void setBarcodeManager(BarcodeManager barcodeManager) { this.barcodeManager = barcodeManager; } @@ -90,6 +100,14 @@ this.useRecordManager = useRecordManager; } + public DiposableGoodsManager getDiposableGoodsManager() { + return diposableGoodsManager; + } + + public void setDiposableGoodsManager(DiposableGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + public void getOperationName() { List list = httpOptionManager .getHttpOptionTextById(HttpOption.SYSTENSETTING_OPERATION_NAME); @@ -311,7 +329,42 @@ } } + + /** + * 读取使用记录的器械材料 + */ + public void loadMaterialGoodsByUseRecordId() { + String useRecordId = StrutsParamUtils.getPraramValue("useRecordId", ""); + StrutsParamUtils.getResponse().setContentType("text/html;charset=UTF-8"); + JSONArray array = new JSONArray(); + UseRecord record = useRecordManager.getUseRecordById(useRecordId); + if(record != null){ + List useMaterialGoodsItems = useRecordManager.findMaterialGoodsListByUseRecordId(Long.valueOf(useRecordId)); + if(CollectionUtils.isNotEmpty(useMaterialGoodsItems)){ + /*for (UseMaterialGoodsItem umi : useMaterialGoodsItems) { + JSONObject obj = new JSONObject(); + obj.put("id", umi.getExternalCode()); + obj.put("barcode", di.getBarcode()); + obj.put("amount", di.getAmount()); + obj.put("tousseDefinitionName", di.getName()); + obj.put("showTousseName", di.getName()); + obj.put("batchNo", di.getBatchNo()); + obj.put("packageType", ""); + obj.put("validUntil", di.getValidUntil()); + obj.put("tousseType", "一次性物品"); + array.add(obj); + }*/ + array = JSONArray.fromObject(useMaterialGoodsItems); + } + } + try { + StrutsParamUtils.getResponse().getWriter().println(array.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + private void getTousseInstanceListJson( List tousseInstances,JSONArray array) { if (tousseInstances != null) { @@ -495,59 +548,140 @@ public void loadScanedGoods(){ String barcode = StrutsParamUtils.getPraramValue("barcode", null); JSONObject obj = new JSONObject(); - if (StringUtils.isNotBlank(barcode)) { - BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); - if (bd != null) { - if (bd instanceof TousseInstance) { - TousseInstance ti = (TousseInstance) bd; - // 检测该器械包有没有被召回 - if (TousseInstance.STATUS_WAIT_FOR_RECALL.equals(ti.getStatus()) || TousseInstance.STATUS_RECALLED.equals(ti.getStatus())) { - obj.put("msg", "该器械包不能被使用,已被召回!"); - } else { - Date validUntil = ti.getValidUntil(); - String validUntilStr = ""; - if (validUntil != null) { - validUntilStr = new SimpleDateFormat("yyyy-MM-dd") - .format(validUntil); + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = null; + try { + out = response.getWriter(); + obj.put("success", true); + if (StringUtils.isNotBlank(barcode)) { + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if (bd != null) { + if (bd instanceof TousseInstance) { + TousseInstance ti = (TousseInstance) bd; + // 检测该器械包有没有被召回 + if (TousseInstance.STATUS_WAIT_FOR_RECALL.equals(ti.getStatus()) || TousseInstance.STATUS_RECALLED.equals(ti.getStatus())) { + obj.put("msg", "该器械包不能被使用,已被召回!"); + } else { + Date validUntil = ti.getValidUntil(); + String validUntilStr = ""; + if (validUntil != null) { + validUntilStr = new SimpleDateFormat("yyyy-MM-dd") + .format(validUntil); + } + TousseDefinition td = ti.getTousseDefinition(); + String tousseDefinitionName = ""; + String tousseType = ""; + if (td != null) { + tousseType = td.getTousseType(); + tousseDefinitionName = td.getName(); + } + obj.put("id", ti.getId()); + obj.put("barcode", ti.getBarcode()); + obj.put("tousseDefinitionName", tousseDefinitionName); + obj.put("showTousseName", ti.getShowTousseName()); + obj.put("packageType", ti.getPackageType()); + obj.put("validUntil", validUntilStr); + obj.put("status", ti.getStatus()); + obj.put("locationForDisplay",ti.getLocationForDisplay()); + obj.put("materials", null); + obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); + obj.put("tousseType", tousseType); } - TousseDefinition td = ti.getTousseDefinition(); - String tousseDefinitionName = ""; - String tousseType = ""; - if (td != null) { - tousseType = td.getTousseType(); - tousseDefinitionName = td.getName(); + } else if (bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + if(!ExpensiveDisposablegoods.STATUS_DELIVERED.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材状态不为%s,不能录使用记录", barcode,ExpensiveDisposablegoods.STATUS_DELIVERED)); + return; } - obj.put("id", ti.getId()); - obj.put("barcode", ti.getBarcode()); - obj.put("tousseDefinitionName", tousseDefinitionName); - obj.put("showTousseName", ti.getShowTousseName()); - obj.put("packageType", ti.getPackageType()); - obj.put("validUntil", validUntilStr); - obj.put("status", ti.getStatus()); - obj.put("locationForDisplay",ti.getLocationForDisplay()); - obj.put("materials", null); - obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); - obj.put("tousseType", tousseType); + + //判断该高值耗材关联的一次性物品定义的物品类型是否为高值耗材(防止入库时定义为高值耗材,后来修改定义为非高值耗材) + if(expensiveDisposablegoods.getDisposableGoodsID() == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材未找到一次性物品定义", barcode)); + return; + } + DisposableGoods disposableGoods = + diposableGoodsManager.getDisposableGoodsById(String.valueOf(expensiveDisposablegoods.getDisposableGoodsID())); + if(disposableGoods == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材一次性物品定义已被删除", barcode)); + return; + } + + if(!DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材对应一次性物品不为高值耗材", barcode)); + return; + } + + //需要判断发货单是否存在且发货科室与当前登录用户是否为同一个科室,否则给予提示 + Long invoiceId = expensiveDisposablegoods.getInvoiceId(); + if(invoiceId == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); + return; + } + + Invoice invoice = useRecordManager.getInvoiceById(invoiceId); + if(invoice == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); + return; + } + + if(!StringUtils.equals(invoice.getDepart(), AcegiHelper.getLoginUser().getCurrentOrgUnitName())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材所属科室与当前登录用户所属科室不一致", barcode)); + return; + } + + Long disposableGoodsBatchId = expensiveDisposablegoods.getDisposableGoodsBatchID(); + if(disposableGoodsBatchId == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材数据异常,批次定义id为空", barcode)); + return; + } + DisposableGoodsBatch batch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchId); + if(batch == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材批次定义已被删除", barcode)); + return; + } + obj.put("barcode", bd.getBarcode()); + obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); + obj.put("batchNo", batch.getBatchNumber()); + obj.put("validUntil", batch.getExpDateStr()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); + obj.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + } else if (bd instanceof DisposableGoodsBatch) { + DisposableGoodsBatch batch = (DisposableGoodsBatch) bd; + DisposableGoods disposableGoods = batch.getDiposableGoods(); + if(disposableGoods == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的一次性物品定义已被删除", barcode)); + return; + } + if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的一次性物品为高值耗材,只能扫描高值耗材的条码", barcode)); + return; + } + obj.put("barcode", batch.getBarcode()); + obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); + obj.put("batchNo", batch.getBatchNumber()); + obj.put("validUntil", batch.getExpDateStr()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); } - } else if (bd instanceof DisposableGoodsBatch) { - DisposableGoodsBatch batch = (DisposableGoodsBatch) bd; - obj.put("barcode", batch.getBarcode()); - obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); - obj.put("batchNo", batch.getBatchNumber()); - obj.put("validUntil", batch.getExpDateStr()); - obj.put("tousseType", "一次性物品"); } } - } - HttpServletResponse response = StrutsParamUtils.getResponse(); - response.setCharacterEncoding("UTF-8"); - PrintWriter out; - try { - out = response.getWriter(); - out.print(obj.toString()); - out.close(); } catch (IOException e) { e.printStackTrace(); + }finally{ + out.print(obj.toString()); + out.close(); } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java =================================================================== diff -u -r12581 -r13522 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java (.../UseRecord.java) (revision 12581) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java (.../UseRecord.java) (revision 13522) @@ -21,6 +21,7 @@ import org.hibernate.annotations.CascadeType; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; import com.forgon.tools.hibernate.ObjectDao; /** @@ -113,6 +114,11 @@ private List diposableGoodsItems; + /** + * 使用材料明细 + */ + private List materialGoodsItems; + @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r13355 -r13522 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 13355) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 13522) @@ -15,6 +15,7 @@ import java.util.Set; import jxl.common.Logger; +import net.sf.ehcache.search.Results; import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; @@ -32,12 +33,14 @@ import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.datasynchronization.model.PatientInfoVO; import com.forgon.disinfectsystem.datasynchronization.service.DataSynchronizationManager; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; 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.departmentstock.DepartmentStock; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; @@ -48,6 +51,7 @@ import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousseitem.service.TousseItemManager; +import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; @@ -158,6 +162,43 @@ public void saveOrUpdate(UseRecord useRecord) { objectDao.saveOrUpdate(useRecord); } + + /** + * 根据使用记录id查询器械材料使用记录 + * @param userecordId + * @return + */ + public List findMaterialGoodsListByUseRecordId(Long userecordId){ + List list = new ArrayList(); + ResultSet rs = null; + try{ + rs = objectDao.executeSql("select mi.serialNumber materialInvoiceSerialNumber,md.externalCode,md.id materialDefinitionId,md.name,md.specification,mii.id materialInvoiceItemId, mii.amount,md.goodsType from MaterialInvoice mi " + + "join MaterialInvoiceItem mii on mi.id=mii.materialInvoice_id join MaterialDefinition md on mii.materialDefinitionId=md.id " + + "where mii.userecordId=" + userecordId); + while(rs.next()){ + UseMaterialGoodsItem umi = new UseMaterialGoodsItem(); + umi.setExternalCode(rs.getString("externalCode")); + String name = rs.getString("name"); + String specification = rs.getString("specification"); + MaterialDefinition md = new MaterialDefinition(); + md.setName(name); + md.setSpecification(specification); + umi.setName(CssdUtils.getMaterialName(md)); + Number amount = (Number)rs.getObject("amount"); + umi.setAmount(amount == null ? 0 : amount.intValue()); + umi.setMaterialInvoiceSerialNumber(rs.getString("materialInvoiceSerialNumber")); + umi.setGoodsType(rs.getString("goodsType")); + Number materialDefinitionId = (Number)rs.getObject("materialDefinitionId"); + umi.setMaterialDefinitionId(materialDefinitionId == null ? null : materialDefinitionId.longValue()); + Number materialInvoiceItemId = (Number)rs.getObject("materialInvoiceItemId"); + umi.setMaterialInvoiceItemId(materialInvoiceItemId == null ? null : materialInvoiceItemId.longValue()); + list.add(umi); + } + }catch(Exception e){ + logger.error("根据使用记录id查询器械材料使用记录报错:" + e); + } + return list; + } @Override public boolean saveOrUpdateUseRecordAndTousseInstanceList( @@ -1636,4 +1677,14 @@ UseRecord useRecord = getUseRecordById(id); return UseRecordToJson.converUseRecordPoToJson(useRecord, tousseInstanceManager); } + + /** + * 根据发货单的id查询发货单信息 + * 由于InvoiceManager所在的发货模块没有被使用记录模块依赖导致不能注入,所以在此定义方法 + * @param id + * @return + */ + public Invoice getInvoiceById(Long id){ + return (Invoice)objectDao.getBySql(Invoice.class.getSimpleName(), " where id=" + id); + } } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStockManagerImpl.java =================================================================== diff -u -r13339 -r13522 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStockManagerImpl.java (.../DisposableGoodsStockManagerImpl.java) (revision 13339) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStockManagerImpl.java (.../DisposableGoodsStockManagerImpl.java) (revision 13522) @@ -123,7 +123,7 @@ SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); double floatPercent = config.getDiposablePriceFluctuation();// 一次性物品浮动价格系数/ List> mapList = new ArrayList>(); - System.out.println("sql:" + sql); + //System.out.println("sql:" + sql); ResultSet resultSet = objectDao.executeSql(sql); try { while (resultSet.next()) { @@ -195,6 +195,15 @@ temp.put("type", "一次性物品"); temp.put("name", goodsName); + Number n = (Number)resultSet.getObject("disposableGoodsId"); + Long disposableGoodsId = n == null ? null : n.longValue(); + if(DatabaseUtil.isPoIdValid(disposableGoodsId)){ + DisposableGoods disposableGoods = + (DisposableGoods)objectDao.getBySql(DisposableGoods.class.getSimpleName(), "where id=" + disposableGoodsId); + if(disposableGoods != null){ + temp.put("goodsType", disposableGoods.getGoodsType()); + } + } temp.put("spelling", resultSet.getString("spelling")); temp.put("amount", damount == null?0:damount); temp.put("externalCode", resultSet.getString("externalCode")); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java =================================================================== diff -u -r13519 -r13522 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java (.../GodownEntryItem.java) (revision 13519) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java (.../GodownEntryItem.java) (revision 13522) @@ -99,6 +99,11 @@ */ private String hasInvoice; + /** + * 条码(一般用于一次性物品高值耗材,后期可支持普通一次性物品的批次条码) + */ + private String barcode; + @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { @@ -449,6 +454,15 @@ public void setHasInvoice(String hasInvoice) { this.hasInvoice = hasInvoice; } + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + /** * 获取分类级别,只能是一类二类三类,如果都不是,返回null * @return Index: ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js =================================================================== diff -u -r13520 -r13522 --- ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 13520) +++ ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 13522) @@ -450,7 +450,7 @@ hideTrigger : true, typeAhead : false, allowBlank : true, - width : 150, + width : 250, listeners : { select : function(combo, record, index) { top.Ext.getCmp('name1').setValue(record.data.name); @@ -481,7 +481,7 @@ hideTrigger : true, typeAhead : false, allowBlank : true, - width : 200, + width : 180, listeners : { select : function(combo, record, index) { combo.setValue(record.data.name); @@ -499,7 +499,7 @@ maxLength : '16', id : 'amount1', name : 'amount1', - width : 70, + width : 40, regex: /^\d+$/, regexText:'只能输入数字', anchor : '95%', @@ -517,7 +517,7 @@ maxLength : '16', id : 'cost1', name : 'cost1', - width : 70, + width : 40, regex: /^(([1-9]+[0-9]*.{1}[0-9]+)|([0].{1}[1-9]+[0-9]*)|([1-9][0-9]*)|([0][.][0-9]+[1-9]*))$/, regexText:'只能输入正数', anchor : '95%', @@ -580,18 +580,7 @@ allowBlank : true, width : 80, tabIndex : 9, - hidden:!sstsConfig.godownEntryShowInvoice, - listeners : { - select : function(field, r) { - top.Ext.getCmp('manufacturer').focus(); - }, - specialKey:function(f,e){ - if (e.getKey() == Ext.EventObject.ENTER) { - top.Ext.getCmp('manufacturer').focus(); - top.Ext.getCmp('manufacturer').selectText(); - } - } - } + hidden:!sstsConfig.godownEntryShowInvoice },{ text : '注册证号:' },{