Index: ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js =================================================================== diff -u -r17945 -r18116 --- ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js (.../useRecordForm.js) (revision 17945) +++ ssts-web/src/main/webapp/disinfectsystem/useRecord/useRecordForm.js (.../useRecordForm.js) (revision 18116) @@ -3,6 +3,9 @@ var containerWin; var useRecordOperationRoomAllowBlank = true; +//器械包丢失报废记录,格式如:[{id:1,errorRemark:"丢失原因说明",damageRemark:"报损原因说明",errorData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}],damageData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}]}, {id:2,errorRemark:"丢失原因说明",damageRemark:"报损原因说明",errorData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}],damageData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}]}] +var tousseInstanceMaterialErrorDamageArray = []; + //巡回护士项的标签 var circuitNurseLabelName = sstsConfig.circuitNurseLabelName ? sstsConfig.circuitNurseLabelName : '巡回护士'; /** @@ -43,7 +46,10 @@ {name : 'isUrgentForUseRecord'}, {name : 'includeImplant'}, {name : 'actualUsed'}, - {name : 'haveUnSupplementMaterials'} + {name : 'isRecycling'}, + {name : 'isConvertApplyGoods'}, + {name : 'haveUnSupplementMaterials'}, + {name : 'tousseMaterialErrorDamageJsonData'} ] }); @@ -182,6 +188,8 @@ foreignTousseApp_id : goodsInfo.foreignTousseApp_id, includeImplant : goodsInfo.includeImplant, actualUsed : goodsInfo.actualUsed, + isRecycling : goodsInfo.isRecycling, + isConvertApplyGoods : goodsInfo.isConvertApplyGoods, haveUnSupplementMaterials : goodsInfo.haveUnSupplementMaterials }); tousseInstanceStore.insert(0 , record); @@ -493,6 +501,8 @@ showResult(action.result.message); } + //清空器械包材料丢失报损的变量 + tousseInstanceMaterialErrorDamageArray = []; win.close(); grid.dwrReload(); // 如果保存成功,并且点击的是保存并新建按钮,则打开新的登记使用记录窗口 @@ -612,7 +622,8 @@ Ext.getCmp("formSubmitResult").setValue(formSubmitResultFail); showResult(action.result.errMsg); } - + //清空器械包材料丢失报损的变量 + tousseInstanceMaterialErrorDamageArray = []; win.close(); grid.dwrReload(); // 如果保存成功,并且点击的是保存并新建按钮,则打开新的登记使用记录窗口 @@ -639,15 +650,15 @@ } -function quickRecycing(window,useRecordID,barcodes){ +function quickRecycing(useRecordWin,useRecordID,barcodes){ Ext.Ajax.request({ url : WWWROOT + '/disinfectSystem/useRecordAction!quickRecycing.do', params : {id : useRecordID,barcodes : barcodes}, success : function(response, options) { var result = Ext.decode(response.responseText); if(result.success == 'true' || result.success == true){ showResult('回收成功'); - window.close(); + useRecordWin.close(); grid.dwrReload(); }else{ showResult(result.msg) @@ -714,21 +725,21 @@ text : '保存', handler : function() { top.Ext.getCmp("audited").setValue(""); - submitUseRecordForm(this, window, id, false); + submitUseRecordForm(this, useRecordWin, id, false); } }; var saveAndNewBtn = { text : '保存并新建', handler : function() { top.Ext.getCmp("audited").setValue(""); - submitUseRecordForm(this, window, id, true); + submitUseRecordForm(this, useRecordWin, id, true); } }; var reviewBtn = { text : '审核', handler : function() { top.Ext.getCmp("audited").setValue("true");// action里则会根据audited的值判断用户是点击申述还是保存按钮,true为审核 - reviewUseRecordForm(this,window,id); + reviewUseRecordForm(this,useRecordWin,id); } }; var createApplicationBtn = { @@ -746,7 +757,7 @@ top.Ext.MessageBox.confirm("请确认",confirmMessage, function(button, text) { if ("yes" == button) { - convertUseRecordToApplication(btn, id, operatorStr, departStr, departCodingStr, window); + convertUseRecordToApplication(btn, id, operatorStr, departStr, departCodingStr, useRecordWin); } }); @@ -756,21 +767,21 @@ text : '审核并生成申请单', handler : function() { top.Ext.getCmp("audited").setValue("true");// action里则会根据audited的值判断用户是点击审核还是保存按钮,true为审核 - reviewAndConvertUseRecordForm(this,window,id); + reviewAndConvertUseRecordForm(this,useRecordWin,id); } }; var saveAndReviewAndConvertBtn = { text : '保存并审核生成申请单', handler : function() { top.Ext.getCmp("audited").setValue("true");// action里则会根据audited的值判断用户是点击审核还是保存按钮,true为审核 - saveAndReviewAndConvertUseRecordForm(this,window,false); + saveAndReviewAndConvertUseRecordForm(this,useRecordWin,false); } }; var saveAndReviewAndConvertAndNewBtn = { text : '保存并审核生成申请单并新建', handler : function() { top.Ext.getCmp("audited").setValue("true");// action里则会根据audited的值判断用户是点击审核还是保存按钮,true为审核 - saveAndReviewAndConvertUseRecordForm(this,window,true); + saveAndReviewAndConvertUseRecordForm(this,useRecordWin,true); } } var fastRecyclingBtn = { @@ -788,7 +799,7 @@ } var qrButton = top.Ext.getCmp('quickRecycingID'); qrButton.disable(); - quickRecycing(window,id,barcodes); + quickRecycing(useRecordWin,id,barcodes); } @@ -797,7 +808,9 @@ var cancelBtn = { text : '取消', handler : function() { - window.close(); + //清空器械包材料丢失报损的变量 + tousseInstanceMaterialErrorDamageArray = []; + useRecordWin.close(); } }; @@ -811,6 +824,21 @@ top.Ext.getCmp('useAmount').setValue(useAmount); // 保存表单上的原始item参数 setOriginalItems(tousseInstanceStore); + + //并将查出来的器械包登记使用记录时录入的丢失报损数据赋值到丢失报损数据的变量上 + tousseInstanceMaterialErrorDamageArray = []; + if(count > 0){ + for (var i = 0; i < count; i++) { + try{ + var tousseMaterialErrorDamageJsonData = store.data.items[i].data["tousseMaterialErrorDamageJsonData"]; + if(tousseMaterialErrorDamageJsonData){ + tousseInstanceMaterialErrorDamageArray.push(tousseMaterialErrorDamageJsonData); + } + }catch (e) { + // TODO: handle exception + } + } + } }); tousseInstanceStore.load(); if (status == unAudited) {// 未审核 @@ -878,10 +906,10 @@ var tousseCm = new Ext.grid.ColumnModel([sm, {id : 'id',dataIndex : 'id',hidden : true}, - {header : "条码",dataIndex : 'barcode',width : 55,menuDisabled : true,renderer : renderTousseInstanceInfoShowFun}, + {header : "条码",dataIndex : 'barcode',width : 52,menuDisabled : true,renderer : renderTousseInstanceInfoShowFun}, {header : "name",dataIndex : 'tousseDefinitionName',hidden : true,menuDisabled : true}, {header : "名称",dataIndex : 'showTousseName',width : 180,menuDisabled : true,renderer : renderTousseInstanceNameForUrgent}, - {header : '加急',width : 35, + {header : '加急',width : 30, renderer : function(v, p, record,rowIndex, colIndex) { var imgName = (record.data.isUrgentForUseRecord=='是')?'arrow_down':'arrow_top'; var str = "
"; + var str = "
"; + + //如果配置启用使用记录录入丢失报损功能且该包类型为器械包、且是否回收为是、且是否转换申请单为是时,提供丢失和报损按钮 + if(sstsConfig.enableUseRecordMaterialErrorDamage && ((record.get("tousseType") == '器械包' && record.get("isRecycling") == '是' && record.get("isConvertApplyGoods") == '是') + || record.get("tousseType") == '自定义器械包')){ + str += ""; + str += ""; + } + str += "
"; return str; }, menuDisabled : true, @@ -985,6 +1021,10 @@ id : 'items' },{ xtype : 'hidden', + name : 'tousseInstanceMaterialErrorDamageItems', + id : 'tousseInstanceMaterialErrorDamageItems' + },{ + xtype : 'hidden', name : 'originalItems', id : 'originalItems' },{ @@ -1595,7 +1635,7 @@ }); - var window = new top.Ext.Window( { + var useRecordWin = new top.Ext.Window( { id : 'useRecordApplicationWin', layout : 'fit', title : '使用记录', @@ -1607,8 +1647,9 @@ items : [ formObj ] }); - window.show(); + useRecordWin.show(); + //如果当有丢失、报损时允许不补充材料也可以装配 if(sstsConfig.allowPackingWhenUnSupplementMaterial){ var tousseInstanceGrid = top.Ext.getCmp("tousseInstanceGrid"); tousseInstanceGrid.on('mouseover',function(e) {// 添加mouseover事件 @@ -1690,18 +1731,33 @@ } } +/** + * 条码列的渲染函数 + * @param v + * @param p + * @param record + * @returns + */ function renderTousseInstanceInfoShowFun(v, p, record){ var id = record.data['id']; var tousseType = record.data['tousseType']; var tousseDefinitionName = record.data['tousseDefinitionName']; if(tousseType != '一次性物品'){ var isComboTousse = (tousseType == '聚合包'); + //点击条码链接显示器械包实例的追溯信息 return "" + v + ""; }else{ return v; } } +/** + * 器械包列表的加急列渲染函数 + * @param v + * @param p + * @param record + * @returns {String} + */ function renderTousseInstanceNameForUrgent(v, p, record){ var isUrgent = record.data['isUrgentForUseRecord']; var tousseType = record.data['tousseType']; @@ -1716,3 +1772,292 @@ return v; } } + +/** + * 点击丢失或报损,然后打开窗口进行丢失或报损及原因备注填写 + * 新打开一个window,里面有上下两个元素,材料的grid及原因备注,其下就是保存按钮 + * 1.判断该器械包实例在本地变量中有没有对应的材料丢失(报损)、原因说明等数据,如果有则取本地的,如果没有则查询服务器后台数据库有没有 + * 2.丢失(报损)保存后,将所录入的数据保存至本地变量 + * 3.使用记录保存后,将所有有录了器械包丢失(报损)的数据保存到后台数据库 + * @param type 类型:error表示丢失、damage表示报损 + * @param tousseInstanceId 包实例id + * @param tousseName 包实例名称 + */ +function addErrorDamageMaterial(type , tousseInstanceId , tousseName){ + var typeName = "丢失"; + if(type == 'damage'){ + typeName = "报废"; + } + + //器械包的材料丢失报损Record类 + var addMaterialErroDamageRecord = Ext.data.Record.create([ + {name : 'materialId'}, + {name : 'name'}, + {name : 'amount'}, + {name : 'errorAmount'} + ]); + //表单表格面板 + var materialErrorDamageFormPanel = new top.Ext.FormPanel({ + id : 'materialErrorDamageFormPanel', + frame : true, + labelSeparator : '', + bodyStyle : 'padding:5px 5px 0px 25px', + width : 800, + autoHeight : true, + autoScroll : true, + labelAlign : 'left', + items:[new top.Ext.grid.EditorGridPanel({ + id : 'materialErrorDamageGrid', + bodyStyle : 'border:1px solid #afd7af', + frame :false, + viewConfig: { + forceFit:true + }, + store : new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/tousseInstanceAction!loadMaterialErrorDamageId.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'materialId'}, + {name : 'name'}, + {name : 'amount'}, + {name : 'errorAmount'} + ] + }) + }), + cm : new top.Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), + {header : "materialId",dataIndex : 'materialId',hidden : true}, + {header : "名称",dataIndex : 'name',width : 180,menuDisabled : true}, + /*{header : "规定数量",dataIndex : 'defineAmount',width : 80,menuDisabled : true}, + {header : "接收数量",dataIndex : 'actualAmount',width : 80,menuDisabled : true},*/ + {header : "数量",dataIndex : 'amount',width : 50,menuDisabled : true}, + {header : typeName + "数量",dataIndex : 'errorAmount',width : 50,menuDisabled : true, + editor : new top.Ext.form.NumberField({ + regex: /^\d+$/, + regexText:'只能输入数字', + width : 50, + allowBlank : true, + allowNegative : false,//不允许输入负数 + allowDecimals : false,//不允许输入小数 + listeners : { + blur : function(thiz){ + //判断所填数量是否超过总数量(thiz.value可以取到当前数量,但js前端判断所输数量或丢失+报损数量大于其定义的数量实现稍有难度,待改进) + } + } + }) + }, + {header : "操作",dataIndex : 'opAction',width : 60,menuDisabled : true,renderer:function(v,p,record){ + var str = ""; + str += " "; + return str; + }} + ]), + width :735, + height : 220, + clicksToEdit : 1,// 设置点击几次才可编辑 + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }) + }),{ + xtype:'panel', + height:10 + },{ + xtype : "panel", + title : "", + layout : 'form', + width:735, + height : 70, + items : [{ + xtype : 'textarea', + fieldLabel : typeName + '原因说明', + height : 50, + id : 'materialErrorDamageRemark', + name : 'materialErrorDamageRemark', + width:750, + maxLength : 665, + allowBlank : true, + anchor : '100%' + }] + }], + buttons : [{ + id : 'btnSave', + text : '保存', + handler : function() { + var currentErrorDamageData; + var dataExists; + var dataIndexInArray; + if(tousseInstanceMaterialErrorDamageArray.length > 0){ + for(var j = 0 ;j < tousseInstanceMaterialErrorDamageArray.length;j++){ + var tousseInstanceMaterialErrorDamageData = tousseInstanceMaterialErrorDamageArray[j]; + if(tousseInstanceId == tousseInstanceMaterialErrorDamageData.id){ + currentErrorDamageData = tousseInstanceMaterialErrorDamageData; + dataExists = true; + dataIndexInArray = j; + break; + } + } + } + + if(!currentErrorDamageData){ + currentErrorDamageData = {}; + currentErrorDamageData.id = tousseInstanceId; + } + + var jsonArray = []; + var store = top.Ext.getCmp("materialErrorDamageGrid").getStore(); + //验证提交的丢失(报损)数据,如果有录备注原因时,必须确保至少有录一条丢失/报损数量 + for(var i = 0;i < store.getCount();i++){ + var record = store.getAt(i); + if(record.data.errorAmount){ + jsonArray.push({materialId:record.data.materialId,errorAmount:record.data.errorAmount}); + } + } + + if(top.Ext.getCmp("materialErrorDamageRemark").getValue() && jsonArray.length == 0){ + alert("如果有录入"+ typeName +"原因,至少需要录入一条材料"+ typeName +"数据"); + return false; + } + if(type == 'error'){ + currentErrorDamageData.errorRemark = top.Ext.getCmp("materialErrorDamageRemark").getValue(); + currentErrorDamageData.errorData = jsonArray; + }else if(type == 'damage'){ + currentErrorDamageData.damageRemark = top.Ext.getCmp("materialErrorDamageRemark").getValue(); + currentErrorDamageData.damageData = jsonArray; + } + + if(!dataExists){ + tousseInstanceMaterialErrorDamageArray.push(currentErrorDamageData); + } + top.Ext.getCmp("tousseInstanceMaterialErrorDamageItems").setValue(Ext.encode(tousseInstanceMaterialErrorDamageArray)); + materialErrorDamageWindow.close(); + } + },{ + text : '取消', + handler : function() { + materialErrorDamageWindow.close(); + } + }] + }); + + var materialErrorDamageWindow = new top.Ext.Window({ + id : 'materialErrorDamageWindow', + layout : 'fit', + title : "【"+ tousseName +"】" + '材料'+ typeName +'信息', + width : 810, + modal : true, + autoHeight : true, + border :false, + plain : true, + items : [ materialErrorDamageFormPanel ] + }); + materialErrorDamageWindow.show(); + + materialErrorDamageFormPanel.getEl().mask("正在加载,请稍候..."); + //通过dwr或ajax请求及同本地变量的计算生成列表数据显示 + Ext.Ajax.request({ + url : WWWROOT + '/disinfectSystem/tousseInstanceAction!loadMaterialErrorDamageDataById.do', + params : { + id : tousseInstanceId, + type : type + }, + success : function(response, options) { + materialErrorDamageFormPanel.getEl().unmask(); + //数据格式:{remark:"原因说明",[{name:"材料1",defineAmount:2,amount:2,errorAmount:1},{name:"材料2",defineAmount:1,amount:1,errorAmount:0},...{name:"材料3",defineAmount:4,amount:3,errorAmount:1}]} + var result = Ext.decode(response.responseText); + + var currentErrorDamageData; + if(tousseInstanceMaterialErrorDamageArray.length > 0){ + for(var j = 0 ;j < tousseInstanceMaterialErrorDamageArray.length;j++){ + var tousseInstanceMaterialErrorDamageData = tousseInstanceMaterialErrorDamageArray[j]; + if(tousseInstanceId == tousseInstanceMaterialErrorDamageData.id){ + currentErrorDamageData = tousseInstanceMaterialErrorDamageData; + break; + } + } + } + var remark; + var currentErrorDamageDetailData; + if(type == 'error' && currentErrorDamageData && currentErrorDamageData.errorData){ + remark = currentErrorDamageData.errorRemark; + currentErrorDamageDetailData = currentErrorDamageData.errorData; + }else if(type == 'damage' && currentErrorDamageData && currentErrorDamageData.damageData){ + remark = currentErrorDamageData.damageRemark; + currentErrorDamageDetailData = currentErrorDamageData.damageData; + }else{ + remark = result.remark; + } + top.Ext.getCmp("materialErrorDamageRemark").setValue(remark); + if(result.data && result.data.length > 0){ + var store = top.Ext.getCmp("materialErrorDamageGrid").getStore(); + for(var i = 0 ;i < result.data.length;i++){ + var resultData = result.data[i]; + var materialId = resultData.materialId; + var errorAmount = resultData.errorAmount; + if(currentErrorDamageDetailData && currentErrorDamageDetailData.length > 0){ + var existsErrorAmount = false; + for(var k = 0;k < currentErrorDamageDetailData.length ;k++){ + if(materialId == currentErrorDamageDetailData[k].materialId){ + errorAmount = currentErrorDamageDetailData[k].errorAmount; + existsErrorAmount = true; + break; + } + } + if(!existsErrorAmount){ + errorAmount = ""; + } + } + var storeData = new addMaterialErroDamageRecord({ + materialId : materialId, + name : resultData.name, + //defineAmount : resultData.defineAmount, + //actualAmount : resultData.actualAmount, + amount : resultData.amount, + errorAmount : errorAmount + }); + + store.add(storeData); + } + } + }, + failure : function(response, options) { + materialErrorDamageFormPanel.getEl().unmask(); + } + }); + +} + +/** + * 调整丢失(报损)数量 + * @param type + * @param materialId + * @param name + */ +function changeMaterialErrorAmount(type , materialId , name){ + var store = top.Ext.getCmp("materialErrorDamageGrid").getStore(); + for(var i = 0 ;i < store.getCount();i++){ + var record = store.getAt(i); + if(materialId == record.get("materialId")){ + var errorAmount = record.get("errorAmount"); + var amount = record.get("amount"); + if(!errorAmount){ + errorAmount = 0; + } + if(type == 'add'){ + if(errorAmount >= amount){ + alert("误差数量已经达到原数量,不能再加"); + }else{ + record.set("errorAmount",errorAmount + 1); + } + }else if(type == 'sub'){ + if(errorAmount == 0){ + alert("误差数量已经为0,不能再减"); + }else{ + record.set("errorAmount",errorAmount - 1); + } + } + break; + } + } +} \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/config/zsyy/config.js =================================================================== diff -u -r18094 -r18116 --- ssts-web/src/main/webapp/disinfectsystem/config/zsyy/config.js (.../config.js) (revision 18094) +++ ssts-web/src/main/webapp/disinfectsystem/config/zsyy/config.js (.../config.js) (revision 18116) @@ -115,5 +115,7 @@ //是否启用手术排班物品查询(true为启用,false或者不配置都不启用) enableOperationReservationInvoiceReport : true, //是否启急用物品处理周期统计报表(true为启用,false或者不配置都不启用) - enableUrgentNeedGoodsProcessingCycleReport : true + enableUrgentNeedGoodsProcessingCycleReport : true, + //是否启用使用记录丢失报损功能 + enableUseRecordMaterialErrorDamage : true } \ No newline at end of file Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java =================================================================== diff -u -r17560 -r18116 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 17560) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 18116) @@ -45,16 +45,20 @@ import com.forgon.disinfectsystem.basedata.becleanitem.service.BeCleanItemManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ContainerManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; +import com.forgon.disinfectsystem.common.CssdUtils; 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.imagefilemanager.ImageFile; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; 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.basedatamanager.toussedefinition.TousseMaterialErrorDamage; import com.forgon.disinfectsystem.entity.becleanitem.ClassifyBasket; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.materialerrordamage.MaterialErrorDamageDetail; import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoring.QualityMonitoringInstance; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; @@ -1308,4 +1312,83 @@ } + /** + * 根据包实例id查询对应的丢失报损数据 + * request请求参数:id为包实例id,type为丢失报损代码,丢失代码为error,报损代码为damage + * response响应数据格式如下: + * {remark:"原因与备注",data:[{name:"材料1",defineAmount:2,amount:2,errorAmount:1},{name:"材料2",defineAmount:2,amount:2,errorAmount:1},{name:"材料3",defineAmount:2,amount:2,errorAmount:1}]} + */ + public void loadMaterialErrorDamageDataById(){ + JSONObject resultJsonObject = new JSONObject(); + Long id = StrutsParamUtils.getPraramLongValue("id", null); + String type = StrutsParamUtils.getPraramValue("type", null); + //所处环节 + String linkType = StrutsParamUtils.getPraramValue("linkType", null); + if(DatabaseUtil.isPoIdValid(id)){ + TousseInstance tousseInstance = tousseInstanceManager.get(id); + if(tousseInstance != null){ + + if(MaterialErrorDamageDetail.TYPE_CODE_ERROR.equals(type)){ + resultJsonObject.put("remark", tousseInstance.getErrorRemark()); + } + else if(MaterialErrorDamageDetail.TYPE_CODE_DAMAGE.equals(type)){ + resultJsonObject.put("remark", tousseInstance.getDamageRemark()); + } + + JSONArray jsonArray = new JSONArray(); + //查询该包实例回时时的丢失报损数据 + String condition = " where tousseInstanceId = " + id; + if(MaterialErrorDamageDetail.TYPE_CODE_ERROR.equals(type)){ + condition += " and type='"+ MaterialErrorDamageDetail.TYPE_ERROR +"'"; + }else{ + condition += " and type='"+ MaterialErrorDamageDetail.TYPE_DAMAGE +"'"; + } + + @SuppressWarnings("unchecked") + List materialErrorDamageListOnRecycling = + objectDao.findBySql(MaterialErrorDamageDetail.class.getSimpleName(), condition); + + //查询该包实例录入使用记录时的丢失报损数据 + List materialErrorDamageListOnUseRecord = + tousseInstance.getTousseMaterialErrorDamageList(objectDao, linkType, type); + + //查询该实例的包定义材料明细 + List materialInstanceList = tousseInstance.getTousseDefinition().getMaterialInstances(); + if(CollectionUtils.isNotEmpty(materialInstanceList)){ + JSONObject materialJsonObject = null; + for (MaterialInstance materialInstance : materialInstanceList) { + materialJsonObject = new JSONObject(); + MaterialDefinition md = materialInstance.getMaterialDefinition(); + materialJsonObject.put("materialId", md.getId()); + materialJsonObject.put("name", CssdUtils.getMaterialName(md)); + int defineAmount = materialInstance.getCount(); + materialJsonObject.put("defineAmount", defineAmount); + materialJsonObject.put("amount", defineAmount); + + if(CollectionUtils.isNotEmpty(materialErrorDamageListOnRecycling)){ + for (MaterialErrorDamageDetail materialErrorDamageDetail : materialErrorDamageListOnRecycling) { + if(md.getId().longValue() == materialErrorDamageDetail.getMaterialDefinitionId().longValue()){ + materialJsonObject.put("amount", defineAmount - materialErrorDamageDetail.getAmount()); + break; + } + } + } + + if(CollectionUtils.isNotEmpty(materialErrorDamageListOnUseRecord)){ + for (TousseMaterialErrorDamage materialErrorDamageDetail : materialErrorDamageListOnUseRecord) { + if(md.getId().longValue() == materialErrorDamageDetail.getMaterialDefinitionId().longValue()){ + materialJsonObject.put("errorAmount", materialErrorDamageDetail.getAmount()); + break; + } + } + } + jsonArray.add(materialJsonObject); + } + } + resultJsonObject.put("data", jsonArray); + } + } + StrutsResponseUtils.output(resultJsonObject); + } + } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java =================================================================== diff -u -r17976 -r18116 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java (.../UseRecordActionBase.java) (revision 17976) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java (.../UseRecordActionBase.java) (revision 18116) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.useRecord.action; import java.util.ArrayList; +import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -12,6 +13,7 @@ import org.apache.commons.lang3.BooleanUtils; import com.forgon.Constants; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedatamanager.goodsdepartshareconfig.service.GoodsDepartShareConfigManager; @@ -22,7 +24,9 @@ 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.basedatamanager.toussedefinition.TousseMaterialErrorDamage; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.materialerrordamage.MaterialErrorDamageDetail; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.useRecord.UseDiposableGoodsItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; @@ -96,12 +100,12 @@ } acceptStatus.add(TousseInstance.STATUS_SIGNED); TousseInstance older = tousseInstanceManager.getExpireNearest(ti, acceptStatus,StringTools.toCollectionIgnoreNullAndBlank(scanedBarcodes)); + TousseDefinition td = ti.getTousseDefinition(); //判断当前用户登录科室是否存在共用科室配置 if(CollectionUtils.isNotEmpty(goodsDepartShareConfigManager.getGoodsShareDepartList(currentOrgUnitCode))){ //判断包实例所属科室是否与当前用户登录科室配置物品共享 if(goodsDepartShareConfigManager.canShareGoodsforTwoDepart(currentOrgUnitCode, ti.getLocation())){ String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); - TousseDefinition td = ti.getTousseDefinition(); String tousseDefinitionName = ""; String tousseType = ""; String includeImplant = ""; @@ -125,14 +129,18 @@ obj.put("includeImplant", includeImplant); obj.put("actualUsed", Constants.STR_YES); //扫描的时候,都取默认值,为是。以免录了使用记录之后,又删除了,就把包实例这个属性修改了,再扫描,就不是默认的值了 obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); + + //是否回收 + obj.put("isRecycling", td.getIsRecycling()); + //是否转换申请单 + obj.put("isConvertApplyGoods", td.getIsConvertApplyGoods()); }else{ obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",未配置与当前科室共用,不能录入使用记录!"); } }else{ //判断包实例所在位置与当前用户所在科室是否一致 if(StringUtils.equals(currentOrgUnitCode, ti.getLocation())){ String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); - TousseDefinition td = ti.getTousseDefinition(); String tousseDefinitionName = ""; String tousseType = ""; String includeImplant = ""; @@ -156,6 +164,11 @@ obj.put("includeImplant", includeImplant); obj.put("actualUsed", Constants.STR_YES); obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); + + //是否回收 + obj.put("isRecycling", td.getIsRecycling()); + //是否转换申请单 + obj.put("isConvertApplyGoods", td.getIsConvertApplyGoods()); }else{ obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",不能录入使用记录!"); } @@ -317,10 +330,33 @@ protected void buildUseRecordParamsForSave(UseRecord modified) { String items = StrutsParamUtils.getPraramValue("items", ""); - setUseRecordItemsFromParams(modified, items); + //器械包实例登记使用记录所录入的丢失报损数据 + String tousseInstanceMaterialErrorDamageItems = StrutsParamUtils.getPraramValue("tousseInstanceMaterialErrorDamageItems", ""); + setUseRecordItemsFromParams(modified, items , tousseInstanceMaterialErrorDamageItems); } - protected void setUseRecordItemsFromParams(UseRecord useRecord, String items) { + /** + * + * @param useRecord + * @param items + * @param tousseInstanceMaterialErrorDamageItems 包实例的材料丢失报损数据,格式如下: + * [ + * {id:1,errorRemark:"丢失原因说明",damageRemark:"报损原因说明",errorData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}],damageData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}]}, + * {id:2,errorRemark:"丢失原因说明",damageRemark:"报损原因说明",errorData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}],damageData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}]} + * ] + */ + protected void setUseRecordItemsFromParams(UseRecord useRecord, String items,String tousseInstanceMaterialErrorDamageItems) { + Date now = new Date(); + JSONArray jsonArray = null; + //解决丢失报损数据 + if(StringUtils.isNotEmpty(tousseInstanceMaterialErrorDamageItems)){ + try{ + jsonArray = JSONArray.fromObject(tousseInstanceMaterialErrorDamageItems); + }catch(Exception e){ + e.printStackTrace(); + } + } + // items列表 List tousseInstanceList = new LinkedList(); List diposableGoodsList = new LinkedList(); @@ -366,6 +402,59 @@ tousseInstance.setActualUsed(JSONUtil.optString(obj, "actualUsed", Constants.STR_YES)); //设置使用记录顺序号 tousseInstance.setUseRecordSortNumber(i + 1); + + if(jsonArray != null && jsonArray.size() > 0){ + for (int j = 0; j < jsonArray.size(); j++) { + JSONObject jsonObject = jsonArray.optJSONObject(j); + if(jsonObject.optLong("id") == itemId.longValue()){ + if(StringUtils.isNotBlank(jsonObject.optString("errorRemark"))){ + tousseInstance.setErrorRemark(jsonObject.optString("errorRemark")); + } + if(StringUtils.isNotBlank(jsonObject.optString("damageRemark"))){ + tousseInstance.setDamageRemark(jsonObject.optString("damageRemark")); + } + + List tousseMaterialErrorDamageList = new ArrayList(); + //该包实例的丢失数据 + JSONArray materialErrorDamageDataListForTousseInstance = jsonObject.optJSONArray("errorData"); + if(materialErrorDamageDataListForTousseInstance != null && materialErrorDamageDataListForTousseInstance.size() > 0){ + for (int k = 0; k < materialErrorDamageDataListForTousseInstance.size(); k++) { + JSONObject materialErrorDamage = materialErrorDamageDataListForTousseInstance.optJSONObject(k); + TousseMaterialErrorDamage tousseMaterialErrorDamage = new TousseMaterialErrorDamage(); + tousseMaterialErrorDamage.setTousseInstanceId(itemId); + tousseMaterialErrorDamage.setAmount(materialErrorDamage.optInt("errorAmount")); + tousseMaterialErrorDamage.setLinkType(TousseMaterialErrorDamage.LINKTYPE_USERECORD); + tousseMaterialErrorDamage.setMaterialDefinitionId(materialErrorDamage.optLong("materialId")); + tousseMaterialErrorDamage.setOperationTime(now); + tousseMaterialErrorDamage.setOperator(AcegiHelper.getLoginUser().getUserFullName()); + tousseMaterialErrorDamage.setType(MaterialErrorDamageDetail.TYPE_ERROR); + + tousseMaterialErrorDamageList.add(tousseMaterialErrorDamage); + } + } + + //该包实例的报损数据 + materialErrorDamageDataListForTousseInstance = jsonObject.optJSONArray("damageData"); + if(materialErrorDamageDataListForTousseInstance != null && materialErrorDamageDataListForTousseInstance.size() > 0){ + for (int k = 0; k < materialErrorDamageDataListForTousseInstance.size(); k++) { + JSONObject materialErrorDamage = materialErrorDamageDataListForTousseInstance.optJSONObject(k); + TousseMaterialErrorDamage tousseMaterialErrorDamage = new TousseMaterialErrorDamage(); + tousseMaterialErrorDamage.setTousseInstanceId(itemId); + tousseMaterialErrorDamage.setAmount(materialErrorDamage.optInt("errorAmount")); + tousseMaterialErrorDamage.setLinkType(TousseMaterialErrorDamage.LINKTYPE_USERECORD); + tousseMaterialErrorDamage.setMaterialDefinitionId(materialErrorDamage.optLong("materialId")); + tousseMaterialErrorDamage.setOperationTime(now); + tousseMaterialErrorDamage.setOperator(AcegiHelper.getLoginUser().getUserFullName()); + tousseMaterialErrorDamage.setType(MaterialErrorDamageDetail.TYPE_DAMAGE); + + tousseMaterialErrorDamageList.add(tousseMaterialErrorDamage); + } + } + tousseInstance.setTousseMaterialErrorDamageList(tousseMaterialErrorDamageList); + break; + } + } + } tousseInstanceList.add(tousseInstance); } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java =================================================================== diff -u -r18009 -r18116 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 18009) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 18116) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition; import java.text.DateFormat; +import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -12,6 +13,10 @@ import javax.persistence.Table; import javax.persistence.Transient; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -21,6 +26,7 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseInstanceUtils; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.materialerrordamage.MaterialErrorDamageDetail; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyItem; @@ -52,7 +58,7 @@ ,@Index(columnList = "unTraceableTousse", name = "unTraceableTousse_index"),@Index(columnList = "tousseFixedBarcode", name = "tousseFixedBarcode_index") ,@Index(columnList = "comboTousseInstanceId", name = "comboTousseInstanceId_index"),@Index(columnList = "comboTousseDefinitionId", name = "comboTousseDefinitionId_index") ,@Index(columnList = "useRecordSortNumber", name = "useRecordSortNumber_index"),@Index(columnList = "reviewer", name = "reviewer_index") -,@Index(columnList = "reviewTime", name = "reviewTime_index") +,@Index(columnList = "reviewTime", name = "reviewTime_index"),@Index(columnList = "tousseItemId", name = "tousseItemId_index") }) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @JsonFilter("fieldFilter") @@ -254,9 +260,13 @@ * 申请单ID */ private Long invoicePlanID; - private Long applicationTousseItemId;// 申请项的id /** + * 申请项的id(目前发现仅用外部代理灭菌单申请时用) + */ + private Long applicationTousseItemId; + + /** * 仓库ID */ private Long wareHouseId; @@ -332,6 +342,29 @@ * 备注,目前只有装配那里会添加 */ private String remark; + + + /** + * 丢失原因说明(录使用记录时用) + */ + private String errorRemark; + + /** + * 报损原因说明(录使用记录时用) + */ + private String damageRemark; + + /** + * 使用记录转换成申请单后该包实例对应的申请项id + */ + private Long tousseItemId; + + /** + * 材料丢失报损记录(使用登记等环节,不含回收、清洗、装配或之前等环节的丢失报损数据) + * 不映射到数据库 + */ + private List tousseMaterialErrorDamageList = new ArrayList(); + public static final String[] filterProperties = { "handler", "hibernateLazyInitializer", "fieldHandler", "materialInstances", "sterilizationRecords", "isUploadImage", "isUploadVideo", "images", @@ -1420,4 +1453,100 @@ this.remark = remark; } + public String getErrorRemark() { + return errorRemark; + } + + public void setErrorRemark(String errorRemark) { + this.errorRemark = errorRemark; + } + + public String getDamageRemark() { + return damageRemark; + } + + public void setDamageRemark(String damageRemark) { + this.damageRemark = damageRemark; + } + + @Transient + public List getTousseMaterialErrorDamageList() { + return tousseMaterialErrorDamageList; + } + + public void setTousseMaterialErrorDamageList( + List tousseMaterialErrorDamageList) { + this.tousseMaterialErrorDamageList = tousseMaterialErrorDamageList; + } + + public Long getTousseItemId() { + return tousseItemId; + } + + public void setTousseItemId(Long tousseItemId) { + this.tousseItemId = tousseItemId; + } + + /** + * 根据环节名称查询该包实例登记的丢失报损记录(不包含装配及之前环节的数据) + * @param objectDao + * @param linkType 环节(如使用记录等) + * @param type 类型(error表示丢失或damage表示报损) + * @return + */ + @SuppressWarnings("unchecked") + @Transient + public List getTousseMaterialErrorDamageList(ObjectDao objectDao , String linkType , String type) { + String condition = " where tousseInstanceId = " + id; + if(StringUtils.isNotBlank(linkType)){ + condition += " and linkType='"+ linkType +"'"; + } + if(TousseMaterialErrorDamage.TYPE_CODE_ERROR.equals(type)){ + condition += " and type='"+ MaterialErrorDamageDetail.TYPE_ERROR +"'"; + }else if(TousseMaterialErrorDamage.TYPE_CODE_DAMAGE.equals(type)){ + condition += " and type='"+ MaterialErrorDamageDetail.TYPE_DAMAGE +"'"; + } + return objectDao.findBySql(TousseMaterialErrorDamage.class.getSimpleName(), condition); + } + + /** + * 查询出包实例的丢失报损数据并转换为json字符串 + * @return 期望结果格式如下: + * { + * id:1,errorRemark:"丢失原因说明",damageRemark:"报损原因说明", + * errorData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}], + * damageData:[{materialId:"材料id1",errorAmount:1},{materialId:"材料id2",errorAmount:0},...{materialId:"材料id3",errorAmount:1}}] + * } + */ + @Transient + public String getTousseMaterialErrorDamageJsonData(){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", id); + jsonObject.put("errorRemark", errorRemark); + jsonObject.put("damageRemark", damageRemark); + if(CollectionUtils.isNotEmpty(tousseMaterialErrorDamageList)){ + JSONArray errorDataArray = new JSONArray(); + JSONArray damageDataArray = new JSONArray(); + for (TousseMaterialErrorDamage tousseMaterialErrorDamage : tousseMaterialErrorDamageList) { + JSONObject tousseMaterialErrorDamageJsonObject = new JSONObject(); + if(StringUtils.equals(MaterialErrorDamageDetail.TYPE_ERROR, tousseMaterialErrorDamage.getType())){ + tousseMaterialErrorDamageJsonObject.put("materialId", tousseMaterialErrorDamage.getMaterialDefinitionId()); + tousseMaterialErrorDamageJsonObject.put("errorAmount", tousseMaterialErrorDamage.getAmount()); + errorDataArray.add(tousseMaterialErrorDamageJsonObject); + }else if(StringUtils.equals(MaterialErrorDamageDetail.TYPE_DAMAGE, tousseMaterialErrorDamage.getType())){ + tousseMaterialErrorDamageJsonObject.put("materialId", tousseMaterialErrorDamage.getMaterialDefinitionId()); + tousseMaterialErrorDamageJsonObject.put("errorAmount", tousseMaterialErrorDamage.getAmount()); + damageDataArray.add(tousseMaterialErrorDamageJsonObject); + } + } + if(errorDataArray.size() > 0){ + jsonObject.put("errorData", errorDataArray); + } + + if(damageDataArray.size() > 0){ + jsonObject.put("damageData", damageDataArray); + } + } + return jsonObject.toString(); + } } \ No newline at end of file Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java =================================================================== diff -u -r17981 -r18116 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 17981) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 18116) @@ -25,6 +25,7 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseMaterialErrorDamage; import com.forgon.disinfectsystem.entity.useRecord.UseDiposableGoodsItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; @@ -117,8 +118,10 @@ private void buildUseRecordParamsForUpdate( UseRecord modified) { String items = StrutsParamUtils.getPraramValue("items", ""); + //器械包实例登记使用记录所录入的丢失报损数据 + String tousseInstanceMaterialErrorDamageItems = StrutsParamUtils.getPraramValue("tousseInstanceMaterialErrorDamageItems", ""); // items列表 - setUseRecordItemsFromParams(useRecord, items); + setUseRecordItemsFromParams(modified, items,tousseInstanceMaterialErrorDamageItems); } private UseRecord buildUseRecordOriginalParamsForUpdate() { @@ -163,8 +166,10 @@ if (original == null) { throw new RuntimeException("原始页面参数为空!"); } + //器械包实例登记使用记录所录入的丢失报损数据 + String tousseInstanceMaterialErrorDamageItems = StrutsParamUtils.getPraramValue("tousseInstanceMaterialErrorDamageItems", ""); // items列表 - setUseRecordItemsFromParams(original, originalItems); + setUseRecordItemsFromParams(original, originalItems,tousseInstanceMaterialErrorDamageItems); return original; } @@ -310,21 +315,32 @@ } + /** + * 根据包实例集合转换成jsonArray对象 + * @param tousseInstances 包实例集合 + * @param array + */ private void getTousseInstanceListJson( List tousseInstances,JSONArray array) { if (tousseInstances != null) { for (TousseInstance ti : tousseInstances) { if (ti != null) { + ti.setTousseMaterialErrorDamageList(ti.getTousseMaterialErrorDamageList(objectDao, TousseMaterialErrorDamage.LINKTYPE_USERECORD, null)); String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); TousseDefinition td = ti.getTousseDefinition(); String tousseDefinitionName = ""; String tousseType = ""; String includeImplant = ""; + String isRecycling = TousseDefinition.STR_NO; + String isConvertApplyGoods = TousseDefinition.STR_NO; if (td != null) { tousseType = td.getTousseType(); tousseDefinitionName = td.getName(); includeImplant = td.getIncludeImplantStr(); + + isRecycling = td.getIsRecycling(); + isConvertApplyGoods = td.getIsConvertApplyGoods(); } JSONObject obj = new JSONObject(); obj.put("id", ti.getId()); @@ -340,6 +356,11 @@ obj.put("isUrgentForUseRecord", StringTools.defaultString(ti.getIsUrgentForUseRecord())); obj.put("includeImplant", includeImplant); obj.put("actualUsed", StringTools.defaultIfBlank(ti.getActualUsed(),Constants.STR_YES)); + //是否回收 + obj.put("isRecycling", isRecycling); + //是否转换申请单 + obj.put("isConvertApplyGoods", isConvertApplyGoods); + obj.put("tousseMaterialErrorDamageJsonData", ti.getTousseMaterialErrorDamageJsonData()); array.add(obj); } } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r18072 -r18116 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 18072) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 18116) @@ -42,12 +42,14 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstanceUseRecord; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseMaterialErrorDamage; import com.forgon.disinfectsystem.entity.departmentstock.DepartmentStock; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.idcarddefinition.IDCardDefinition; 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.materialerrordamage.MaterialErrorDamageDetail; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; @@ -639,6 +641,14 @@ // 处理新增 newUseRecordsForUseRecord(curUseRecord, tousseInstancesMap, newTousseInstanceIDs, updatedTousseInstances,modifiedTousseInstanceMap); + + if(CollectionUtils.isNotEmpty(itemList)){ + for (TousseInstance item : itemList) { + //处理器械包登录使用记录时填写的丢失报损数据 + saveOrUpdateTousseMaterialErrorDamageData(null, item); + } + } + // 处理修改 modifyUseRecordItemProperty(tousseInstancesMap, modifiedTousseInstanceIDs,modifiedTousseInstanceMap); @@ -828,11 +838,13 @@ .getTousseInstanceList(); List tousseInstanceIDList = new ArrayList(); fetchTousseInstanceIDs(tousseInstanceIDList, tousseInstanceList); + //将包实例的集合转换成对应的map格式{id1:tousseInstance1,id1:tousseInstance2} fetchModifiedTousseInstanceMap(modifiedTousseInstanceMap,tousseInstanceList); // 锁定并获取器械包 lockTousseInstances(tousseInstanceIDList, tousseInstancesMap); Collection updatedTousseInstances = new ArrayList<>( tousseInstanceIDList.size()); + //新增使用记录的器械包实例登记 newUseRecordsForUseRecord(modified, tousseInstancesMap, tousseInstanceIDList, updatedTousseInstances,modifiedTousseInstanceMap); updateDepartmentUsedStock(modified, updatedTousseInstances); @@ -844,7 +856,7 @@ * @param tousseInstancesMap 使用记录的包实例map,key为包实例id,value为包实例对象 * @param tousseInstanceIDSet 包实例id的集合 * @param updatedTousseInstances 更新的器械包实例集合,调用时传空集合,通过程序计算后把新增的对象赋值进来 - * @param modifiedTousseInstanceMap 前台传入的器械包的信息,用于更新数据库中的对象 + * @param modifiedTousseInstanceMap 前台传入的器械包的信息,用于更新数据库中的对象(包括包实例的丢失报损信息) */ private void newUseRecordsForUseRecord(UseRecord useRecord, Map tousseInstancesMap, @@ -886,6 +898,9 @@ if(modifiedTousseInstance != null){ tousseInstance.setIsUrgentForUseRecord(modifiedTousseInstance.getIsUrgentForUseRecord()); tousseInstance.setActualUsed(modifiedTousseInstance.getActualUsed()); + + //更新包实例的丢失报损信息 + saveOrUpdateTousseMaterialErrorDamageData(tousseInstance , modifiedTousseInstance); } objectDao.saveOrUpdate(tousseInstance); updatedTousseInstances.add(tousseInstance); @@ -910,6 +925,105 @@ } } + /** + * 更新包实例的丢失报损信息 + * @param tousseInstance 包实例及其丢失报损信息 + */ + @SuppressWarnings("unchecked") + private void saveOrUpdateTousseMaterialErrorDamageData(TousseInstance orginalTousseInstance , TousseInstance modifiedTousseInstance){ + + if(orginalTousseInstance != null){ + //设置丢失与报损原因 + orginalTousseInstance.setErrorRemark(modifiedTousseInstance.getErrorRemark()); + orginalTousseInstance.setDamageRemark(modifiedTousseInstance.getDamageRemark()); + }else{ + orginalTousseInstance = (TousseInstance)objectDao.getByID_ForUpdate(TousseInstance.class.getSimpleName(), modifiedTousseInstance.getId()); + orginalTousseInstance.setErrorRemark(modifiedTousseInstance.getErrorRemark()); + orginalTousseInstance.setDamageRemark(modifiedTousseInstance.getDamageRemark()); + objectDao.saveOrUpdate(orginalTousseInstance); + } + //1.查询数据库中该包实例是否存在录使用记录的丢失报损信息 + List materialErrorDamageListInDb = + objectDao.findBySql_ForUpdate(TousseMaterialErrorDamage.class.getSimpleName(), + " where tousseInstanceId=" + modifiedTousseInstance.getId() + " and linkType='"+ TousseMaterialErrorDamage.LINKTYPE_USERECORD +"'"); + + //2.查询出前台传过来的该包实例的丢失报损信息 + List materialErrorDamageListFromFront = + modifiedTousseInstance.getTousseMaterialErrorDamageList(); + if(CollectionUtils.isNotEmpty(materialErrorDamageListInDb)){ + //待添加、待修改、待删除的器械包实例录入使用记录时的材料丢失报损数据 + List waitAddTousseMaterialErrorDamageList = new ArrayList(); + List waitUpdateTousseMaterialErrorDamageList = new ArrayList(); + List waitDeleteTousseMaterialErrorDamageList = new ArrayList(); + for (TousseMaterialErrorDamage materialErrorDamageInDb : materialErrorDamageListInDb) { + boolean existsMaterialErrorDamageData = false; + if(CollectionUtils.isNotEmpty(materialErrorDamageListFromFront)){ + for (TousseMaterialErrorDamage materialErrorDamageFromFront : materialErrorDamageListFromFront) { + if(materialErrorDamageInDb.getMaterialDefinitionId().longValue() == materialErrorDamageFromFront.getMaterialDefinitionId().intValue() + && StringUtils.equals(materialErrorDamageInDb.getType(), materialErrorDamageFromFront.getType())){ + existsMaterialErrorDamageData = true; + if(materialErrorDamageInDb.getAmount().intValue() != materialErrorDamageFromFront.getAmount().intValue()){ + materialErrorDamageInDb.setAmount(materialErrorDamageFromFront.getAmount()); + waitUpdateTousseMaterialErrorDamageList.add(materialErrorDamageInDb); + } + break; + } + //如果不存在,则删除该丢失或报损记录 + if(!existsMaterialErrorDamageData){ + waitDeleteTousseMaterialErrorDamageList.add(materialErrorDamageInDb); + } + } + }else{ + waitDeleteTousseMaterialErrorDamageList.add(materialErrorDamageInDb); + } + } + + if(CollectionUtils.isNotEmpty(materialErrorDamageListFromFront)){ + for (TousseMaterialErrorDamage materialErrorDamageFromFront : materialErrorDamageListFromFront) { + boolean existsMaterialErrorDamageData = false; + for (TousseMaterialErrorDamage materialErrorDamageInDb : materialErrorDamageListInDb) { + if(materialErrorDamageInDb.getMaterialDefinitionId().longValue() == materialErrorDamageFromFront.getMaterialDefinitionId().intValue() + && StringUtils.equals(materialErrorDamageInDb.getType(), materialErrorDamageFromFront.getType())){ + existsMaterialErrorDamageData = true; + break; + } + //如果不存在,则添加该丢失或报损记录 + if(!existsMaterialErrorDamageData){ + waitAddTousseMaterialErrorDamageList.add(materialErrorDamageFromFront); + } + } + } + } + + /* + * 对待添加的器械包丢失报损数据进行数据库的插入、更新与删除 + */ + if(CollectionUtils.isNotEmpty(waitAddTousseMaterialErrorDamageList)){ + for (TousseMaterialErrorDamage materialErrorDamageData : waitAddTousseMaterialErrorDamageList) { + objectDao.saveOrUpdate(materialErrorDamageData); + } + } + + if(CollectionUtils.isNotEmpty(waitUpdateTousseMaterialErrorDamageList)){ + for (TousseMaterialErrorDamage materialErrorDamageData : waitUpdateTousseMaterialErrorDamageList) { + objectDao.saveOrUpdate(materialErrorDamageData); + } + } + + if(CollectionUtils.isNotEmpty(waitDeleteTousseMaterialErrorDamageList)){ + for (TousseMaterialErrorDamage materialErrorDamageData : waitDeleteTousseMaterialErrorDamageList) { + objectDao.delete(materialErrorDamageData); + } + } + }else{ + if(CollectionUtils.isNotEmpty(materialErrorDamageListFromFront)){ + for (TousseMaterialErrorDamage materialErrorDamageData : materialErrorDamageListFromFront) { + objectDao.saveOrUpdate(materialErrorDamageData); + } + } + } + } + private void modifyUseRecordItemProperty(Map tousseInstancesMap, Collection tousseInstanceIDSet,Map modifiedTousseInstanceMap){ int updateObjectCount = 0; @@ -1186,14 +1300,18 @@ String hospitalNumber = null; List useRecordList = (List) useRecordsMap .get("useRecordList"); - + //要转换的使用记录对象及id UseRecord useRecord = null; Long useRecordId = null; if(CollectionUtils.isNotEmpty(useRecordList) && useRecordList.size() == 1){ useRecord = useRecordList.get(0); hospitalNumber = useRecord.getHospitalNum(); useRecordId = useRecord.getId(); } + + //使用记录转换后的申请单对象集合(用于器械包录使用记录的丢失/报损数据表的tousseItem字段进行更新赋值) + List recyclingApplicationListAfterConvert = new ArrayList(); + //是否仅统计需要转换的物品数量 boolean tousseAmountOnlyCountNeedConvertGoods = CssdUtils.getSystemSetConfigByNameBool("useRecordToRecycAppTousseAmountOfRemarkOnlyCountNeedConvertGoods"); //是否仅统计需要回收的物品数量 @@ -1300,6 +1418,8 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } }else{ //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 @@ -1358,6 +1478,9 @@ tousseTransitionPlanManager.save(useRecord, recyclingApplication, list, true); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ //待完善 @@ -1386,6 +1509,9 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } } } @@ -1452,6 +1578,9 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } }else{ //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 @@ -1510,6 +1639,9 @@ tousseTransitionPlanManager.save(useRecord, recyclingApplication, list, true); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ //待完善 @@ -1537,6 +1669,9 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } } } @@ -1604,6 +1739,9 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } }else{ //1.申请单更改备注、增加器械包条码、设置最后转换的使用记录、及重新计算申请项 @@ -1661,6 +1799,9 @@ tousseTransitionPlanManager.save(useRecord, recyclingApplication, list, true); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.add(recyclingApplication); } }else if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_DEPART.equals(useRecordConvertRecyclingApplicationMergeRegular)){ //待完善 @@ -1689,6 +1830,9 @@ tousseTransitionPlanManager.save(useRecord, newRecyclingApplication, tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(recyclingApplicationList); } } } @@ -1755,10 +1899,62 @@ tousseTransitionPlanManager.save(useRecord, recyclingApplication,tousseTransitionPlanItemList , false); } } + + //将转换后申请单对象保存至集合中 + recyclingApplicationListAfterConvert.addAll(list); } + + //使用记录转换申请单后对器械包录入使用记录时登记的丢失/报损记录更新tousseItemId字段值 + updateTousseMaterialErrorDamageTousseItemIdAfterConvert(useRecord , recyclingApplicationListAfterConvert); } /** + * 使用记录转换申请单后对器械包录入使用记录时登记的丢失/报损记录更新tousseItemId字段值 + * @param useRecord + * @param recyclingApplicationList + */ + private void updateTousseMaterialErrorDamageTousseItemIdAfterConvert(UseRecord useRecord , List recyclingApplicationList){ + List tousseList = useRecord.getTousseInstanceWillBeConvertedAndWaitRecyclingTousseItemList(objectDao); + if(CollectionUtils.isNotEmpty(tousseList) && CollectionUtils.isNotEmpty(recyclingApplicationList)){ + for (TousseInstance tousseInstance : tousseList) { + TousseDefinition td = tousseInstance.getTousseDefinition(); + //不管有无在使用记录里登记丢失报损记录,都会记录其对应转换后的tousseItemId + if(td.isCustomTousse()){ + //只在自定义器械申请单中查找对应的申请项 + for (RecyclingApplication recyclingApplication : recyclingApplicationList) { + if(StringUtils.equals(InvoicePlan.TYPE_CUSTOM_TOUSSE_APPLIACTION_FORM, recyclingApplication.getType())){ + if(CollectionUtils.isNotEmpty(recyclingApplication.getApplicationItems())){ + for (TousseItem tousseItem : recyclingApplication.getApplicationItems()) { + if(td.getId().longValue() == tousseItem.getTousseDefinitionId().longValue()){ + tousseInstance.setTousseItemId(tousseItem.getId()); + break; + } + } + } + } + } + }else{ + //只在通用申请单或器械包申请单中查找对应的申请项 + for (RecyclingApplication recyclingApplication : recyclingApplicationList) { + if(StringUtils.equals(InvoicePlan.TYPE_COMBO_FORM, recyclingApplication.getType()) + || StringUtils.equals(InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM, recyclingApplication.getType())){ + if(CollectionUtils.isNotEmpty(recyclingApplication.getApplicationItems())){ + for (TousseItem tousseItem : recyclingApplication.getApplicationItems()) { + if(td.getId().longValue() == tousseItem.getTousseDefinitionId().longValue()){ + tousseInstance.setTousseItemId(tousseItem.getId()); + break; + } + } + } + } + } + } + objectDao.saveOrUpdate(tousseInstance); + } + } + } + + /** * 根据使用记录与项目配置得出对应备注 * 之前是按项目计算出不同的备注需求,现改为按使用记录及原申请单及config.js配置等计算出不同备注 * 旧的需求如下([和]代表变量,不是实际字符文本): Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialerrordamage/MaterialErrorDamageDetail.java =================================================================== diff -u -r17524 -r18116 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialerrordamage/MaterialErrorDamageDetail.java (.../MaterialErrorDamageDetail.java) (revision 17524) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialerrordamage/MaterialErrorDamageDetail.java (.../MaterialErrorDamageDetail.java) (revision 18116) @@ -7,6 +7,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Index; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -24,9 +25,17 @@ * @author WangYi * 2017年3月22日 下午8:58:32 * 材料丢失、报损明细 + * + * 补充说明: + * 1.回收时新增丢失或报损明细数据,并通过recyclingItem_errorDamage表与RecyclingItem进行多对对关联 + * 2.装配时如果未补充就装配时,说明1的回收生成的MaterialErrorDamageDetail数据关联到该实例 + * 3.该包实例使用后转换申请单重新回收后,生成新的recyclingItem数据,并增加recyclingItem_errorDamage记录关闭在MaterialErrorDamageDetail表的数据 */ @Entity -@Table(name = "MaterialErrorDamageDetail") +@Table(name = "MaterialErrorDamageDetail",indexes = {@Index(columnList = "errorType", name = "errorType_index"),@Index(columnList = "type", name = "type_index") +,@Index(columnList = "materialDefinitionId", name = "materialDefinitionId_index"),@Index(columnList = "tousseInstanceId", name = "tousseInstanceId_index") +,@Index(columnList = "linkType", name = "linkType_index") +}) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class MaterialErrorDamageDetail implements Cloneable{ @@ -61,6 +70,8 @@ * 类型(回收误差或器械报损) */ private String type; + public final static String TYPE_CODE_ERROR = "error"; + public final static String TYPE_CODE_DAMAGE = "damage"; /** * 已补充数量(做了限制、只能补充一次) @@ -137,7 +148,7 @@ private String additionalPerson; /** - * 报损环节 + * 报损环节 (有可能为回收、使用记录等环节) */ private String linkType; @@ -206,15 +217,14 @@ private String operator; /** - * 回收项Id + * 回收项Id(基本上不用此字段了) */ private Long recyclingItemId; /** * 是否已关联上包实例(未补充装配时用到) */ private Boolean isUnionToussInstance; - @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -550,6 +560,11 @@ this.tousseBarcode = tousseBarcode; } + /** + * (基本上不用此字段了) + * @return + */ + @Deprecated public Long getRecyclingItemId() { return recyclingItemId; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseMaterialErrorDamage.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseMaterialErrorDamage.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseMaterialErrorDamage.java (revision 18116) @@ -0,0 +1,148 @@ +package com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * 器械包实例材料丢失与报废记录表 + * 1.与MaterialErrorDamageDetail表区别是:本po是在生成包实例后记录丢失报损,而MaterialErrorDamageDetail是在创建包实例前(比如回收等)录入的丢失报损记录 + * 2.目前用到的业务场景:录入使用记录时对相应的包实例进行材料丢失与报表及对应原因说明的记录 + * @author shuyongfu + * @since date 2017-05-11 + * + */ +@Entity +@Table(name = "TousseMaterialErrorDamage",indexes = {@Index(columnList = "type", name = "type_index") +,@Index(columnList = "materialDefinitionId", name = "materialDefinitionId_index") +,@Index(columnList = "tousseInstanceId", name = "tousseInstanceId_index") +,@Index(columnList = "linkType", name = "linkType_index") +}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class TousseMaterialErrorDamage implements Cloneable{ + + public static String LINKTYPE_USERECORD= "使用记录"; + public static String LINKTYPECODE_USERECORD= "useRecord"; + + private Long id; + + /** + * 数量 + */ + private Integer amount; + + /** + * 类型(回收误差或器械报损) + */ + private String type; + + public final static String TYPE_CODE_ERROR = "error"; + public final static String TYPE_CODE_DAMAGE = "damage"; + + /** + * 材料定义Id + */ + private Long materialDefinitionId; + + /** + * 器械包实例Id + */ + private Long tousseInstanceId; + + /** + * 报损环节 (有可能为使用记录等环节) + */ + private String linkType; + + /** + * 操作时间 + */ + private Date operationTime; + + /** + * 操作人 + */ + private String operator; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + + public String getLinkType() { + return linkType; + } + + public void setLinkType(String linkType) { + this.linkType = linkType; + } + + + public Date getOperationTime() { + return operationTime; + } + + public void setOperationTime(Date operationTime) { + this.operationTime = operationTime; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + @Override + public TousseMaterialErrorDamage clone() throws CloneNotSupportedException + { + return (TousseMaterialErrorDamage)super.clone(); + } + + public Long getTousseInstanceId() { + return tousseInstanceId; + } + + public void setTousseInstanceId(Long tousseInstanceId) { + this.tousseInstanceId = tousseInstanceId; + } + +} \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java =================================================================== diff -u -r17945 -r18116 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java (.../UseRecord.java) (revision 17945) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/useRecord/UseRecord.java (.../UseRecord.java) (revision 18116) @@ -271,6 +271,25 @@ } /** + * 查询该使用记录里会被转换至申请单的申请项且需要进行回收的包实例集合 + * 条件如下:1.包类型为器械包并且是否回收为是且(包实例的是否真正使用为否或者包定义的是否转换为是) + * 或者2.自定义器械包无条件转换 + * @param dao + * @return + */ + @SuppressWarnings("unchecked") + public List getTousseInstanceWillBeConvertedAndWaitRecyclingTousseItemList(ObjectDao dao) { + //改为按使用记录顺序号排序 + List tousseInstanceList = dao.findBySql(TousseInstance.class.getSimpleName(), " where useRecord_id=" + id + + " and ((tousseDefinition.tousseType = '"+ TousseDefinition.PACKAGE_TYPE_CUSTOM +"')" + + " or (tousseDefinition.tousseType = '"+ TousseDefinition.PACKAGE_TYPE_INSIDE +"' " + + " and tousseDefinition.isRecycling='"+ Constants.STR_YES +"' and (actualUsed = '"+ Constants.STR_NO +"' or tousseDefinition.isConvertApplyGoods='"+ Constants.STR_YES +"') " + + " )) " + + " order by useRecordSortNumber"); + return tousseInstanceList; + } + + /** * 查询该使用记录里所有类型为器械包的包实例集合(只限类型为器械包,不限是否回收、是否转换申请单等条件) * @param dao * @return