Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/MaterialInvoiceTableManager.java =================================================================== diff -u -r25216 -r41663 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/MaterialInvoiceTableManager.java (.../MaterialInvoiceTableManager.java) (revision 25216) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/dwr/table/MaterialInvoiceTableManager.java (.../MaterialInvoiceTableManager.java) (revision 41663) @@ -4,14 +4,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.Map.Entry; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; + import com.forgon.disinfectsystem.common.CssdUtils; 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.invoicemanager.service.MaterialInvoiceManager; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; +import com.forgon.tools.MathTools; import com.forgon.tools.db.DatabaseUtil; /** * @@ -45,24 +49,40 @@ List materialInvoiceItemList = materialInvoice.getMaterialInvoiceItemList();//材料发货单明细 List materialItemList = materialInvoice.getMaterialItemList();//材料各业务项的明细 //1、遍历材料发货明细 - for(MaterialInvoiceItem mInvoiceItem : materialInvoiceItemList){ - Long materialDefinitionId = mInvoiceItem.getMaterialDefinitionId(); + for(MaterialInvoiceItem mInvoiceItem : materialInvoiceItemList){ + Long materialDefinitionId = mInvoiceItem.getMaterialDefinitionId(); String name = CssdUtils.getMaterialName(materialDefinitionManager.get(materialDefinitionId));//根据材料定义id获取材料名称 - Integer amount = mInvoiceItem.getAmount();//材料发货数量 - Double settlementPrice = mInvoiceItem.getSettlementPrice();// 材料发货物品小结价格 - //根据材料发货单明细id获得对应的材料明细 - MaterialItem materialItem = materialItemList.stream().filter( - mi -> mInvoiceItem.getId().equals(mi.getMaterialInvoiceItemID())) - .findFirst().orElse(new MaterialItem()); - Double price = materialItem.getPrice();//材料明细单价 - //2、生成返回的数据 - Map temp = new HashMap(); - temp.put("name", name); - temp.put("amount",amount); - temp.put("price",price); - temp.put("settlementPrice",settlementPrice); - mapList.add(temp); - } + //根据价格分开显示 + Map> priceMaterialItemMap = materialInvoiceManager.getMaterialItemMapGroupByPrice(mInvoiceItem, materialItemList); + if(MapUtils.isEmpty(priceMaterialItemMap)){ + continue; + } + for (Entry> materialItemEntry : priceMaterialItemMap.entrySet()) { + Double price = materialItemEntry.getKey(); + List materialItems = materialItemEntry.getValue(); + if(price == null || CollectionUtils.isEmpty(materialItems)){ + continue; + } + Integer amount = 0; + Double settlementPrice = 0.0; + for (MaterialItem materialItem : materialItems) { + if(materialItem.getAmount() != null){ + amount += materialItem.getAmount(); + if(materialItem.getPrice() != null){ + settlementPrice = MathTools.add(settlementPrice, + MathTools.mul(materialItem.getAmount(), materialItem.getPrice())).doubleValue(); + } + } + } + //2、生成返回的数据 + Map temp = new HashMap(); + temp.put("name", name); + temp.put("amount",amount); + temp.put("price",price); + temp.put("settlementPrice",settlementPrice); + mapList.add(temp); + } + } } catch (Exception e) { e.printStackTrace(); } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/vo/MaterialGoodsStockVo.java =================================================================== diff -u --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/vo/MaterialGoodsStockVo.java (revision 0) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/vo/MaterialGoodsStockVo.java (revision 41663) @@ -0,0 +1,47 @@ +package com.forgon.disinfectsystem.invoicemanager.vo; + +/** + * 材料库存的vo + */ +public class MaterialGoodsStockVo { + + /** + * 材料定义id + */ + private Long materialDefinitionId; + + /** + * 单价 + */ + private Double price; + + /** + * 发货数量 + */ + private Integer sendOutAmount; + + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getSendOutAmount() { + return sendOutAmount; + } + + public void setSendOutAmount(Integer sendOutAmount) { + this.sendOutAmount = sendOutAmount; + } + +} Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java =================================================================== diff -u -r13125 -r41663 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java (.../MaterialInvoiceManager.java) (revision 13125) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManager.java (.../MaterialInvoiceManager.java) (revision 41663) @@ -1,9 +1,13 @@ package com.forgon.disinfectsystem.invoicemanager.service; import java.util.List; +import java.util.Map; 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.invoicemanager.vo.InvoicePrintVo; +import com.forgon.disinfectsystem.invoicemanager.vo.MaterialGoodsStockVo; /** * @author WangYi 2012-3-5 @@ -27,5 +31,22 @@ public List getMaterialPrintData(String departCoding); public List getMaterialPrintData(String[] invoiceIds); + + /** + * 查询待发货材料的库存vo + * @param warehouseId 仓库id + * @param materialDefinitionId 材料定义id + * @param sendOutAmount 发货数量 + * @return 价格 + */ + public List getMaterialWaiteSendOutGoodsStock(Long warehouseId, Long materialDefinitionId, Integer sendOutAmount); + + /** + * 查找材料发货项关联的材料明细,并返回根据单价分组的材料明细map + * @param mInvoiceItem 材料发货项 + * @param materialItemList 材料明细 + * @return 单价及材料明细map + */ + public Map> getMaterialItemMapGroupByPrice(MaterialInvoiceItem mInvoiceItem, List materialItemList); } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java =================================================================== diff -u -r35870 -r41663 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java (.../MaterialInvoiceAction.java) (revision 35870) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/MaterialInvoiceAction.java (.../MaterialInvoiceAction.java) (revision 41663) @@ -7,13 +7,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; 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.collections4.MapUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; @@ -27,6 +29,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.MaterialItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.invoicemanager.service.MaterialInvoiceManager; +import com.forgon.disinfectsystem.invoicemanager.vo.MaterialGoodsStockVo; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; import com.forgon.exception.StockNotEnoughException; import com.forgon.serialnumber.model.SerialNum; @@ -35,6 +38,7 @@ import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.string.StringTools; import com.opensymphony.xwork2.ModelDriven; @@ -121,21 +125,35 @@ JSONArray mInvoiceItemListArray = new JSONArray(); //材料发货单明细 for (MaterialInvoiceItem mInvoiceItem : materialInvoiceItemList) { - JSONObject mInvoiceJson = new JSONObject(); - mInvoiceJson.put("tousseName", mInvoiceItem.getTousseName()); - mInvoiceJson.put("id", mInvoiceItem.getId()); - mInvoiceJson.put("materialDefinitionId", mInvoiceItem.getMaterialDefinitionId()); - mInvoiceJson.put("materialName", mInvoiceItem.getMaterialName()); - mInvoiceJson.put("amount", mInvoiceItem.getAmount()); - mInvoiceJson.put("userecordId", mInvoiceItem.getUserecordId()); - mInvoiceJson.put("userecordName", mInvoiceItem.getUserecordName()); - mInvoiceJson.put("userecordDepartCoding", mInvoiceItem.getUserecordDepartCoding()); - //根据材料发货单明细id获得对应的材料明细 - MaterialItem materialItem = materialItemList.stream().filter( - mi -> mInvoiceItem.getId().equals(mi.getMaterialInvoiceItemID())) - .findFirst().orElse(new MaterialItem()); - mInvoiceJson.put("price", materialItem.getPrice());//单价 - mInvoiceItemListArray.add(mInvoiceJson); + //根据价格分开显示 + Map> priceMaterialItemMap = materialInvoiceManager.getMaterialItemMapGroupByPrice(mInvoiceItem, materialItemList); + if(MapUtils.isEmpty(priceMaterialItemMap)){ + continue; + } + for (Entry> materialItemEntry : priceMaterialItemMap.entrySet()) { + Double price = materialItemEntry.getKey(); + List materialItems = materialItemEntry.getValue(); + if(price == null || CollectionUtils.isEmpty(materialItems)){ + continue; + } + Integer amount = 0; + for (MaterialItem materialItem : materialItems) { + if(materialItem.getAmount() != null){ + amount += materialItem.getAmount(); + } + } + JSONObject mInvoiceJson = new JSONObject(); + mInvoiceJson.put("tousseName", mInvoiceItem.getTousseName()); + mInvoiceJson.put("id", mInvoiceItem.getId()); + mInvoiceJson.put("materialDefinitionId", mInvoiceItem.getMaterialDefinitionId()); + mInvoiceJson.put("materialName", mInvoiceItem.getMaterialName()); + mInvoiceJson.put("amount", amount); + mInvoiceJson.put("userecordId", mInvoiceItem.getUserecordId()); + mInvoiceJson.put("userecordName", mInvoiceItem.getUserecordName()); + mInvoiceJson.put("userecordDepartCoding", mInvoiceItem.getUserecordDepartCoding()); + mInvoiceJson.put("price", price);//单价 + mInvoiceItemListArray.add(mInvoiceJson); + } }; jsonData.put("materialInvoiceItemList",mInvoiceItemListArray); } @@ -361,4 +379,25 @@ } } + /** + * 查询材料的待发货库存信息CDSLQYQYYY-154 + */ + public void getMaterialWaiteSendOutGoodsStock(){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + Long warehouseId = StrutsParamUtils.getPraramLongValue("warehouseId", null); + Long materialDefinitionId = StrutsParamUtils.getPraramLongValue("materialDefinitionId", null); + Integer sendOutAmount = StrutsParamUtils.getPraramValue("sendOutAmount", 0); + List materialSendOutAmountVos = materialInvoiceManager.getMaterialWaiteSendOutGoodsStock(warehouseId, materialDefinitionId, sendOutAmount); + if(materialSendOutAmountVos == null){ + materialSendOutAmountVos = new ArrayList(); + } + result = JSONUtil.buildJsonObject(true, JSONArray.fromObject(materialSendOutAmountVos)); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + StrutsResponseUtils.output(result); + } + } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java =================================================================== diff -u -r35871 -r41663 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java (.../MaterialInvoiceManagerImpl.java) (revision 35871) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/MaterialInvoiceManagerImpl.java (.../MaterialInvoiceManagerImpl.java) (revision 41663) @@ -4,12 +4,15 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -24,16 +27,16 @@ 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.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoicemanager.vo.InvoicePrintVo; +import com.forgon.disinfectsystem.invoicemanager.vo.MaterialGoodsStockVo; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; import com.forgon.exception.StockNotEnoughException; -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.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.SqlUtils; /** * @author WangYi 2012-3-5 @@ -44,25 +47,12 @@ private ObjectDao objectDao; - private SerialNumManager serialNumManager; - - private WriteBackInventoryHelper writeBackInventoryHelper; - private WareHouseManager wareHouseManager; private GoodsStockManager goodsStockManager; private MaterialDefinitionManager materialDefinitionManager; - public void setWriteBackInventoryHelper( - WriteBackInventoryHelper writeBackInventoryHelper) { - this.writeBackInventoryHelper = writeBackInventoryHelper; - } - - public void setSerialNumManager(SerialNumManager serialNumManager) { - this.serialNumManager = serialNumManager; - } - public void setObjectDao(ObjectDao objectDao) { this.objectDao = objectDao; } @@ -191,20 +181,7 @@ 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()){ - BigDecimal bd = rs.getBigDecimal("amount"); - if(bd != null){ - totalAmount = bd.intValue(); - } - } - } catch (SQLException e) { - throw new RuntimeException("材料库存查询出错"); - } - DatabaseUtil.closeResultSetAndStatement(rs); + int totalAmount = getWaiteInvoceMatrialGoodsStockTotalAmount(warehouseId, materialDefinitionId); if(totalAmount < sendOutAmount){ throw new StockNotEnoughException(materialInvoiceItem.getMaterialName() + "总库存数量少于需要扣减的数量,不能扣减,请修改数量"); } @@ -213,7 +190,7 @@ //还需发货的数量(根据库存发货实时调整) int needSendOutAmount = sendOutAmount.intValue(); while(true){ - String sql = " where 1=1 and wareHouseId = " + warehouseId + " and materialDefinitionId = " + materialDefinitionId + " and amount > 0"; + String sql = getMaterialInvoiceGoodsStockSql(warehouseId, materialDefinitionId, null); GoodsStock goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); if(goodsStock == null){ throw new StockNotEnoughException(materialInvoiceItem.getMaterialName() + "总库存数量少于需要扣减的数量,不能扣减,请修改数量"); @@ -420,4 +397,128 @@ sql += " order by po.sendTime asc"; return getMaterialPrintData(findByHql(sql)); } + + @Override + public List getMaterialWaiteSendOutGoodsStock(Long warehouseId, Long materialDefinitionId, Integer sendOutAmount) { + + List materialSendOutAmountVos = new ArrayList(); + if(!DatabaseUtil.isPoIdValid(warehouseId) && !DatabaseUtil.isPoIdValid(materialDefinitionId)){ + throw new RuntimeException("仓库id及材料定义id不能为空!"); + } + + if(sendOutAmount == null || sendOutAmount <= 0){ + throw new RuntimeException("发货数量异常!"); + } + + //先判断该材料所有库存总和是否大于需扣减的数量 + int totalAmount = getWaiteInvoceMatrialGoodsStockTotalAmount(warehouseId, materialDefinitionId); + if(totalAmount < sendOutAmount){ + throw new StockNotEnoughException("总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + + //还需发货的数量(根据库存发货实时调整) + int needSendOutAmount = sendOutAmount.intValue(); + List usedGoodsStockIdList = new ArrayList(); + Map materialGoodsStockVoMap = new LinkedHashMap(); + while(true){ + String sql = getMaterialInvoiceGoodsStockSql(warehouseId, materialDefinitionId, usedGoodsStockIdList); + GoodsStock goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + if(goodsStock == null){ + throw new StockNotEnoughException("总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + usedGoodsStockIdList.add(goodsStock.getId()); + //实际发生变动数量 + if(goodsStock.getAmount() >= needSendOutAmount){ + addMaterialSendOutAmountVosMap(materialDefinitionId, goodsStock.getPrice(), needSendOutAmount, materialGoodsStockVoMap); + break; + } + needSendOutAmount -= goodsStock.getAmount(); + addMaterialSendOutAmountVosMap(materialDefinitionId, goodsStock.getPrice(), goodsStock.getAmount(), materialGoodsStockVoMap); + } + + if(MapUtils.isNotEmpty(materialGoodsStockVoMap)){ + materialSendOutAmountVos.addAll(materialGoodsStockVoMap.values()); + } + + return materialSendOutAmountVos; + } + + /** + * 查询待发货材料总库存 + * @param warehouseId 仓库id + * @param materialDefinitionId 材料定义id + * @return 总库存 + */ + private int getWaiteInvoceMatrialGoodsStockTotalAmount(Long warehouseId, Long materialDefinitionId) { + int totalAmount = 0; + ResultSet rs = null; + try { + rs = objectDao.executeSql("select sum(amount) amount from GoodsStock where 1=1 and wareHouseId = " + warehouseId + " and materialDefinitionId=" + materialDefinitionId + " and amount > 0"); + if(rs.next()){ + BigDecimal bd = rs.getBigDecimal("amount"); + if(bd != null){ + totalAmount = bd.intValue(); + } + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("材料库存查询出错"); + } finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return totalAmount; + } + + /** + * 添加到库存map中 + * @param goodsStock 库存 + * @param materialSendOutAmountVoMap 库存map + */ + private void addMaterialSendOutAmountVosMap(Long materialDefinitionId, Double price, Integer amount, Map materialSendOutAmountVoMap) { + MaterialGoodsStockVo vo = materialSendOutAmountVoMap.get(price); + if(vo == null){ + vo = new MaterialGoodsStockVo(); + vo.setMaterialDefinitionId(materialDefinitionId); + vo.setPrice(price); + vo.setSendOutAmount(amount); + }else{ + vo.setSendOutAmount(MathTools.add(vo.getSendOutAmount(), amount).intValue()); + } + materialSendOutAmountVoMap.put(price, vo); + } + + @Override + public Map> getMaterialItemMapGroupByPrice(MaterialInvoiceItem mInvoiceItem, List materialItemList) { + Map> materialItemMapGroupByPrice = new HashMap>(); + if(mInvoiceItem == null || CollectionUtils.isEmpty(materialItemList)){ + return materialItemMapGroupByPrice; + } + for (MaterialItem materialItem : materialItemList) { + if(materialItem.getMaterialInvoiceItemID().equals(mInvoiceItem.getId())){ + Double price = materialItem.getPrice(); + List tempMaterialItemList = materialItemMapGroupByPrice.get(price); + if(tempMaterialItemList == null){ + tempMaterialItemList = new ArrayList(); + } + tempMaterialItemList.add(materialItem); + materialItemMapGroupByPrice.put(price, tempMaterialItemList); + } + } + return materialItemMapGroupByPrice; + } + + /** + * 材料发货库存查询的语句 + * @param warehouseId 仓库id + * @param materialDefinitionId 材料对定义id + * @return sql + */ + private String getMaterialInvoiceGoodsStockSql(Long warehouseId, Long materialDefinitionId, Collection ignoreGoodsStockIdList) { + String sql = " where wareHouseId = " + warehouseId + " and materialDefinitionId = " + materialDefinitionId + " and amount > 0 "; + if(CollectionUtils.isNotEmpty(ignoreGoodsStockIdList)){ + sql += " and " + SqlUtils.getNonStringFieldNotInCollectionsPredicate("id", ignoreGoodsStockIdList); + } + sql += " order by id"; + return sql; + } } \ No newline at end of file