Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/receiverecord/ReceiveRecordItem.java =================================================================== diff -u -r13081 -r13370 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/receiverecord/ReceiveRecordItem.java (.../ReceiveRecordItem.java) (revision 13081) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/receiverecord/ReceiveRecordItem.java (.../ReceiveRecordItem.java) (revision 13370) @@ -32,19 +32,27 @@ private MaterialDefinition materialDefinition; /** - * + * 材料或一次性物品名称,带规格 */ private String goodsName; private String type; + /** + * 仅记录该物品最后一次入库的成功价格 + */ private Double price; private Integer amount; + /** + * 供应室领用物品小结价格 + */ + private Double settlementPrice = 0d;// + private ReceiveRecord receiveRecord; - private Long objID;// 批次ID,或者器械包ID。 + private Long objID;// 批次ID,或者器械包ID。或者材料定义id private Long diposableGoodsID ;// 一次性物品id @@ -118,6 +126,14 @@ this.price = price; } + public Double getSettlementPrice() { + return settlementPrice; + } + + public void setSettlementPrice(Double settlementPrice) { + this.settlementPrice = settlementPrice; + } + @ManyToOne @JoinColumn(name = "receiveRecord_id") public ReceiveRecord getReceiveRecord() { Index: ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java =================================================================== diff -u -r13142 -r13370 --- ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java (.../ReceiveRecordManagerImpl.java) (revision 13142) +++ ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java (.../ReceiveRecordManagerImpl.java) (revision 13370) @@ -6,6 +6,9 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; @@ -43,13 +46,15 @@ import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialItem; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecord; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordDiposableGoodsItem; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.receiverecord.util.ReceiveRecordUtils; import com.forgon.tools.Path; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.excel.ExcelCellStyle; import com.forgon.tools.excel.ExcelHelper; import com.forgon.tools.hibernate.ObjectDao; @@ -717,10 +722,105 @@ if(!record.getItems().contains(receiveRecordItem)){ record.getItems().add(receiveRecordItem); } + + Integer sendOutAmount = receiveRecordItem.getAmount(); + + //先判断该材料所有库存总和是否大于需扣减的数量 + ResultSet rs = + objectDao.executeSql("select sum(amount) amount from GoodsStock where 1=1 and wareHouseId = " + record.getWarehouseId() + + " and materialDefinitionId=" + receiveRecordItem.getMaterialDefinition().getId() + " 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); + if(totalAmount < sendOutAmount){ + throw new RuntimeException("材料总库存数量少于需要扣减的数量,不能扣减,请修改数量"); + } + objectDao.save(receiveRecordItem);// 保存领用item + + Double settlementPrice = 0.0; + //还需发货的数量(根据库存发货实时调整) + int needSendOutAmount = sendOutAmount.intValue(); + while(true){ + String sql = " where 1=1 and wareHouseId = " + record.getWarehouseId() + " and materialDefinitionId = " + + receiveRecordItem.getMaterialDefinition().getId() + " and amount > 0"; + GoodsStock goodsStock = (GoodsStock)objectDao.getBySql(GoodsStock.class.getSimpleName(), sql); + //实际发生变动数量 + int stockChangeAmount = goodsStock.getAmount(); + if(goodsStock.getAmount() >= needSendOutAmount){ + stockChangeAmount = needSendOutAmount; + goodsStock.setAmount(goodsStock.getAmount() - needSendOutAmount); + objectDao.saveOrUpdate(goodsStock); + + MaterialItem materialItem = new MaterialItem(); + materialItem.setAmount(stockChangeAmount); + materialItem.setPrice(goodsStock.getPrice()); + materialItem.setGoodsStockId(goodsStock.getId()); + materialItem.setReceiveRecordId(record.getId()); + materialItem.setReceiveRecordItemId(receiveRecordItem.getId()); + materialItem.setName(receiveRecordItem.getGoodsName()); + materialItem.setMaterialDefinitionId(goodsStock.getMaterialDefinitionId()); + objectDao.saveOrUpdate(materialItem); + + + settlementPrice = new BigDecimal(settlementPrice.toString()).add( + new BigDecimal(materialItem.getPrice().toString()) + .multiply(new BigDecimal(materialItem + .getAmount().toString()))).doubleValue(); + break; + } + stockChangeAmount = goodsStock.getAmount(); + needSendOutAmount -= goodsStock.getAmount(); + goodsStock.setAmount(0); + objectDao.saveOrUpdate(goodsStock); + + MaterialItem materialItem = new MaterialItem(); + materialItem.setAmount(stockChangeAmount); + materialItem.setGoodsStockId(goodsStock.getId()); + materialItem.setReceiveRecordId(record.getId()); + materialItem.setReceiveRecordItemId(receiveRecordItem.getId()); + materialItem.setName(receiveRecordItem.getGoodsName()); + materialItem.setMaterialDefinitionId(goodsStock.getMaterialDefinitionId()); + 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(); + } + + //更新材料发货项的价格小结 + receiveRecordItem.setSettlementPrice(settlementPrice); + objectDao.saveOrUpdate(receiveRecordItem); + + //更新材料发货单的总价 + updateReceiveRecordTotalPrice(record); + //更新材料库存 - updateGoodsStock(md, record, receiveRecordItem.getAmount()); + //updateGoodsStock(md, record, receiveRecordItem.getAmount()); } + + private void updateReceiveRecordTotalPrice(ReceiveRecord record){ + if(CollectionUtils.isNotEmpty(record.getItems())){ + Double d = 0d; + for(ReceiveRecordItem receiveRecordItem : record.getItems()){ + d += receiveRecordItem.getSettlementPrice(); + } + record.setTotalPrice(d); + objectDao.saveOrUpdate(record); + } + } private void updateGoodsStock(MaterialDefinition md, ReceiveRecord record , Integer updateAmount) { List stockList = new ArrayList(); @@ -793,6 +893,10 @@ receiveRecordItem.getReceiveRecord().getItems() .remove(receiveRecordItem); receiveRecordItem.setReceiveRecord(null); + + //删除对应的materialItem + objectDao.executeUpdate("delete from MaterialItem where receiveRecordItemId=" + receiveRecordItem.getId()); + objectDao.delete(receiveRecordItem); updateGoodsStock(md,record , -receiveRecordItem.getAmount()); }