Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManager.java =================================================================== diff -u -r19156 -r20351 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManager.java (.../InventoryRecordManager.java) (revision 19156) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManager.java (.../InventoryRecordManager.java) (revision 20351) @@ -5,10 +5,11 @@ import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; +import com.forgon.tools.hibernate.BasePoManager; -public interface InventoryRecordManager { +public interface InventoryRecordManager extends BasePoManager { public void deleteStockTakeInfoById_TRANS_NEW(String id); @@ -24,8 +25,20 @@ */ public List getAllInventoryItem(String inventoryRecordId); + /** + * 添加盘点记录(基于批次粒度级别的盘点) + * @param params 输入参数,json格式,示例:{time : '2017-10-14 15:22',operator : '张三',wareHouseId : 222,type : '一次性物品'} + * @throws Exception + */ public void addInventoryRecord(String params) throws Exception; + /** + * 添加盘点记录(基于标识号粒度级别的盘点) + * @param params 输入参数,json格式,示例:{time : '2017-10-14 15:22',operator : '张三',wareHouseId : 222,type : '一次性物品'} + * @throws Exception + */ + public void addInventoryRecordBaseOnIdentification(String params) throws Exception; + public InventoryItem getInventoryItem(String itemId); public void setInventoryItemAmount(String itemJson,InventoryRecord record); Index: ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm2.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm2.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm2.js (revision 20351) @@ -0,0 +1,582 @@ +function isExistItem(name,sp,batchNumber, batchIdFromHisSync , price){ + var exist = false; + var itemsStore = top.Ext.getCmp('inventoryRecordForm').getStore(); + for ( var i = 0; i < itemsStore.getCount(); i++) { + var record = itemsStore.getAt(i); + var s_name = record.get("name"); + var s_sp = record.get("specification"); + var s_batchNumber = record.get("batchNumber"); + var s_batchIdFromHisSync = record.get("batchIdFromHisSync"); + var s_price = record.get("cost"); + if(s_name == name && s_sp == sp && s_batchNumber == batchNumber && s_price == price && s_batchIdFromHisSync == batchIdFromHisSync){ + exist = true; + break; + } + } + return exist; +} + +/** + * 添加盘点记录 + * @param batchId 批次id + * @param name + * @param specification + * @param amount + * @param batchNumber + * @param cost + * @param supplierName + * @param externalCode + * @param goodsType + * @param sequence + * @param type + * @param unit + * @param expDate + * @param batchIdFromHisSync + */ +function addItem(batchId,name,specification,amount,batchNumber,cost,supplierName,externalCode,goodsType,sequence,type,unit , expDate , storage, batchIdFromHisSync){ + var itemsStore = top.Ext.getCmp('inventoryRecordForm').getStore(); + var inventoryItem = new inventoryRecordItem({ + id:'', + disposableGoodsBatchId:batchId, + name:name, + specification:specification, + amount : storage, + inventoryAmount : amount, + batchNumber:batchNumber, + cost:cost, + supplierName:supplierName, + externalCode:externalCode, + goodsType:goodsType, + sequence : sequence, + type : type, + unit : unit, + expDate : expDate, + batchIdFromHisSync : batchIdFromHisSync + }); + itemsStore.insert(0 , inventoryItem); +} + +//一次性物品盘点记录 +function getDisposablegoodsInventoryRecord(recordId,time,operator,wareHouseName,status){ + var selectModel = new top.Ext.grid.CheckboxSelectionModel(); + + var itemsStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/inventoryRecordAction!loadInventoryRecordItems.do', + method : 'POST' + }), + sortInfo : {field : 'name',direction : 'ASC'}, //按名称默认升序 + reader : new Ext.data.JsonReader({ + root : 'data' + },[ + {name : 'id'}, + {name : 'disposableGoodsBatchId'}, + {name : 'name'}, + {name : 'amount'}, + {name : 'inventoryAmount'}, + {name : 'batchNumber'}, + {name : 'cost'}, + {name : 'specification'}, + {name : 'supplierName'}, + {name : 'externalCode'}, + {name : 'goodsType'}, + {name : 'expensiveGoodsInfo'}, + {name : 'sequence'}, + {name : 'unit'}, + {name : 'type'}, + {name : 'expDate'}, + {name : 'sourceIdFromHisSync'}, + {name : 'batchIdFromHisSync'} + ] + ) + }); + + var disposableGoodsStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/diposableGoodsAction!getDiposableGoodsData.do?allItems=yes&canInventory=yes', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'sourceIdFromHisSync',mapping : 'sourceIdFromHisSync'}, + {name : 'spelling',mapping : 'spelling'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'}, + {name : 'referencePrice',mapping : 'referencePrice'}, + {name : 'externalCode',mapping : 'externalCode'}, + {name : 'goodsType',mapping : 'goodsType'}, + {name : 'sequence',mapping : 'sequence'}, + {name : 'specification',mapping : 'specification'},//规格 + {name : 'disposableGoodsName',mapping : 'disposableGoodsName'},//没拼接的名字 + {name : 'type',mapping : 'type'}, + {name : 'unit',mapping : 'unit'} + + + ]) + }); + + var batchNumStore = new top.Ext.data.Store({ + proxy : new top.Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/diposableGoodsAction!getDisposableGoodsBatchList.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'id'}, + {name : 'batchNumber'}, + {name : 'cost'}, + {name : 'expDateStr'}, + {name : 'supplierName'} + ] + }) + }); + + //物资系统batchId数据源 + var batchIdFromHisSyncStore = new top.Ext.data.Store({ + proxy : new top.Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/diposableGoodsAction!getDisposableGoodsBatchIdFromHisSyncList.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'batchIdFromHisSync'}, + {name : 'amount'} + ] + }) + }); + + itemsStore.load({params:{id:recordId}}); + + form = new top.Ext.FormPanel({ + id : 'godownEntryForm', + frame : true, + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 5px', + width : 950, + autoScroll : true, + labelAlign : 'left', + items:[{ + layout : 'column', + items : [{ + xtype : 'hidden', + name : 'id', + id : 'id' + },{ + columnWidth : .3, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'textfield', + fieldLabel : '盘点日期', + maxLength : '41', + id : 'time', + name : 'time', + cls : 'fieldReadOnlyNoRemove', + allowBlank : true, + readOnly : true, + value:time, + anchor : '100%' + }] + }, { + columnWidth : .3, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'textfield', + fieldLabel : '盘点人', + maxLength : '16', + id : 'operator', + name : 'operator', + allowBlank : false, + readOnly : true, + cls : 'fieldReadOnlyNoRemove', + value : operator, + anchor : '100%' + }] + }, { + columnWidth : .3, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'textfield', + fieldLabel : '仓库', + maxLength : '16', + id : 'wareHouseName', + name : 'wareHouseName', + allowBlank : false, + readOnly : true, + cls : 'fieldReadOnlyNoRemove', + value : wareHouseName, + anchor : '100%' + }] + }] + },new top.Ext.grid.EditorGridPanel({ + id : 'inventoryRecordForm', + bodyStyle : 'border:1px solid #afd7af', + frame :false, + sm : selectModel, + width : 1350, + autoScroll : true, + height : top.screen.height > 800 ? 480 : 390, + viewConfig: { + forceFit:true + }, + clicksToEdit : 1, + loadMask:{msg:'正在加载,请稍候...'}, + store : itemsStore, + cm : new top.Ext.grid.ColumnModel([new Ext.grid.RowNumberer({header:'序号',width:40}), selectModel, + {header : "外部编码",dataIndex : 'externalCode',width : 50,menuDisabled : true,sortable : true}, + {header : "名称",dataIndex : 'name',width : 135,sortable:true,menuDisabled : true}, + {header : "物品类型",dataIndex : 'type',width : 50, sortable:true, menuDisabled : true}, + {header : "规格",dataIndex : 'specification',width : 50,menuDisabled : true}, + {header : "批次",width : 55,dataIndex : 'batchNumber',menuDisabled : true}, + {header : "物资库batchId",width : 75,dataIndex : 'batchIdFromHisSync',menuDisabled : true}, + {header : "失效时期",width : 60,dataIndex : 'expDate',menuDisabled : true}, + {header : "账面数量",dataIndex : 'amount',width : 50,menuDisabled : true,renderer : isChange}, + {header : "盘点数量",dataIndex : 'inventoryAmount',css: 'background: #F0F0F0;',width : 50,menuDisabled : true, + editor : new top.Ext.form.TextField({ + regex: /^\d+$/, + regexText:'只能输入数字', + allowBlank : false + }) + }, + {header : "高值耗材操作",dataIndex : 'goodsType',width : 75,menuDisabled : true,hidden:true, + renderer: function(v,p,record,rowIndex, columnIndex, store){ + if(v == '高值耗材'){ + var id = record.get('id'); + var amount = record.get('amount'); + var inventoryAmount = record.get('inventoryAmount'); + var isCanEdit = false; + var storageDifference = 0; + if(inventoryAmount != null && inventoryAmount != ""){ + if(inventoryAmount < amount){ + isCanEdit = true; + storageDifference = (amount - inventoryAmount); + } + } + return ""; + } + } + }, + {header : "单价",dataIndex : 'cost',width : 20,menuDisabled : true}, + {header : "单位",dataIndex : 'unit',width : 20,menuDisabled : true}, + {header : "供应商",width : 70,dataIndex : 'supplierName',menuDisabled : true , hidden:true}, + {id : 'expandColumn',header : "顺序号",width : 40,dataIndex : 'sequence',menuDisabled : true,sortable:true} + ]), + //autoExpandColumn : 'expandColumn', + tbar : [{ + xtype:'hidden', + name : 'sourceIdFromHisSync', + id : 'sourceIdFromHisSync' + },{ + xtype:'hidden', + name : 'batchID', + id : 'batchID' + },{ + xtype:'hidden', + name : 'externalCode', + id : 'externalCode' + },{ + xtype:'hidden', + name : 'cost', + id : 'cost' + },{ + xtype:'hidden', + name : 'goodsType', + id : 'goodsType' + },{ + xtype:'hidden', + name : 'supplierName', + id : 'supplierName' + },{ + xtype:'hidden', + name : 'sequence', + id : 'sequence' + },{ + xtype:'hidden', + name : 'specification', + id : 'specification' + },{ + xtype:'hidden', + name : 'disposableGoodsName', + id : 'disposableGoodsName' + },{ + xtype:'hidden', + name : 'unit', + id : 'unit' + },{ + xtype:'hidden', + name : 'type', + id : 'type' + },{ + xtype:'hidden', + name : 'expDate', + id : 'expDate' + },{ + xtype:'hidden', + name : 'storage', + id : 'storage' + },{ + text : '物品名称:' + },{ + xtype : 'combo', + id : 'name', + name : 'name', + queryParam : 'spell', + minChars : 0, + valueField : 'id', + displayField : 'name', + store : disposableGoodsStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true, + width : 270, + listWidth : 500, + tabIndex : 1, + selectOnFocus : true, + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('sourceIdFromHisSync').setValue(record.data.sourceIdFromHisSync); + top.Ext.getCmp('externalCode').setValue(record.data.externalCode); + top.Ext.getCmp('goodsType').setValue(record.data.goodsType); + top.Ext.getCmp('sequence').setValue(record.data.sequence); + top.Ext.getCmp('disposableGoodsName').setValue(record.data.disposableGoodsName); + top.Ext.getCmp('specification').setValue(record.data.specification); + top.Ext.getCmp('type').setValue(record.data.type); + top.Ext.getCmp('unit').setValue(record.data.unit); + batchNumStore.baseParams.disposableGoodsID = record.data.id; + batchNumStore.load(); + } + } + },{ + text : '生产批次:' + },{ + xtype : 'combo', + id : 'batchNumber', + name : 'batchNumber', + maxLength : '30', + queryParam : 'spell', + minChars : 0, + valueField : 'batchNumber', + displayField : 'batchNumber', + store : batchNumStore, + forceSelection : false, + lazyInit : false, + triggerAction : 'all', + hideTrigger : false, + typeAhead : false, + allowBlank:true, + editable : false, + selectOnFocus :true, + width : 150, + tabIndex : 3, + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('cost').setValue(record.data.cost); + top.Ext.getCmp('supplierName').setValue(record.data.supplierName); + top.Ext.getCmp('batchID').setValue(record.data.id); + top.Ext.getCmp('price').setValue(record.data.cost); + top.Ext.getCmp('expDate').setValue(record.data.expDateStr); + batchIdFromHisSyncStore.baseParams.disposableGoodsBatchID = record.data.id; + batchIdFromHisSyncStore.load(); + } + }, + anchor : '95%' + },{ + text : '物资库batchId:' + },{ + xtype : 'combo', + id : 'batchIdFromHisSync', + name : 'batchIdFromHisSync', + maxLength : '30', + queryParam : 'spell', + minChars : 0, + valueField : 'batchIdFromHisSync', + displayField : 'batchIdFromHisSync', + store : batchIdFromHisSyncStore, + forceSelection : false, + lazyInit : false, + triggerAction : 'all', + hideTrigger : false, + typeAhead : false, + allowBlank:true, + editable : false, + selectOnFocus :true, + width : 150, + tabIndex : 3, + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('storage').setValue(record.data.amount); + } + }, + anchor : '95%' + },{ + text : '数量:' + },{ + xtype : 'numberfield', + id : 'amount', + name : 'amount', + allowBlank:true, + width : 60, + allowDecimals : false, + allowNegative : false, + minValue : 1, + listeners : { + render : function(c) { + c.getEl().on('keypress',function(e) { + if (e.getKey() == 13) { + insertIntoGrid(id,type); + } + }); + } + } + },{ + text : '单价:' + },{ + xtype : 'numberfield', + id : 'price', + name : 'price', + allowNegative : false, + width : 60 + },{ + text : '添加', + iconCls : 'btn_ext_add', + id:'addBtn', + handler : function() { + insertIntoGrid(); + } + },'-',{ + text:'盘点数量初始化', + iconCls : 'icon_set', + handler : function() { + for ( var i = 0; i < itemsStore.getCount(); i++) { + var record = itemsStore.getAt(i); + var storage = record.get("amount"); + var inventoryAmount = record.get("inventoryAmount"); + if(inventoryAmount == null || inventoryAmount == ""){ + record.set('inventoryAmount',storage); + } + } + } + }] + })], + buttons : [{ + text : '导出', + hidden:(recordId == ""), + handler : function() { + var inventoryExportExcelConfig = ""; + if(!isUndefinedOrNullOrEmpty(printConfig.disposableGoodsInventoryExportExcel)){ + inventoryExportExcelConfig = JSON.stringify(printConfig.disposableGoodsInventoryExportExcel); + } + location.href = WWWROOT + "/disinfectsystem/stocktakerecordmanager/exportInventoryRecord.jsp?id=" + recordId + "&excelConfig=" + encodeURI(inventoryExportExcelConfig) + "&time=" + time; + } + },{ + text : '暂存', + id:'button1', + hidden:status=="已更新"?true:false, + handler : function() { + saveInventoryItem(recordId); + } + },{ + text : '更新库存并结算', + id:'button2', + hidden:status=="已更新"?true:false, + handler : function() { + updateStock(recordId,'disposableGoods'); + } + },{ + text : '取消', + handler : function() { + top.Ext.getCmp("inventoryItemWin").close(); + } + }] + }); + + var window = new top.Ext.Window( { + id : 'inventoryItemWin', + layout : 'fit', + title : '盘点信息', + width : 1000, + height : top.screen.height > 800 ? 610 : 530, + // height :680, + modal : true, + border :false, + plain : true, + items : [ form ] + }); + window.show(); + + function cleanSelect(){ + top.Ext.getCmp('name').setValue(""); + top.Ext.getCmp('batchNumber').setValue(""); + top.Ext.getCmp('amount').setValue(""); + top.Ext.getCmp('storage').setValue(""); + top.Ext.getCmp('batchID').setValue(""); + top.Ext.getCmp('cost').setValue(""); + top.Ext.getCmp('price').setValue(""); + top.Ext.getCmp('supplierName').setValue(""); + top.Ext.getCmp('externalCode').setValue(""); + top.Ext.getCmp('disposableGoodsName').setValue(""); + top.Ext.getCmp('type').setValue(""); + top.Ext.getCmp('specification').setValue(""); + top.Ext.getCmp('unit').setValue(""); + } + + function insertIntoGrid(){ +// var goodsType = top.Ext.getCmp('name').getRawValue();//获得物品名称框显示的名字 + var batchNumber = top.Ext.getCmp('batchNumber').getValue(); + var amount = top.Ext.getCmp('amount').getValue(); + var batchId = top.Ext.getCmp('batchID').getValue(); + var price = top.Ext.getCmp('price').getValue(); + var supplierName = top.Ext.getCmp('supplierName').getValue(); + var externalCode = top.Ext.getCmp('externalCode').getValue(); + var goodsType = top.Ext.getCmp('goodsType').getValue(); + var sequence = top.Ext.getCmp('sequence').getValue(); + var goodsName = top.Ext.getCmp('disposableGoodsName').getValue();//没有拼接的名字 + var specification = top.Ext.getCmp('specification').getValue();//规格 + var type = top.Ext.getCmp('type').getValue(); + var unit = top.Ext.getCmp('unit').getValue(); + var expDate = top.Ext.getCmp('expDate').getValue(); + //所查出来的库存 + var storage = top.Ext.getCmp('storage').getValue(); + + var batchIdFromHisSync = top.Ext.getCmp('batchIdFromHisSync').getValue();//物资系统batchId + + if(goodsName == ""){ + showResult("请选择物品名称!"); + return; + } + if(batchNumber == ""){ + showResult("请选择批次!"); + return; + } + if(amount == ""){ + showResult("数量必须大于0!"); + return; + } + if(price == ""){ + showResult("单价不能为空!"); + return; + } +// var specification = ""; +// var _index = goodsName.lastIndexOf('['); +// if(_index > 0){ +// specification = goodsName.substring(_index + 1,goodsName.length-1); +// goodsName = goodsName.substring(0,_index); +// } + var isExist = isExistItem(goodsName,specification,batchNumber , batchIdFromHisSync,price); + if(!isExist){ + addItem(batchId,goodsName,specification,amount,batchNumber,price,supplierName,externalCode,goodsType,sequence,type,unit , expDate , storage , batchIdFromHisSync); + cleanSelect(); + }else{ + showResult(goodsName + ",已存在!"); + } + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/stocktakemanager/InventoryItem.java =================================================================== diff -u -r20239 -r20351 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/stocktakemanager/InventoryItem.java (.../InventoryItem.java) (revision 20239) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/stocktakemanager/InventoryItem.java (.../InventoryItem.java) (revision 20351) @@ -87,6 +87,17 @@ private Long disposableGoodsBatchId ;// 批次id private Long disposableGoodsBatchStockId ;// 批次库存id + /** + * 一次性物品标识id(针对普通物品) + */ + private Long sourceIdFromHisSync; + + /** + * 从his系统同步(推送)进来的批次id + * 根据省医物资接口增加此属性(目前仅省医使用),相同batchNumber的多个入库数据推送过来,每次的batchId是变化的,所以需要对每一笔的batchId单独记录 + */ + private Long batchIdFromHisSync; + private Date expDate;//失效期 private String unit;//单位 @@ -263,6 +274,22 @@ this.disposableGoodsBatchStockId = disposableGoodsBatchStockId; } + public Long getSourceIdFromHisSync() { + return sourceIdFromHisSync; + } + + public void setSourceIdFromHisSync(Long sourceIdFromHisSync) { + this.sourceIdFromHisSync = sourceIdFromHisSync; + } + + public Long getBatchIdFromHisSync() { + return batchIdFromHisSync; + } + + public void setBatchIdFromHisSync(Long batchIdFromHisSync) { + this.batchIdFromHisSync = batchIdFromHisSync; + } + public Long getWareHouseId() { return wareHouseId; } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/InventoryRecordAction.java =================================================================== diff -u -r19465 -r20351 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/InventoryRecordAction.java (.../InventoryRecordAction.java) (revision 19465) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/InventoryRecordAction.java (.../InventoryRecordAction.java) (revision 20351) @@ -143,6 +143,10 @@ }else{ obj.put("expensiveGoodsInfo",""); } + + //针对省医需求,需要细化到每一个标识的版本,新增四个字段(sourceIdfromHisSync、disposableGoodsIdentityId , expensiveDisposablegoodsId , batchIdFromHisSync) + obj.put("sourceIdfromHisSync", goods.getSourceIdFromHisSync()); + obj.put("batchIdFromHisSync", goods.getBatchIdFromHisSync()); array.add(obj); } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryDiposableGoodsItem.java =================================================================== diff -u -r14174 -r20351 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryDiposableGoodsItem.java (.../GodownEntryDiposableGoodsItem.java) (revision 14174) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryDiposableGoodsItem.java (.../GodownEntryDiposableGoodsItem.java) (revision 20351) @@ -39,6 +39,10 @@ private Long disposableGoodsBatchStockID ;// 批次库存id private Long expensiveDisposableGoodsId; + //针对省医项目,增加记录物资系统的sourceId与batchId + private Long sourceIdFromHisSync; + private Long batchIdFromHisSync; + /** * 一次性物品名称,带规格 */ @@ -133,6 +137,22 @@ this.expensiveDisposableGoodsId = expensiveDisposableGoodsId; } + public Long getSourceIdFromHisSync() { + return sourceIdFromHisSync; + } + + public void setSourceIdFromHisSync(Long sourceIdFromHisSync) { + this.sourceIdFromHisSync = sourceIdFromHisSync; + } + + public Long getBatchIdFromHisSync() { + return batchIdFromHisSync; + } + + public void setBatchIdFromHisSync(Long batchIdFromHisSync) { + this.batchIdFromHisSync = batchIdFromHisSync; + } + public String getGoodsName() { return goodsName; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/disposablegoods/service/DisposableGoodsServiceContext.java =================================================================== diff -u -r20253 -r20351 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/disposablegoods/service/DisposableGoodsServiceContext.java (.../DisposableGoodsServiceContext.java) (revision 20253) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/disposablegoods/service/DisposableGoodsServiceContext.java (.../DisposableGoodsServiceContext.java) (revision 20351) @@ -72,6 +72,12 @@ private Set identificationIdsSet = new HashSet(); /** + * 一次性物品标识号表对应的物资系统的batchId(即batchIdFromHisSync字段)集合 + * 针对省医的盘点功能增加此变量 + */ + private Set batchIdFromHisSyncSet = new HashSet(); + + /** * 一次性物品的id和一次性物品的Map */ private Map idToDisposableGoodsMap = new HashMap(); @@ -223,6 +229,14 @@ this.identificationIdsSet = identificationIdsSet; } + public Set getBatchIdFromHisSyncSet() { + return batchIdFromHisSyncSet; + } + + public void setBatchIdFromHisSyncSet(Set batchIdFromHisSyncSet) { + this.batchIdFromHisSyncSet = batchIdFromHisSyncSet; + } + public Map getIdToDisposableGoodsMap() { return idToDisposableGoodsMap; } Index: ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js =================================================================== diff -u -r20183 -r20351 --- ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 20183) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 20351) @@ -236,5 +236,7 @@ //禁用供应室领用记录删除(防止因删除导致回写结果不准确) disableReceiveRecordDelete : true, //启用库存对比功能菜单 - enableBatchStockCompare : true + enableBatchStockCompare : true, + //一次性物品盘点版本(版本2的盘点粒度细化到标识表这一级即最底导,原版本的盘点粒度只到批次这一级) + inventoryDisposableVersion : 2 } \ No newline at end of file Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java =================================================================== diff -u -r19327 -r20351 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 19327) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 20351) @@ -38,6 +38,7 @@ 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.DisposableGoodsIdentification; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; @@ -49,6 +50,7 @@ import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.util.IntegerUtils; @@ -83,6 +85,8 @@ private LogManager appLogManager; + private ObjectDao objectDao; + public void setWareHouseManager(WareHouseManager wareHouseManager) { this.wareHouseManager = wareHouseManager; } @@ -117,6 +121,10 @@ this.disposableGoodsStorageRecordManager = disposableGoodsStorageRecordManager; } + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + /** * 保存前检查是否重复 * @@ -1124,6 +1132,81 @@ return null; } + /** + * 根据一次性物品批次id,返回该物品批次的标识号表的物资系统batchId列表 + * [{batchIdFromHisSync:1234,amount:100}] + * @return disposableGoodsBatchID + */ + public void getDisposableGoodsBatchIdFromHisSyncList() { + JSONArray jsonArray = new JSONArray(); + String disposableGoodsBatchID = StrutsParamUtils.getPraramValue( + "disposableGoodsBatchID", ""); + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchID)){ + StrutsResponseUtils.output(jsonArray); + return; + } + try { + + DisposableGoodsBatch disposableGoodsBatch = + (DisposableGoodsBatch)objectDao.getBySql(DisposableGoodsBatch.class.getSimpleName(), " where id=" + disposableGoodsBatchID); + String goodsType = disposableGoodsBatch.getDiposableGoods().getGoodsType(); + if(DisposableGoods.TYPE_DIPOSABLEGOODS.equals(goodsType)){ + List identificationList = + objectDao.findBySql(DisposableGoodsIdentification.class.getSimpleName(), "where disposableGoodsBatchID=" + disposableGoodsBatchID); + if(CollectionUtils.isNotEmpty(identificationList)){ + Map batchIdFromHisSyncAndAmountMap = new HashMap(); + //相同批次的一次生物品需要按batchIdFromHisSync进行合并 + for (DisposableGoodsIdentification disposableGoodsIdentification : identificationList) { + Long batchIdFromHisSync = disposableGoodsIdentification.getBatchIdFromHisSync(); + if(batchIdFromHisSyncAndAmountMap.containsKey(batchIdFromHisSync)){ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, + batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSync) + disposableGoodsIdentification.getAmount()); + }else{ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, disposableGoodsIdentification.getAmount()); + } + } + + if(batchIdFromHisSyncAndAmountMap.size() > 0){ + for (Long batchIdFromHisSyncKey : batchIdFromHisSyncAndAmountMap.keySet()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("batchIdFromHisSync", batchIdFromHisSyncKey); + jsonObject.put("amount", batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSyncKey)); + jsonArray.add(jsonObject); + } + } + } + }else if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(goodsType)){ + List expensiveDisposablegoodsList = + objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(), "where disposableGoodsBatchID=" + disposableGoodsBatchID); + if(CollectionUtils.isNotEmpty(expensiveDisposablegoodsList)){ + Map batchIdFromHisSyncAndAmountMap = new HashMap(); + //相同批次的一次生物品需要按batchIdFromHisSync进行合并 + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + Long batchIdFromHisSync = expensiveDisposablegoods.getBatchIdFromHisSync(); + if(batchIdFromHisSyncAndAmountMap.containsKey(batchIdFromHisSync)){ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, + batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSync) + 1); + }else{ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, 1L); + } + } + + if(batchIdFromHisSyncAndAmountMap.size() > 0){ + for (Long batchIdFromHisSyncKey : batchIdFromHisSyncAndAmountMap.keySet()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("batchIdFromHisSync", batchIdFromHisSyncKey); + jsonObject.put("amount", batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSyncKey)); + jsonArray.add(jsonObject); + } + } + } + } + StrutsResponseUtils.output(jsonArray); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Override public void prepare() { diposableGoods = new DisposableGoods(); Index: ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.js (revision 20351) @@ -0,0 +1,598 @@ +var grid; +var form; + +var buildInventoryForm; +function save(){ + + var time = Ext.getCmp('time').getRawValue(); + var operator = Ext.getCmp('operator').getValue(); + var wareHouseId = Ext.getCmp('wareHouseName').getValue(); + if(wareHouseId == null || wareHouseId == ""){ + showResult("请选择仓库!"); + return; + } + buildInventoryForm.close(); + + top.Ext.MessageBox.wait('正在处理,请稍候……','请等待'); + + var params = { + time : time, + operator : operator, + wareHouseId : wareHouseId, + type : type + }; + + //基于一次性物品标识基础上进行生成盘点记录与明细 + InventoryRecordTableManager.addInventoryRecordBaseOnIdentification(JSON.stringify(params),function(result){ + var json = top.Ext.decode(result); + hideMessageBox(true); + grid.dwrReload(); + if(json.success){ + showResult("保存成功"); + }else{ + showResult(json.message); + } + }); +} + +function isChange(v, p, record){ + var inventoryAmount = record.get("inventoryAmount"); + if(inventoryAmount != "" && inventoryAmount != v){ + return "

" + v + "

"; + }else{ + return v; + } +} + +var inventoryRecordItem = Ext.data.Record.create([ + {name : 'id'}, + {name : 'disposableGoodsBatchId'}, + {name : 'name'}, + {name : 'amount'}, + {name : 'inventoryAmount'}, + {name : 'batchNumber'}, + {name : 'cost'}, + {name : 'specification'}, + {name : 'supplierName'}, + {name : 'externalCode'}, + {name : 'goodsType'} +]); + +function showInventoryExpensiveGoods(inventoryItemId,storeRowIndex,isCanEdit,storageDifference){ + var rd = new Ext.data.JsonReader({ + root : 'data' + }, [ + {name : 'id'}, + {name : 'barcode'}, + {name : 'isDecreaseGoods'} + ]); + store = new top.Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/inventoryRecordAction!loadExpensiveGoodsItem.do', + method : 'POST' + }), + baseParams : {id : inventoryItemId}, + reader : rd + }); + store.load(); + + var expensiveGoodsCm = new top.Ext.grid.ColumnModel([new Ext.grid.RowNumberer({header:'序号',width:40}), + { + name:'id', + hidden :true, + dataIndex : 'id' + },{ + header : "高值耗材条码", + width:100, + dataIndex : 'barcode' + },{ + header : "是否盘亏扣减物品", + width : 50, + dataIndex : 'isDecreaseGoods', + editor : new top.Ext.form.ComboBox({ + valueField : 'result', + displayField : 'result', + listWidth : 160, + editable:false, + store : new Ext.data.SimpleStore( { + fields : ['result'], + data : [['是'],['否']] + }), + forceSelection : true, + allowBlank : false, + triggerAction : 'all', + mode : 'local', + anchor : '97%' + }) + }]); + + var formObj = new top.Ext.FormPanel({ + frame : true, + labelAlign:'right', + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 5px', + autoWidth : true, + autoHeight : true, + autoScroll : true, + items:[{ + layout : 'column', + items : [{ + columnWidth : 1, + layout: 'form', + items : [ + new top.Ext.grid.EditorGridPanel({ + id : 'splitMaterialGrid', + height : 200, + width : 560, + store : store, + cm : expensiveGoodsCm, + frame : false, + border : true, + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }), + viewConfig: { + forceFit:true + }, + stripeRows : true, + bodyStyle : 'border:1px solid #afd7af;padding-left:5px' + }) + ] + }] + }], + buttons : [{ + id : 'saveBtn', + text : '确定', + hidden:(isCanEdit?false:true), + handler : function(){ + var array = new Array(); + for(var i = 0;i < store.getCount();i++){ + var record = store.getAt(i); + if(record.get("isDecreaseGoods") == "是"){ + array.push({id:record.get("id")}); + } + } + if(array.length == storageDifference){ + var record = top.Ext.getCmp('inventoryRecordForm').getStore().getAt(storeRowIndex); + if(record != null){ + record.set('expensiveGoodsInfo',array); + formWindow.close(); + } + }else{ + showResult("盘亏够减物品不等于" + storageDifference); + + } + } + },{ + id : 'cancleBtn', + text : '取消', + handler : function() { + formWindow.close(); + } + }] + }); + + var formWindow = new top.Ext.Window( { + layout : 'fit', + title : '高值耗材库存明细', + width : 600, + modal : true, + autoHeight : true, + border : false, + plain : true, + items : [formObj] + }); + formWindow.show(); +} + +function saveInventoryItem(recordId){ + var array = new Array(); + var expensiveValidPass = true; + var goodsName = ""; + var itemsStore = top.Ext.getCmp('inventoryRecordForm').getStore(); + for ( var i = 0; i < itemsStore.getCount(); i++) { + var record = itemsStore.getAt(i); + var id = record.get("id"); + var amount = record.get("inventoryAmount"); + var name = record.get("name"); + var specification = record.get("specification"); + var batchNumber = record.get("batchNumber"); + var price = record.get("cost"); + if(amount == "" || amount < 0){ + continue; + } + + var expensiveGoodsInfo = record.get("expensiveGoodsInfo"); + var storeageAmount = record.get("amount"); + if("高值耗材" == record.get("goodsType")){ + if(amount < storeageAmount){ + if(expensiveGoodsInfo != ""){ + if(expensiveGoodsInfo.length != (storeageAmount - amount)){ + expensiveValidPass = false; + goodsName = record.get("name"); + break; + } + }else{ + expensiveValidPass = false; + goodsName = record.get("name"); + break; + } + } + } + + var obj = { + itemId : id, + amount : amount, + name : name, + specification:specification, + batchNumber:batchNumber, + price:price, + expensiveGoodsInfo:expensiveGoodsInfo + }; + array.push(obj); + } + + if(!expensiveValidPass){ + showResult(goodsName + ",请确认盘亏数量是否关联上相应的条码!"); + return; + } + + form.form.submit( { + url : WWWROOT + '/disinfectSystem/inventoryRecordAction!saveInventoryRecord.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + params : { + items : JSON.stringify(array), + id : recordId + }, + success : function(form, action) { + showResult(action.result.msg); + top.Ext.getCmp('inventoryItemWin').close(); + }, + failure : function(form, action) { + showResult(action.result.msg); + top.Ext.getCmp('inventoryItemWin').close(); + } + }); +} + +function updateStock(recordId,type){ + var array = new Array(); + var isNullAmount = false; + var goodsName = ""; + var expensiveValidPass = true; + var itemsStore = top.Ext.getCmp('inventoryRecordForm').getStore(); + for ( var i = 0; i < itemsStore.getCount(); i++) { + var record = itemsStore.getAt(i); + var id = record.get("id"); + var batchIdFromHisSync = record.get("batchIdFromHisSync"); + var amount = record.get("amount"); + var inventoryAmount = record.get("inventoryAmount"); + if(inventoryAmount == "" && inventoryAmount != '0'){ + isNullAmount = true; + goodsName = record.get("name"); + break; + } + var expensiveGoodsInfo = record.get("expensiveGoodsInfo"); + if("高值耗材" == record.get("goodsType")){ + if(inventoryAmount < amount){ + if(expensiveGoodsInfo != ""){ + if(expensiveGoodsInfo.length != (amount - inventoryAmount)){ + expensiveValidPass = false; + goodsName = record.get("name"); + break; + } + }else{ + expensiveValidPass = false; + goodsName = record.get("name"); + break; + } + } + } + + var name = record.get("name"); + var specification = record.get("specification"); + var batchNumber = record.get("batchNumber"); + var price = record.get("cost"); + var obj = { + itemId : id, + amount : inventoryAmount, + name : name, + specification:specification, + batchNumber:batchNumber, + price : price, + expensiveGoodsInfo:expensiveGoodsInfo, + batchIdFromHisSync:batchIdFromHisSync + }; + array.push(obj); + } + if(isNullAmount){ + showResult(goodsName + ",盘点数量不能为空!"); + return; + } + + if(!expensiveValidPass){ + showResult(goodsName + ",请确认盘亏数量是否关联上相应的条码!"); + return; + } + top.Ext.getCmp('button2').disable(); + form.form.submit( { + url : WWWROOT + '/disinfectSystem/inventoryRecordAction!updateGoodsStock.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + params : { + items : JSON.stringify(array), + id : recordId, + type : type + }, + success : function(form, action) { + showResult(action.result.msg); + grid.dwrReload(); + top.Ext.getCmp('inventoryItemWin').close(); + }, + failure : function(form, action) { + showResult(action.result.msg); + grid.dwrReload(); + top.Ext.getCmp('inventoryItemWin').close(); + } + }); +} + + +function addInventoryRecord() { + + var wareHouseStore = new Ext.data.JsonStore({ + url : WWWROOT + '/disinfectSystem/baseData/wareHouseAction!getWareHouseData.do', + root: 'data', + fields: [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'} + ], + listeners : { + load : function(store,records) { + if(records.length > 0) { + if (Ext.getCmp('wareHouseName')) { + Ext.getCmp('wareHouseName').setValue(records[0].data.id); + } + } + } + } + }); + + var formObj = new Ext.FormPanel({ + id : 'form', + frame : true, + labelSeparator : ':', + labelAlign:'right', + bodyStyle : 'padding:5px 5px 0px 5px', + autoHeight:true, + autoScroll : true, + items : [{ + layout : 'column', + items : [ { + columnWidth : 0.5, + layout : 'form', + labelWidth:70, + items : [ new Ext.form.DateField({ + id:'time', + name : 'time', + fieldLabel : '盘点时间', + readOnly : true, + format:'Y-m-d H:i', + value : new Date(), + anchor : '99%' + })] + },{ + columnWidth : 0.5, + layout : 'form', + labelWidth:70, + items : [ { + xtype : 'textfield', + fieldLabel : "盘点人", + name : "operator", + readOnly : true, + id : "operator", + anchor : '99%', + value : operator + }] + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 70, + items : [{ + xtype : 'combo', + fieldLabel : '仓库', + id : 'wareHouseName', + name : 'wareHouseName', + editable:false, + valueField : 'id', + displayField : 'name', + store : wareHouseStore, + forceSelection : true, + allowBlank : false, + triggerAction : 'all', + anchor : '99%' + }] + }] + }], + buttons : [{ + id : 'saveBtn', + text : '保存', + handler : save + }] + }); + + buildInventoryForm = new Ext.Window( { + id : 'chooseMonthWin', + layout : 'fit', + title : '盘点信息 ', + width : 500, + border : false, + modal : true, + autoHeight : true, + plain : true, + items : [ formObj ] + }); + buildInventoryForm.show(); + wareHouseStore.load(); +} + + +function formartPrice(v, p, record) { + if (v != null && v != "") { + var temp = parseFloat(v); + return temp.toFixed(2); + } + return v; +} + +//删除 +function deleteStockRecord(grid) { + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要删除的记录!"); + return false; + } + var ids = null; + for ( var i = 0, len = records.length; i < len; i++) { + if (ids == null) { + ids = records[i].data['id']; + } else { + ids = ids + ';' + records[i].data['id']; + } + } + top.Ext.MessageBox.confirm("请确认","是否确定要删除选中的信息?", + function(button, text) { + if ("yes" == button){ + top.Ext.MessageBox.wait('正在删除,请稍候……','请等待'); + InventoryRecordTableManager.deleteInventoryRecord(ids,function(success){ + hideMessageBox(true); + if(success){ + showResult("删除成功!"); + }else{ + showResult("删除失败!"); + } + grid.dwrReload(); + }); + } + } + ); +} + +function modify(v, data) { + var records = grid.getSelectionModel().getSelections(); + var id = records[0].data['id']; + var time = myDateFormatByMinute(records[0].data['time']); + var operator = records[0].data['operator']; + var wareHouseName = records[0].data['wareHouseName']; + var status = records[0].data['status']; + if("material" == type){ + getMaterialInventoryRecord(id,time,operator,wareHouseName,status); + }else{ + getDisposablegoodsInventoryRecord(id,time,operator,wareHouseName,status); + } + +} + +Ext.onReady(function() { + var columns = new Array(); + columns.push( + {header : "盘点日期",width : 150,dataIndex : 'time',renderer : myDateFormatByMinute,renderer : modifyRecord}, + {header : "盘点人",width : 100,dataIndex : 'operator'}, + {header : "状态",width : 135,dataIndex : 'status'}, + {header : "仓库名称",width : 135,dataIndex : 'wareHouseName'}, + {header : "备注",width : 200,dataIndex : 'remark'} + ); + var readerDetail = [ + {name : 'id'}, + {name : 'time'}, + {name : 'operator'}, + {name : 'wareHouseName'}, + {name : 'status'}, + {name : 'remark'} + ]; + + var filters = new Ext.grid.GridFilters({ + filters : [ + {type : 'date',dataIndex : 'time'}, + {type : 'string',dataIndex : 'operator'}, + {type : 'string',dataIndex : 'amount'}, + {type : 'string',dataIndex : 'status'}, + {type : 'string',dataIndex : 'wareHouseName'}, + {type : 'string',dataIndex : 'remark'} + ] + }); + + var tbar = [{ + text : '添加盘点记录', + iconCls : 'btn_ext_application_add', + hidden:SSTS_StockTakeInfo_Create, + handler : function() { + addInventoryRecord(); + } + },{ + text : '删除', + iconCls : 'btn_ext_application_del', + hidden:SSTS_StockTakeInfo_Delete, + handler : function() { + deleteStockRecord(grid); + } + },{ + text : '导出', + iconCls:'btn_ext_download', + handler : function() { + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要导出的记录!"); + return false; + } + if(records.length > 1){ + showResult("一次只能导出一条盘点记录!"); + return false; + } + var recordId = records[0].data['id']; + var time = records[0].data['time']; + var inventoryExportExcelConfig = ""; + if("material" == type){ + if(!isUndefinedOrNullOrEmpty(printConfig.materialInventoryExportExcel)){ + inventoryExportExcelConfig = JSON.stringify(printConfig.materialInventoryExportExcel); + } + }else{ + if(!isUndefinedOrNullOrEmpty(printConfig.disposableGoodsInventoryExportExcel)){ + inventoryExportExcelConfig = JSON.stringify(printConfig.disposableGoodsInventoryExportExcel); + } + } + location.href = WWWROOT + "/disinfectsystem/stocktakerecordmanager/exportInventoryRecord.jsp?id=" + recordId + "&excelConfig=" + encodeURI(inventoryExportExcelConfig) + "&time=" + time; + } + }]; + + grid = new Ext.ux.ForgonPageGrid({ + id : 'stocktakerecordGrid', + title : '盘点信息列表', + pageSize : 20, + renderTo : 'gridDiv', + defaultSortField : 'id', + defaultSortDirection : 'DESC', + isCheckboxSelectionModel : true, + rememberSelected : false, + isShowSearchField : true, + columns : columns, + plugins : filters, + frame : false, + tbar:tbar, + border : false + }, readerDetail, InventoryRecordTableManager.findInventoryRecordList, + null); + + var viewport = new Ext.Viewport({ + layout : 'border', + items : [/*form,*/ { + region : 'center', + margins : '0 0 0 0', + layout : 'fit', + items : grid + }] + }); +}); Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java =================================================================== diff -u -r20183 -r20351 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 20183) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 20351) @@ -721,6 +721,8 @@ boolean newBatch = false; Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + //物资系统的batchId + Long batchIdFromHisSync = godownEntryItem.getBatchIdFromHisSync(); DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); DisposableGoodsStock disposableGoodsStock = null; @@ -820,14 +822,6 @@ } } }else{ - //找出该仓库下的该批次库存(该数据只会有一条)的最新的一条一次性物品标识数据,按该标识对应的batchId(物资系统batchId)生成新的标识 - DisposableGoodsIdentification lastDisposableGoodsIdentification = - (DisposableGoodsIdentification)objectDao.getBySql(DisposableGoodsIdentification.class.getSimpleName(), "where batchStock.id="+ disposableGoodsBatchStock.getId() +" order by id desc"); - Long batchIdFromHisSync = null; - if(lastDisposableGoodsIdentification != null){ - batchIdFromHisSync = lastDisposableGoodsIdentification.getBatchIdFromHisSync(); - godownEntryItem.setBatchIdFromHisSync(batchIdFromHisSync); - } // 新建标识号对象 DisposableGoodsIdentification identification = newIdentificationOfDisposableGoods( entry, godownEntryItem, disposableGoodsID, @@ -1878,6 +1872,8 @@ .get(disposableGoodsStockID); Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + //物资系统的batchId + Long batchIdFromHisSync = godownEntryItem.getBatchIdFromHisSync(); String batchNumber = godownEntryItem.getBatchNumber(); DisposableGoodsBatchStock disposableGoodsBatchStock = null; if(!DatabaseUtil.isPoIdValid(disposableGoodsID)){ @@ -1916,8 +1912,16 @@ } // 这是用户在页面看到的退库价格,必须从这些价格的标识号里面退库 Double outPrice = godownEntryItem.getCost(); + + List identifications = null; + if(DatabaseUtil.isPoIdValid(batchIdFromHisSync)){ + identifications = objectDao.findBySql(DisposableGoodsIdentification.class.getSimpleName(), + " where batchStock.id="+ disposableGoodsBatchStockID +" and batchIdFromHisSync=" + batchIdFromHisSync); + }else{ + identifications = disposableGoodsBatchStock.getIdentifications(); + } // 开始退库 - for (DisposableGoodsIdentification identification : disposableGoodsBatchStock.getIdentifications()) { + for (DisposableGoodsIdentification identification : identifications) { Long restAmount = identification.getAmount(); Double price = identification.getPrice(); if(restAmount <= 0){ @@ -1940,6 +1944,9 @@ diposableGoodsItem.setGodownEntryItemID(godownEntryItem.getId());// 关联退库itemID diposableGoodsItem.setIdentificationID(identification.getId());// 关联标识号ID + diposableGoodsItem.setSourceIdFromHisSync(godownEntryItem.getSourceIdFromHisSync()); + diposableGoodsItem.setBatchIdFromHisSync(batchIdFromHisSync); + if(!diposableGoodsItem.isAssociatedInfoValid()){ throw new RuntimeException("关联信息不正确!"); } @@ -2199,6 +2206,8 @@ .getDisposableGoodsBatchNumberSet(); Set identificationIdsSet = disposableGoodsServiceContext .getIdentificationIdsSet(); + Set batchIdFromHisSyncSet = disposableGoodsServiceContext + .getBatchIdFromHisSyncSet(); List itemList = entry.getItemsList(); for (GodownEntryItem godownEntryItem : itemList) { Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); @@ -2232,6 +2241,10 @@ if (DatabaseUtil.isPoIdValid(expensiveDisposablegoodsId)) { expensiveDisposablegoodsIdsSet.add(expensiveDisposablegoodsId); } + Long batchIdFromHisSyncId = godownEntryItem.getBatchIdFromHisSync(); + if (DatabaseUtil.isPoIdValid(batchIdFromHisSyncId)) { + batchIdFromHisSyncSet.add(batchIdFromHisSyncId); + } String batchNumber = godownEntryItem.getBatchNumber(); batchNumbersSet.add(batchNumber); } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r20254 -r20351 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 20254) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 20351) @@ -942,6 +942,8 @@ temp.put("id", disposableGoods.getId()); temp.put("disposableGoodsId", disposableGoods.getId()); + //物资系统的物资定义id + temp.put("sourceIdFromHisSync", disposableGoods.getIdFromHisSync()); temp.put("type", "一次性物品"); temp.put("disposableGoodsName", disposableGoods.getName());//没有拼接的名字 temp.put("specification", disposableGoods.getSpecification());//规格 Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r20183 -r20351 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 20183) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 20351) @@ -311,7 +311,7 @@ {hidden :SSTS_DisposableGoodsCancellingStocks_Manager,text:"一次性物品退库单管理",href:WWWROOT+'/disinfectsystem/assestManagement/godownEntry/godownOutView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsAllot_Manager,text:"一次性物品调拨单管理",href:WWWROOT+'/disinfectsystem/assestManagement/godownEntry/appropriationView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsProfitAndLoss_Manager,text:"一次性物品盘盈盘亏管理",href:WWWROOT+'/disinfectsystem/assestManagement/godownEntry/godownStockTakeView.jsp',hrefTarget:linkTarget,leaf:true}, - {hidden :SSTS_DisposableGoodsCheck_Manager,text:"一次性物品盘点管理",href:WWWROOT+'/disinfectsystem/stocktakerecordmanager/inventoryrecordView.jsp?type=disposableGoods',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_DisposableGoodsCheck_Manager,text:"一次性物品盘点管理",href:WWWROOT+'/disinfectsystem/stocktakerecordmanager/'+ (sstsConfig.inventoryDisposableVersion == 2 ? "inventoryrecordView2.jsp" : "inventoryrecordView.jsp") +'?type=disposableGoods',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodSsettleAccounts_Manager,text:"一次性物品结算管理",href:WWWROOT+'/disinfectsystem/reportforms/stocktakeView.jsp',hrefTarget:linkTarget,leaf:true} ] },{ Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java =================================================================== diff -u -r20189 -r20351 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 20189) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 20351) @@ -28,6 +28,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.util.Region; +import org.apache.velocity.runtime.parser.node.MathUtils; import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; @@ -68,19 +69,19 @@ import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.excel.ExcelCellStyle; import com.forgon.tools.excel.ExcelHelper; +import com.forgon.tools.hibernate.BasePoManager; +import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.hibernate.ObjectDao; /** * @author qjw * * 2012-6-7 下午01:54:02 */ -public class InventoryRecordManagerImpl implements InventoryRecordManager { +public class InventoryRecordManagerImpl extends BasePoManagerImpl implements InventoryRecordManager { private static final Logger logger = Logger .getLogger(InventoryRecordManagerImpl.class); - private ObjectDao objectDao; - private MaterialEntryManager materialEntryManager; private GodownEntryManager godownEntryManager; @@ -135,10 +136,6 @@ this.materialEntryManager = materialEntryManager; } - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } - public void setGodownEntryManager(GodownEntryManager godownEntryManager) { this.godownEntryManager = godownEntryManager; } @@ -273,6 +270,8 @@ obj.put("batchID", inventoryItem.getBatchID()); obj.put("diposableGoodsStockID", inventoryItem.getDisposableGoodsStockId()); obj.put("diposableGoodsBatchStockID", inventoryItem.getDisposableGoodsBatchStockId()); + obj.put("sourceIdFromHisSync", inventoryItem.getSourceIdFromHisSync()); + obj.put("batchIdFromHisSync", inventoryItem.getBatchIdFromHisSync()); obj.put("batchNumber", inventoryItem.getBatchNumber()); obj.put("price", inventoryItem.getPrice()); obj.put("expDate", sdf.format(inventoryItem.getExpDate())); @@ -411,12 +410,13 @@ objectDao.delete(stockTakeInfo); } - @Override public void addInventoryRecord(String params) throws Exception{ InventoryRecord record =null; try { JSONObject obj = JSONObject.fromObject(params); + //检查是否存在未更新的盘点记录,如果存在将往上抛出异常 + checkExistsNotUpdatedInventoryRecordByWarehouseId(obj.optLong("wareHouseId") , obj.optString("type")); LoginUserData loginUser = AcegiHelper.getLoginUser(); Long wareHouseId = obj.optLong("wareHouseId"); @@ -520,7 +520,7 @@ item = itemsGroupedByPrice.get(0); item.setStorage(item.getStorage() + 1); }else{ - item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods); + item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods , null); item.setStorage(1); itemsGroupedByPrice.add(item); } @@ -539,6 +539,7 @@ if(identifications == null){ continue; } + //按价格对标识号进行数量汇总 Map> itemsGroupedByPriceMap = new HashMap>(); for (DisposableGoodsIdentification identification : identifications) { Double price = identification.getPrice(); @@ -561,7 +562,7 @@ item = itemsGroupedByPrice.get(0); item.setStorage(item.getStorage() + identificationAmount); }else{ - item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods); + item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods , null); item.setStorage(identificationAmount); itemsGroupedByPrice.add(item); } @@ -581,9 +582,248 @@ } } + @Override + public void addInventoryRecordBaseOnIdentification(String params) throws Exception{ + InventoryRecord record =null; + try { + JSONObject obj = JSONObject.fromObject(params); + //检查是否存在未更新的盘点记录,如果存在将往上抛出异常 + checkExistsNotUpdatedInventoryRecordByWarehouseId(obj.optLong("wareHouseId") , obj.optString("type")); + LoginUserData loginUser = AcegiHelper.getLoginUser(); + + Long wareHouseId = obj.optLong("wareHouseId"); + if(wareHouseId == null){ + throw new RuntimeException("请选择仓库!"); + } + WareHouse warehouse = wareHouseManager.getWareHouseById(wareHouseId); + if(warehouse == null){ + throw new RuntimeException("仓库不存在!"); + } + String type = obj.optString("type"); + if("material".equals(type)){ + record = new InventoryRecord(); + record.setTime(new Date()); + record.setOperator(loginUser.getUserFullName()); + record.setOrgUnitCode(warehouse.getOrgUnitCode()); + record.setOrgUnitName(warehouse.getOrgUnitName()); + record.setWareHouseId(wareHouseId); + record.setType(InventoryRecord.TYPE_MATERIALENTRY); + record.setWareHouseName(warehouse.getName()); + objectDao.saveOrUpdate(record); + + List items = new ArrayList(); + String inventoryDepartCoding = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig() + ","; + + String sql = "select min(m.externalCode),min(m.name),min(m.specification),sum(s.amount),s.price,m.id,min(m.unit),min(m.goodsType),min(m.type) from MaterialDefinition m " + + ", GoodsStock s where m.id = s.materialDefinitionId and m.inventoryDepartCoding like '%" + inventoryDepartCoding + "%' and " + + "wareHouseId = " + wareHouseId + " and s.amount > 0 group by m.id,s.price order by min(m.externalCode) asc"; + ResultSet rs = objectDao.executeSql(sql); + while(rs.next()){ + InventoryItem item = new InventoryItem(); + item.setMaterialName(rs.getString(2)); + item.setPrice(rs.getDouble(5)); + String sp = rs.getString(3); + if(StringUtils.isBlank(sp)){ + sp = null; + } + item.setSpecification(sp); + item.setInventoryRecordId(record.getId()); + item.setStorage(rs.getInt(4)); + item.setSupplierName(""); + item.setMaterialID(rs.getLong(6)); + item.setExternalCode(rs.getString(1)); + item.setWareHouseId(wareHouseId); + item.setWareHouseName(warehouse.getName()); + item.setUnit(rs.getString(7)); + item.setGoodsType(rs.getString(8)); + item.setType(rs.getString(9)); + items.add(item); + } + record.setItems(items); + }else if("disposableGoods".equals(type)){ + @SuppressWarnings("unchecked") + //查询一次性物品库存表进行一次性物品的盘点 + List goodsStockList = objectDao + .findBySql(DisposableGoodsStock.class.getSimpleName(), + " where (po.inventoryGoods is null or po.inventoryGoods = '" + Constants.STR_YES + "') and po.warehouseID = " + wareHouseId + + " order by po.externalCode asc"); + if(goodsStockList != null && goodsStockList.size() > 0){ + record = new InventoryRecord(); + record.setTime(new Date()); + record.setOperator(loginUser.getUserFullName()); + record.setOrgUnitCode(warehouse.getOrgUnitCode()); + record.setOrgUnitName(warehouse.getOrgUnitName()); + record.setWareHouseId(wareHouseId); + record.setType(InventoryRecord.TYPE_DISPOSABLEGOOD); + record.setWareHouseName(warehouse.getName()); + objectDao.saveOrUpdate(record); + List items = new ArrayList(); + for (DisposableGoodsStock disposableGoodsStock : goodsStockList) { + DisposableGoods disposableGoods = (DisposableGoods) objectDao + .getByProperty(DisposableGoods.class.getSimpleName(), "id", + disposableGoodsStock.getDisposableGoodsID()); + if(disposableGoods == null){ + throw new RuntimeException(String.format("一次性物品[%s]定义不存在!",disposableGoodsStock.getShowNameForSmallestUnit())); + } + //查询一次性物品批次库存进行盘点(分普通物品与高值耗材) + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsStock.getGoodsBatchs()) { + if(disposableGoodsBatchStock.getStorage() <= 0){ + continue; + } + + if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + @SuppressWarnings("unchecked") + List expensiveDisposablegoodsList = objectDao + .findBySql(ExpensiveDisposablegoods.class.getSimpleName(), + "where po.status = '"+ ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE + + "' and po.disposableGoodsBatchStock.id = "+ disposableGoodsBatchStock.getId()); + if(expensiveDisposablegoodsList != null){ + //按价格及物资系统的batchId对标识号数据进行数量汇总(map结果为{price:111,batchIdFromHisSync:222,inventoryList:[]}) + List> itemsGroupedByPriceAndBatchIdFromHisSyncMapList = new ArrayList>(); + for (ExpensiveDisposablegoods expensiveGoods : expensiveDisposablegoodsList) { + Double price = expensiveGoods.getPrice(); + if(price == null){ + throw new RuntimeException(String.format("条码为[%s]的物品[%s]有价格为空的库存数据!", expensiveGoods.getBarcode(),disposableGoodsStock.getShowNameForSmallestUnit())); + } + + Long batchIdFromHisSync = expensiveGoods.getBatchIdFromHisSync(); + InventoryItem item = null; + + List itemsGroupedByPriceAndBatchIdFromHisSync = + getInventoryItemsByPriceAndBatchIdFromHisSyncMap(itemsGroupedByPriceAndBatchIdFromHisSyncMapList , price, batchIdFromHisSync); + if(itemsGroupedByPriceAndBatchIdFromHisSync == null){ + itemsGroupedByPriceAndBatchIdFromHisSync = new LinkedList(); + item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods, + expensiveGoods.getBatchIdFromHisSync()); + item.setStorage(1); + itemsGroupedByPriceAndBatchIdFromHisSync.add(item); + Map itemsGroupedByBatchIdFromHisSyncMap = new HashMap(); + itemsGroupedByBatchIdFromHisSyncMap.put("price", price); + itemsGroupedByBatchIdFromHisSyncMap.put("batchIdFromHisSync", batchIdFromHisSync); + itemsGroupedByBatchIdFromHisSyncMap.put("inventoryList", itemsGroupedByPriceAndBatchIdFromHisSync); + itemsGroupedByPriceAndBatchIdFromHisSyncMapList.add(itemsGroupedByBatchIdFromHisSyncMap); + }else{ + item = itemsGroupedByPriceAndBatchIdFromHisSync.get(0); + item.setStorage(item.getStorage() + 1); + } + + InventoryExpensiveGoodsItem expensiveGoodsItem = new InventoryExpensiveGoodsItem(); + expensiveGoodsItem.setBarcode(expensiveGoods.getBarcode()); + expensiveGoodsItem.setExpensiveGoodsId(expensiveGoods.getId()); + item.getItems().add(expensiveGoodsItem); + } + if(CollectionUtils.isNotEmpty(itemsGroupedByPriceAndBatchIdFromHisSyncMapList)){ + for (Map map : itemsGroupedByPriceAndBatchIdFromHisSyncMapList) { + List inventoryList = (List)map.get("inventoryList"); + if (CollectionUtils.isNotEmpty(inventoryList)) { + items.addAll(inventoryList); + } + } + } + } + }else{ + //该批次库存的所有标识号 + List identifications = disposableGoodsBatchStock.getIdentifications(); + if(identifications == null){ + continue; + } + //按价格及物资系统的batchId对标识号数据进行数量汇总(map结果为{price:111,batchIdFromHisSync:222,inventoryList:[]}) + List> itemsGroupedByPriceAndBatchIdFromHisSyncMapList = new ArrayList>(); + for (DisposableGoodsIdentification identification : identifications) { + Double price = identification.getPrice(); + if(price == null){ + throw new RuntimeException(String.format("批次号为[%s]的物品[%s]有价格为空的库存数据!", disposableGoodsBatchStock.getBatchNumber(),disposableGoodsStock.getShowNameForSmallestUnit())); + } + Long amount = identification.getAmount(); + if(amount == null || amount.intValue() == 0){ + continue; + } + + Integer identificationAmount = Integer.valueOf(identification.getAmount().intValue()); + InventoryItem item = null; + + Long batchIdFromHisSync = identification.getBatchIdFromHisSync(); + List itemsGroupedByPriceAndBatchIdFromHisSync = + getInventoryItemsByPriceAndBatchIdFromHisSyncMap(itemsGroupedByPriceAndBatchIdFromHisSyncMapList , price, batchIdFromHisSync); + if(itemsGroupedByPriceAndBatchIdFromHisSync == null){ + itemsGroupedByPriceAndBatchIdFromHisSync = new LinkedList(); + item = newInventoryItem(record, warehouse,disposableGoodsStock,disposableGoodsBatchStock,price,disposableGoods, identification.getBatchIdFromHisSync()); + item.setStorage(identificationAmount); + itemsGroupedByPriceAndBatchIdFromHisSync.add(item); + Map itemsGroupedByBatchIdFromHisSyncMap = new HashMap(); + itemsGroupedByBatchIdFromHisSyncMap.put("price", price); + itemsGroupedByBatchIdFromHisSyncMap.put("batchIdFromHisSync", batchIdFromHisSync); + itemsGroupedByBatchIdFromHisSyncMap.put("inventoryList", itemsGroupedByPriceAndBatchIdFromHisSync); + itemsGroupedByPriceAndBatchIdFromHisSyncMapList.add(itemsGroupedByBatchIdFromHisSyncMap); + }else{ + item = itemsGroupedByPriceAndBatchIdFromHisSync.get(0); + item.setStorage(item.getStorage() + identificationAmount); + } + + } + if(CollectionUtils.isNotEmpty(itemsGroupedByPriceAndBatchIdFromHisSyncMapList)){ + for (Map map : itemsGroupedByPriceAndBatchIdFromHisSyncMapList) { + List inventoryList = (List)map.get("inventoryList"); + if (CollectionUtils.isNotEmpty(inventoryList)) { + items.addAll(inventoryList); + } + } + } + } + } + } + record.setItems(items); + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } + } + + /** + * 根据单价及物资系统的batchId从内存对象中取到盘点明细 + * @param itemsGroupedByPriceAndBatchIdFromHisSyncMapList 内存对象,存放盘点明细。map结果如:{price:111,batchIdFromHisSync:222,inventoryList:[]} + * @param price 单价 + * @param batchIdFromHisSync 物资系统的batchId + * @return + */ + private List getInventoryItemsByPriceAndBatchIdFromHisSyncMap( + List> itemsGroupedByPriceAndBatchIdFromHisSyncMapList , Double price , Long batchIdFromHisSync){ + List inventoryItemList = null; + if(CollectionUtils.isNotEmpty(itemsGroupedByPriceAndBatchIdFromHisSyncMapList)){ + for (Map itemsGroupedByPriceAndBatchIdFromHisSyncMap : itemsGroupedByPriceAndBatchIdFromHisSyncMapList) { + if(MathTools.valueEquals((Double)itemsGroupedByPriceAndBatchIdFromHisSyncMap.get("price"), price) + && MathTools.valueEquals((Long)itemsGroupedByPriceAndBatchIdFromHisSyncMap.get("batchIdFromHisSync"), batchIdFromHisSync)){ + inventoryItemList = (List)itemsGroupedByPriceAndBatchIdFromHisSyncMap.get("inventoryList"); + break; + } + } + } + return inventoryItemList; + } + + /** + * 检查是否存在未更新的盘点记录 + * @param warehouseId 仓库id + * @param type 类型,值为material或disposableGoods,分别代表材料或一次性物品 + */ + private void checkExistsNotUpdatedInventoryRecordByWarehouseId(Long warehouseId , String type){ + String inventoryType = InventoryRecord.TYPE_DISPOSABLEGOOD; + if("material".equals(type)){ + inventoryType = InventoryRecord.TYPE_MATERIALENTRY; + } + InventoryRecord notUpdatedInventoryRecord = + (InventoryRecord)objectDao.getBySql(InventoryRecord.class.getSimpleName(), + " where wareHouseId=" + warehouseId + " and type='"+ inventoryType +"' and status='"+ InventoryRecord.STATUS_NO_UPDATES +"'"); + if(notUpdatedInventoryRecord != null){ + throw new RuntimeException("该仓库还有未更新的盘点记录,请先更新或删除未更新的盘点记录"); + } + } + private InventoryItem newInventoryItem(InventoryRecord record, WareHouse warehouse, DisposableGoodsStock disposableGoodsStock, - DisposableGoodsBatchStock disposableGoodsBatchStock, Double price,DisposableGoods disposableGoods) { + DisposableGoodsBatchStock disposableGoodsBatchStock, Double price,DisposableGoods disposableGoods,Long batchIdFromHisSync) { InventoryItem item = new InventoryItem(); item.setType(disposableGoodsStock.getType()); item.setBatchID(disposableGoodsBatchStock.getDisposableGoodsBatchId()); @@ -593,6 +833,9 @@ item.setDisposableGoodsBatchStockId(disposableGoodsBatchStock.getDisposableGoodsBatchStockId()); item.setDisposableGoodsId(disposableGoodsBatchStock.getDisposableGoodsId()); item.setDisposableGoodsStockId(disposableGoodsBatchStock.getDisposableGoodsStockId()); + + item.setSourceIdFromHisSync(disposableGoods.getIdFromHisSync()); + item.setBatchIdFromHisSync(batchIdFromHisSync); item.setMaterialName(disposableGoodsBatchStock.getDiposableGoods().getName()); item.setPrice(price); item.setSpecification(disposableGoodsBatchStock.getDiposableGoods().getSpecification()); @@ -673,6 +916,7 @@ .getDisposableGoodsBatchStockByNameAndBatchNumber( record.getWareHouseId(), goodsName, specification, batchNumber); + Long batchIdFromHisSync = obj.optLong("batchIdFromHisSync"); if(goodsBatch != null){ InventoryItem item = new InventoryItem(); item.setType(goodsBatch.getDiposableGoods().getType()); @@ -696,6 +940,8 @@ item.setWareHouseName(record.getWareHouseName()); item.setExternalCode(diposableGoods.getExternalCode()); item.setExpDate(goodsBatch.getExpDate()); + + item.setBatchIdFromHisSync(batchIdFromHisSync); items.add(item); }else{ throw new RuntimeException(goodsName + "不存在!"); @@ -740,7 +986,7 @@ @Override public void updateGoodsStock(String recordId,String itemJson,String type) throws Exception{ try { - InventoryRecord record = getById(recordId); + InventoryRecord record = getForUpdate(recordId); if(record == null){ throw new RuntimeException("盘点记录已删除!"); } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java =================================================================== diff -u -r14590 -r20351 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java (.../InventoryRecordTableManager.java) (revision 14590) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java (.../InventoryRecordTableManager.java) (revision 20351) @@ -71,7 +71,11 @@ return true; } - // 创建盘点记录 + /** + * 创建盘点记录 + * @param params 输入参数,json格式,示例:{time : '2017-10-14 15:22',operator : '张三',wareHouseId : 222,type : '一次性物品'} + * @return + */ public String addInventoryRecord(String params) { boolean success = false; String message = null; @@ -83,4 +87,21 @@ } return JSONUtil.buildJsonObject(success, message).toString(); } + + /** + * 创建盘点记录 + * @param params 输入参数,json格式,示例:{time : '2017-10-14 15:22',operator : '张三',wareHouseId : 222,type : '一次性物品'} + * @return + */ + public String addInventoryRecordBaseOnIdentification(String params) { + boolean success = false; + String message = null; + try { + inventoryRecordManager.addInventoryRecordBaseOnIdentification(params); + success = true; + } catch (Exception e) { + message = e.getMessage(); + } + return JSONUtil.buildJsonObject(success, message).toString(); + } } Index: ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView2.jsp (revision 20351) @@ -0,0 +1,57 @@ +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> + + + +<%@ include file="/common/includeExtJsAndCss.jsp"%> +<% + String userName = AcegiHelper.getLoginUser().getUserFullName(); + request.setAttribute("userName",userName); +%> + + + + + + + + + + + + + + +盘点记录 + + + + + + + + + +
+
+
+
+ +
+ + \ No newline at end of file