Index: ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.js =================================================================== diff -u -r15581 -r16861 --- ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.js (.../materialOutView.js) (revision 15581) +++ ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.js (.../materialOutView.js) (revision 16861) @@ -36,7 +36,7 @@ var supplierStore = new Ext.data.Store({ proxy : new Ext.data.HttpProxy({ - url : WWWROOT + '/disinfectSystem/baseData/supplierAction!getSupplierData.do?supplierType='+encodeURI(supplier), + url : WWWROOT + '/disinfectSystem/materialSupplierAction!getSupplierData.do', method : 'POST' }), reader : new Ext.data.JsonReader({ @@ -48,7 +48,10 @@ }, { name : 'name', mapping : 'name' - }]) + }]), + beforeload : function(store,option) { + store.baseParams['materialId'] = top.Ext.getCmp('materialId').getValue(); + } }); var GodownEntryItemRecord = Ext.data.Record.create([ @@ -114,6 +117,7 @@ top.Ext.getCmp('cost1').setValue(''); top.Ext.getCmp('materialId').setValue(''); top.Ext.getCmp('supplier1').setValue(''); + top.Ext.getCmp('supplierId').setValue(''); top.Ext.getCmp('name1').focus(); } @@ -138,6 +142,62 @@ }); function addGodownEntry(type) { + + //单价数据源 + var priceStore = null; + var PriceRecord = null; + + //单价数据源 + if(priceStore == null){ + priceStore = new Ext.data.Store({ + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'price'}, + {name : 'fluctuationPrice'}, + {name : 'amount'} + ] + }) + }); + } + if(PriceRecord == null){ + PriceRecord = Ext.data.Record.create([ + {name : 'price'}, + {name : 'fluctuationPrice'}, + {name : 'amount'} + ]); + } + + // 清除表单数据 + function clearFormData(){ + priceStore.removeAll(); + } + // 清空批次和价格 + function clearBatchNumberAndPrice() { + clearPrice(); + } + // 清空价格 + function clearPrice() { + clearCombo(priceStore,'cost1'); + } + //设置价格 + function setPrices(prices,selectFirst) { + clearPrice() + if(typeof(prices) == 'undefined' || prices == null){ + return; + } + for(var i = 0;i 0){ + setCmpValue('cost1',prices[0].price); + } + } + } + var wareHouseStore = new Ext.data.JsonStore({ url : WWWROOT + '/disinfectSystem/baseData/wareHouseAction!getWareHouseData.do', root: 'data', @@ -378,6 +438,10 @@ name : 'materialId', id : 'materialId' },{ + xtype : 'hidden', + name : 'supplierId', + id : 'supplierId' + },{ text : '名称:' },{ xtype : 'combo', @@ -399,7 +463,7 @@ select : function(combo, record, index) { top.Ext.getCmp('name1').setValue(record.data.name); top.Ext.getCmp('materialId').setValue(record.data.id); - top.Ext.getCmp('cost1').setValue(record.data.cost); +// top.Ext.getCmp('cost1').setValue(record.data.cost); }, specialkey : function(field, ee) { if (ee.getKey() == Ext.EventObject.ENTER) { @@ -428,7 +492,15 @@ width : 150, listeners : { select : function(combo, record, index) { + top.Ext.getCmp('supplierId').setValue(record.data.id); combo.setValue(record.data.name); + var materialId = top.Ext.getCmp('materialId').getValue(); + // 清空价格 + clearPrice(); + // 填充价格 + MaterialEntryTableManager.getPriceAmountInfo(record.data.id,materialId,top.Ext.getCmp('wareHouseId').getValue(),function(priceAmounts){ + setPrices(priceAmounts,true); + }); }, specialkey : function(field, e) { if (e.getKey() == Ext.EventObject.ENTER) { @@ -457,26 +529,20 @@ },{ text : '单价:' },{ - xtype : 'textfield', - maxLength : '16', + xtype : 'combo', id : 'cost1', name : 'cost1', + valueField : 'price', + displayField : 'priceForDisplay', + store : priceStore, + editable : false, + forceSelection : true, + mode : 'local', + triggerAction : 'all', + typeAhead : false, + allowBlank : false, width : 50, - regex: /^(([1-9]+[0-9]*.{1}[0-9]+)|([0].{1}[1-9]+[0-9]*)|([1-9][0-9]*)|([0][.][0-9]+[1-9]*))$/, - regexText:'只能输入正数', - anchor : '95%', - listeners : { - specialkey : function(field, e) { - if (e.getKey() == Ext.EventObject.ENTER) { - var materialId = top.Ext.getCmp('materialId').getValue(); - var name = top.Ext.getCmp('name1').getValue(); - var count = top.Ext.getCmp('amount1').getValue(); - var cost = top.Ext.getCmp('cost1').getValue(); - var supplierName = top.Ext.getCmp('supplier1').getValue(); - addItems(materialId,name,count,cost,supplierName); - } - } - } + anchor : '95%' },{ text : '添加', iconCls : 'btn_ext_add', @@ -492,6 +558,55 @@ ] })], buttons : [{ + id : 'btnSave', + text : '保存', + handler : function() { + + var itemGrid = top.Ext.getCmp('materialEntryItemGrid'); + var store = itemGrid.getStore(); + if(store.getCount()<=0){ + showResult('请添加材料。'); + return false; + } + + var jsonArray = new Array(); + for(var i = 0;i < store.getCount();i++){ + var record = store.getAt(i); + var len = jsonArray.length; + jsonArray[len] = {}; + jsonArray[len].id = record.data.id; + jsonArray[len].materialId = record.data.materialId; + jsonArray[len].amount = record.data.amount; + jsonArray[len].cost = record.data.cost; + jsonArray[len].supplierName = record.data.supplierName; + jsonArray[len].certification = record.data.certification; + jsonArray[len].hasInvoice = record.data.hasInvoice; + jsonArray[len].goodsType = record.data.goodsType; + } + top.Ext.getCmp("items").setValue(Ext.encode(jsonArray)); + +// top.Ext.getCmp("wareHouseId").setValue(top.Ext.getCmp("wareHouseName").getValue()); + + form.form.submit({ + url : WWWROOT + '/disinfectSystem/MaterialEntryAction!saveMaterialEntryAction.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + success : function(form, action) { + showResult(action.result.message); + grid.dwrReload(); + window.close(); + }, + failure : function(form, action) { + if(action.result && action.result.message){ + showResult(action.result.message); + }else{ + showResult("提交失败"); + } + } + }); + } + },{ text : '取消', handler : function() { window.close(); @@ -574,8 +689,7 @@ function editRecord(id){ addGodownEntry(); - //这个js会报错,暂时屏蔽 - // top.Ext.getCmp('btnSave').setDisabled(true); + top.Ext.getCmp('btnSave').setDisabled(true); top.Ext.getCmp("serialNum").show(); top.Ext.getCmp('godownEntryForm').form.load({ url : WWWROOT + '/disinfectSystem/MaterialEntryAction!loadMaterialEntry.do', @@ -653,7 +767,7 @@ } },{ text : '删除', - hidden : SSTS_WarehouseEntry_Delete, + hidden : true,//SSTS_WarehouseEntry_Delete, iconCls : 'btn_ext_application_del', handler : function() { deleteGodownEntry(grid); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/GoodsStockInfo.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/GoodsStockInfo.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/GoodsStockInfo.java (revision 16861) @@ -0,0 +1,68 @@ +package test.forgon.disinfectsystem.material.model; + +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.tools.string.StringTools; + +/** + * 库存的主要信息。从GoodsStock表获取 + * @author kzh + * + */ +public class GoodsStockInfo { + /** + * 仓库id + */ + private Long wareHouseId; + /** + * 材料定义id + */ + private Long materialDefinitionId; + /** + * 数量 + */ + private Integer amount; + /** + * 供应商。退库需要退对应供应商的物品 + */ + private String supplierName; + + public Long getWareHouseId() { + return wareHouseId; + } + public void setWareHouseId(Long wareHouseId) { + this.wareHouseId = wareHouseId; + } + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + public Integer getAmount() { + return amount; + } + public void setAmount(Integer amount) { + this.amount = amount; + } + public String getSupplierName() { + return supplierName; + } + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + /** + * 是否可以将数量合并 + * @param other + * @return + */ + public boolean canMerge(GoodsStock other,String supplierName){ + if(this.wareHouseId.equals(other.getWareHouseId())){ + if(this.materialDefinitionId.equals(other.getMaterialDefinitionId())){ + if(StringTools.equals(this.supplierName, supplierName)){ + return true; + } + } + } + return false; + } +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java =================================================================== diff -u -r16507 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java (.../MaterialEntryManager.java) (revision 16507) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java (.../MaterialEntryManager.java) (revision 16861) @@ -1,22 +1,25 @@ package com.forgon.disinfectsystem.tousse.materialmanager.service; import java.util.List; +import java.util.Map; import net.sf.json.JSONObject; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; +import com.forgon.disinfectsystem.vo.PriceAmount; +import com.forgon.tools.hibernate.BasePoManager; /** * @author WangYi * @date 2012-05-11 14:53 */ -public interface MaterialEntryManager { +public interface MaterialEntryManager extends BasePoManager { - public MaterialEntry getMaterialEntryById(String id); + public MaterialEntry get(String id); public MaterialEntryItem getMaterialEntryItemById(String id); - public void deleteMaterialEntryById(String id); +// public void deleteMaterialEntryById(String id); public String deleteMaterialEntryAndReturnMessage(String ids); @@ -39,5 +42,20 @@ public void loadMaterialEntryPrintData(String[] idStrs, JSONObject jsonObject); + /** + * 搜索供应商,如果此供应商有入过此材料,则放在前面显示 + * @param inputString 输入字符串,拼音码、五笔码或者名称 + * @param materialDefinitionId 材料定义id + * @return + */ + public List> searchMaterialSupplier(String inputString,String materialDefinitionId); + /** + * 获取材料的可以退库的价格数量 + * @param suppierId 供应商id + * @param materialDefinitionId 材料定义id + * @param wareHouseId 仓库id + * @return + */ + public List getPriceAmountInfo(String suppierId,String materialDefinitionId,String wareHouseId); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r15228 -r16861 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 15228) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 16861) @@ -17,9 +17,11 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; import com.forgon.tools.MathTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; import com.forgon.tools.util.SqlUtils; /** @@ -247,6 +249,74 @@ } } } + /** + * 获取材料库存对应的供应商.由记录的入库单的明细id查找 + * @param gs + * @return + */ + private String getGoodsStockSupplier(GoodsStock gs){ + if(gs != null){ + MaterialEntryItem item = (MaterialEntryItem)objectDao.getByID_ForUpdate(MaterialEntryItem.class.getSimpleName(), gs.getMaterialEntryItemId()); + if(item != null){ + return item.getSupplierName(); + } + } + return null; + } + public List outMaterialStock(List goodsStockList){ + if(CollectionUtils.isEmpty(goodsStockList)){ + return goodsStockList; + } + Set wareHouseIds = new HashSet(); + Set materialDefIds = new HashSet(); + for(GoodsStock gs : goodsStockList){ + wareHouseIds.add(gs.getWareHouseId()); + if(DatabaseUtil.isPoIdValid(gs.getMaterialDefinitionId())){ + materialDefIds.add(gs.getMaterialDefinitionId()); + } + } + List materialDefGoodsStockListInDb = getGoodsStock(wareHouseIds,materialDefIds,false); + List toUpdateGoodsStock = new ArrayList(); //需要更新库存数量的库存记录 + for(GoodsStock goodsStockTemp : goodsStockList){ + if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ + throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + } + + if(DatabaseUtil.isPoIdValid(goodsStockTemp.getMaterialDefinitionId())){ + //先判断该材料所有库存总和是否大于需扣减的数量 + List list = materialDefGoodsStockListInDb.stream().filter( + gs->gs.getWareHouseId().equals(goodsStockTemp.getWareHouseId()) + && gs.getMaterialDefinitionId().equals(goodsStockTemp.getMaterialDefinitionId()) + && gs.getAmount() > 0 + && StringTools.equals(getGoodsStockSupplier(gs),goodsStockTemp.getSupplier())).collect(Collectors.toList()); + int totalAmount = calculateTotalAmount(list); + + int needReturnAmount = goodsStockTemp.getAmount(); + if(totalAmount < needReturnAmount){ + throw new RuntimeException(goodsStockTemp.getName() + ",材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + for(GoodsStock goodsStock : list){ + if(goodsStock.getAmount() >= needReturnAmount){ + goodsStock.setAmount(goodsStock.getAmount() - needReturnAmount); + addIfNotFind(toUpdateGoodsStock,goodsStock); + break; + } + needReturnAmount -= goodsStock.getAmount(); + goodsStock.setAmount(0); + addIfNotFind(toUpdateGoodsStock,goodsStock); + } + } else { + throw new RuntimeException("入/退库单材料id不能为空"); + } + } + //最后一次更新需要更新的库存记录 + if(CollectionUtils.isNotEmpty(toUpdateGoodsStock)){ + for(GoodsStock gs : toUpdateGoodsStock){ + objectDao.saveOrUpdate(gs); + } + } + return goodsStockList; + } /** * 查询材料库存数据明细,(按仓库对器械包或材料进行数量汇总,显示仓库明细) @@ -380,4 +450,12 @@ String sql = String.format("where wareHouseId = %d and materialDefinitionId = %d", wareHouseId,materialDefinitionId); return (List)objectDao.findBySql(GoodsStock.class.getSimpleName(), sql); } + + @Override + public List getGoodsStock(Long wareHouseId, + Collection goodsDefId, boolean toussedefIdOrMaterialDefId) { + Set wareHouseIds = new HashSet<>(); + wareHouseIds.add(wareHouseId); + return getGoodsStock(wareHouseIds, goodsDefId, toussedefIdOrMaterialDefId); + } } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/MaterialEntryManagerTests.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/MaterialEntryManagerTests.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/MaterialEntryManagerTests.java (revision 16861) @@ -0,0 +1,308 @@ +package test.forgon.disinfectsystem.material.service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.testng.Assert.*; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.beanutils.BeanUtilsBean2; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.testng.annotations.Test; + +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; +import test.forgon.disinfectsystem.material.model.GoodsStockInfo; +import test.forgon.disinfectsystem.material.model.MaterialItemInfo; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; +import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; +import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialEntryItemManager; +import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialEntryManager; +import com.forgon.tools.MathTools; +import com.forgon.tools.string.StringTools; + +/** + * 材料入库和退库的测试用例 + * @author kzh + * + */ +public class MaterialEntryManagerTests extends AbstractCSSDTest { + @Autowired + private MaterialEntryManager materialEntryManager; + @Autowired + private MaterialEntryItemManager materialEntryItemManager; + + /** + * 构建数据 + */ + private MaterialEntry materialEntry; + /** + * 入库单。用这个单号查找单 + */ + private String serialNumberIn = "201711562489"; + /** + * 退库单号 + */ + private String serialNumberOut = "201711562490"; + /** + * 入退库的仓库 + */ + private WareHouse wareHouse; + /** + * 入库和退库项明细信息 + */ + private List items = new ArrayList<>(); + /** + * 入库和退库前的材料库存,key为材料id,value为仓库下此材料的库存 + */ + private List materialStockBefore; + /** + * 入退库的操作的材料id + */ + private Set materialDefinitionIds = new HashSet(); + /** + * 查找库存信息 + * @param goodsStockInfos + * @param itemInfo + * @return + */ + private GoodsStockInfo findGoodsStockInfo(List goodsStockInfos,MaterialItemInfo itemInfo){ + return CollectionUtils.find(goodsStockInfos, new Predicate(){ + @Override + public boolean evaluate(GoodsStockInfo object) { + if(object.getMaterialDefinitionId().equals(itemInfo.getMaterialId())){ + if(object.getWareHouseId().equals(wareHouse.getId())){ + if(StringTools.equals(object.getSupplierName(), itemInfo.getSupplierName())){ + return true; + } + } + } + return false; + }}); + } + /** + * 断言 + */ + private void assertion(){ + MaterialEntry dbMaterialEntry = materialEntryManager.getFirst("serialNumber", materialEntry.getSerialNumber()); + assertNotNull(dbMaterialEntry); + + assertEquals(dbMaterialEntry.getOperator(),AcegiHelper.getLoginUserFullName()); + assertEquals(dbMaterialEntry.getSerialNumber(),materialEntry.getSerialNumber()); + assertEquals(dbMaterialEntry.getSubType(),materialEntry.getSubType()); + assertEquals(dbMaterialEntry.getTime(),materialEntry.getTime()); + assertEquals(dbMaterialEntry.getRemark(),materialEntry.getRemark()); + assertEquals(dbMaterialEntry.getSourceId(),materialEntry.getSourceId()); + assertEquals(dbMaterialEntry.getType(),materialEntry.getType()); + assertEquals(dbMaterialEntry.getWareHouseId(),wareHouse.getId()); + assertEquals(dbMaterialEntry.getWareHouseName(),wareHouse.getName()); + + List currentStock = getMaterialStocks(); + Double totalPrice = 0.0; + for(MaterialItemInfo info : items){ + Integer amount = 0; + GoodsStockInfo gsb = findGoodsStockInfo(materialStockBefore,info); + GoodsStockInfo gsa = findGoodsStockInfo(currentStock,info); + if(materialEntry.typeIn()){ + assertNotNull(gsa); + amount = MathTools.sub(gsa.getAmount(), gsb==null?0:gsb.getAmount()).intValue(); + }else{ + assertNotNull(gsb); + assertNotNull(gsa); + amount = MathTools.sub(gsb.getAmount(), gsa.getAmount()).intValue(); + } + //增加的库存为库存之差 + assertEquals(info.getAmount(),amount); + totalPrice = MathTools.add(totalPrice, MathTools.mul(amount, info.getCost())).doubleValue(); + } + assertEquals(totalPrice, dbMaterialEntry.getTotalPrice()); + } + /** + * 测试保存材料入库单。先入库,再出库 + * @throws Exception + */ + @Test + @Rollback(value=false) + public void testSaveMaterialEntry() throws Exception{ + prepare(); + //3.准备材料 + initMaterialItems(); + //4.准备入库单 + buildMaterialEntry(true); + //5.记录入库前的库存 + materialStockBefore = getMaterialStocks(); + //6.保存入库单 + materialEntryManager.saveMaterialEntry((MaterialEntry)BeanUtilsBean2.getInstance().cloneBean(materialEntry), buildItemsJsonStr()); + //7.断言 + assertion(); + //8.准备退库单 + buildMaterialEntry(false); + //9.记录退库前的库存 + materialStockBefore = getMaterialStocks(); + //10.保存退库单 + materialEntryManager.saveMaterialEntry((MaterialEntry)BeanUtilsBean2.getInstance().cloneBean(materialEntry), buildItemsJsonStr()); + //11.断言 + assertion(); + + } + /** + * 多个供应商的同一个物品,测试入库和退库 + * @throws Exception + */ + @Test + public void testSaveMaterialEntryMultiSupplier() throws Exception{ + prepare(); + //3.准备材料 + initMaterialItemsMultiSupplier(true); + //4.准备入库单 + buildMaterialEntry(true); + //5.记录入库前的库存 + materialStockBefore = getMaterialStocks(); + //需要清除Hibernate缓存 +// objectDao.clearCache(); + //6.保存入库单 + materialEntryManager.saveMaterialEntry((MaterialEntry)BeanUtilsBean2.getInstance().cloneBean(materialEntry), buildItemsJsonStr()); + //7.断言 + assertion(); + //8.准备退库材料和退库单 + initMaterialItemsMultiSupplier(false); + buildMaterialEntry(false); + //9.记录退库前的库存 + materialStockBefore = getMaterialStocks(); + //需要清除Hibernate缓存,不然会使用上次入库时产生的对象 +// objectDao.clearCache(); + //10.保存退库单 + materialEntryManager.saveMaterialEntry((MaterialEntry)BeanUtilsBean2.getInstance().cloneBean(materialEntry), buildItemsJsonStr()); + //11.断言 + assertion(); + + } + private void prepare(){ + //1.初始化基础数据 + initCSSDData(); + //2.记录仓库信息 + wareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(Constants.ORG_UNIT_CODE_CSSD); + assertNotNull(wareHouse); + } + /** + * 入库单或者退库单 + * @param isIn true为入库单,false为退库单 + */ + private void buildMaterialEntry(boolean isIn){ + materialEntry = new MaterialEntry(); + materialEntry.setOperator(AcegiHelper.getLoginUserFullName()); + materialEntry.setTime(new Date()); + materialEntry.setWareHouseId(wareHouse.getId()); + materialEntry.setWareHouseName(wareHouse.getName()); + if(isIn){ + materialEntry.setSerialNumber(serialNumberIn); + materialEntry.setType(MaterialEntry.TYPE_IN); + materialEntry.setSubType(MaterialEntry.SUBTYPE_MANUAL_IN); + }else{ + materialEntry.setSerialNumber(serialNumberOut); + materialEntry.setType(MaterialEntry.TYPE_OUT); + materialEntry.setSubType(MaterialEntry.SUBTYPE_MANUAL_OUT); + } + } + private void initMaterialItems(){ + items.clear(); + MaterialDefinition md = materialDefinitionManager.getMaterialDefinitionByName("Test镊子", null); + assertNotNull(md); + materialDefinitionIds.add(md.getId()); + MaterialItemInfo info = new MaterialItemInfo(md.getId(),123,md.getCost()); + items.add(info); + + MaterialDefinition md2 = materialDefinitionManager.getMaterialDefinitionByName("Test棉球", null); + assertNotNull(md2); + materialDefinitionIds.add(md2.getId()); + + MaterialItemInfo info2 = new MaterialItemInfo(md2.getId(),106,md2.getCost()); + items.add(info2); + } + /** + * 准备多供应商的物品 + */ + private void initMaterialItemsMultiSupplier(boolean isIn){ + items.clear(); + MaterialDefinition md = materialDefinitionManager.getMaterialDefinitionByName("Test镊子", null); + assertNotNull(md); + materialDefinitionIds.add(md.getId()); + //供应商1 + MaterialItemInfo infoA_1 = new MaterialItemInfo(md.getId(),120,md.getCost()); + + //供应商2 + MaterialItemInfo infoA_2 = new MaterialItemInfo(md.getId(),130,md.getCost()); + infoA_2.setSupplierName("测试供应商2"); + if(!isIn){ + //退库,只退供应商2,数量比两供应商的都小 + infoA_2.setAmount(100); + }else{ + //入库才有供应商1 + items.add(infoA_1); + } + items.add(infoA_2); + + MaterialDefinition md2 = materialDefinitionManager.getMaterialDefinitionByName("Test棉球", null); + assertNotNull(md2); + materialDefinitionIds.add(md2.getId()); + + MaterialItemInfo info2 = new MaterialItemInfo(md2.getId(),106,md2.getCost()); + items.add(info2); + } + /** + * 获取材料库存数据 + * @return + */ + private List getMaterialStocks(){ + List ret = new ArrayList<>(); + List list = goodsStockManager.getGoodsStock(wareHouse.getId(), materialDefinitionIds, false); + if(CollectionUtils.isNotEmpty(list)){ + for(GoodsStock gs : list){ + MaterialEntryItem mei = materialEntryItemManager.get(gs.getMaterialEntryItemId()); + GoodsStockInfo find = CollectionUtils.find(ret, new Predicate(){ + @Override + public boolean evaluate(GoodsStockInfo object) { + if(object.canMerge(gs,mei.getSupplierName())){ + return true; + } + return false; + }}); + if(find == null){ + find = new GoodsStockInfo(); + find.setMaterialDefinitionId(gs.getMaterialDefinitionId()); + find.setSupplierName(mei.getSupplierName()); + find.setWareHouseId(gs.getWareHouseId()); + ret.add(find); + } + find.setAmount(MathTools.add(gs.getAmount(), find.getAmount()).intValue()); + } + } + return ret; + } + /** + * 将明细信息转换为json字符串 + * @return + */ + private String buildItemsJsonStr(){ + JSONArray array = new JSONArray(); + if(CollectionUtils.isNotEmpty(items)){ + for(MaterialItemInfo item : items){ + JSONObject json = JSONObject.fromObject(item); + array.add(json); + } + } + return array.toString(); + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java =================================================================== diff -u -r15096 -r16861 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 15096) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 16861) @@ -31,6 +31,13 @@ */ public List saveOrUpdateGoodsStock(List goodsStockList, String mode); /** + * 材料扣库存。只做库存扣减,不加增加操作。扣减的时候,会按供应商扣,供应商A提供的物品A,供应商B也提供了物品A,如果扣物品A,需要指定供应商。 + * 如果指定供应商A,则只扣供应商A的库存,供应商B的库存不变 + * @param goodsStockList + * @return + */ + public List outMaterialStock(List goodsStockList); + /** * 新增或修改器械包或材料库存数据 * @param gs * @param mode @@ -55,6 +62,15 @@ public List getGoodsStock(Collection wareHouseIds, Collection goodsDefId,boolean toussedefIdOrMaterialDefId); /** + * 获取对应仓库下,器械包或者材料的库存 + * @param wareHouseId 仓库id + * @param goodsDefId 器械包定义或者是材料定义的id + * @param toussedefIdOrMaterialDefId true为包定义id,false为材料定义id + * @return + */ + public List getGoodsStock(Long wareHouseId, + Collection goodsDefId,boolean toussedefIdOrMaterialDefId); + /** * 查找仓库下器械包的库存 * @param wareHouseId 仓库id * @param tousseDefinitionId 器械包定义id Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/dwr/table/MaterialEntryTableManager.java =================================================================== diff -u -r15570 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/dwr/table/MaterialEntryTableManager.java (.../MaterialEntryTableManager.java) (revision 15570) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/dwr/table/MaterialEntryTableManager.java (.../MaterialEntryTableManager.java) (revision 16861) @@ -1,15 +1,16 @@ package com.forgon.disinfectsystem.tousse.materialmanager.dwr.table; - -import java.text.ParseException; import java.util.List; import java.util.Map; import java.util.Set; import com.forgon.component.grid.GridManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; +import com.forgon.disinfectsystem.vo.PriceAmount; import com.forgon.search.service.TBarFilterManager; import com.forgon.tools.util.SqlUtils; +import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialEntryManager; + import org.apache.log4j.Logger; import javax.annotation.Resource; @@ -19,7 +20,13 @@ private GridManager gridManager; private WareHouseManager wareHouseManager; + + private MaterialEntryManager materialEntryManager; + public void setMaterialEntryManager(MaterialEntryManager materialEntryManager) { + this.materialEntryManager = materialEntryManager; + } + @Resource(name = "materialEntryTableFilterManagerImpl") private TBarFilterManager materialEntryTableFilterManagerImpl; @@ -57,5 +64,14 @@ MaterialEntry.class.getSimpleName(), sql.toString(), new String[] {}); } + /** + * 获取材料的可以退库的价格数量 + * @param suppierId 供应商id + * @param materialDefinitionId 材料定义id + * @return + */ + public List getPriceAmountInfo(String suppierId,String materialDefinitionId,String wareHouseId) { + return materialEntryManager.getPriceAmountInfo(suppierId, materialDefinitionId,wareHouseId); + } } Index: forgon-core/src/main/java/com/forgon/databaseadapter/service/SqlFunctionsAdapter.java =================================================================== diff -u -r15688 -r16861 --- forgon-core/src/main/java/com/forgon/databaseadapter/service/SqlFunctionsAdapter.java (.../SqlFunctionsAdapter.java) (revision 15688) +++ forgon-core/src/main/java/com/forgon/databaseadapter/service/SqlFunctionsAdapter.java (.../SqlFunctionsAdapter.java) (revision 16861) @@ -3,6 +3,7 @@ */ package com.forgon.databaseadapter.service; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.db.InitDbConnection; /** @@ -76,4 +77,14 @@ public String strNotBlank(String property){ return strlen(property) + " > 0 "; } + /** + * 数据库字段为空的判断,并设置空时的默认值 + * @param property 字段名称 + * @param defalut 为空时的默认值 + * @return + */ + public String isNull(String property,String defalut){ + String funName = DatabaseUtil.getSqlIsNullFunctionName(dbConnection); + return " " + funName + "("+property+","+defalut+") "; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialmanager/MaterialEntry.java =================================================================== diff -u -r14723 -r16861 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialmanager/MaterialEntry.java (.../MaterialEntry.java) (revision 14723) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/materialmanager/MaterialEntry.java (.../MaterialEntry.java) (revision 16861) @@ -20,6 +20,7 @@ import org.hibernate.annotations.CascadeType; import com.forgon.tools.MathTools; +import com.forgon.tools.string.StringTools; /** * @author WangYi * @date 2012-05-11 14:40 @@ -154,6 +155,13 @@ return inventoryWriteBackEntryId; } + /** + * 是否入库单 + * @return + */ + public boolean typeIn(){ + return StringTools.equals(type, TYPE_IN); + } public void setInventoryWriteBackEntryId( Long inventoryWriteBackEntryId) { this.inventoryWriteBackEntryId = inventoryWriteBackEntryId; Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java =================================================================== diff -u -r16507 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java (.../MaterialEntryManagerImpl.java) (revision 16507) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java (.../MaterialEntryManagerImpl.java) (revision 16861) @@ -1,11 +1,19 @@ package com.forgon.disinfectsystem.tousse.materialmanager.service; -import java.math.BigDecimal; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -14,33 +22,46 @@ import org.apache.commons.lang3.ArrayUtils; import com.forgon.Constants; +import com.forgon.databaseadapter.service.SqlFunctionsAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.vo.LoginUserData; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.supplier.Supplier; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; +import com.forgon.disinfectsystem.vo.PriceAmount; import com.forgon.tools.MathTools; -import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; /** * @author WangYi * @date 2012-05-11 14:53 */ -public class MaterialEntryManagerImpl implements MaterialEntryManager { +public class MaterialEntryManagerImpl extends BasePoManagerImpl implements MaterialEntryManager { - private ObjectDao objectDao; + public MaterialEntryManagerImpl() { + super(MaterialEntry.class); + } private MaterialDefinitionManager materialDefinitionManager; private GoodsStockManager goodsStockManager; + private SqlFunctionsAdapter sqlFunctionsAdapter; + + public void setSqlFunctionsAdapter(SqlFunctionsAdapter sqlFunctionsAdapter) { + this.sqlFunctionsAdapter = sqlFunctionsAdapter; + } + public void setGoodsStockManager(GoodsStockManager goodsStockManager) { this.goodsStockManager = goodsStockManager; } @@ -50,20 +71,16 @@ this.materialDefinitionManager = materialDefinitionManager; } - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } +// @Override +// public void deleteMaterialEntryById(String id) { +// MaterialEntry materialEntry = get(id); +// if (materialEntry != null) { +// objectDao.delete(materialEntry); +// } +// } @Override - public void deleteMaterialEntryById(String id) { - MaterialEntry materialEntry = getMaterialEntryById(id); - if (materialEntry != null) { - objectDao.delete(materialEntry); - } - } - - @Override - public MaterialEntry getMaterialEntryById(String id) { + public MaterialEntry get(String id) { return (MaterialEntry) objectDao.getByProperty(MaterialEntry.class .getSimpleName(), "id", Long.valueOf(id)); } @@ -88,7 +105,7 @@ String returnValue = ""; for (String id : ids.split(";")) { if (StringUtils.isNotBlank(id)) { - MaterialEntry materialEntry = getMaterialEntryById(id); + MaterialEntry materialEntry = get(id); if(materialEntry == null){ throw new RuntimeException("id为" + id + "的入库单可能已被删除."); } @@ -120,7 +137,7 @@ String returnValue = ""; for (String id : ids.split(";")) { if (StringUtils.isNotBlank(id)) { - MaterialEntry materialEntry = getMaterialEntryById(id); + MaterialEntry materialEntry = get(id); if(materialEntry == null){ throw new RuntimeException("id为" + id + "的退库单可能已被删除."); } @@ -153,7 +170,7 @@ public void saveMaterialEntry(MaterialEntry materialEntry, String items) throws Exception { if(materialEntry.getWareHouseId() == null){ - throw new RuntimeException("该科室仓库未定义,不能入库!"); + throw new RuntimeException("请选择仓库"); } //旧的入库材料信息字典 Map oldMaterialEntryItemsMap = new HashMap(); @@ -254,15 +271,20 @@ stock.setMaterialEntryItemId(materialEntryItem.getId()); stock.setWareHouseId(materialEntry.getWareHouseId()); stock.setWareHouseName(materialEntry.getWareHouseName()); + stock.setSupplier(materialEntryItem.getSupplierName()); goodsStockList.add(stock); } String type = GoodsStockManager.MODE_INSTOCK; if(MaterialEntry.TYPE_OUT.equals(materialEntry.getType())){ type = GoodsStockManager.MODE_OUTSTOCK; } try { - //材料入库 - goodsStockManager.saveOrUpdateGoodsStock(goodsStockList, type); + if(GoodsStockManager.MODE_OUTSTOCK.equals(type)){ + goodsStockManager.outMaterialStock(goodsStockList); + }else{ + //材料入库 + goodsStockManager.saveOrUpdateGoodsStock(goodsStockList, type); + } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); @@ -452,4 +474,91 @@ jsonObject.put("goods", materialItemArray); } + @Override + public List> searchMaterialSupplier(String inputString, + String materialDefinitionId) { + if(StringTools.isBlank(inputString)){ + inputString = ""; + } + try { + inputString = URLDecoder.decode(inputString, "UTF-8"); + } catch (UnsupportedEncodingException e) { + inputString = ""; + } + Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); + Matcher m = pat.matcher(inputString); + if (!m.find()) { + inputString = inputString.toUpperCase(); + } + String materialBelongSql = " 0 "; + if(StringTools.isNotBlank(materialDefinitionId)){ + materialBelongSql = " case mei.materialDefinition_id when " + materialDefinitionId + " then 1 else 0 end "; + } + String countSql = sqlFunctionsAdapter.isNull("gs.amount", "0"); + + String sql = "select distinct * from ( select s.id,s.companyName, "+countSql+" as amount, "+ materialBelongSql + " as bl " + + " from Supplier s left join MaterialEntryItem mei on s.companyName = mei.supplierName " + + " left join GoodsStock gs on gs.materialEntryItemId=mei.id" + + " where (s.spelling like '%"+inputString+"%' or s.wbCode like '%"+inputString+"%' or s.companyName like '%" + + inputString+"%') and s.rentTousse='"+Supplier.SUPPLIER_TYPE_SUPPLIER +"') m order by m.bl desc, m.amount desc"; + + ResultSet rs = objectDao.executeSql(sql); + List> mapList = new ArrayList>(); + Set ids = new HashSet(); + try { + while(rs.next()){ + long id = rs.getLong("id"); + if(!ids.contains(id)){ + ids.add(id); + Map temp = new HashMap(); + temp.put("id", rs.getLong("id")); + temp.put("name", rs.getString("companyName")); + mapList.add(temp); + } + } + } catch (SQLException e) { + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + + return mapList; + } + + @Override + public List getPriceAmountInfo(String suppierId, + String materialDefinitionId,String wareHouseId) { + List priceAmountList = new LinkedList(); + if(StringTools.isNotBlank(suppierId)&&StringTools.isNotBlank(materialDefinitionId)){ + + String amountSql = sqlFunctionsAdapter.isNull("gs.amount", "0"); + String sql = " select gs.price as price,sum("+amountSql+") as sumAmount from "+GoodsStock.class.getSimpleName() + +" gs join "+MaterialEntryItem.class.getSimpleName()+" mei on mei.id=gs.materialEntryItemId" + +" join " + Supplier.class.getSimpleName() + " s on s.companyName=mei.supplierName" + +" where gs.goodsType='"+GoodsStock.TYPE_MATERIAL+"' and gs.materialDefinitionId=" + materialDefinitionId + +" and gs.wareHouseId=" + wareHouseId + +" and s.id=" + suppierId + " and "+amountSql+" > 0 group by gs.price"; + ResultSet resultSet = objectDao.executeSql(sql); + if (resultSet != null) { + try { + while (resultSet.next()) { + Long sumAmount = resultSet.getLong("sumAmount"); + Double price = resultSet.getDouble("price"); + + PriceAmount priceAmount = new PriceAmount(); + priceAmount.setPrice(price); + priceAmount.setAmount(sumAmount); + + priceAmountList.add(priceAmount); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + } + } + return priceAmountList; + } + } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialEntryAction.java =================================================================== diff -u -r13277 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialEntryAction.java (.../MaterialEntryAction.java) (revision 13277) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialEntryAction.java (.../MaterialEntryAction.java) (revision 16861) @@ -25,6 +25,8 @@ import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.json.JSONUtil; import com.opensymphony.xwork2.ModelDriven; @ParentPackage(value = "default") @@ -48,11 +50,11 @@ } public void saveMaterialEntryAction() { - String result = "{success:true,message:'保存成功'}"; + JSONObject json = JSONUtil.buildJsonObject(true, "保存成功"); String items = StrutsParamUtils.getPraramValue("items", ""); String id = StrutsParamUtils.getPraramValue("id", ""); if (StringUtils.isNotBlank(id) && StringUtils.isNumeric(id)) { - materialEntry = materialEntryManager.getMaterialEntryById(id); + materialEntry = materialEntryManager.get(id); } else { materialEntry.setSerialNumber(serialNumManager .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); @@ -61,23 +63,15 @@ try { materialEntryManager.saveMaterialEntry(materialEntry, items); } catch (Exception e) { - result = "{success:false,message:'" + e.getMessage() + "'}"; + json = JSONUtil.buildJsonObject(false, e.getMessage()); } - try { - HttpServletResponse response = StrutsParamUtils.getResponse(); - response.setCharacterEncoding("UTF-8"); - PrintWriter out = response.getWriter(); - out.print(result); - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } + StrutsResponseUtils.output(json); } public String loadMaterialEntryItemByid() { String id = StrutsParamUtils.getPraramValue("id", ""); if (StringUtils.isNotBlank(id) && id.equals("0") == false) {// 初始化加载的数据 - materialEntry = materialEntryManager.getMaterialEntryById(id); + materialEntry = materialEntryManager.get(id); List items = materialEntry.getItemsList(); Map map = new HashMap(); map.put("success", true); @@ -99,7 +93,7 @@ public String loadMaterialEntry() { String id = StrutsParamUtils.getPraramValue("id", ""); if (StringUtils.isNotBlank(id) && StringUtils.isNumeric(id)) { - materialEntry = materialEntryManager.getMaterialEntryById(id); + materialEntry = materialEntryManager.get(id); } JsonConfig config = new JsonConfig(); config.setExcludes(new String[] { "fieldHandler","image"}); // 解决hibernate延迟加载的问题 Index: ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js =================================================================== diff -u -r15581 -r16861 --- ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 15581) +++ ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 16861) @@ -660,11 +660,15 @@ waitTitle : '提交表单', success : function(form, action) { showResult(action.result.message); - window.close(); grid.dwrReload(); + window.close(); }, failure : function(form, action) { - showResult(action.result.message); + if(action.result && action.result.message){ + showResult(action.result.message); + }else{ + showResult("提交失败"); + } } }); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialSupplierAction.java =================================================================== diff -u --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialSupplierAction.java (revision 0) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/action/MaterialSupplierAction.java (revision 16861) @@ -0,0 +1,42 @@ +package com.forgon.disinfectsystem.tousse.materialmanager.action; + +import java.util.List; +import java.util.Map; + +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialEntryManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.util.PageUtil; + + +/** + * 材料供应商Action。已经入过库的供应商排在前面 + * @author kzh + * + */ +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "materialSupplierAction") +public class MaterialSupplierAction { + private MaterialEntryManager materialEntryManager; + + + public void setMaterialEntryManager(MaterialEntryManager materialEntryManager) { + this.materialEntryManager = materialEntryManager; + } + + + public void getSupplierData(){ + try{ + String supplierName = StrutsParamUtils.getPraramValue("supplierName", ""); + String materialId = StrutsParamUtils.getPraramValue("materialId", ""); + List> data = materialEntryManager.searchMaterialSupplier(supplierName,materialId); + PageUtil.outPutResult(PageUtil.getPagePara(), data); + }catch(Exception e){ + e.printStackTrace(); + } + } +} Index: ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.jsp =================================================================== diff -u -r15440 -r16861 --- ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.jsp (.../materialOutView.jsp) (revision 15440) +++ ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialOutView.jsp (.../materialOutView.jsp) (revision 16861) @@ -20,6 +20,7 @@ + Index: ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/MaterialItemInfo.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/MaterialItemInfo.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/material/model/MaterialItemInfo.java (revision 16861) @@ -0,0 +1,85 @@ +package test.forgon.disinfectsystem.material.model; + +/** + * 材料项的信息。用于生成json字符串 + * @author kzh + * + */ +public class MaterialItemInfo { + /** + * 材料定义id + */ + private Long materialId; + /** + * 数量 + */ + private Integer amount; + /** + * 价格 + */ + private Double cost; + /** + * 供应商 + */ + private String supplierName = "测试供应商"; + /** + * 注册证号 + */ + private String certification = "20170112548"; + /** + * 有无发票 + */ + private String hasInvoice = "有"; + /** + * 物品类型,高值耗材或者普通物品 + */ + private String goodsType = "普通物品"; + + public MaterialItemInfo(Long materialDefinitionId,Integer amount,Double cost){ + this.materialId = materialDefinitionId; + this.amount = amount; + this.cost = cost; + } + public Long getMaterialId() { + return materialId; + } + public void setMaterialId(Long materialId) { + this.materialId = materialId; + } + public Integer getAmount() { + return amount; + } + public void setAmount(Integer amount) { + this.amount = amount; + } + public Double getCost() { + return cost; + } + public void setCost(Double cost) { + this.cost = cost; + } + public String getSupplierName() { + return supplierName; + } + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + public String getCertification() { + return certification; + } + public void setCertification(String certification) { + this.certification = certification; + } + public String getHasInvoice() { + return hasInvoice; + } + public void setHasInvoice(String hasInvoice) { + this.hasInvoice = hasInvoice; + } + public String getGoodsType() { + return goodsType; + } + public void setGoodsType(String goodsType) { + this.goodsType = goodsType; + } +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManager.java =================================================================== diff -u -r13073 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManager.java (.../MaterialEntryItemManager.java) (revision 13073) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManager.java (.../MaterialEntryItemManager.java) (revision 16861) @@ -3,13 +3,14 @@ import java.util.List; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; +import com.forgon.tools.hibernate.BasePoManager; /** * 材料入库单物品明细操作 * @author kzh * */ -public interface MaterialEntryItemManager { +public interface MaterialEntryItemManager extends BasePoManager { /** * 获取材料入库单或者退库单的明细 * @param startDate 起始日期 Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManagerImpl.java =================================================================== diff -u -r13073 -r16861 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManagerImpl.java (.../MaterialEntryItemManagerImpl.java) (revision 13073) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryItemManagerImpl.java (.../MaterialEntryItemManagerImpl.java) (revision 16861) @@ -7,20 +7,21 @@ import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.disinfectsystem.diposablegoods.util.MaterialEntryUtil; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntryItem; -import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.hibernate.BasePoManagerImpl; -public class MaterialEntryItemManagerImpl implements MaterialEntryItemManager { +public class MaterialEntryItemManagerImpl extends BasePoManagerImpl implements MaterialEntryItemManager { + + public MaterialEntryItemManagerImpl() { + super(MaterialEntryItem.class); + // TODO Auto-generated constructor stub + } + private DateQueryAdapter dateQueryAdapter; - private ObjectDao objectDao; public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { this.dateQueryAdapter = dateQueryAdapter; } - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } - @SuppressWarnings("unchecked") @Override public List getMaterialEntryItemList(String startDate, Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java =================================================================== diff -u -r14485 -r16861 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java (.../GoodsStock.java) (revision 14485) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/goodsstock/GoodsStock.java (.../GoodsStock.java) (revision 16861) @@ -4,6 +4,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -82,6 +83,10 @@ * 材料入库明细id */ private Long materialEntryItemId; + /** + * 供应商,临时变量,不持久化。目前在材料退库时,需要退对应的供应商,有使用 + */ + private String supplier; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -180,5 +185,16 @@ public void setMaterialEntryItemId(Long materialEntryItemId) { this.materialEntryItemId = materialEntryItemId; } + /** + * 供应商,临时变量,不持久化。目前在材料退库时,需要退对应的供应商,有使用 + */ + @Transient + public String getSupplier() { + return supplier; + } + public void setSupplier(String supplier) { + this.supplier = supplier; + } + }