Index: ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js =================================================================== diff -u -r12830 -r13103 --- ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 12830) +++ ssts-web/src/main/webapp/disinfectsystem/materialmanager/materialEntryView.js (.../materialEntryView.js) (revision 13103) @@ -220,6 +220,7 @@ id : 'time', name : 'time', format : 'Y-m-d H:i', + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', value : new Date(), editable: false, anchor : '95%' Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js =================================================================== diff -u -r13058 -r13103 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js (.../godownEntryView.js) (revision 13058) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js (.../godownEntryView.js) (revision 13103) @@ -465,6 +465,7 @@ id : 'time', name : 'time', format : 'Y-m-d H:i', + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', value : new Date(), allowBlank : false, anchor : '95%' Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoice.java =================================================================== diff -u -r13075 -r13103 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoice.java (.../MaterialInvoice.java) (revision 13075) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoice.java (.../MaterialInvoice.java) (revision 13103) @@ -1,7 +1,8 @@ package com.forgon.disinfectsystem.entity.invoicemanager; +import java.util.ArrayList; import java.util.Date; -import java.util.Set; +import java.util.List; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -11,7 +12,6 @@ import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OrderBy; -import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -36,6 +36,10 @@ private String depart; // 发往目的科室 + private String spelling; // 科室拼音 + + private String wbCode;// 科室五笔 + private String settleAccountsDepart;//结算科室 private String sender; // 发货员 @@ -44,9 +48,19 @@ private String remark; // 备注 + /** + * 发货项 + */ @JsonIgnore - private Set materialInvoiceItem; // 待发的物品 + private List materialInvoiceItemList = new ArrayList(); + /** + * 发货项的明细 + */ + @JsonIgnore + private List materialItemList = new ArrayList(); + + private Double totalPrice;//总价 private String orgUnitCoding;//供应室 @@ -103,6 +117,22 @@ this.depart = depart; } + public String getSpelling() { + return spelling; + } + + public void setSpelling(String spelling) { + this.spelling = spelling; + } + + public String getWbCode() { + return wbCode; + } + + public void setWbCode(String wbCode) { + this.wbCode = wbCode; + } + public String getSettleAccountsDepart() { return settleAccountsDepart; } @@ -139,14 +169,26 @@ @Cascade(value = { org.hibernate.annotations.CascadeType.ALL }) @JoinColumn(name = "materialInvoice_id") @OrderBy("id asc") - public Set getMaterialInvoiceItem() { - return materialInvoiceItem; + public List getMaterialInvoiceItemList() { + return materialInvoiceItemList; } - public void setMaterialInvoiceItem(Set materialInvoiceItem) { - this.materialInvoiceItem = materialInvoiceItem; + public void setMaterialInvoiceItemList(List materialInvoiceItemList) { + this.materialInvoiceItemList = materialInvoiceItemList; } + + @OneToMany(fetch = FetchType.LAZY) + @Cascade(value = { org.hibernate.annotations.CascadeType.ALL }) + @JoinColumn(name = "materialInvoice_id") + @OrderBy("id asc") + public List getMaterialItemList() { + return materialItemList; + } + public void setMaterialItemList(List materialItemList) { + this.materialItemList = materialItemList; + } + public Double getTotalPrice() { return totalPrice; } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java =================================================================== diff -u -r13089 -r13103 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java (.../MaterialDefinitionManagerImpl.java) (revision 13089) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java (.../MaterialDefinitionManagerImpl.java) (revision 13103) @@ -236,13 +236,13 @@ if(warehouseId != null && warehouseId != 0){ long l = System.currentTimeMillis(); String materialSql = "select md.id,md.name,md.specification,md.externalCode,md.cost,gs.amount as storage " - + "from MaterialDefinition md left join goodsstock gs on md.id=gs.materialDefinitionId and gs.wareHouseId=" + warehouseId; + + "from MaterialDefinition md left join (select materialDefinitionId , wareHouseId ,sum(amount) as amount from goodsstock where materialDefinitionId is not null and materialDefinitionId<>0 group by wareHouseId,materialDefinitionId ) gs on md.id=gs.materialDefinitionId and gs.wareHouseId=" + warehouseId; if(StringUtils.isNotBlank(simpleSpell)){ materialSql += " where md.spelling like '%" + simpleSpell + "%' or md.wbCode like '%" + simpleSpell + "%' or md.name like '%" + simpleSpell + "%' or md.specification like '%" + simpleSpell - + "%' or md.externalCode like '%" + simpleSpell + "%' "; + + "%' or md.externalCode like '%" + simpleSpell + "%' order by externalCode "; } ResultSet rs = objectDao.executeSql(materialSql); @@ -286,6 +286,7 @@ temp.put("id", md.getId()); String materialName = CssdUtils.getMaterialName(md); temp.put("name", materialName); + temp.put("displayName", materialName); temp.put("type", "器械"); temp.put("spelling", md.getSpelling()); temp.put("cost", md.getCost()); @@ -306,6 +307,7 @@ + "]"; } temp.put("name", diposableGoodName); + temp.put("displayName", diposableGoodName); temp.put("type", "一次性物品"); temp.put("spelling", diposableGood.getSpelling()); temp.put("cost", diposableGood.getReferencePrice()); Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r13020 -r13103 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 13020) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 13103) @@ -80,6 +80,7 @@ {hidden :SSTS_Invoice_Create,text:"发货计划管理",href:WWWROOT+'/disinfectsystem/invoice/invoicePlanExtractedView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_Invoice_Create,text:"科室发货计划设置",href:WWWROOT+'/disinfectsystem/invoice/invoiceDepartmentView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_Invoice_Select,text:"发货单管理",href:WWWROOT+'/disinfectsystem/invoice/invoiceView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_Invoice_Select,text:"材料发货管理",href:WWWROOT+'/disinfectsystem/invoice/materialInvoiceView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, {hidden :true,text:"发货单批量打印",href:WWWROOT+'/disinfectsystem/invoice/invoicePrintView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DeliverGoodsQuqery_Menu,text:"发货物品查询",href:WWWROOT+'/disinfectsystem/reportforms/invoiceQueryView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true} ] Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r12702 -r13103 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 12702) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 13103) @@ -1,10 +1,13 @@ package com.forgon.disinfectsystem.basedatamanager.goodsstock.service; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.List; import org.apache.commons.collections4.CollectionUtils; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; /** @@ -21,77 +24,105 @@ } /** - * 新增或修改材料库存数据(同一个仓库的同一个器械包或材料id只存在一条数据),同步方法防止并发出错 + * 新增或修改器械包或材料库存数据(同一个仓库的同一个器械包id只存在一条数据,如果是材料则每次入库会产生一条记录),同步方法防止并发出错 * 修改入库或出库单时,数量应传修改后减修改前的差值。如果修改前后数量不变,则数量应该传0 * @param goodsStockList * @return */ - public synchronized List saveOrUpdateGoodsStock(List goodsStockList, String mode) throws Exception{ + public synchronized List saveOrUpdateGoodsStock(List goodsStockList, String mode){ if(!MODE_INSTOCK.equals(mode) && !MODE_OUTSTOCK.equals(mode)){ - throw new Exception("参数mode="+mode+"值非法"); + throw new RuntimeException("参数mode="+mode+"值非法"); } if(CollectionUtils.isEmpty(goodsStockList)){ - throw new Exception("入/退库单明细数据不能为空"); + throw new RuntimeException("入/退库单明细数据不能为空"); } //1.如果为出库,校验库存是否够扣减 if(MODE_OUTSTOCK.equals(mode)){ String sql = null; GoodsStock goodsStock = null; for(GoodsStock goodsStockTemp : goodsStockList){ if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ - throw new Exception("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); } - sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId(); if(goodsStockTemp.getTousseDefinitionId() != null && goodsStockTemp.getTousseDefinitionId() != 0){ - sql += " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); + sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); + //判断库存数量是否大于退/出库数量 + goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock == null){ + throw new RuntimeException("未找到"+goodsStockTemp.getName()+"的库存数据,不能出库或退库"); + } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ + throw new RuntimeException(goodsStockTemp.getName() + "的库存数量小于出库或退库数量,不能出库或退库"); + } else { + goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); + objectDao.saveOrUpdate(goodsStock); + } }else if(goodsStockTemp.getMaterialDefinitionId() != null && goodsStockTemp.getMaterialDefinitionId() != 0){ - sql += " and materialDefinitionId = " + goodsStockTemp.getMaterialDefinitionId(); + //先判断该材料所有库存总和是否大于需扣减的数量 + ResultSet rs = + objectDao.executeSql("select sum(amount) amount from GoodsStock where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and materialDefinitionId=" + goodsStockTemp.getMaterialDefinitionId() + " and amount > 0"); + int totalAmount = 0; + try { + if(rs.next()){ + totalAmount = rs.getBigDecimal("amount").intValue(); + } + } catch (SQLException e) { + throw new RuntimeException("材料库存查询出错"); + } + DatabaseUtil.closeResultSetAndStatement(rs); + int needReturnAmount = goodsStockTemp.getAmount(); + if(totalAmount < needReturnAmount){ + throw new RuntimeException("材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + while(true){ + sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and materialDefinitionId = " + goodsStockTemp.getMaterialDefinitionId() + " and amount > 0"; + goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock.getAmount() >= needReturnAmount){ + goodsStock.setAmount(goodsStock.getAmount() - needReturnAmount); + objectDao.saveOrUpdate(goodsStock); + break; + } + goodsStock.setAmount(0); + objectDao.saveOrUpdate(goodsStock); + needReturnAmount -= goodsStock.getAmount(); + } } else { - throw new Exception("入/退库单器械包id与材料id不能同时为空"); + throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); } - //判断库存数量是否大于退/出库数量 - goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); - if(goodsStock == null){ - throw new Exception("未找到"+goodsStockTemp.getName()+"的库存数据,不能出库或退库"); - } else if(goodsStock.getAmount() < goodsStockTemp.getAmount()){ - throw new Exception(goodsStockTemp.getName() + "的库存数量小于出库或退库数量,不能出库或退库"); - } else { - goodsStock.setAmount(goodsStock.getAmount() - goodsStockTemp.getAmount()); - objectDao.saveOrUpdate(goodsStock); - } } } else if(MODE_INSTOCK.equals(mode)){ String sql = null; GoodsStock goodsStock = null; for(GoodsStock goodsStockTemp : goodsStockList){ if(goodsStockTemp.getAmount() == null || goodsStockTemp.getAmount() == 0){ - throw new Exception("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); + throw new RuntimeException("入/退库单"+goodsStockTemp.getName()+"的数量不能为空或0"); } - sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId(); + //如果为器械包 if(goodsStockTemp.getTousseDefinitionId() != null && goodsStockTemp.getTousseDefinitionId() != 0){ - sql += " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); + sql = " where 1=1 and wareHouseId = " + goodsStockTemp.getWareHouseId() + " and tousseDefinitionId = " + goodsStockTemp.getTousseDefinitionId(); + //判断库存数量是否大于退/出库数量 + goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock == null){ + goodsStock = new GoodsStock(); + goodsStock.setWareHouseId(goodsStockTemp.getWareHouseId()); + goodsStock.setWareHouseName(goodsStockTemp.getWareHouseName()); + goodsStock.setMaterialDefinitionId(goodsStockTemp.getMaterialDefinitionId()); + goodsStock.setTousseDefinitionId(goodsStockTemp.getTousseDefinitionId()); + goodsStock.setName(goodsStockTemp.getName()); + goodsStock.setGoodsType(goodsStockTemp.getGoodsType()); + goodsStock.setOrgUnitCode(goodsStockTemp.getOrgUnitCode()); + goodsStock.setOrgUnitName(goodsStockTemp.getOrgUnitName()); + goodsStock.setAmount(goodsStockTemp.getAmount()); + objectDao.saveOrUpdate(goodsStock); + } else { + goodsStock.setAmount(goodsStock.getAmount() + goodsStockTemp.getAmount()); + objectDao.saveOrUpdate(goodsStock); + } }else if(goodsStockTemp.getMaterialDefinitionId() != null && goodsStockTemp.getMaterialDefinitionId() != 0){ - sql += " and materialDefinitionId = " + goodsStockTemp.getMaterialDefinitionId(); - } else { - throw new Exception("入/退库单器械包id与材料id不能同时为空"); - } - //判断库存数量是否大于退/出库数量 - goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); - if(goodsStock == null){ - goodsStock = new GoodsStock(); - goodsStock.setWareHouseId(goodsStockTemp.getWareHouseId()); - goodsStock.setWareHouseName(goodsStockTemp.getWareHouseName()); - goodsStock.setMaterialDefinitionId(goodsStockTemp.getMaterialDefinitionId()); - goodsStock.setTousseDefinitionId(goodsStockTemp.getTousseDefinitionId()); - goodsStock.setName(goodsStockTemp.getName()); - goodsStock.setGoodsType(goodsStockTemp.getGoodsType()); - goodsStock.setOrgUnitCode(goodsStockTemp.getOrgUnitCode()); - goodsStock.setOrgUnitName(goodsStockTemp.getOrgUnitName()); - goodsStock.setAmount(goodsStockTemp.getAmount()); + goodsStock = goodsStockTemp; + //如果为材料 objectDao.saveOrUpdate(goodsStock); } else { - goodsStock.setAmount(goodsStock.getAmount() + goodsStockTemp.getAmount()); - objectDao.saveOrUpdate(goodsStock); + throw new RuntimeException("入/退库单器械包id与材料id不能同时为空"); } } } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java =================================================================== diff -u -r12713 -r13103 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java (.../MaterialEntryManager.java) (revision 12713) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManager.java (.../MaterialEntryManager.java) (revision 13103) @@ -10,16 +10,12 @@ */ public interface MaterialEntryManager { - public void saveOrUpdate(MaterialEntry materialEntry); - public MaterialEntry getMaterialEntryById(String id); public MaterialEntryItem getMaterialEntryItemById(String id); public void deleteMaterialEntryById(String id); - public void saveOrUpdate(MaterialEntryItem MaterialEntryItem); - public String deleteMaterialEntryAndReturnMessage(String ids); public String deleteMaterialEntryOutAndReturnMessage(String ids); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/invoice/service/InvoiceUtils.java =================================================================== diff -u -r12938 -r13103 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/invoice/service/InvoiceUtils.java (.../InvoiceUtils.java) (revision 12938) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/invoice/service/InvoiceUtils.java (.../InvoiceUtils.java) (revision 13103) @@ -15,6 +15,8 @@ import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialItem; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.tools.hibernate.ObjectDao; @@ -25,7 +27,7 @@ public class InvoiceUtils { /** - * 统计发货单的发货物品总价格 + * 统计发货单的发货物品总价格(器械包与一次性物品发货) */ public static void updateInvoiceTotalPrice(ObjectDao objectDao,Invoice invoice) { List tousseInstanceList = invoice.getTousseInstances(objectDao); @@ -80,4 +82,19 @@ invoice.setTotalPrice(totalPrice); } + + /** + * 统计材料发货单的发货物品总价格 + */ + public static void updateMaterialInvoiceTotalPrice(ObjectDao objectDao,MaterialInvoice materialInvoice) { + List materialItemList = objectDao.findBySql(MaterialItem.class.getSimpleName(), " where po.materialInvoice.id=" + materialInvoice.getId()); + Double totalPrice = 0.0; + for (MaterialItem materialItem : materialItemList) { + totalPrice = new BigDecimal(totalPrice.toString()).add( + new BigDecimal(materialItem.getPrice().toString()) + .multiply(new BigDecimal(materialItem + .getAmount().toString()))).doubleValue(); + } + materialInvoice.setTotalPrice(totalPrice); + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java =================================================================== diff -u -r13098 -r13103 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java (.../MaterialItem.java) (revision 13098) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java (.../MaterialItem.java) (revision 13103) @@ -7,13 +7,10 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import javax.persistence.Transient; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import com.forgon.tools.db.DatabaseUtil; - /** * 材料发货明细的材料明细 * @author shuyongfu @@ -27,8 +24,12 @@ private Long id; /** - * 材料名称 + * 材料定义id */ + private Long materialDefinitionId; + /** + * 材料名称(含规格) + */ private String name; /** @@ -90,6 +91,14 @@ this.id = id; } + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + public String getName() { return name; } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java =================================================================== diff -u --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java (revision 0) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java (revision 13103) @@ -0,0 +1,22 @@ +package com.forgon.disinfectsystem.invoicemanager.service; + +import java.util.List; + +import net.sf.json.JSONObject; + +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; + +/** + * @author WangYi 2012-3-5 + */ +public interface MaterialInvoiceManager { + + public MaterialInvoice getMaterialInvoiceById(String id); + + public MaterialInvoice getMaterialInvoiceById(Long id); + + public void deleteMaterialInvoiceById(String id); + + public void submitMaterialInvoice(MaterialInvoice materialInvoice); + +} Index: ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.js (revision 13103) @@ -0,0 +1,792 @@ +var entityName = "材料发货管理"; +var grid; + +//明细grid删除按钮 +function renderDeleteButton(v,p,record){ + return ""; +} + +//删除grid明细 +function deleteItem(materialDefinitionId){ + var materialGridStore = top.Ext.getCmp('materialInvoiceItemGrid').getStore(); + for(var i = 0;i < materialGridStore.getCount();i++){ + if(materialGridStore.getAt(i).data.materialDefinitionId == materialDefinitionId){ + materialGridStore.remove(materialGridStore.getAt(i)); + break; + } + } +} +//Ext.form.DateField在IE8下显示不全 +Ext.override(top.Ext.menu.Menu, { + autoWidth: function() { + this.width += "px"; + } +}); + +var MaterialInvoiceItemRecord = Ext.data.Record.create([ + {name : 'id'}, + {name : 'materialDefinitionId'}, + {name : 'materialName'}, + {name : 'amount'}, + {name : 'storage'} +]); + +//添加材料发货 +function addMaterialInvoice(id) { + var myMask = new top.Ext.LoadMask(top.Ext.getBody() , {msg:"正在加载,请稍候..."}); + //仓库数据源 + var sourceWarehouseStore = 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 && id == "") { + if (top.Ext.getCmp('sourceWarehouseName')) { + top.Ext.getCmp("sourceWarehouseId").setValue(records[0].data.id); + top.Ext.getCmp('sourceWarehouseName').setValue(records[0].data.name); + top.Ext.getCmp('name1').setDisabled(false); + } + } + myMask.hide(); + } + } + }); + //科室数据 + var departJsonStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + root : 'data' + },[ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'} + ] + ) + }); + + //材料store + var materialStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/materialDefinitionAction!getMaterialDefinitionDataForMaterial.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'}, + {name : 'spelling',mapping : 'spelling'}, + {name : 'storage',mapping : 'storage'} + ]), + listeners : { + beforeload : function(store,option) { + store.baseParams['wareHouseId'] = top.Ext.getCmp('sourceWarehouseId').getValue(); + } + } + }); + + //添加明细 + function addItems(materialDefinitionId,name,amount,storage){ + if(name == null || name == ''){ + showResult("请填写物品名称!"); + return false; + } + + if(amount == null || amount == ''){ + showResult("请填写数量!"); + return false; + } + + if(!top.Ext.getCmp('amount1').isValid()){ + showResult("请正确填写数量!"); + return false; + } + + if(parseInt(amount) > parseInt(storage)){ + showResult("发货数量不能大于库存数量!"); + return false; + } + + for(var i = 0;i < top.Ext.getCmp('materialInvoiceItemGrid').getStore().getCount();i++){ + if(top.Ext.getCmp('materialInvoiceItemGrid').getStore().getAt(i).data.materialDefinitionId == materialDefinitionId){ + showResult("该物品已经存在,不能重复添加!"); + return false; + } + } + + //添加操作 + var materialInvoiceItem = new MaterialInvoiceItemRecord({ + id : "", + materialDefinitionId : materialDefinitionId, + materialName : name, + amount : amount + }); + top.Ext.getCmp('materialInvoiceItemGrid').getStore().add(materialInvoiceItem); + + top.Ext.getCmp('name1').setValue(''); + top.Ext.getCmp('amount1').setValue(''); + top.Ext.getCmp('materialDefinitionId').setValue(''); + top.Ext.getCmp('name1').focus(); + } + + var form = new top.Ext.FormPanel({ + id : 'materialInvoiceForm', + frame : true, + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 25px', + width : 800, + autoHeight : true, + autoScroll : true, + labelAlign : 'left', + items:[{ + layout : 'column', + items : [{ + xtype : 'hidden', + name : 'id', + id : 'id' + },{ + xtype : 'hidden', + name : 'materialInvoiceItem', + id : 'materialInvoiceItem' + },{ + xtype : 'hidden', + name : 'sourceWarehouseId', + id : 'sourceWarehouseId' + },{ + xtype : 'hidden', + name : 'depart', + id : 'depart' + },{ + xtype : 'hidden', + name : 'departCoding', + id : 'departCoding' + },{ + id:'serialNum', + columnWidth : .33, + layout : 'form', + labelWidth : 40, + hidden : true, + items : [{ + xtype : 'textfield', + fieldLabel : '单号', + maxLength : '41', + id : 'serialNumber', + name : 'serialNumber', + cls : 'fieldReadOnlyNoRemove', + allowBlank : true, + readOnly : true, + anchor : '95%' + }] + }, { + columnWidth : .22, + layout : 'form', + labelWidth : 50, + items : [{ + xtype : 'textfield', + fieldLabel : '操作员', + maxLength : '16', + id : 'sender', + name : 'sender', + allowBlank : false, + readOnly : true, + cls : 'fieldReadOnlyNoRemove', + value : $Id('userName').value, + anchor : '95%' + }] + }, { + columnWidth : .28, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'datefield', + fieldLabel : '发货时间', + id : 'sendTime', + name : 'sendTime', + format : 'Y-m-d H:i', + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', + value : new Date(), + editable: false, + anchor : '95%' + }] + }, { + columnWidth : .25, + layout : 'form', + labelWidth : 40, + items : [{ + xtype : 'combo', + fieldLabel : '仓库', + id : 'sourceWarehouseName', + name : 'sourceWarehouseName', + editable:false, + valueField : 'name', + displayField : 'name', + store : sourceWarehouseStore, + forceSelection : true, + allowBlank : false, + triggerAction : 'all', + anchor : '95%', + listeners : { + select : function(combo,record,index){ + top.Ext.getCmp("sourceWarehouseId").setValue(record.data.id); + top.Ext.getCmp('name1').setDisabled(false); + } + } + }] + },{ + columnWidth : .24, + layout : 'form', + labelWidth : 40, + items : [{ + xtype : 'combo', + id : 'departSearch', + name : 'departSearch', + queryParam : 'spell', + fieldLabel : '科室', + minChars : 0, + valueField : 'id', + displayField : 'name', + store : departJsonStore, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : false, + anchor : '95%', + listeners : { + select : function(combo , record , index){ + top.Ext.getCmp('departCoding').setValue(record.data.id); + top.Ext.getCmp('depart').setValue(record.data.name); + } + } + }] + }, { + columnWidth : 1, + layout : 'form', + labelWidth : 50, + items : [{ + xtype : 'textarea', + fieldLabel : '备注', + height : 30, + id : 'remark', + name : 'remark', + maxLength : 665, + allowBlank : true, + anchor : '97%' + }] + }] + },new top.Ext.grid.EditorGridPanel({ + id : 'materialInvoiceItemGrid', + bodyStyle : 'border:1px solid #afd7af', + frame :false, + viewConfig: { + forceFit:true + }, + store : new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/materialInvoiceAction!getMaterialInvoiceItemsByMaterialInvoiceId.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'id'}, + {name : 'materialDefinitionId'}, + {name : 'materialName'}, + {name : 'amount'}, + {name : 'deleteButton'} + ] + }) + }), + cm : new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), + {header : "id",dataIndex : 'id',hidden : true}, + {header : "materialDefinitionId",dataIndex : 'materialDefinitionId',hidden : true}, + {header : "名称",dataIndex : 'materialName',width : 210,menuDisabled : true, + editor : new top.Ext.form.ComboBox({ + queryParam : 'spell', + minChars : 0, + valueField : 'id', + displayField : 'displayName', + store : materialStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true, + width : 100, + listeners : { + select : function(combo, record, index) { + combo.setValue(record.data.name); + } + } + }) + }, + {header : " 数量",dataIndex : 'amount',width : 90,menuDisabled : true, + editor : new Ext.form.TextField({ + regex: /^\d+$/, + regexText:'只能输入数字', + allowBlank : false + }) + }, + {header : "删除",width : 90,menuDisabled : true,dataIndex : 'deleteButton', id:'expandColumn', renderer:renderDeleteButton} + ]), + width :735, + height : 250, + autoExpandColumn : 'expandColumn', + clicksToEdit : 1,// 设置点击几次才可编辑 + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }), + tbar : [{ + xtype : 'hidden', + name : 'materialDefinitionId', + id : 'materialDefinitionId' + },{ + xtype : 'hidden', + name : 'storage', + id : 'storage' + },{ + text : ' 材料:' + },{ + xtype : 'combo', + id : 'name1', + name : 'name1', + disabled : true, + queryParam : 'spell', + minChars : 0, + valueField : 'id', + displayField : 'displayName', + store : materialStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true, + width : 350, + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('name1').setValue(record.data.name); + top.Ext.getCmp('materialDefinitionId').setValue(record.data.id); + top.Ext.getCmp('storage').setValue(record.data.storage); + storage + }, + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + + } + } + } + },{ + text : ' 数量:' + },{ + xtype : 'textfield', + maxLength : '16', + id : 'amount1', + name : 'amount1', + width : 70, + regex: /^\d+$/, + regexText:'只能输入数字', + anchor : '95%', + listeners : { + specialkey : function(field, e) { + if (e.getKey() == Ext.EventObject.ENTER) { + + } + } + } + },{ + text : '添加', + iconCls : 'btn_ext_add', + handler : function() { + var materialDefinitionId = top.Ext.getCmp('materialDefinitionId').getValue(); + var name = top.Ext.getCmp('name1').getValue(); + var amount = top.Ext.getCmp('amount1').getValue(); + var storage = top.Ext.getCmp('storage').getValue(); + addItems(materialDefinitionId,name,amount,storage); + } + } + ] + })], + buttons : [{ + id : 'btnSave', + text : '保存', + handler : function() { + + var itemGrid = top.Ext.getCmp('materialInvoiceItemGrid'); + 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].materialDefinitionId = record.data.materialDefinitionId; + jsonArray[len].materialName = record.data.materialName; + jsonArray[len].amount = record.data.amount; + } + + top.Ext.getCmp("materialInvoiceItem").setValue(Ext.encode(jsonArray)); + + if (!form.getForm().isValid()) { + showResult('请正确填写表单各值'); + return false; + } + + form.form.submit({ + url : WWWROOT + + '/disinfectSystem/materialInvoiceAction!saveMaterialInvoice.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + success : function(form, action) { + window.close(); + showResult(action.result.message); + grid.dwrReload(); + + }, + failure : function(form, action) { + showResult(action.result.message); + } + }); + } + },{ + text : '取消', + handler : function() { + window.close(); + } + }] + }); + + var window = new top.Ext.Window( { + id : 'materialInvoiceWin', + layout : 'fit', + title : '材料发货单信息', + width : 810, + modal : true, + autoHeight : true, + border :false, + plain : true, + items : [ form ] + }); + window.show(); + myMask.show(); + top.Ext.getCmp("btnSave").setDisabled(false); + sourceWarehouseStore.load(); +} + +// 删除 +function deleteMaterialInvoice(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){ + Ext.Ajax.request({ + url : WWWROOT + '/disinfectSystem/materialInvoiceAction!deleteMaterialInvoice.do', + params : {ids : ids}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + var success = result.success; + if (success) { + grid.dwrReload(); + showResult(result.message); + } + }, + failure : function(response, options) { + showResult(response.responseText); + } + }); + } + } + ); + +} + +//更新打印状态 +function updatePrintStatus(ids){ + InvoiceTableManager.updatePrintStatus(ids,function(printSuccess){ + if(printSuccess){ + grid.dwrReload(); + showResult("已打印!"); + }else{ + showResult("更新打印状态失败!"); + } + }); +} + +//批量打印发货计划 +function mergePrintInvoices(){ + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要打印的发货单!"); + return; + } + + // 保证选的是同一部门的发货单 + var depart = records[0].data['depart']; + var sendTime = records[0].data['sendTime'].substring(0,10); + var serialNumber = records[0].data['serialNumber']; + var sender = records[0].data['sender']; + var remark = records[0].data['remark']; + for ( var i = 1, len = records.length; i < len; i++){ + if(depart != records[i].data['depart']){ + showResult("请选择相同科室的发货单!"); + return; + } + } + + 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']; + } + } + batchPrintInvoices(ids, depart, 0,sendTime,sender,serialNumber,remark); + +} + +function batchPrintInvoices(ids, depart, printType,sendTime,sender,serialNumber,remark){ + if(ids == null) + return; + var departBarcode = getDepartBarcodeByDepart(depart); + top.Ext.MessageBox.show({ + title:'请等待', + msg:'打印中……', + width:350, + progress:true, + closable:false + }); + Ext.Ajax.timeout=300*000; + Ext.Ajax.request({ + timeout: 300*000, + url : WWWROOT + '/disinfectSystem/invoiceAction!mergeLoadToussePrintData.do', + params : {ids : ids}, + success : function(response){ + var result = Ext.decode(response.responseText); + result.depart = depart; + result.departBarcode = departBarcode; + result.sendTime = sendTime; + result.sender = sender; + result.serialNumber2 = serialNumber; + result.remark2 = remark; + var dt = new Date(); + var printDate = dt.getFullYear() + "-" + (dt.getMonth() + 1) + "-"+dt.getDate(); + result.printDate = printDate; + batchPrintInvoices_result(result, printType); + + if (printType == 0){ + updatePrintStatus(ids); + } + + hideMessageBox(true); + }, + failure: function(response){ + showResult("打印失败!"); + hideMessageBox(true); + } + }); +} + +function batchPrintInvoices_result(result, printType){ + var typeofFunction = typeof(batchPrintInvoices_CurrentProject) + if(typeofFunction != undefined && typeofFunction != 'undefined'){ + batchPrintInvoices_CurrentProject(result, printType); + return; + } + batchPrintInvoices_result_default(result, printType); +} +function batchPrintInvoices_result_default(result, printType) { + result.serialNumber = ''; + result.applicant = ''; + result.applicationTime = ''; + result.printUser = curUserName; + result.printTime = Ext.util.Format.date(new Date(), 'Y-m-d H:i'); + result.remark = ''; + // 发料人默认改为当前用户 + if (isUndefinedOrNullOrEmpty(result.sender)) { + result.sender = curUserName; + } + printInvoices2(result, printType); +} + +//查看加载材料发货单明细信息 +var loadFormData = function(grid) { + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择材料发货单!"); + return false; + } + if (records.length > 1) { + showResult("一次只能选择一个材料发货单!"); + return false; + } + id = records[0].data['id']; + editRecord(id); +}; + +function editRecord(id){ + addMaterialInvoice(id); + top.Ext.getCmp("btnSave").setDisabled(true); + top.Ext.getCmp("serialNum").show(); + top.Ext.getCmp('materialInvoiceForm').form.load({ + url : WWWROOT + '/disinfectSystem/materialInvoiceAction!loadMaterialInvoice.do', + method : 'GET', + waitMsg : '正在加载数据,请稍候', + params : {id : id}, + success : function(form, action) { + top.Ext.getCmp("sendTime").setValue(Ext.util.Format.date(new Date(action.result.data.sendTime.time), 'Y-m-d H:i')); + top.Ext.getCmp("sourceWarehouseName").setValue(action.result.data.sourceWarehouseName); + top.Ext.getCmp("departSearch").setRawValue(action.result.data.depart); + for(var i = 0 ;i < action.result.data.materialInvoiceItemList.length ;i++){ + var materialName = action.result.data.materialInvoiceItemList[i].materialName; + var materialInvoiceItem = new MaterialInvoiceItemRecord({ + id : action.result.data.materialInvoiceItemList[i].id, + materialDefinitionId : action.result.data.materialInvoiceItemList[i].materialDefinitionId, + materialName : materialName, + amount : action.result.data.materialInvoiceItemList[i].amount + }); + + top.Ext.getCmp('materialInvoiceItemGrid').getStore().add(materialInvoiceItem); + } + }, + failure : function(form, action) { + } + }); +} + +/** + * 修改记录 + * modifyRecord函数 触发modify函数调用,并传入当前列的值以及record.data对象 + * 页面中需要定义 modify(v,data) 函数 + */ +function modify(v,data){ + editRecord(data['id']); +} + +Ext.onReady(function() { + Ext.QuickTips.init(); + + var columns = [ + {header : "单号",width : 200,dataIndex : 'serialNumber', renderer : modifyRecord}, + {header : "科室",width : 200,dataIndex : 'depart'}, + {header : "总价",width : 200,dataIndex : 'totalPrice'}, + {header : "操作员",width : 200,dataIndex : 'sender'}, + {header : "发货时间",width : 200,dataIndex : 'sendTime' , renderer : myDateFormatByMinute}, + {id : 'operationRemark',header : "备注",width : 120,dataIndex : 'remark'} + ]; + + var readerDetail = [ + {name : 'id'}, + {name : 'serialNumber'}, + {name : 'depart'}, + {name : 'totalPrice'}, + {name : 'sender'}, + {name : 'sendTime'}, + {name : 'remark'} + ]; + + var filters = new Ext.grid.GridFilters({ + filters:[ + {type: 'string', dataIndex: 'serialNumber'}, + {type: 'string', dataIndex: 'depart'}, + {type: 'string', dataIndex: 'totalPrice'}, + {type: 'string', dataIndex: 'sender'}, + {type: 'date', dataIndex: 'time'}, + {type: 'string', dataIndex: 'remark'} + ]} + ); + + var sign = true; + var tbar = [{ + text : '查看', + hidden : SSTS_Invoice_Update, + iconCls : 'btn_ext_application_go', + id : 'editTbar', + handler : function() { + loadFormData(grid); + } + },{ + text : '添加', + hidden : SSTS_Invoice_Update, + iconCls : 'btn_ext_application_add', + handler : function() { + addMaterialInvoice(""); + } + }, { + text : '删除', + hidden : SSTS_Invoice_Delete, + iconCls : 'btn_ext_application_del', + handler : function() { + deleteMaterialInvoice(grid); + } + }, { + text : '刷新列表', + iconCls : 'btn_ext_refresh1', + handler : function() { + grid.dwrReload(); + } + }, { + text : '批量打印', + iconCls : 'icon_print', + handler : function() { + mergePrintInvoices(); + } + }]; + + grid = new Ext.ux.ForgonPageGrid( { + tbar : tbar, + pageSize : 20, + defaultSortField : 'id', + title : entityName + '列表', + defaultSortDirection : 'DESC', + isCheckboxSelectionModel : true, + rememberSelected : false, + isShowSearchField : true, + columns : columns, + plugins: filters, + autoExpandColumn : 'operationRemark', + renderTo : 'gridDiv', + frame : false + }, readerDetail, + InvoiceTableManager.findMaterialInvoiceTableList, + null + ); + + var viewport = new Ext.Viewport( { + layout : 'border', + items : [{ + region : 'center', + margins : '0 0 0 0', + layout : 'fit', + items : grid + }] + }); +}); \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/materialInvoiceView.jsp (revision 13103) @@ -0,0 +1,66 @@ +<%@page import="com.forgon.disinfectsystem.entity.basedatamanager.supplier.Supplier"%> +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> +<%@ include file="/common/includeExtJsAndCss.jsp"%> +<%@ page import="com.forgon.tools.SpringBeanManger" %> +<% + String userName = AcegiHelper.getLoginUser().getUserFullName(); + request.setAttribute("userName",userName); +%> + + + +材料发货信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + \ No newline at end of file Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java =================================================================== diff -u --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java (revision 0) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java (revision 13103) @@ -0,0 +1,199 @@ +package com.forgon.disinfectsystem.invoicemanager.action; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; +import net.sf.json.util.PropertyFilter; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoiceItem; +import com.forgon.disinfectsystem.invoicemanager.service.MaterialInvoiceManager; +import com.forgon.serialnumber.model.SerialNum; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JsonPropertyFilter; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; + +/** + * @author WangYi 2012-3-5 + */ + +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "materialInvoiceAction") +public class MaterialInvoiceAction implements ModelDriven, Preparable { + + private final Logger logger = Logger.getLogger(this.getClass()); + + // 发货单 + private MaterialInvoice materialInvoice; + + private MaterialInvoiceManager materialInvoiceManager; + + private SerialNumManager serialNumManager; + + private ObjectDao objectDao; + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setMaterialInvoiceManager( + MaterialInvoiceManager materialInvoiceManager) { + this.materialInvoiceManager = materialInvoiceManager; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void loadMaterialInvoice() { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + JsonConfig config = new JsonConfig(); + PropertyFilter propertyFilter = new JsonPropertyFilter(new String[] { + "materialInvoiceItem" }); + config.setJsonPropertyFilter(propertyFilter); + + Map map = new HashMap(); + map.put("success", true); + map.put("data", materialInvoice); + JSONObject jsonObject = JSONObject.fromObject(map, config); + String jsonStr = jsonObject.toString(); + try { + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void iniInfo() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id) && !id.equals("0")) { + materialInvoice = + (MaterialInvoice)objectDao.getByProperty(MaterialInvoice.class.getSimpleName(), "id" , Long.valueOf(id)); + } + if (materialInvoice == null) { + materialInvoice = new MaterialInvoice(); + } + } + + + @Override + public MaterialInvoice getModel() { + return materialInvoice; + } + + @Override + public void prepare() throws Exception { + iniInfo(); + } + + /** + * 保存材料发货单 + */ + public void saveMaterialInvoice() { + JSONObject result = new JSONObject(); + try { + if(materialInvoice == null){ + result.put("success", false); + result.put("message", "发货单为空!"); + }else if(CollectionUtils.isEmpty(materialInvoice.getMaterialInvoiceItemList())){ + String materialInvoiceItem = StrutsParamUtils.getPraramValue("materialInvoiceItem", ""); + if(StringUtils.isNotBlank(materialInvoiceItem)){ + JSONArray jsonArray = JSONArray.fromObject(materialInvoiceItem); + if(jsonArray != null && jsonArray.size() > 0){ + List materialInvoiceItemList = new ArrayList(); + for(int i = 0;i < jsonArray.size();i++){ + JSONObject jsonData = jsonArray.getJSONObject(i); + MaterialInvoiceItem item = new MaterialInvoiceItem(); + Long id = jsonData.optLong("id"); + item.setId(id == null || id == 0 ? null : id); + item.setMaterialDefinitionId(jsonData.optLong("materialDefinitionId")); + item.setMaterialName(jsonData.optString("materialName")); + item.setAmount(jsonData.optInt("amount")); + item.setWareHouseId(materialInvoice.getSourceWarehouseId()); + item.setWareHouseName(materialInvoice.getSourceWarehouseName()); + materialInvoiceItemList.add(item); + } + materialInvoice.setMaterialInvoiceItemList(materialInvoiceItemList); + }else{ + result.put("success", false); + result.put("message", "发货单材料为空!"); + } + }else{ + result.put("success", false); + result.put("message", "发货单材料为空!"); + } + } + LoginUserData loginUserData = AcegiHelper.getLoginUser(); + materialInvoice.setSerialNumber(serialNumManager.getSerialNumberStr(SerialNum.TYPE_INVOICE)); + materialInvoice.setSendTime(new Date()); + materialInvoice.setSender(loginUserData.getUserFullName()); + materialInvoice.setOrgUnitCoding(loginUserData.getCurrentOrgUnitCode()); + + + try{ + materialInvoiceManager.submitMaterialInvoice(materialInvoice); + result.put("success", true); + result.put("message", "保存成功!"); + } catch (Exception ex){ + result.put("success", false); + result.put("message", ex.getMessage()); + } + + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + + StrutsParamUtils.getResponse().getWriter().println(result.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 删除材料发货单 + */ + public void deleteMaterialInvoice(){ + JSONObject result = new JSONObject(); + result.put("success", true); + String ids = StrutsParamUtils.getPraramValue("ids", ""); + StrutsParamUtils.getResponse().setContentType("text/html;charset=UTF-8"); + try{ + if(StringUtils.isNotBlank(ids)){ + String[] idArray = ids.split(";"); + for(String id : idArray){ + materialInvoiceManager.deleteMaterialInvoiceById(id); + } + }else{ + result.put("success", false); + result.put("message", "请选择要删除的材料发货单"); + } + }catch(Exception e){ + result.put("success", false); + result.put("message", e.getMessage()); + } + try{ + StrutsParamUtils.getResponse().getWriter().println(result.toString()); + }catch(Exception e){ + + } + } + +} Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java =================================================================== diff -u --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java (revision 0) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java (revision 13103) @@ -0,0 +1,380 @@ +package com.forgon.disinfectsystem.invoicemanager.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.functors.AllPredicate; +import org.apache.commons.collections4.map.MultiValueMap; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.log4j.Logger; +import org.hibernate.LockMode; +import org.hibernate.Query; +import org.hibernate.Session; + +import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; +import com.forgon.disinfectsystem.basedatamanager.invoice.service.InvoiceUtils; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseDefinitionUtils; +import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseInstanceUtils; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.IdentificationOfDisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.TousseStock; +import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.departmentstock.DepartmentStock; +import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceGoodsVo; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.invoicemanager.LostMaterialItem; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialItem; +import com.forgon.disinfectsystem.entity.invoicemanager.TimeQuantum; +import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyItem; +import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; +import com.forgon.disinfectsystem.invoicemanager.vo.InvoicePrintVo; +import com.forgon.disinfectsystem.invoicemanager.vo.InvoiceStaticsVo; +import com.forgon.disinfectsystem.invoicemanager.vo.WaitSignGoodsSummary; +import com.forgon.disinfectsystem.project.service.ProjectManager; +import com.forgon.disinfectsystem.recyclingapplication.service.InvoicePlanManager; +import com.forgon.disinfectsystem.recyclingapplication.vo.ApplicationGoodsVo; +import com.forgon.disinfectsystem.recyclingapplication.vo.GridDataVo; +import com.forgon.disinfectsystem.recyclingapplication.vo.MaterialVO; +import com.forgon.disinfectsystem.recyclingrecord.service.RecyclingRecordManager; +import com.forgon.disinfectsystem.stockmanage.cssdstock.service.TousseStockManager; +import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManagerImpl; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.security.model.User; +import com.forgon.serialnumber.model.SerialNum; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.GB2Alpha; +import com.forgon.tools.GB2WB; +import com.forgon.tools.MathTools; +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.GsonUtil; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.SqlUtils; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.google.gson.reflect.TypeToken; + +/** + * @author WangYi 2012-3-5 + */ + +public class MaterialInvoiceManagerImpl implements MaterialInvoiceManager { + private final Logger logger = Logger.getLogger(this.getClass()); + + private ObjectDao objectDao; + + private SerialNumManager serialNumManager; + + private WriteBackInventoryHelper writeBackInventoryHelper; + + private WareHouseManager wareHouseManager; + + private GoodsStockManager goodsStockManager; + + public void setWriteBackInventoryHelper( + WriteBackInventoryHelper writeBackInventoryHelper) { + this.writeBackInventoryHelper = writeBackInventoryHelper; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setGoodsStockManager(GoodsStockManager goodsStockManager) { + this.goodsStockManager = goodsStockManager; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + @Override + public MaterialInvoice getMaterialInvoiceById(String id) { + return getMaterialInvoiceById(Long.valueOf(id)); + /*return (Invoice) objectDao.getByProperty(Invoice.class.getSimpleName(), + "id", Long.valueOf(id));*/ + } + @Override + public MaterialInvoice getMaterialInvoiceById(Long id){ + return (MaterialInvoice) objectDao.getByProperty(MaterialInvoice.class.getSimpleName(), + "id", id); + } + + @Override + public void deleteMaterialInvoiceById(String id) { + MaterialInvoice materialInvoice = getMaterialInvoiceById(id); + if(materialInvoice == null){ + throw new RuntimeException("未找到材料发货单,可能已被删除!"); + } + if(CollectionUtils.isEmpty(materialInvoice.getMaterialInvoiceItemList())){ + throw new RuntimeException("该材料发货单无发货内容!"); + } + //遍历发货项 + for(MaterialInvoiceItem materialInvoiceItem : materialInvoice.getMaterialInvoiceItemList()){ + //查询该发货项的材料库存明细 + List materialItemList = + objectDao.findBySql("MaterialItem", "where materialInvoiceItemID=" + materialInvoiceItem.getId()); + if(CollectionUtils.isNotEmpty(materialItemList)){ + for(MaterialItem materialItem : materialItemList){ + //找到该明细对应的库存 + GoodsStock goodsStock = + (GoodsStock)objectDao.getBySql("GoodsStock", "where id=" + materialItem.getGoodsStockId()); + if(goodsStock != null){ + goodsStock.setAmount(goodsStock.getAmount() + materialItem.getAmount()); + objectDao.saveOrUpdate(goodsStock); + } + + objectDao.delete(materialItem); + } + } + + } + updateGoodsStock(materialInvoice , materialInvoice.getDepartCoding(),materialInvoice.getDepart(), + materialInvoice.getWarehouseId(),materialInvoice.getWarehouseName(),GoodsStockManager.MODE_OUTSTOCK); + objectDao.delete(materialInvoice); + } + + /** + * 统计及更新发货单的发货物品总价格 + */ + private void updateMaterialInvoiceTotalPrice(MaterialInvoice materialInvoice) { + InvoiceUtils.updateMaterialInvoiceTotalPrice(objectDao, materialInvoice); + objectDao.executeUpdate("update MaterialInvoice set totalPrice=" + + materialInvoice.getTotalPrice() + " where id=" + materialInvoice.getId()); + } + + /** + * 设置发货单所属的仓库 + * @param tousseInstance + * @param orgUnitCoding + */ + private void setDefaultWarehouse(MaterialInvoice materialInvoice,String orgUnitCoding){ + WareHouse warehouse = wareHouseManager.getDefaultWareHouseByUnitCode(orgUnitCoding); + Long id = null; + String name = ""; + if(warehouse != null){ + id = warehouse.getId(); + name = warehouse.getName(); + } + materialInvoice.setWarehouseId(id); + materialInvoice.setWarehouseName(name); + } + + /** + * 材料发货 + */ + public synchronized void submitMaterialInvoice(MaterialInvoice materialInvoice) { + try { + if (StringUtils.isBlank(materialInvoice.getSender())) { + throw new RuntimeException("缺失参数sender"); + } + if (CollectionUtils.isEmpty(materialInvoice.getMaterialInvoiceItemList())) { + throw new RuntimeException("缺失参数materialInvoiceItems"); + } + if (materialInvoice.getSourceWarehouseId() == null || materialInvoice.getSourceWarehouseId() == 0) { + throw new RuntimeException("未指定发货仓库!"); + } + + // 用锁定的方式获取待发货的发货单。 + if (StringUtils.isBlank(materialInvoice.getDepartCoding())) { + throw new RuntimeException("缺失参数departCoding"); + } + materialInvoice.setSpelling(GB2Alpha.string2Alpha(materialInvoice.getDepart())); + materialInvoice.setWbCode(GB2WB.getWBCode(materialInvoice.getDepart())); + //结算科室 + materialInvoice.setSettleAccountsDepart(materialInvoice.getDepart()); + + //查询发送目标科室的仓库 + setDefaultWarehouse(materialInvoice , materialInvoice.getDepartCoding()); + + //先保存材料发货单与明细 + objectDao.saveOrUpdate(materialInvoice); + + Long warehouseId = materialInvoice.getSourceWarehouseId(); + for(MaterialInvoiceItem materialInvoiceItem : materialInvoice.getMaterialInvoiceItemList()){ + //材料定义id,出库仓库,出库数量 + Long materialDefinitionId = materialInvoiceItem.getMaterialDefinitionId(); + materialInvoiceItem.setWareHouseId(warehouseId); + materialInvoiceItem.setWareHouseName(materialInvoice.getSourceWarehouseName()); + Integer sendOutAmount = materialInvoiceItem.getAmount(); + + //先判断该材料所有库存总和是否大于需扣减的数量 + ResultSet rs = + objectDao.executeSql("select sum(amount) amount from GoodsStock where 1=1 and wareHouseId = " + warehouseId + " and materialDefinitionId=" + materialDefinitionId + " and amount > 0"); + int totalAmount = 0; + try { + if(rs.next()){ + totalAmount = rs.getBigDecimal("amount").intValue(); + } + } catch (SQLException e) { + throw new RuntimeException("材料库存查询出错"); + } + DatabaseUtil.closeResultSetAndStatement(rs); + if(totalAmount < sendOutAmount){ + throw new RuntimeException("材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + + Double settlementPrice = 0.0; + int needSendOutAmount = sendOutAmount.intValue(); + while(true){ + String sql = " where 1=1 and wareHouseId = " + warehouseId + " and materialDefinitionId = " + materialDefinitionId + " and amount > 0"; + GoodsStock goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock.getAmount() >= needSendOutAmount){ + goodsStock.setAmount(goodsStock.getAmount() - needSendOutAmount); + objectDao.saveOrUpdate(goodsStock); + + MaterialItem materialItem = new MaterialItem(); + materialItem.setAmount(needSendOutAmount); + materialItem.setGoodsStockId(goodsStock.getId()); + materialItem.setMaterialInvoice(materialInvoice); + materialItem.setMaterialInvoiceItemID(materialInvoiceItem.getId()); + materialItem.setName(materialInvoiceItem.getMaterialName()); + materialItem.setPrice(goodsStock.getPrice()); + objectDao.saveOrUpdate(materialItem); + + settlementPrice = new BigDecimal(settlementPrice.toString()).add( + new BigDecimal(materialItem.getPrice().toString()) + .multiply(new BigDecimal(materialItem + .getAmount().toString()))).doubleValue(); + break; + } + goodsStock.setAmount(0); + objectDao.saveOrUpdate(goodsStock); + needSendOutAmount -= goodsStock.getAmount(); + + MaterialItem materialItem = new MaterialItem(); + materialItem.setAmount(goodsStock.getAmount()); + materialItem.setGoodsStockId(goodsStock.getId()); + materialItem.setMaterialInvoice(materialInvoice); + materialItem.setMaterialInvoiceItemID(materialInvoiceItem.getId()); + materialItem.setName(materialInvoiceItem.getMaterialName()); + materialItem.setPrice(goodsStock.getPrice()); + objectDao.saveOrUpdate(materialItem); + + settlementPrice = new BigDecimal(settlementPrice.toString()).add( + new BigDecimal(materialItem.getPrice().toString()) + .multiply(new BigDecimal(materialItem + .getAmount().toString()))).doubleValue(); + } + + //更新材料发货项的价格小结 + materialInvoiceItem.setSettlementPrice(settlementPrice); + objectDao.saveOrUpdate(materialInvoiceItem); + } + + //更新材料发货单的总价 + updateMaterialInvoiceTotalPrice(materialInvoice); + + // 更新器械包库存(源仓库在之前已扣减库存,所以只需对目标仓库增加库存) + updateGoodsStock(materialInvoice , materialInvoice.getDepartCoding(),materialInvoice.getDepart(), + materialInvoice.getWarehouseId(),materialInvoice.getWarehouseName(),GoodsStockManager.MODE_INSTOCK); + + } catch (RuntimeException ex) { + ex.printStackTrace(); + throw ex; + } + } + + /** + * 修改库存数量 + * + * @param materialInvoice + * @param stockMode + */ + private void updateGoodsStock(MaterialInvoice materialInvoice , String orgUnitCoding , String orgUnitName , Long warehouseId , String warehouseName, String stockMode) { + + if (materialInvoice != null && CollectionUtils.isNotEmpty(materialInvoice.getMaterialInvoiceItemList())) { + List goodsStockList = new ArrayList(); + for (MaterialItem mi : materialInvoice.getMaterialItemList()) { + GoodsStock goodsStock = new GoodsStock(); + goodsStock.setGoodsType(GoodsStock.TYPE_MATERIAL); + goodsStock.setMaterialDefinitionId(mi.getMaterialDefinitionId()); + goodsStock.setName(mi.getName()); + goodsStock.setAmount(mi.getAmount()); + goodsStock.setPrice(mi.getPrice()); + goodsStock.setOrgUnitCode(orgUnitCoding); + goodsStock.setOrgUnitName(orgUnitName); + goodsStock.setWareHouseId(warehouseId); + goodsStock.setWareHouseName(warehouseName); + goodsStockList.add(goodsStock); + + } + // 更新源仓库材料库存,源仓库即供应室仓库出库扣减库存,目标仓库即临床科室r仓库也要增加库存 + try { + goodsStockManager.saveOrUpdateGoodsStock(goodsStockList, stockMode); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + } + +} \ No newline at end of file Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java =================================================================== diff -u -r13089 -r13103 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java (.../MaterialEntryManagerImpl.java) (revision 13089) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialmanager/service/MaterialEntryManagerImpl.java (.../MaterialEntryManagerImpl.java) (revision 13103) @@ -68,17 +68,11 @@ Long.valueOf(id)); } - @Override - public void saveOrUpdate(MaterialEntry materialEntry) { + private void saveOrUpdate(MaterialEntry materialEntry) { objectDao.saveOrUpdate(materialEntry); } - @Override - public void saveOrUpdate(MaterialEntryItem MaterialEntryItem) { - objectDao.saveOrUpdate(MaterialEntryItem); - } - /** * 删除材料入库单 */ @@ -171,6 +165,10 @@ @Override public void saveMaterialEntry(MaterialEntry materialEntry, String items) throws Exception { + + if(materialEntry.getWareHouseId() == null){ + throw new RuntimeException("该科室仓库未定义,不能入库!"); + } //旧的入库材料信息字典 Map oldMaterialEntryItemsMap = new HashMap(); for (MaterialEntryItem oldItem : materialEntry.getItemsList()) { @@ -236,26 +234,23 @@ } } + materialEntry.setItemsList(materialEntryItems); + saveOrUpdate(materialEntry); + List goodsStockList = new ArrayList(); - if(materialEntry.getWareHouseId() == null){ - throw new RuntimeException("该科室仓库未定义,不能入库!"); - } LoginUserData loginUser = AcegiHelper.getLoginUser(); String orgUnitCode = loginUser.getOrgUnitCodingFromSupplyRoomConfig(); String orgUnitName = loginUser.getOrgUnitNameCodingFromSupplyRoomConfig(); - for (Entry entry : updateMaterialDefinition.entrySet()) { - MaterialDefinition md = entry.getKey(); - Integer updateAmount = entry.getValue(); - if(updateAmount == null || updateAmount == 0){ - continue; - } + for (MaterialEntryItem materialEntryItem : materialEntryItems) { GoodsStock stock = new GoodsStock(); - stock.setMaterialDefinitionId(md.getId()); + stock.setMaterialDefinitionId(materialEntryItem.getId()); stock.setGoodsType(GoodsStock.TYPE_MATERIAL); - stock.setAmount(updateAmount); - stock.setName(CssdUtils.getMaterialName(md)); + stock.setAmount(materialEntryItem.getAmount()); + stock.setName(CssdUtils.getMaterialName(materialEntryItem.getMaterialDefinition())); stock.setOrgUnitCode(orgUnitCode); stock.setOrgUnitName(orgUnitName); + stock.setPrice(materialEntryItem.getCost()); + stock.setMaterialEntryItemId(materialEntryItem.getId()); stock.setWareHouseId(materialEntry.getWareHouseId()); stock.setWareHouseName(materialEntry.getWareHouseName()); goodsStockList.add(stock); @@ -270,8 +265,6 @@ } catch (Exception e) { throw new RuntimeException(e.getMessage()); } - materialEntry.setItemsList(materialEntryItems); - saveOrUpdate(materialEntry); } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java =================================================================== diff -u -r13070 -r13103 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java (.../MaterialInvoiceItem.java) (revision 13070) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialInvoiceItem.java (.../MaterialInvoiceItem.java) (revision 13103) @@ -5,14 +5,10 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; -import javax.persistence.Transient; -import org.apache.commons.lang3.StringUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; - /** * @author shuyongfu * @since 2016-04-15 @@ -24,15 +20,18 @@ public class MaterialInvoiceItem { private Long id; + + /** + * 材料定义id + */ + private Long materialDefinitionId; private String materialName;// 名字 private Integer amount;// 数量 private Double settlementPrice = 0d;// 发货物品小结价格 - private Long materialInvoiceId;// 材料发货单Id - /** * 仓库ID */ @@ -55,6 +54,14 @@ this.id = id; } + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + public String getMaterialName() { return materialName; } @@ -79,14 +86,6 @@ this.settlementPrice = settlementPrice; } - public Long getMaterialInvoiceId() { - return materialInvoiceId; - } - - public void setMaterialInvoiceId(Long materialInvoiceId) { - this.materialInvoiceId = materialInvoiceId; - } - public Long getWareHouseId() { return wareHouseId; } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/InvoiceTableManager.java =================================================================== diff -u -r13028 -r13103 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/InvoiceTableManager.java (.../InvoiceTableManager.java) (revision 13028) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/InvoiceTableManager.java (.../InvoiceTableManager.java) (revision 13103) @@ -24,6 +24,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceManager; @@ -377,4 +378,22 @@ } return str; } + + /** + * 查询材料发货列表 + * @param parameterMap + * @return + */ + public String findMaterialInvoiceTableList(Map> parameterMap) { + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + + String sql = " where po.orgUnitCoding = '" + + AcegiHelper.getLoginUser() + .getOrgUnitCodingFromSupplyRoomConfig() + "'"; + String json = gridManager.renderGrid(parameterMap, + MaterialInvoice.class.getSimpleName(), sql, new String[] { + "materialInvoiceItem" }); + return json; + } }