Index: forgon-core/src/main/java/com/forgon/directory/model/BarcodeDevice.java =================================================================== diff -u -r12739 -r13519 --- forgon-core/src/main/java/com/forgon/directory/model/BarcodeDevice.java (.../BarcodeDevice.java) (revision 12739) +++ forgon-core/src/main/java/com/forgon/directory/model/BarcodeDevice.java (.../BarcodeDevice.java) (revision 13519) @@ -39,6 +39,7 @@ public static final String BARCODE_TYPE_DIPOSABLEGOODS = "一次性物品"; public static final String BARCODE_TYPE_SIGNBOARD = "标识牌"; public static final String BARCODE_TYPE_WAREHOUSE = "仓库"; + public static final String BARCODE_TYPE_EXPENSIVEDIPOSABLEGOODS = "高值耗材"; @Id @GeneratedValue(strategy = GenerationType.AUTO) Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r13517 -r13519 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 13517) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 13519) @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -47,8 +48,9 @@ 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.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.reportoption.GoodsOption; @@ -190,19 +192,56 @@ updateNameAndSpecification(oldName, oldSpecification, newName, newSpecification); } } + private void setUpdatingProperties(DisposableGoods curDisposableGoods,DisposableGoods disposableGoods){ + curDisposableGoods.setCertification(disposableGoods.getCertification()); + curDisposableGoods.setExternalCode(disposableGoods.getExternalCode()); +// curDisposableGoods.setGoodsType(disposableGoods.getGoodsType()); + curDisposableGoods.setGrade(disposableGoods.getGrade()); + curDisposableGoods.setGuid(disposableGoods.getGuid()); + curDisposableGoods.setIsApplicationMaterial(disposableGoods.getIsApplicationMaterial()); + curDisposableGoods.setIsPartOfTousseMaterial(disposableGoods.getIsPartOfTousseMaterial()); + curDisposableGoods.setIsSupplyRoomGoods(disposableGoods.getIsSupplyRoomGoods()); + curDisposableGoods.setMaxStorage(disposableGoods.getMaxStorage()); + curDisposableGoods.setMinApplyAmount(disposableGoods.getMinApplyAmount()); + curDisposableGoods.setMinStorage(disposableGoods.getMinStorage()); + curDisposableGoods.setName(disposableGoods.getName()); + curDisposableGoods.setPackageSpec(disposableGoods.getPackageSpec()); + curDisposableGoods.setPrintInLabel(disposableGoods.getPrintInLabel()); + curDisposableGoods.setReferencePrice(disposableGoods.getReferencePrice()); + curDisposableGoods.setSpecification(disposableGoods.getSpecification()); + curDisposableGoods.setType(disposableGoods.getType()); + curDisposableGoods.setUnit(disposableGoods.getUnit()); + curDisposableGoods.setUnitConvertCoefficient(disposableGoods.getUnitConvertCoefficient()); + } /** * 更新一次性物品定义 */ @Override public void updateDisposableGoods_TRANS_REQUIRED( - DisposableGoods diposableGoods) { - saveOrUpdate(diposableGoods); + DisposableGoods disposableGoods) { + // 如果是修改了物品类型,要做相应的修改 + String originalGoodsType = disposableGoods.getOriginalGoodsType(); + String goodsType = disposableGoods.getGoodsType(); // 如果修改了名称或者规则,同步修改其他关联的表 - String oldName = diposableGoods.getOrginalName(); - String oldSpecification = diposableGoods.getOrginalSpecification(); - String newName = diposableGoods.getName(); - String newSpecification = diposableGoods.getSpecification(); + String oldName = disposableGoods.getOrginalName(); + String oldSpecification = disposableGoods.getOrginalSpecification(); + String newName = disposableGoods.getName(); + String newSpecification = disposableGoods.getSpecification(); boolean nameChanged = false; + + DisposableGoods curDisposableGoods = getDisposableGoodsById_ForUpdate(disposableGoods.getId().toString()); + if(curDisposableGoods == null){ + throw new RuntimeException("物品已被删除!"); + } + setUpdatingProperties(curDisposableGoods, disposableGoods); + saveOrUpdate(curDisposableGoods); + if(!StringUtils.equals(originalGoodsType, goodsType)){ + if(DisposableGoods.TYPE_DIPOSABLEGOODS.equals(originalGoodsType)){ + changeGoodsToExpensiveDiposablegoods_internal(curDisposableGoods); + }else if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(originalGoodsType)){ + changeExpensiveDiposablegoodsToGoods_internal(curDisposableGoods); + } + } if(!StringUtils.isBlank(oldName) || !StringUtils.isBlank(newName)){ nameChanged = !StringUtils.equals(oldName, newName); } @@ -1152,6 +1191,11 @@ return (DisposableGoodsBatch) objectDao.getBySql( DisposableGoodsBatch.class.getSimpleName(), sql); } + + public DisposableGoodsBatch getDisposableGoodsBatchById(Long disposableGoodsBatchId){ + return (DisposableGoodsBatch) objectDao.getByProperty( + DisposableGoodsBatch.class.getSimpleName(),"id", disposableGoodsBatchId); + } public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsID( Long warehouseID, Long disposableGoodsID) { @@ -1578,6 +1622,12 @@ return retList; } + public List getDisposableGoodsBySql(String sql){ + List retList = objectDao.findBySql( + DisposableGoods.class.getSimpleName(), sql); + return retList; + } + public List getDisposableGoodsBySql_ForUpdate(String sql){ List retList = objectDao.findBySql_ForUpdate( DisposableGoods.class.getSimpleName(), sql); @@ -1650,18 +1700,32 @@ // 此时获取的是按照id升序排列的 return objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),queryString); } - - public List getDisposableGoodsByBatchBarcodes_ForUpdate(String warehouseID,Collection batchBarcodes){ + /** + * 获取一次性物品定义的列表 + * @param warehouseID 拼音或五笔码,或者是物品名称 + * @param batchBarcodes 是否能被科室申请的标志,值yes表示能 + * @return + */ + public List getDisposableGoodsByBatchBarcodes_ForUpdate(Collection batchBarcodes){ if(batchBarcodes == null || batchBarcodes.size()==0){ return null; } - if(StringUtils.isBlank(warehouseID)){ - return null; - } + List disposableGoodsIds = new LinkedList(); // 锁定的方式批量查询 + String selectDisposableGoodsIdsInBatchSql = String.format("select distinct(b.diposableGoods.id) from %s b where b.diposableGoods.id is not null and %s ",DisposableGoodsBatch.class.getSimpleName(), SqlUtils.getStringFieldInCollectionsPredicate("b.barcode", batchBarcodes)); + String selectDisposableGoodsIdsInExpensiveDisposablegoodsSql = String.format("select distinct(e.disposableGoodsID) from %s e where e.disposableGoodsID is not null and %s ", + ExpensiveDisposablegoods.class.getSimpleName(),SqlUtils.getStringFieldInCollectionsPredicate("e.barcode", batchBarcodes)); + List disposableGoodsIdsInBatch = (List)objectDao.findByHql(selectDisposableGoodsIdsInBatchSql); + if(disposableGoodsIdsInBatch != null){ + disposableGoodsIds.addAll(disposableGoodsIdsInBatch); + } + List disposableGoodsIdsInExpensiveDisposablegoods = (List)objectDao.findByHql(selectDisposableGoodsIdsInExpensiveDisposablegoodsSql); + if(disposableGoodsIdsInExpensiveDisposablegoods != null){ + disposableGoodsIds.addAll(disposableGoodsIdsInExpensiveDisposablegoods); + } String queryString = String - .format(" from %s po where po.id in(select b.diposableGoods.id from %s b where %s) order by po.id asc", - DisposableGoods.class.getSimpleName(),DisposableGoodsBatch.class.getSimpleName(),SqlUtils.getStringFieldInCollectionsPredicate("b.barcode", batchBarcodes)); + .format(" from %s po where %s order by po.id asc", + DisposableGoods.class.getSimpleName(),SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", disposableGoodsIds)); Session session = objectDao.getHibernateSession(); Query queryObject = session.createQuery(queryString); queryObject.setLockMode("po", LockMode.UPGRADE); @@ -1695,6 +1759,26 @@ // 此时获取的是按照id升序排列的 return objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(),sql); } + + public List getExpensiveDisposablegoodsByBarcodes( + Collection barcodes) { + if (barcodes == null || barcodes.size() == 0) { + return null; + } + String sql = String.format(" where %s ", SqlUtils + .getStringFieldInCollectionsPredicate("po.barcode", barcodes)); + return objectDao.findBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + } + public List getExpensiveDisposablegoodsByIds(Collection ids){ + if (ids == null || ids.size() == 0) { + return null; + } + String sql = String.format(" where %s ", SqlUtils + .getNonStringFieldInCollectionsPredicate("po.id", ids)); + return objectDao.findBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + } public List getDisposableGoodsBatchesByDisposableGoodsID(Long disposableGoodsID){ if(disposableGoodsID == null){ return null; @@ -1705,6 +1789,18 @@ // 此时获取的是按照id升序排列的 return objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(),sql); } + public List getExpensivediposablegoodsByDisposableGoodsBatchStockId(Long disposableGoodsBatchStockId){ + String sql = String + .format(" where %s and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsBatchStock.id", disposableGoodsBatchStockId), + SqlUtils.getStringFieldPredicate("po.status", ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE)); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } + public List getExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId){ + String sql = String + .format(" where %s and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsID", disposableGoodsId), + SqlUtils.getStringFieldPredicate("po.status", ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE)); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } // 在新的事务中执行删除。 public void deleteDiposableGoodsById_TRANS_NEW(String id) { // TODO @@ -1895,4 +1991,180 @@ } objectDao.saveOrUpdate(disposableGoodsBatch); } + + public void changeGoodsToExpensiveDiposablegoods_TRANS_NEW(String id) { + changeGoodsToExpensiveDiposablegoods_internal(id); + } + private void changeGoodsToExpensiveDiposablegoods_internal(String id) { + DisposableGoods disposableGoods = getDisposableGoodsById_ForUpdate(id); + if (disposableGoods == null) { + throw new RuntimeException("物品已被删除!"); + } + changeGoodsToExpensiveDiposablegoods_internal(disposableGoods); + } + private void changeGoodsToExpensiveDiposablegoods_internal(DisposableGoods disposableGoods) { + + if (disposableGoods.expensiveDiposablegoods()) { + // 已经是高值耗材,那么直接返回 + return; + } + List disposableGoodsBatchStocks = getDisposableGoodsBatchStocksByDisposableGoodsID(disposableGoods + .getId()); + + // 库存清0 + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + DisposableGoodsStock disposableGoodsStock = disposableGoodsBatchStock + .getDiposableGoods(); + disposableGoodsBatchStock.setStorage(0L); + disposableGoodsStock.setAmount(0L); + } + // 新建高值耗材 + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + List identifications = disposableGoodsBatchStock + .getIdentifications(); + if (identifications != null) { + for (DisposableGoodsIdentification disposableGoodsIdentification : identifications) { + Long amount = disposableGoodsIdentification.getAmount(); + if (amount <= 0) { + continue; + } + String conclusion = disposableGoodsIdentification + .getConclusion(); + Date entryDate = disposableGoodsIdentification + .getEntryDate(); + String identification = disposableGoodsIdentification + .getIdentification(); + newExpensivediposablegoods(disposableGoodsBatchStock, + amount, conclusion, entryDate, identification); + } + } + } + // 更改物品类型为高值耗材 + disposableGoods + .setGoodsType(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + objectDao.update(disposableGoods); + + // 删除标识号 + objectDao.executeUpdate(String.format( + " delete from %s where disposableGoodsID=%s ", + DisposableGoodsIdentification.class.getSimpleName(), disposableGoods.getId())); + } + + public void saveOrUpdate(ExpensiveDisposablegoods expensiveDiposablegoods){ + if(StringUtils.isBlank(expensiveDiposablegoods.getBarcode())){ + String barcode = serialNumManager + .getSerialNumberStr(SerialNum.TYPE_BARCODE); + expensiveDiposablegoods.setBarcode(barcode); + } + objectDao.saveOrUpdate(expensiveDiposablegoods); + } + public void changeExpensiveDiposablegoodsToGoods_TRANS_NEW(String id) { + changeExpensiveDiposablegoodsToGoods_internal(id); + } + + private void changeExpensiveDiposablegoodsToGoods_internal(String id) { + DisposableGoods disposableGoods = getDisposableGoodsById_ForUpdate(id); + if(disposableGoods == null){ + throw new RuntimeException("物品已被删除!"); + } + changeExpensiveDiposablegoodsToGoods_internal(disposableGoods); + } + private void changeExpensiveDiposablegoodsToGoods_internal(DisposableGoods disposableGoods) { + + if(!disposableGoods.expensiveDiposablegoods()){ + // 已经是普通物品,那么直接返回 + return; + } + + List disposableGoodsBatchStocks = getDisposableGoodsBatchStocksByDisposableGoodsID(disposableGoods.getId()); + // 库存清0 + if(disposableGoodsBatchStocks != null){ + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + DisposableGoodsStock disposableGoodsStock = disposableGoodsBatchStock + .getDiposableGoods(); + disposableGoodsBatchStock.setStorage(0L); + disposableGoodsStock.setAmount(0L); + } + } + + // 新建标识号 + if(disposableGoodsBatchStocks != null){ + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + + List expensiveDiposablegoodsList = getExpensivediposablegoodsByDisposableGoodsBatchStockId(disposableGoodsBatchStock.getId()); + String conclusion = ""; + Date entryDate = null; + String identification = ""; + Double price = 0.0; + int amount = 0; + if(expensiveDiposablegoodsList != null && !expensiveDiposablegoodsList.isEmpty()){ + ExpensiveDisposablegoods expensiveDiposablegoods = expensiveDiposablegoodsList.get(0); + conclusion = expensiveDiposablegoods.getConclusion(); + entryDate = expensiveDiposablegoods.getEntryDate(); + identification = expensiveDiposablegoods.getIdentification(); + price = expensiveDiposablegoods.getPrice(); + amount = expensiveDiposablegoodsList.size(); + } + if(amount == 0){ + continue; + } + DisposableGoodsIdentification disposableGoodsIdentification = new DisposableGoodsIdentification(); + disposableGoodsIdentification.setDisposableGoodsID(disposableGoodsBatchStock.getDisposableGoodsID()); + disposableGoodsIdentification.setDisposableGoodsBatchID(disposableGoodsBatchStock.getDisposableGoodsBatchID()); + disposableGoodsIdentification.setDisposableGoodsStockID(disposableGoodsBatchStock.getDisposableGoodsStockID()); + disposableGoodsIdentification.setBatchStock(disposableGoodsBatchStock); + disposableGoodsBatchStock.getIdentifications().add(disposableGoodsIdentification); + disposableGoodsIdentification.adjustAmount(amount); + disposableGoodsIdentification.setBatchStock(disposableGoodsBatchStock); + disposableGoodsIdentification.setConclusion(conclusion); + disposableGoodsIdentification.setEntryDate(entryDate); + disposableGoodsIdentification.setIdentification(identification); + disposableGoodsIdentification.setPrice(price); + disposableGoodsIdentification.setWarehouseID(disposableGoodsBatchStock.getWarehouseID()); + disposableGoodsIdentification.setWarehouseName(disposableGoodsBatchStock.getWarehouseName()); + objectDao.save(disposableGoodsIdentification); + } + } + disposableGoods.setGoodsType(DisposableGoods.TYPE_DIPOSABLEGOODS); + objectDao.update(disposableGoods); + + // 删除高值耗材,仅删除未发货,未领用的? + objectDao.executeUpdate(String.format(" delete from %s where disposableGoodsID=%s and invoiceId is null ", ExpensiveDisposablegoods.class.getSimpleName(),disposableGoods.getId())); + } + + public List newExpensivediposablegoods( + DisposableGoodsBatchStock disposableGoodsBatchStock,Long storage, + String conclusion, Date entryDate, String identification) { + List expensiveDiposablegoodsList = new LinkedList(); + if (storage == null) { + storage = 0L; + } + for (int i = 0; i < storage; ++i) { + ExpensiveDisposablegoods expensiveDiposablegoods = new ExpensiveDisposablegoods(); + expensiveDiposablegoods.setConclusion(conclusion); + expensiveDiposablegoods + .setDisposableGoodsBatchID(disposableGoodsBatchStock + .getDisposableGoodsBatchID()); + expensiveDiposablegoods + .setDisposableGoodsBatchStock(disposableGoodsBatchStock); + expensiveDiposablegoods + .setDisposableGoodsID(disposableGoodsBatchStock + .getDisposableGoodsID()); + expensiveDiposablegoods + .setDisposableGoodsStockID(disposableGoodsBatchStock + .getDisposableGoodsStockID()); + expensiveDiposablegoods.setEntryDate(entryDate); + expensiveDiposablegoods.setIdentification(identification); + expensiveDiposablegoods.setPrice(disposableGoodsBatchStock + .getCost()); + expensiveDiposablegoods.setWarehouseID(disposableGoodsBatchStock + .getWarehouseID()); + expensiveDiposablegoods.setWarehouseName(disposableGoodsBatchStock + .getWarehouseName()); + expensiveDiposablegoods.adjustAmount(1); + saveOrUpdate(expensiveDiposablegoods); + expensiveDiposablegoodsList.add(expensiveDiposablegoods); + } + return expensiveDiposablegoodsList; + } } Index: ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js =================================================================== diff -u -r12859 -r13519 --- ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js (.../returnGoodsRecordForm.js) (revision 12859) +++ ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js (.../returnGoodsRecordForm.js) (revision 13519) @@ -62,6 +62,7 @@ {name : 'disposableGoodsStockID'}, {name : 'disposableGoodsBatchID'}, {name : 'disposableGoodsBatchStockID'}, + {name : 'expensiveDisposablegoodsId'}, {name : 'amount'}, {name : 'amountCanReturn'}, {name : 'barcode'}, @@ -203,6 +204,45 @@ returnGoodsItemStore.add(returnGoodsItem); setTotalMoney(); } +// 添加高值一次性物品到grid +function addExpensiveDisposablegoodsItems(diposableGood){ + if(isExpensiveDisposablegoodsRepeat(diposableGood)){ + showResult("该物品已存在!"); + return; + } + + var tousseName = diposableGood.showName; + + var barcode = diposableGood.barcode; + var batchNumber = diposableGood.batchNumber; + var price = diposableGood.price; + var expDate = diposableGood.expDate; + var fluctuationPrice = diposableGood.fluctuationPrice; + +// alert(batch.disposableGoodsID+','+batch.disposableGoodsStockID+','+batch.disposableGoodsBatchID+','+batch.disposableGoodsBatchStockID+',') + //添加操作 + alert(diposableGood.expensiveDisposablegoodsId) + var returnGoodsItem = new addReturnGoodsItem({ + id : 0, + tousseName : tousseName, + disposableGoodsID : diposableGood.disposableGoodsID, + disposableGoodsStockID : diposableGood.disposableGoodsStockID, + disposableGoodsBatchID : diposableGood.disposableGoodsBatchID, + disposableGoodsBatchStockID : diposableGood.disposableGoodsBatchStockID, + expensiveDisposablegoodsId : diposableGood.expensiveDisposablegoodsId, + amount : 1, + amountCanReturn : 1, +// diposable : diposable, + barcode : barcode, + batchNumber : batchNumber, + isDelivery : '否', + price : price, + fluctuationPrice : fluctuationPrice, + expDate : expDate + }); + returnGoodsItemStore.add(returnGoodsItem); + setTotalMoney(); +} function setTotalMoney() { var totalMoney = 0.0; returnGoodsItemStore.each(function(record){ @@ -347,7 +387,11 @@ showResult(resultObj.errMsg); return; } - onLoadDiposableGoodsInfo(resultObj.diposableGood); + if(resultObj.diposableGood.goodsType == '高值耗材'){ + addExpensiveDisposablegoodsItems(resultObj.diposableGood); + }else{ + onLoadDiposableGoodsInfo(resultObj.diposableGood); + } }else{ showResult('输入的条码无效!'); } @@ -464,6 +508,22 @@ } return false; } +//验证一次性物品是否重复 +function isExpensiveDisposablegoodsRepeat(diposableGood){ + for ( var i = 0; i < returnGoodsItemStore.getCount(); i++) { + var record = returnGoodsItemStore.getAt(i); + var price = record.get('price'); + var fluctuationPrice = record.get('fluctuationPrice'); + var barcode = record.get('barcode'); + + if(barcode == diposableGood.barcode){ + return true; + break; + } + } + return false; +} + // 添加一次性物品 function onAddDiposableGoodsClick(){ // 判断批次和价格是否已选择 @@ -564,6 +624,7 @@ {name : 'disposableGoodsStockID'}, {name : 'disposableGoodsBatchID'}, {name : 'disposableGoodsBatchStockID'}, + {name : 'expensiveDisposablegoodsId'}, {name : 'amount'}, {name : 'barcode'}, {name : 'batchNumber'}, Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js =================================================================== diff -u -r13502 -r13519 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js (.../diposableGoodsView.js) (revision 13502) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js (.../diposableGoodsView.js) (revision 13519) @@ -17,6 +17,10 @@ fields : [ 'value'], data : [[CONSTANT_YES],[CONSTANT_NO]] }); + var goodsTypeStore = new Ext.data.SimpleStore( { + fields : [ 'value'], + data : [['普通物品'],['高值耗材']] + }); //能否被科室申请 var isApplicationMaterialStore = new Ext.data.SimpleStore( { @@ -74,6 +78,10 @@ id : 'originalFormParams' },{ xtype : 'hidden', + name : 'originalGoodsType', + id : 'originalGoodsType' + },{ + xtype : 'hidden', name : 'orginalName', id : 'orginalName' },{ @@ -178,6 +186,24 @@ labelWidth : 110, items : [{ xtype : 'combo', + fieldLabel : "物品类型", + valueField : 'value', + displayField : 'value', + store : goodsTypeStore, + forceSelection : true, + allowBlank : false, + mode : 'local', + triggerAction : 'all', + name : "goodsType", + id : "goodsType", + anchor : '95%' + }] + },{ + columnWidth : 1, + layout : 'form', + labelWidth : 110, + items : [{ + xtype : 'combo', fieldLabel : "类别", valueField : 'name', displayField : 'name', @@ -556,6 +582,8 @@ success : function(response, options) { var result = Ext.decode(response.responseText); if(result.stauts==1){ + var originalGoodsType = top.Ext.getCmp("originalGoodsType").getValue(); + var goodsType = top.Ext.getCmp("goodsType").getValue(); var orginalName = top.Ext.getCmp("orginalName").getValue(); var orginalSpecification = top.Ext.getCmp("orginalSpecification").getValue(); var name = top.Ext.getCmp("name").getValue(); @@ -567,7 +595,11 @@ msg = "是否确定修改一次性物品名称?" }else if(!stringLooksEquals(orginalSpecification,specification)){ msg = "是否确定修改一次性物品规格?" - }else{ + } + if(!stringLooksEquals(originalGoodsType,goodsType)){ + msg += "是否确定更改物品类型?" + } + if(msg == ''){ submitForSaveDisposableGoods(); return; } @@ -677,8 +709,8 @@ }else{ var ids = ""; for(var i = 0,len=records.length;i expensiveDisposablegoods = new LinkedList(); public static final String DIPOSABLE_YES = "是";//一次性物品 public static final String DIPOSABLE_NO = "否"; //包 - + @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { @@ -94,6 +104,14 @@ this.diposable = diposable; } + public String getDisposableGoodsType() { + return disposableGoodsType; + } + + public void setDisposableGoodsType(String disposableGoodsType) { + this.disposableGoodsType = disposableGoodsType; + } + public Integer getReturnedNum() { return returnedNum; } @@ -110,6 +128,14 @@ this.barcode = barcode; } + public String getBatchNumber() { + return batchNumber; + } + + public void setBatchNumber(String batchNumber) { + this.batchNumber = batchNumber; + } + public Double getSettlementPrice() { return settlementPrice; } @@ -197,5 +223,20 @@ public void setDisposableGoodsBatchStockId(Long disposableGoodsBatchStockId) { this.disposableGoodsBatchStockId = disposableGoodsBatchStockId; } - + + @Transient + public List getExpensiveDisposablegoods() { + return expensiveDisposablegoods; + } + + public void setExpensiveDisposablegoods( + List expensiveDisposablegoods) { + this.expensiveDisposablegoods = expensiveDisposablegoods; + } + public boolean expensiveDisposablegoods() { + if (StringUtils.equals(disposableGoodsType, DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS)) { + return true; + } + return false; + } } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/DiposableGoodsTableManager.java =================================================================== diff -u -r13089 -r13519 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/DiposableGoodsTableManager.java (.../DiposableGoodsTableManager.java) (revision 13089) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dwr/table/DiposableGoodsTableManager.java (.../DiposableGoodsTableManager.java) (revision 13519) @@ -4,9 +4,12 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import net.sf.json.JSONObject; + import org.apache.commons.lang.StringUtils; import org.directwebremoting.util.Logger; @@ -534,4 +537,62 @@ } return code; } + // 转换类型 + public String changeGoodsToExpensiveDiposablegoods(String ids) { + JSONObject obj = new JSONObject(); + if(StringUtils.isNotBlank(ids)){ + obj.put("success", false); + obj.put("msg", "要转换的id不能为空"); + return obj.toString(); + } + String[] idsArray = ids.split(","); + List msgs = new LinkedList(); + int successCount = 0; + for (String id : idsArray) { + try { + diposableGoodsManager.changeGoodsToExpensiveDiposablegoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + msgs.add(e.getMessage()); + } + } + if(successCount > 0){ + obj.put("success", true); + }else{ + obj.put("success", false); + } + obj.put("successCount", successCount); + obj.put("msg", StringUtils.join(msgs, ",")); + return obj.toString(); + } + + public String changeExpensiveDiposablegoodsToGoods(String ids) { + JSONObject obj = new JSONObject(); + if(StringUtils.isNotBlank(ids)){ + obj.put("success", false); + obj.put("msg", "要转换的id不能为空"); + return obj.toString(); + } + String[] idsArray = ids.split(","); + List msgs = new LinkedList(); + int successCount = 0; + for (String id : idsArray) { + try { + diposableGoodsManager.changeExpensiveDiposablegoodsToGoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + msgs.add(e.getMessage()); + } + } + if(successCount > 0){ + obj.put("success", true); + }else{ + obj.put("success", false); + } + obj.put("successCount", successCount); + obj.put("msg", StringUtils.join(msgs, ",")); + return obj.toString(); + } } Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java =================================================================== diff -u -r13461 -r13519 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 13461) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 13519) @@ -33,6 +33,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.assestmanagement.TousseStock; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -388,6 +389,8 @@ returnDiposableGoodsItem.setSendOutDiposableGoodsItemID(sendOutDiposableGoodsItem.getId());// 和发货明细ID关联 returnDiposableGoodsItem.setReturnGoodsItemID(returnGoodsItem.getId());// 和退货明细汇总关联 returnDiposableGoodsItem.setReturnGoodsRecordID(returnGoodsItem.getReturnGoodsRecord().getId());// 和退货记录关联 + returnDiposableGoodsItem.setPrice(price); + returnDiposableGoodsItem.setFluctuationPrice(fluctuationPrice.doubleValue()); // TODO 校验关联信息 if(!returnDiposableGoodsItem.isAssociatedInfoValidForReturn()){ throw new RuntimeException("关联信息不正确!"); @@ -408,15 +411,122 @@ // 设置金额汇总 returnGoodsItem.setSettlementPrice(settlementPrice); } + // 高值耗材退货 + private void returnExpensiveDisposablegoods(Long warehouseID,String depart,ReturnGoodsItem returnGoodsItem, + Map idToDisposableGoodsMap, + Map disposableGoodsIDToDisposableGoodsStockMap, + Map idToDisposableGoodsStockMap, + Map idToExpensiveDisposablegoodsMap, + Map barcodeToExpensiveDisposablegoodsMap, + Map idToDisposableGoodsBatchMap, + Map idToDisposableGoodsBatchStockMap, + List returnDiposableGoodsItems){ + + Long disposableGoodsID = returnGoodsItem.getDisposableGoodsID(); + Long expensiveDisposablegoodsId = returnGoodsItem.getExpensiveDisposablegoodsId(); + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + Long disposableGoodsBatchStockID = returnGoodsItem.getDisposableGoodsBatchStockID(); + Double price = returnGoodsItem.getPrice(); + String diposableGoodsShowName = disposableGoods.getShowName(); + if(price == null){ + throw new RuntimeException("金额不能为空!"); + } + if(expensiveDisposablegoodsId == null){ + throw new RuntimeException("高值耗材id不能为空!"); + } + ExpensiveDisposablegoods expensiveDisposablegoods = idToExpensiveDisposablegoodsMap.get(expensiveDisposablegoodsId); + if(expensiveDisposablegoods == null){ + throw new RuntimeException(String.format("id为%s的高值耗材已被删除!", expensiveDisposablegoodsId)); + } + String barcode = expensiveDisposablegoods.getBarcode(); + if(!expensiveDisposablegoods.delivered()){ + throw new RuntimeException(String.format("高值耗材 %s 状态为 %s,不能退货!", diposableGoodsShowName,expensiveDisposablegoods.getStatus())); + } + expensiveDisposablegoods.setStatus(ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE); + String batchNumber = returnGoodsItem.getBatchNumber(); + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsBatchStockID); + + long amountToReturn = returnGoodsItem.getAmountToReturn();// 待退货数量 + if(amountToReturn != 1){ + throw new RuntimeException("高值耗材退货数量必须为1!"); + } + BigDecimal settlementPrice = new BigDecimal(0.00); + + String sql = String.format(" where %s", SqlUtils.getLongFieldPredicate("po.expensiveDisposablegoodsId", expensiveDisposablegoodsId)); + DiposableGoodsItem sendOutDiposableGoodsItem = (DiposableGoodsItem)objectDao.getBySql(DiposableGoodsItem.class.getSimpleName(), sql);// 发货明细 + if(sendOutDiposableGoodsItem == null){ + throw new RuntimeException(String.format("未找到高值耗材 %s(条码=%s) 的发货明细记录,不能退货!", diposableGoodsShowName,barcode)); + } + Integer amount = sendOutDiposableGoodsItem.getAmount(); + Long returnedAmount = sendOutDiposableGoodsItem.getReturnedAmount(); + if(returnedAmount == null){ + returnedAmount = 0L;// 兼容旧数据 + } + if(amount <= returnedAmount){ + throw new RuntimeException(String.format("高值耗材 %s(条码=%s) 的发货明细记录数量异常!", diposableGoodsShowName,barcode)); + } + Long sendOutItemAmountCanReturn = amount - returnedAmount;// 发货项可退货的数量 + Long curAmountCanReturn = Math.min(sendOutItemAmountCanReturn, amountToReturn);// 当前可退货数量 + + sendOutDiposableGoodsItem.setReturnedAmount(returnedAmount + curAmountCanReturn);// 设置发货明细的已退货数量 + returnGoodsItem.setReturnedAmount(returnGoodsItem.getReturnedAmount() + curAmountCanReturn);// 设置退货汇总项的已退货数量 + // 一次性物品库存修改 + Long amountChange = curAmountCanReturn; + expensiveDisposablegoods.adjustAmount(amountChange); + objectDao.update(expensiveDisposablegoods); + objectDao.update(expensiveDisposablegoods.getDisposableGoodsBatchStock()); + objectDao.update(expensiveDisposablegoods.getDisposableGoodsBatchStock().getDiposableGoods()); + + // 计算总价 + BigDecimal fluctuationPrice = new BigDecimal( + supplyRoomConfigManager + .getDisposableGoodsFluctuationPrice(expensiveDisposablegoods + .getPrice())).setScale(2, + BigDecimal.ROUND_HALF_UP); + // 发货物品单项总价 + BigDecimal itemPrice = fluctuationPrice.multiply( + new BigDecimal(curAmountCanReturn)).setScale(2, + BigDecimal.ROUND_HALF_UP); + + // 发货物品统计总价 + settlementPrice = settlementPrice.add(itemPrice).setScale(2, + BigDecimal.ROUND_HALF_UP); + // 一次性物品入库项 + DiposableGoodsItem returnDiposableGoodsItem = new DiposableGoodsItem(sendOutDiposableGoodsItem);// 新建退货明细项 + returnDiposableGoodsItem.setInvoice(null);// 不能和发货单关联 + returnDiposableGoodsItem.setInvoiceItemID(null);// 不和InvoiceItem关联 + returnDiposableGoodsItem.setReturnedAmount(0L); + returnDiposableGoodsItem.setDisposableGoodsID(sendOutDiposableGoodsItem.getDisposableGoodsID()); + returnDiposableGoodsItem.setDisposableGoodsStockID(sendOutDiposableGoodsItem.getDisposableGoodsStockID()); + returnDiposableGoodsItem.setDisposableGoodsBatchID(sendOutDiposableGoodsItem.getDisposableGoodsBatchID()); + returnDiposableGoodsItem.setDisposableGoodsBatchStockID(sendOutDiposableGoodsItem.getDisposableGoodsBatchStockID()); + returnDiposableGoodsItem.setExpensiveDisposablegoodsId(expensiveDisposablegoodsId); + returnDiposableGoodsItem.setIdentificationID(sendOutDiposableGoodsItem.getIdentificationID());// 和标识号ID关联 + returnDiposableGoodsItem.setSendOutDiposableGoodsItemID(sendOutDiposableGoodsItem.getId());// 和发货明细ID关联 + returnDiposableGoodsItem.setReturnGoodsItemID(returnGoodsItem.getId());// 和退货明细汇总关联 + returnDiposableGoodsItem.setReturnGoodsRecordID(returnGoodsItem.getReturnGoodsRecord().getId());// 和退货记录关联 + returnDiposableGoodsItem.setPrice(price); + returnDiposableGoodsItem.setFluctuationPrice(fluctuationPrice.doubleValue()); + // TODO 校验关联信息 + if(!returnDiposableGoodsItem.isAssociatedInfoValidForReturnExpensiveDisposablegoods()){ + throw new RuntimeException("关联信息不正确!"); + } + returnDiposableGoodsItem.setReturnedAmount(curAmountCanReturn); + objectDao.update(sendOutDiposableGoodsItem); + returnDiposableGoodsItems.add(returnDiposableGoodsItem); + // 设置金额汇总 + returnGoodsItem.setSettlementPrice(settlementPrice); + } // 汇总退货信息 private void summaryReturnDiposableGoodsInfo(ReturnGoodsRecord returnGoodsRecord,Set disposableGoodsIDsSet, - Set disposableGoodsStockIDsSet, Set disposableGoodsBatchIDsSet,Set disposableGoodsBatchStockIDSet, + Set disposableGoodsStockIDsSet,Set expensiveDisposablegoodsIdsSet, Set disposableGoodsBatchIDsSet,Set disposableGoodsBatchStockIDSet, Set disposableGoodsBatchNumberSet,Set disposableGoodsBarcodesSet, Set identificationIDsSet){ for(ReturnGoodsItem returnGoodsItem : returnGoodsRecord.getReturnGoodsItems()){ Long disposableGoodsID = returnGoodsItem.getDisposableGoodsID(); Long disposableGoodsStockID = returnGoodsItem.getDisposableGoodsStockID(); Long disposableGoodsBatchID = returnGoodsItem.getDisposableGoodsBatchID(); Long disposableGoodsBatchStockID = returnGoodsItem.getDisposableGoodsBatchStockID(); + Long expensiveDisposablegoodsId = returnGoodsItem.getExpensiveDisposablegoodsId(); String batchNumber = returnGoodsItem.getBatchNumber(); String barcode = returnGoodsItem.getBarcode(); if(!DatabaseUtil.isPoIdValid(disposableGoodsID)){ @@ -443,6 +553,9 @@ disposableGoodsBatchStockIDSet.add(disposableGoodsBatchStockID); disposableGoodsBatchNumberSet.add(batchNumber); disposableGoodsBarcodesSet.add(barcode); + if(expensiveDisposablegoodsId != null){ + expensiveDisposablegoodsIdsSet.add(expensiveDisposablegoodsId); + } } } @@ -451,13 +564,16 @@ Long warehouseID, Set disposableGoodsIDsSet, Set diposableGoodsStockIDsSet, + Set expensiveDisposablegoodsIdsSet, Set disposableGoodsBatchIDsSet, Set disposableGoodsBatchStockIDsSet, Set batchNumbersSet, Set identificationIdsSet, Map idToDiposableGoodsMap, Map disposableGoodsIDToDisposableGoodsStockMap, Map idToDisposableGoodsStockMap, + Map idToExpensiveDisposablegoodsMap, + Map barcodeToExpensiveDisposablegoodsMap, Map idToDisposableGoodsBatchMap, Map idToBatchStockMap, Map idToIdentificationMap) { @@ -487,7 +603,16 @@ disposableGoodsStock.getDisposableGoodsID(), disposableGoodsStock); } - + List expensiveDisposablegoodsList = diposableGoodsManager + .getExpensiveDisposablegoodsByIds(expensiveDisposablegoodsIdsSet); + if (expensiveDisposablegoodsList != null) { + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + barcodeToExpensiveDisposablegoodsMap.put( + expensiveDisposablegoods.getBarcode(), + expensiveDisposablegoods); + idToExpensiveDisposablegoodsMap.put(expensiveDisposablegoods.getId(), expensiveDisposablegoods); + } + } // 加载所有的批次定义 String getDisposableGoodsBatchSql = String.format(" where %s ", SqlUtils.getNonStringFieldInCollectionsPredicate( @@ -582,35 +707,48 @@ Set disposableGoodsBarcodesSet = new HashSet(); Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 + Set expensiveDisposablegoodsIdsSet = new HashSet(); Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 Set identificationIDsSet = new HashSet();// 标识号id集合 Map idToDisposableGoodsMap = new HashMap(); Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); Map idToDisposableGoodsStockMap = new HashMap(); + Map idToExpensiveDisposablegoodsMap = new HashMap(); + Map barcodeToExpensiveDisposablegoodsMap = new HashMap(); Map idToDisposableGoodsBatchMap = new HashMap(); Map idToDisposableGoodsBatchStockMap = new HashMap(); Map idToIdentificationMap = new HashMap(); List returnDiposableGoodsItems = new LinkedList();// 退货明细 - summaryReturnDiposableGoodsInfo(returnGoodsRecord, disposableGoodsIDsSet, disposableGoodsStockIDsSet, disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, disposableGoodsBarcodesSet, identificationIDsSet); + summaryReturnDiposableGoodsInfo(returnGoodsRecord, disposableGoodsIDsSet, disposableGoodsStockIDsSet, expensiveDisposablegoodsIdsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, disposableGoodsBarcodesSet, identificationIDsSet); // 锁定一次性物品 - lockAndGetDiposableGoodsResources(warehouseID, disposableGoodsIDsSet, disposableGoodsStockIDsSet, disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap); + lockAndGetDiposableGoodsResources(warehouseID, disposableGoodsIDsSet, disposableGoodsStockIDsSet, expensiveDisposablegoodsIdsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap,idToExpensiveDisposablegoodsMap,barcodeToExpensiveDisposablegoodsMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap); // 保存退货记录 saveOrUpdate(returnGoodsRecord); // 开始退货处理 for(ReturnGoodsItem returnGoodsItem : returnGoodsRecord.getReturnGoodsItems()){ + Long disposableGoodsID = returnGoodsItem.getDisposableGoodsID(); String barcode = returnGoodsItem.getBarcode(); + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + if(disposableGoods == null){ + throw new RuntimeException(String.format("未找到id为%s的物品!", disposableGoods)); + } Long disposableGoodsBatchStockID = returnGoodsItem.getDisposableGoodsBatchStockID(); DisposableGoodsBatchStock disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); if(disposableGoodsBatchStock == null){ throw new RuntimeException("批次库存不能为空!"); } // 关联批次 returnGoodsItem.setDiposableGoodBatchStock(disposableGoodsBatchStock); - returnDiposableGoods(warehouseID,depart,returnGoodsItem,idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap,idToDisposableGoodsBatchStockMap,returnDiposableGoodsItems); + if(disposableGoods.expensiveDiposablegoods()){ + returnExpensiveDisposablegoods(warehouseID,depart,returnGoodsItem,idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToExpensiveDisposablegoodsMap,barcodeToExpensiveDisposablegoodsMap,idToDisposableGoodsBatchMap,idToDisposableGoodsBatchStockMap,returnDiposableGoodsItems); + }else{ + returnDiposableGoods(warehouseID,depart,returnGoodsItem,idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap,idToDisposableGoodsBatchStockMap,returnDiposableGoodsItems); + } + } // 创建发货单 createInvoicePlan(returnGoodsRecord); Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java =================================================================== diff -u -r13061 -r13519 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 13061) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 13519) @@ -26,10 +26,14 @@ import com.forgon.component.grid.GridManager; import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; 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.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; @@ -77,6 +81,8 @@ private ObjectDao objectDao; + private BarcodeManager barcodeManager; + public void setSupplyRoomConfigManager( SupplyRoomConfigManager supplyRoomConfigManager) { this.supplyRoomConfigManager = supplyRoomConfigManager; @@ -114,6 +120,10 @@ this.objectDao = objectDao; } + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + private String ids; public void setIds(String ids) { @@ -166,7 +176,7 @@ Long disposableGoodsStockID = obj.optLong("disposableGoodsStockID"); Long disposableGoodsBatchID = obj.optLong("disposableGoodsBatchID"); Long disposableGoodsBatchStockID = obj.optLong("disposableGoodsBatchStockID"); - Long batchID = obj.optLong("batchID"); + Long expensiveDisposablegoodsId = obj.optLong("expensiveDisposablegoodsId"); String batchNumber = obj.optString("batchNumber"); String barcode = obj.optString("barcode"); Double price = obj.optDouble("price"); @@ -180,6 +190,7 @@ returnGoodsItem.setDisposableGoodsStockID(disposableGoodsStockID); returnGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchID); returnGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + returnGoodsItem.setExpensiveDisposablegoodsId(expensiveDisposablegoodsId); returnGoodsItem.setBarcode(barcode); returnGoodsItem.setBatchNumber(batchNumber); returnGoodsItem.setTousseName(tousseName); @@ -353,19 +364,30 @@ if (StringUtils.isBlank(barcode)) { throw new RuntimeException("条码不能为空!"); } - String depart = StrutsParamUtils.getPraramValue("depart", ""); - if(StringUtils.isBlank(depart)){ - throw new RuntimeException("部门不能为空!"); + BarcodeDevice barcodeDevice = barcodeManager + .getBarcodeByBarcode(barcode); + if (barcodeDevice == null){ + throw new RuntimeException("查无此物品"); } - if(StringUtils.isBlank(warehouseID)){ - throw new RuntimeException("仓库不能为空!"); + Map diposableGood = null; + if(barcodeDevice instanceof ExpensiveDisposablegoods){// 高值耗材处理 + diposableGood = buildExpensiveDisposablegoodsInfo((ExpensiveDisposablegoods)barcodeDevice); + }else{ + String depart = StrutsParamUtils.getPraramValue("depart", ""); + if(StringUtils.isBlank(depart)){ + throw new RuntimeException("部门不能为空!"); + } + if(StringUtils.isBlank(warehouseID)){ + throw new RuntimeException("仓库不能为空!"); + } + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodsManager + .getByWarehouseIDAndBarcode(Long.valueOf(warehouseID),barcode); + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("该批次没有可退货的物品!"); + } + diposableGood = buildDiposableGoodInfo(warehouseID,depart,disposableGoodsBatchStock); } - DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodsManager - .getByWarehouseIDAndBarcode(Long.valueOf(warehouseID),barcode); - if(disposableGoodsBatchStock == null){ - throw new RuntimeException("该批次没有可退货的物品!"); - } - Map diposableGood = buildDiposableGoodInfo(warehouseID,depart,disposableGoodsBatchStock); + returnMsg.put("success", true); returnMsg.put("diposableGood", diposableGood); @@ -403,6 +425,7 @@ diposableGood.put("disposableGoodsBatchID", disposableGoodsBatchStock.getDisposableGoodsBatchID()); diposableGood.put("disposableGoodsBatchStockID", disposableGoodsBatchStock.getId()); diposableGood.put("id", disposableGoodsBatchStock.getDiposableGoods().getId()); + diposableGood.put("goodsType", DisposableGoods.TYPE_DIPOSABLEGOODS); diposableGood.put("barcode", barcode); diposableGood.put("showName", showName); diposableGood.put("batchNumber", batchNumber); @@ -421,6 +444,43 @@ diposableGood.put("priceAmountList", priceAmountList); return diposableGood; } + private Map buildExpensiveDisposablegoodsInfo(ExpensiveDisposablegoods expensiveDisposablegoods) { + Map diposableGood = new HashMap(); + Double cost = expensiveDisposablegoods.getPrice(); + String fluctuationPrice = cost.toString(); + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + double f = config.getDiposablePriceFluctuation();// 浮动价格 + if (f > 0) { + double fPrice = MathTools.mul(cost, f, 2); + fluctuationPrice = "" + fPrice; + } + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + String barcode = expensiveDisposablegoods.getBarcode(); + String batchNumber = disposableGoodsBatchStock.getBatchNumber(); + String showName = disposableGoodsBatchStock.getDiposableGoods() + .getShowName(); + diposableGood.put("disposableGoodsID", disposableGoodsBatchStock.getDisposableGoodsID()); + diposableGood.put("disposableGoodsStockID", disposableGoodsBatchStock.getDiposableGoods().getId()); + diposableGood.put("disposableGoodsBatchID", disposableGoodsBatchStock.getDisposableGoodsBatchID()); + diposableGood.put("disposableGoodsBatchStockID", disposableGoodsBatchStock.getId()); + diposableGood.put("expensiveDisposablegoodsId", expensiveDisposablegoods.getId()); + diposableGood.put("id", disposableGoodsBatchStock.getDiposableGoods().getId()); + diposableGood.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + diposableGood.put("barcode", barcode); + diposableGood.put("showName", showName); + diposableGood.put("batchNumber", batchNumber); + diposableGood.put("cost", cost); + diposableGood.put("price", cost); + diposableGood.put("expDate", FastDateFormat.getInstance("yyyy-MM-dd") + .format(disposableGoodsBatchStock.getExpDate())); + diposableGood.put("fluctuationPrice", fluctuationPrice); + Long storage = disposableGoodsBatchStock.getStorage(); + if (storage == null || storage < 0) { + storage = 0l; + } + diposableGood.put("storage", storage); + return diposableGood; + } public String loadDiposableGoodsByNameAndBatchNumber() { Map returnMsg = new HashMap(); Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/disposableGoodsStockView.js =================================================================== diff -u -r13445 -r13519 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/disposableGoodsStockView.js (.../disposableGoodsStockView.js) (revision 13445) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/disposableGoodsStockView.js (.../disposableGoodsStockView.js) (revision 13519) @@ -352,7 +352,7 @@ cm : new top.Ext.grid.ColumnModel([selectModel, {header : "id",dataIndex : 'id',hidden : true}, {header : "条码",width : 90,dataIndex : 'barcode',menuDisabled:true}, - {header : "批次",width : 90,dataIndex : 'batchNumber',menuDisabled:true}, + {header : "批次",width : 90,dataIndex : 'batchNumber',menuDisabled:true,renderer : batchRenderer}, {header : "价格",width : 50,dataIndex : 'cost',menuDisabled:true}, {header : "库存",width : 50,dataIndex : 'storage',menuDisabled:true}, {header : "失效期",width : 90,dataIndex : 'expDate',renderer:myDateFormat,menuDisabled:true}, @@ -742,6 +742,11 @@ } return "" + v + ""; } +function batchRenderer(v, p, record){ + return v; + var data = record.data; + return "" + v + ""; +} Ext.onReady(function() { Ext.QuickTips.init(); Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java =================================================================== diff -u -r13299 -r13519 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 13299) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 13519) @@ -30,6 +30,7 @@ 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.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; @@ -146,7 +147,14 @@ public String loadDiposableGoods() { StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); - + String id = StrutsParamUtils.getPraramValue("id", ""); + DisposableGoods diposableGoods = null; + if (DatabaseUtil.isPoIdValid(id)) { + diposableGoods = diposableGoodsManager.getDisposableGoodsById(id); + } + if(diposableGoods == null){ + diposableGoods = new DisposableGoods(); + } Map map = new HashMap(); map.put("success", true); map.put("data", diposableGoods); @@ -254,33 +262,66 @@ String idStr = StrutsParamUtils.getPraramValue("diposableIds", ""); StringBuffer sb = new StringBuffer(); if (StringUtils.isNotBlank(idStr)) { - String[] ids = idStr.split(";"); + String sql = String.format(" where po.id in(%s)", idStr); + List disposableGoodsList = diposableGoodsManager.getDisposableGoodsBySql(sql); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - for (String id : ids) { - List disposableGoodsBatchStockList = diposableGoodBatchStockManager - .getDisposableGoodsBatchStockByDisposableGoodsId(id, false); - if (disposableGoodsBatchStockList != null) { - for (DisposableGoodsBatchStock batchStock : disposableGoodsBatchStockList) { - if (sb.length() > 0) { - sb.append(";"); + if(disposableGoodsList != null){ + for (DisposableGoods disposableGoods : disposableGoodsList) { + if(disposableGoods.expensiveDiposablegoods()){// 高值耗材的打印 + List expensiveDisposablegoodsList = diposableGoodsManager.getExpensivediposablegoodsByDisposableGoodsId(disposableGoods.getId()); + if(expensiveDisposablegoodsList == null){ + continue; } - String expDate = ""; - if (batchStock.getExpDate() != null) { - expDate = sdf.format(batchStock.getExpDate()); - } + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (disposableGoodsBatchStock.getExpDate() != null) { + expDate = sdf.format(disposableGoodsBatchStock.getExpDate()); + } - String specification = ""; - if (batchStock.getDiposableGoods().getSpecification() != null) { - specification = batchStock.getDiposableGoods() - .getSpecification().trim(); + String specification = ""; + if (disposableGoods.getSpecification() != null) { + specification = disposableGoods.getSpecification().trim(); + } + + sb.append(disposableGoods.getName() + + "#&" + expensiveDisposablegoods.getBarcode() + "#&" + + expDate + "#&" + disposableGoodsBatchStock.getSupplierName() + + "#&" + disposableGoodsBatchStock.getBatchNumber() + "#&" + + specification); } + }else{ + List disposableGoodsBatchStockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(disposableGoods.getId().toString(), false); + if (disposableGoodsBatchStockList == null) { + continue; + } + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStockList) { + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (disposableGoodsBatchStock.getExpDate() != null) { + expDate = sdf.format(disposableGoodsBatchStock.getExpDate()); + } - sb.append(batchStock.getDiposableGoods().getName() - + "#&" + batchStock.getBarcode() + "#&" - + expDate + "#&" + batchStock.getSupplierName() - + "#&" + batchStock.getBatchNumber() + "#&" - + specification); + String specification = ""; + if (disposableGoodsBatchStock.getDiposableGoods().getSpecification() != null) { + specification = disposableGoodsBatchStock.getDiposableGoods() + .getSpecification().trim(); + } + + sb.append(disposableGoodsBatchStock.getDiposableGoods().getName() + + "#&" + disposableGoodsBatchStock.getBarcode() + "#&" + + expDate + "#&" + disposableGoodsBatchStock.getSupplierName() + + "#&" + disposableGoodsBatchStock.getBatchNumber() + "#&" + + specification); + } } + } } } @@ -719,12 +760,7 @@ @Override public void prepare() { - String id = StrutsParamUtils.getPraramValue("id", ""); - if (StringUtils.isNotBlank(id) && !id.equals("0")) { - diposableGoods = diposableGoodsManager.getDisposableGoodsById(id); - } else { - diposableGoods = new DisposableGoods(); - } + diposableGoods = new DisposableGoods(); } @Override Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/ExpensiveDisposablegoods.java (revision 13519) @@ -0,0 +1,196 @@ +/** + * + */ +package com.forgon.disinfectsystem.entity.assestmanagement; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Transient; + +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.tools.db.DatabaseUtil; + +/** + * @author jeffli + * + */ +@Entity +public class ExpensiveDisposablegoods extends BarcodeDevice { + + public static final String STATUS_IN_WAREHOUSE = "已入库"; + public static final String STATUS_DELIVERED = "已发货"; + public static final String STATUS_RECEIVED = "已领用"; + public static final String STATUS_RETURNED = "已退货"; + private String identification; // 标识号 + + private Date entryDate; // 入库时间 + + private Double price; // 价格 + + private DisposableGoodsBatchStock disposableGoodsBatchStock; + + private String conclusion;// 验收结果 + + private Long warehouseID;// 仓库ID + private String warehouseName;// 仓库名字 + + private Long disposableGoodsID;// 一次性物品id + private Long disposableGoodsStockID;// 一次性物品库存id + private Long disposableGoodsBatchID;// 批次id + + private Long invoiceItemId;// 明细汇总的Id + private Long invoiceId;// 发货单Id + + private String status = STATUS_IN_WAREHOUSE; + + public ExpensiveDisposablegoods() { + super(); + setType(BarcodeDevice.BARCODE_TYPE_EXPENSIVEDIPOSABLEGOODS); + } + + public String getIdentification() { + return identification; + } + + public void setIdentification(String identification) { + this.identification = identification; + } + + public Date getEntryDate() { + return entryDate; + } + + public void setEntryDate(Date entryDate) { + this.entryDate = entryDate; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + @ManyToOne + @JoinColumn(name = "batchStock_id") + public DisposableGoodsBatchStock getDisposableGoodsBatchStock() { + return disposableGoodsBatchStock; + } + + public void setDisposableGoodsBatchStock( + DisposableGoodsBatchStock disposableGoodsBatchStock) { + this.disposableGoodsBatchStock = disposableGoodsBatchStock; + } + + public String getConclusion() { + return conclusion; + } + + public void setConclusion(String conclusion) { + this.conclusion = conclusion; + } + + public Long getWarehouseID() { + return warehouseID; + } + + public void setWarehouseID(Long warehouseID) { + this.warehouseID = warehouseID; + } + + public String getWarehouseName() { + return warehouseName; + } + + public void setWarehouseName(String warehouseName) { + this.warehouseName = warehouseName; + } + + public Long getDisposableGoodsID() { + return disposableGoodsID; + } + + public void setDisposableGoodsID(Long disposableGoodsID) { + this.disposableGoodsID = disposableGoodsID; + } + + public Long getDisposableGoodsStockID() { + return disposableGoodsStockID; + } + + public void setDisposableGoodsStockID(Long disposableGoodsStockID) { + this.disposableGoodsStockID = disposableGoodsStockID; + } + + public Long getDisposableGoodsBatchID() { + return disposableGoodsBatchID; + } + + public void setDisposableGoodsBatchID(Long disposableGoodsBatchID) { + this.disposableGoodsBatchID = disposableGoodsBatchID; + } + + public Long getInvoiceItemId() { + return invoiceItemId; + } + + public void setInvoiceItemId(Long invoiceItemId) { + this.invoiceItemId = invoiceItemId; + } + + public Long getInvoiceId() { + return invoiceId; + } + + public void setInvoiceId(Long invoiceId) { + this.invoiceId = invoiceId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + @Transient + public boolean isAssociatedInfoValidForInvoice() { + if (!DatabaseUtil.isPoIdValid(invoiceId)) { + return false; + } + if (!DatabaseUtil.isPoIdValid(invoiceItemId)) { + return false; + } + return true; + } + public boolean inWarehouse() { + if (STATUS_IN_WAREHOUSE.equals(status)) { + return true; + } + return false; + } + + public boolean delivered() { + if (STATUS_DELIVERED.equals(status)) { + return true; + } + return false; + } + + public boolean received() { + if (STATUS_RECEIVED.equals(status)) { + return true; + } + return false; + } + + // 调整库存 + public void adjustAmount(long amountChange) { + // 调整批次库存 + disposableGoodsBatchStock.adjustAmount(amountChange); + } +} Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java =================================================================== diff -u -r13490 -r13519 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 13490) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 13519) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.diposablegoods.service; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; @@ -11,8 +12,9 @@ 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.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.vo.PriceAmount; public interface DiposableGoodsManager { @@ -35,6 +37,7 @@ public DisposableGoodsBatchStock getDisposableGoodsStockByBatchNumber(Long warehouseID,Long disposableGoodsID, String batchNumber); public DisposableGoodsBatch getDisposableGoodsBatchByBatchNumber(Long disposableGoodsID, String batchNumber) ; + public DisposableGoodsBatch getDisposableGoodsBatchById(Long disposableGoodsBatchId) ; public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsID(Long warehouseID,Long disposableGoodsID); public DisposableGoodsBatchStock getByWarehouseIDAndBarcode(Long warehouseID,String barcode); @@ -97,6 +100,8 @@ public List getDiposableGoodsBySql_ForUpdate(String sql); + public List getDisposableGoodsBySql(String sql); + public List getDisposableGoodsBySql_ForUpdate(String sql); public List getDisposableGoodsStockByBatchBarcodes(String warehouseID,Collection barcodes); @@ -110,14 +115,18 @@ public List getDisposableGoodsBatchStocksByDisposableGoodsID(Long disposableGoodsID); - public List getDisposableGoodsByBatchBarcodes_ForUpdate(String warehouseID,Collection barcodes); + public List getDisposableGoodsByBatchBarcodes_ForUpdate(Collection barcodes); public List getDisposableGoodsByDisposableGoodsIDs_ForUpdate(Collection ids); public List getDisposableGoodsBatchByBatchBarcodes(Collection barcodes); + public List getExpensiveDisposablegoodsByBarcodes(Collection barcodes); + public List getExpensiveDisposablegoodsByIds(Collection ids); public List getDisposableGoodsBatchesByDisposableGoodsID(Long disposableGoodsID); + public List getExpensivediposablegoodsByDisposableGoodsBatchStockId(Long disposableGoodsBatchStockId); + public List getExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId); // 在新的事务中执行删除。 public void deleteDiposableGoodsById_TRANS_NEW(String id); // 获取批次的可以退库的价格数量 @@ -133,4 +142,11 @@ public DisposableGoodsStock createDisposableGoodsStock(Long warehouseID,String warehouseName,DisposableGoods disposableGoods); public void saveOrUpdate(DisposableGoodsBatch disposableGoodsBatch); + + public void changeGoodsToExpensiveDiposablegoods_TRANS_NEW(String id); + public void changeExpensiveDiposablegoodsToGoods_TRANS_NEW(String id); + + public List newExpensivediposablegoods( + DisposableGoodsBatchStock disposableGoodsBatchStock, Long storage, + String conclusion, Date entryDate, String identification); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java =================================================================== diff -u -r13500 -r13519 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java (.../GodownEntryItem.java) (revision 13500) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntryItem.java (.../GodownEntryItem.java) (revision 13519) @@ -51,6 +51,7 @@ * 标识对象的ID,以后不要使用identification来关联了。 */ private Long identificationID; + /** * 一次性物品id */ @@ -349,7 +350,40 @@ } return true; } + + @Transient + public boolean isAssociatedInfoValidForExpensiveDisposablegoodsInEntry() { + if (!DatabaseUtil.isPoIdValid(disposableGoodsStockID)) { + return false; + } + if (!DatabaseUtil.isPoIdValid(disposableGoodsBatchStockID)) { + return false; + } +// if (!DatabaseUtil.isPoIdValid(identificationID)) { +// return false; +// } + if (!DatabaseUtil.isPoIdValid(disposableGoodsID)) { + return false; + } + if (!DatabaseUtil.isPoIdValid(disposableGoodsBatchID)) { + return false; + } + if (godownEntry == null) { + return false; + } + if (!DatabaseUtil.isPoIdValid(godownEntry.getId())) { + return false; + } + if (diposableGoods == null) { + return false; + } + if (!DatabaseUtil.isPoIdValid(diposableGoods.getId())) { + return false; + } + return true; + } + // 校验关联信息是否正确/退库 @Transient public boolean isAssociatedInfoValidForOutEntry() { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returngoodsrecord/ReturnGoodsItem.java =================================================================== diff -u -r13061 -r13519 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returngoodsrecord/ReturnGoodsItem.java (.../ReturnGoodsItem.java) (revision 13061) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returngoodsrecord/ReturnGoodsItem.java (.../ReturnGoodsItem.java) (revision 13519) @@ -77,7 +77,7 @@ private Long disposableGoodsStockID ;// 一次性物品库存id private Long disposableGoodsBatchID ;// 批次id private Long disposableGoodsBatchStockID ;// 批次库存id - + private Long expensiveDisposablegoodsId; /** * 仓库ID */ @@ -288,6 +288,14 @@ this.disposableGoodsBatchStockID = disposableGoodsBatchStockID; } + public Long getExpensiveDisposablegoodsId() { + return expensiveDisposablegoodsId; + } + + public void setExpensiveDisposablegoodsId(Long expensiveDisposablegoodsId) { + this.expensiveDisposablegoodsId = expensiveDisposablegoodsId; + } + public Long getWarehouseID() { return warehouseID; } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r13424 -r13519 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 13424) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 13519) @@ -9,6 +9,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -53,8 +54,9 @@ 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.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.assestmanagement.TousseStock; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; @@ -64,7 +66,6 @@ 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; @@ -1150,6 +1151,7 @@ Map sendOutAmountMap, Map sendOutBarcodeAmountMap, Map barcodeObjMap, + Map barcodeToExpensiveDisposablegoodsMap, Map barcodeDiposableGoodBatchStockMap, Map barcodeDiposableGoodBatchMap, Map barcodeTousseInstanceMap, @@ -1165,6 +1167,9 @@ barcodeDevice = barcodeDiposableGoodBatchMap.get(barcode); } if(barcodeDevice == null){ + barcodeDevice = barcodeToExpensiveDisposablegoodsMap.get(barcode); + } + if(barcodeDevice == null){ throw new RuntimeException("条码" +barcode+ "已不存在!"); } @@ -1205,6 +1210,14 @@ sendOutAmountMap.put(showName, totalAmount); sendOutBarcodeAmountMap.put(barcode, amount); barcodeObjMap.put(barcode, disposableGoodsBatch); + }else if (barcodeDevice instanceof ExpensiveDisposablegoods) { + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) barcodeDevice; + +// int totalAmount = MapUtils.getInteger(sendOutAmountMap, showName, 0); +// totalAmount += amount; +// sendOutAmountMap.put(showName, totalAmount); + sendOutBarcodeAmountMap.put(barcode, amount); + barcodeObjMap.put(barcode, expensiveDisposablegoods); } } } @@ -1285,19 +1298,46 @@ } } } - private void lockDiposableGoods2(String sourceWarehouseId,Map barcodeToDisposableGoodsStockMap,Map barcodeToDisposableGoodsBatchMap,Map barcodeToDisposableGoodsBatchStockMap, + + private void lockDiposableGoods2( + String sourceWarehouseId, + Map idToDisposableGoodsMap, + Map barcodeToDisposableGoodsStockMap, + Map barcodeToExpensiveDisposablegoodsMap, + Map barcodeToDisposableGoodsBatchMap, + Map barcodeToDisposableGoodsBatchStockMap, Set barcodesScanned) { - - List disposableGoodsList = diposableGoodsManager.getDisposableGoodsByBatchBarcodes_ForUpdate(sourceWarehouseId, barcodesScanned); + + List disposableGoodsList = diposableGoodsManager + .getDisposableGoodsByBatchBarcodes_ForUpdate(barcodesScanned); + if (disposableGoodsList != null) { + for (DisposableGoods disposableGoods : disposableGoodsList) { + idToDisposableGoodsMap.put(disposableGoods.getId(), + disposableGoods); + } + } // 获取所有的批次定义 - List disposableGoodsBatchList = diposableGoodsManager.getDisposableGoodsBatchByBatchBarcodes(barcodesScanned); - if(disposableGoodsBatchList != null){ + List disposableGoodsBatchList = diposableGoodsManager + .getDisposableGoodsBatchByBatchBarcodes(barcodesScanned); + if (disposableGoodsBatchList != null) { for (DisposableGoodsBatch disposableGoodsBatch : disposableGoodsBatchList) { - barcodeToDisposableGoodsBatchMap.put(disposableGoodsBatch.getBarcode(), disposableGoodsBatch); + barcodeToDisposableGoodsBatchMap + .put(disposableGoodsBatch.getBarcode(), + disposableGoodsBatch); } } + List expensiveDisposablegoodsList = diposableGoodsManager + .getExpensiveDisposablegoodsByBarcodes(barcodesScanned); + if (expensiveDisposablegoodsList != null) { + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + barcodeToExpensiveDisposablegoodsMap.put( + expensiveDisposablegoods.getBarcode(), + expensiveDisposablegoods); + } + } List diposableGoodsList = diposableGoodsManager - .getDisposableGoodsStockByBatchBarcodes(sourceWarehouseId,barcodesScanned); + .getDisposableGoodsStockByBatchBarcodes(sourceWarehouseId, + barcodesScanned); // 获取所有的批次对象 if (diposableGoodsList != null) { for (DisposableGoodsStock diposableGoods : diposableGoodsList) { @@ -1308,7 +1348,8 @@ String barcode = disposableGoodsBatchStock.getBarcode(); barcodeToDisposableGoodsBatchStockMap.put(barcode, disposableGoodsBatchStock); - barcodeToDisposableGoodsStockMap.put(barcode, diposableGoods); + barcodeToDisposableGoodsStockMap.put(barcode, + diposableGoods); } } } @@ -1325,20 +1366,19 @@ Map sendOutAmountMap, Map sendOutBarcodeAmountMap, Map barcodeObjMap, + Map idToDisposableGoodsMap, + Map barcodeToExpensiveDisposablegoodsMap, Map barcodeToDisposableGoodsBatchStockMap, Map barcodeTousseInstanceMap, - Set toUpdateDiposableGoods, - Set toUpdateDiposableGoodBatchStocks, - Set toUpdateIdentificationOfDiposableGoods,Map> updateStockInfo,JSONObject params) { + Map> updateStockInfo,JSONObject params) { String deliverStatus = invoicePlan.getDeliverStatus(); if (!InvoicePlan.DELIVERSTATUS_DELIVERED.equals(deliverStatus) && !InvoicePlan.STATUS_END.equals(deliverStatus)) { // // 获取最终发货明细 Set avaliableInvoiceItems = getAvaliableInvoiceItem( invoicePlan, sendOutAmountMap, sendOutBarcodeAmountMap, - barcodeObjMap, barcodeToDisposableGoodsBatchStockMap); + barcodeObjMap,idToDisposableGoodsMap,barcodeToExpensiveDisposablegoodsMap, barcodeToDisposableGoodsBatchStockMap); //找出发货项中的一次性物品,判断是否超支 if(CollectionUtils.isNotEmpty(avaliableInvoiceItems) && StringUtils.isNotBlank(invoicePlan.getProjCode())){ @@ -1376,7 +1416,7 @@ Set tousseInstancesToUpdate = new HashSet(); Invoice invoice = createInvoice(invoicePlan, sendOutBarcodeAmountMap, avaliableInvoiceItems, - sender, barcodeObjMap,barcodeToDisposableGoodsBatchStockMap, assistantSender,tousseInstancesToUpdate,params); + sender, barcodeObjMap,idToDisposableGoodsMap,barcodeToExpensiveDisposablegoodsMap,barcodeToDisposableGoodsBatchStockMap, assistantSender,tousseInstancesToUpdate,params); if (invoice != null) { // 设置仓库信息 invoice.setSourceWarehouseId(Long.valueOf(sourceWarehouseId)); @@ -1395,6 +1435,17 @@ invoiceItem.setInvoiceID(invoice.getId()); objectDao.update(invoiceItem); } + // 设置ExpensiveDisposablegoods和invoice的关联 + for (InvoiceItem invoiceItem : invoice.getInvoiceItem()) { + for (ExpensiveDisposablegoods expensiveDisposablegoods : invoiceItem.getExpensiveDisposablegoods()) { + expensiveDisposablegoods.setInvoiceId(invoice.getId());// 关联发货单 + if(!expensiveDisposablegoods.isAssociatedInfoValidForInvoice()){ + throw new RuntimeException("关联信息不正确!"); + } + objectDao.update(expensiveDisposablegoods); + } + } + // 更新代理灭菌外来器械包申请的状态 invoicePlanManager.updateProxyDisinfectionForeignTousseApplicationStataus( tousseInstancesToUpdate, invoicePlan); @@ -1543,24 +1594,23 @@ Map barcodeTousseInstanceMap = new HashMap(); lockTousseInstances2(barcodeTousseInstanceMap,barcodesScanned); // 锁定一次性物品 + Map idToDisposableGoodsMap = new HashMap(); Map barcodeToDisposableGoodsStockMap = new HashMap(); Map barcodeToDisposableGoodsBatchStockMap = new HashMap(); Map barcodeToDisposableGoodsBatchMap = new HashMap(); - lockDiposableGoods2(sourceWarehouseId,barcodeToDisposableGoodsStockMap, barcodeToDisposableGoodsBatchMap,barcodeToDisposableGoodsBatchStockMap, barcodesScanned); + Map barcodeToExpensiveDisposablegoodsMap = new HashMap(); + lockDiposableGoods2(sourceWarehouseId,idToDisposableGoodsMap,barcodeToDisposableGoodsStockMap, barcodeToExpensiveDisposablegoodsMap,barcodeToDisposableGoodsBatchMap,barcodeToDisposableGoodsBatchStockMap, barcodesScanned); // 统计发货数据 Map sendOutAmountMap = new HashMap();// 物品-物品总发货数 Map sendOutBarcodeAmountMap = new HashMap();// 条码-本条码物品发货数 Map barcodeObjMap = new HashMap(); summarySendOutInfo(submitInvoiceItems, sendOutAmountMap, - sendOutBarcodeAmountMap, barcodeObjMap, + sendOutBarcodeAmountMap, barcodeObjMap,barcodeToExpensiveDisposablegoodsMap, barcodeToDisposableGoodsBatchStockMap,barcodeToDisposableGoodsBatchMap, barcodeTousseInstanceMap, mode,departCode,params.optString("invoicePlanId")); - Set toUpdateDiposableGoods = new HashSet(); - Set toUpdateDiposableGoodBatchStocks = new HashSet(); - Set toUpdateIdentificationOfDiposableGoods = new HashSet(); // 开始发货,遍历申请单列表 List invoiceList = new ArrayList(); // 用于更新库存的信息 @@ -1573,25 +1623,15 @@ } invoice( sourceWarehouseId, sourceWarehouseName,invoicePlan, invoiceList, sender, assistantSender, sendOutAmountMap, sendOutBarcodeAmountMap, - barcodeObjMap, barcodeToDisposableGoodsBatchStockMap, - barcodeTousseInstanceMap, toUpdateDiposableGoods, - toUpdateDiposableGoodBatchStocks, - toUpdateIdentificationOfDiposableGoods,updateStockInfo,params); + barcodeObjMap, idToDisposableGoodsMap,barcodeToExpensiveDisposablegoodsMap,barcodeToDisposableGoodsBatchStockMap, + barcodeTousseInstanceMap, + updateStockInfo,params); } // 更新器械包库存 updateGoodsStock(updateStockInfo); // 更新仓库的库存 updateTousseInstanceStockInwareHouse(updateStockInfo, sourceWarehouseId); - // 更新一次性物品库存 - for (DisposableGoodsIdentification identificationOfDiposableGoods : toUpdateIdentificationOfDiposableGoods) { - objectDao.update(identificationOfDiposableGoods); - } - for (DisposableGoodsBatchStock disposableGoodsBatchStock : toUpdateDiposableGoodBatchStocks) { - objectDao.update(disposableGoodsBatchStock); - } - for (DisposableGoodsStock diposableGoods : toUpdateDiposableGoods) { - objectDao.update(diposableGoods); - } + // 检查是否已完全发货 // for (Map.Entry entry : sendOutAmountMap.entrySet()) { // if(entry.getValue().intValue() > 0){ @@ -1657,6 +1697,8 @@ Set invoiceItems, String sender, Map barcodeObjMap, + Map idToDisposableGoodsMap, + Map barcodeToExpensiveDisposablegoodsMap, Map barcodeToDisposableGoodsBatchStockMap, String assistantSender, Set tousseInstancesToUpdate,JSONObject params) { @@ -1680,86 +1722,141 @@ int amountAwaitingSent = invoiceItem.getAmount(); // 一次性物品 if (InvoiceItem.DIPOSABLE_YES.equals(invoiceItem.getDiposable())) { - String barcode = invoiceItem.getBarcode(); - BarcodeDevice barcodeDevice = barcodeObjMap.get(invoiceItem - .getBarcode()); - if (!(barcodeDevice instanceof DisposableGoodsBatch)) { - throw new RuntimeException(String.format("申请单[%s]上物品[%s]的类型与条码[%s]不匹配!",invoicePlan.getSerialNumber(), invoiceItem.getTousseName(),barcode)); - } - DisposableGoodsBatch diposableGoodBatch = (DisposableGoodsBatch) barcodeDevice; - DisposableGoodsBatchStock disposableGoodsBatchStock = barcodeToDisposableGoodsBatchStockMap.get(barcode); - if(disposableGoodsBatchStock == null){ - throw new RuntimeException(String.format("数据异常,物品[%s]在仓库[%s]中的批次库存[条码为 %s]不存在!", invoiceItem.getTousseName(),sourceWarehouseName,barcode)); - } + if(invoiceItem.expensiveDisposablegoods()){// 高值耗材 + List expensiveDisposablegoodsList = invoiceItem.getExpensiveDisposablegoods(); + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + if(!expensiveDisposablegoods.inWarehouse()){ + throw new RuntimeException(String.format("条码为[%s]的高值耗材状态为%s,不能发货", expensiveDisposablegoods.getBarcode(),expensiveDisposablegoods.getStatus())); + } + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + expensiveDisposablegoods.setStatus(ExpensiveDisposablegoods.STATUS_DELIVERED); + expensiveDisposablegoods.adjustAmount(-1); + --amountAwaitingSent; + expensiveDisposablegoods.setInvoiceItemId(invoiceItem.getId());// 明细汇总关联 + + invoiceItem.setDisposableGoodsId(expensiveDisposablegoods.getDisposableGoodsID()); + invoiceItem.setDisposableGoodsStockId(expensiveDisposablegoods.getDisposableGoodsStockID()); + invoiceItem.setDisposableGoodsBatchId(expensiveDisposablegoods.getDisposableGoodsBatchID()); + invoiceItem.setDisposableGoodsBatchStockId(expensiveDisposablegoods.getId()); + Double price = expensiveDisposablegoods.getPrice(); + BigDecimal fluctuationPrice = MathTools.mul( + price, floatPercent).setScale( + 4, BigDecimal.ROUND_HALF_UP); + DiposableGoodsItem diposableGoodsItem = new DiposableGoodsItem(); + diposableGoodsItem.setAmount(1); + diposableGoodsItem.setFluctuationPrice(fluctuationPrice + .doubleValue()); + diposableGoodsItem.setPrice(price); + diposableGoodsItem.setName(invoiceItem.getTousseName()); + diposableGoodsItem.setBarcode(invoiceItem.getBarcode()); + diposableGoodsItem.setBatch(invoiceItem.getBatchNumber()); + diposableGoodsItem.setDisposableGoodsID(expensiveDisposablegoods.getDisposableGoodsID()); + diposableGoodsItem.setDisposableGoodsStockID(expensiveDisposablegoods.getDisposableGoodsStockID()); + diposableGoodsItem.setDisposableGoodsBatchID(expensiveDisposablegoods.getDisposableGoodsBatchID()); + diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); + diposableGoodsItem.setExpensiveDisposablegoodsId(expensiveDisposablegoods.getId()); + diposableGoodsItem.setInvoice(invoice);// 和发货单关联 + diposableGoodsItem.setInvoiceItemID(invoiceItem.getId());// 明细汇总关联 + if(!diposableGoodsItem.isAssociatedInfoValidForExpensiveDisposablegoodsInvoice()){ + throw new RuntimeException("关联信息不正确!"); + } + diposableGoodsItems.add(diposableGoodsItem); + // 发货物品单项总价 + BigDecimal itemPrice = fluctuationPrice.multiply( + new BigDecimal(diposableGoodsItem.getAmount())) + .setScale(4, BigDecimal.ROUND_HALF_UP); - // 获得价格 - List identifications = disposableGoodsBatchStock - .getIdentifications(); - // TODO:排序问题 - Collections.sort(identifications); - - DiposableGoodsItem diposableGoodsItem = null; - // 处理同一批次多个标识号是否够减 - for (DisposableGoodsIdentification identification : identifications) { - if (identification.getAmount() <= 0) { - continue; + // 发货物品统计总价 + totalPrice = totalPrice.add(itemPrice).setScale(4, + BigDecimal.ROUND_HALF_UP); + double tmpSettlementPrice = invoiceItem + .getSettlementPrice() + itemPrice.doubleValue(); + invoiceItem.setSettlementPrice(tmpSettlementPrice); + } - if (amountAwaitingSent <= 0) { - break; + }else{ + String barcode = invoiceItem.getBarcode(); + BarcodeDevice barcodeDevice = barcodeObjMap.get(invoiceItem + .getBarcode()); + if (!(barcodeDevice instanceof DisposableGoodsBatch)) { + throw new RuntimeException(String.format("申请单[%s]上物品[%s]的类型与条码[%s]不匹配!",invoicePlan.getSerialNumber(), invoiceItem.getTousseName(),barcode)); } - if (identification.getAmount() < amountAwaitingSent) { - diposableGoodsItem = new DiposableGoodsItem(); - diposableGoodsItem.setAmount(Integer.valueOf(identification.getAmount().intValue())); - } else { - diposableGoodsItem = new DiposableGoodsItem(); - diposableGoodsItem.setAmount(amountAwaitingSent); + DisposableGoodsBatch diposableGoodBatch = (DisposableGoodsBatch) barcodeDevice; + DisposableGoodsBatchStock disposableGoodsBatchStock = barcodeToDisposableGoodsBatchStockMap.get(barcode); + if(disposableGoodsBatchStock == null){ + throw new RuntimeException(String.format("数据异常,物品[%s]在仓库[%s]中的批次库存[条码为 %s]不存在!", invoiceItem.getTousseName(),sourceWarehouseName,barcode)); } - amountAwaitingSent -= diposableGoodsItem.getAmount(); - BigDecimal fluctuationPrice = MathTools.mul( - identification.getPrice(), floatPercent).setScale( - 4, BigDecimal.ROUND_HALF_UP); - diposableGoodsItem.setFluctuationPrice(fluctuationPrice - .doubleValue()); - diposableGoodsItem.setPrice(identification.getPrice()); - diposableGoodsItem.setName(invoiceItem.getTousseName()); - diposableGoodsItem.setBarcode(barcode); - diposableGoodsItem.setBatch(diposableGoodBatch - .getBatchNumber()); - diposableGoodsItem.setDisposableGoodsID(disposableGoodsBatchStock.getDisposableGoodsID()); - diposableGoodsItem.setDisposableGoodsStockID(disposableGoodsBatchStock.getDisposableGoodsStockID()); - diposableGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchStock.getDisposableGoodsBatchID()); - diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); - diposableGoodsItem.setIdentificationID(identification.getId());// 标识id关联,这样可以在修改库存价格时做联动修改,jeff li - diposableGoodsItem.setInvoice(invoice);// 和发货单关联 - diposableGoodsItem.setInvoiceItemID(invoiceItem.getId());// 明细汇总关联 - if(!diposableGoodsItem.isAssociatedInfoValidForInvoice()){ - throw new RuntimeException("关联信息不正确!"); - } - diposableGoodsItems.add(diposableGoodsItem); - - // 库存调整 - long amountChange = diposableGoodsItem.getAmount(); - identification.adjustAmount(-amountChange); - // 待更新库存 - objectDao.update(identification); - objectDao.update(disposableGoodsBatchStock); - objectDao.update(disposableGoodsBatchStock.getDiposableGoods()); - // 发货物品单项总价 - BigDecimal itemPrice = fluctuationPrice.multiply( - new BigDecimal(diposableGoodsItem.getAmount())) - .setScale(4, BigDecimal.ROUND_HALF_UP); - // 发货物品统计总价 - totalPrice = totalPrice.add(itemPrice).setScale(4, - BigDecimal.ROUND_HALF_UP); - double tmpSettlementPrice = invoiceItem - .getSettlementPrice() + itemPrice.doubleValue(); - invoiceItem.setSettlementPrice(tmpSettlementPrice); + // 获得价格 + List identifications = disposableGoodsBatchStock + .getIdentifications(); + // TODO:排序问题 + Collections.sort(identifications); + + DiposableGoodsItem diposableGoodsItem = null; + // 处理同一批次多个标识号是否够减 + for (DisposableGoodsIdentification identification : identifications) { + if (identification.getAmount() <= 0) { + continue; + } + if (amountAwaitingSent <= 0) { + break; + } + if (identification.getAmount() < amountAwaitingSent) { + diposableGoodsItem = new DiposableGoodsItem(); + diposableGoodsItem.setAmount(Integer.valueOf(identification.getAmount().intValue())); + } else { + diposableGoodsItem = new DiposableGoodsItem(); + diposableGoodsItem.setAmount(amountAwaitingSent); + } + amountAwaitingSent -= diposableGoodsItem.getAmount(); + BigDecimal fluctuationPrice = MathTools.mul( + identification.getPrice(), floatPercent).setScale( + 4, BigDecimal.ROUND_HALF_UP); + diposableGoodsItem.setFluctuationPrice(fluctuationPrice + .doubleValue()); + diposableGoodsItem.setPrice(identification.getPrice()); + diposableGoodsItem.setName(invoiceItem.getTousseName()); + diposableGoodsItem.setBarcode(barcode); + diposableGoodsItem.setBatch(diposableGoodBatch + .getBatchNumber()); + diposableGoodsItem.setDisposableGoodsID(disposableGoodsBatchStock.getDisposableGoodsID()); + diposableGoodsItem.setDisposableGoodsStockID(disposableGoodsBatchStock.getDisposableGoodsStockID()); + diposableGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchStock.getDisposableGoodsBatchID()); + diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); + diposableGoodsItem.setIdentificationID(identification.getId());// 标识id关联,这样可以在修改库存价格时做联动修改,jeff li + diposableGoodsItem.setInvoice(invoice);// 和发货单关联 + diposableGoodsItem.setInvoiceItemID(invoiceItem.getId());// 明细汇总关联 + if(!diposableGoodsItem.isAssociatedInfoValidForInvoice()){ + throw new RuntimeException("关联信息不正确!"); + } + diposableGoodsItems.add(diposableGoodsItem); + + // 库存调整 + long amountChange = diposableGoodsItem.getAmount(); + identification.adjustAmount(-amountChange); + // 待更新库存 + objectDao.update(identification); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsBatchStock.getDiposableGoods()); + // 发货物品单项总价 + BigDecimal itemPrice = fluctuationPrice.multiply( + new BigDecimal(diposableGoodsItem.getAmount())) + .setScale(4, BigDecimal.ROUND_HALF_UP); + + // 发货物品统计总价 + totalPrice = totalPrice.add(itemPrice).setScale(4, + BigDecimal.ROUND_HALF_UP); + double tmpSettlementPrice = invoiceItem + .getSettlementPrice() + itemPrice.doubleValue(); + invoiceItem.setSettlementPrice(tmpSettlementPrice); + } + invoiceItem.setDisposableGoodsId(disposableGoodsBatchStock.getDisposableGoodsID()); + invoiceItem.setDisposableGoodsStockId(disposableGoodsBatchStock.getDisposableGoodsStockID()); + invoiceItem.setDisposableGoodsBatchId(disposableGoodsBatchStock.getDisposableGoodsBatchID()); + invoiceItem.setDisposableGoodsBatchStockId(disposableGoodsBatchStock.getId()); } - invoiceItem.setDisposableGoodsId(disposableGoodsBatchStock.getDisposableGoodsID()); - invoiceItem.setDisposableGoodsStockId(disposableGoodsBatchStock.getDisposableGoodsStockID()); - invoiceItem.setDisposableGoodsBatchId(disposableGoodsBatchStock.getDisposableGoodsBatchID()); - invoiceItem.setDisposableGoodsBatchStockId(disposableGoodsBatchStock.getId()); + // 器械包 } else { // 关联器械包实体 @@ -2892,7 +2989,60 @@ }else{ return buildErrorMsgJsonResult("篮筐为非有效的篮筐,请扫描或输入灭菌篮筐或虚拟篮筐"); } - } else if (barcodeDevice instanceof DisposableGoodsBatch) { + } else if (barcodeDevice instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) barcodeDevice; + if(!expensiveDisposablegoods.inWarehouse()){ + return buildErrorMsgJsonResult(String.format("条码为[%s]的高值耗材状态为%s,不能发货", barcode,expensiveDisposablegoods.getStatus())); + } + Long disposableGoodsBatchId = expensiveDisposablegoods.getDisposableGoodsBatchID(); + if(disposableGoodsBatchId == null){ + return buildErrorMsgJsonResult(String.format("条码为[%s]的高值耗材数据异常,批次定义id为空", barcode)); + } + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchById(expensiveDisposablegoods.getDisposableGoodsBatchID()); + if(disposableGoodsBatch == null){ + return buildErrorMsgJsonResult(String.format("条码为[%s]的高值耗材批次定义已被删除", barcode)); + } + DisposableGoods diposableGoods = disposableGoodsBatch.getDiposableGoods(); + if(diposableGoods == null){ + return buildErrorMsgJsonResult(String.format("条码为[%s]的高值耗材的物品定义已被删除", barcode)); + } + String showName = diposableGoods.getShowName(); + + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + if(disposableGoodsBatchStock == null){ + return buildErrorMsgJsonResult(String.format("条码为[%s]的高值耗材的批次库存已被删除", barcode)); + } + + // ***验证失效期*** + Date expDate = disposableGoodsBatchStock.getExpDate(); + if (new Date().after(expDate)) {// 一次性物品失效 + return buildErrorMsgJsonResult(String.format("[%s]已过期", showName)); + } + + // 获取单价 + Double price = expensiveDisposablegoods.getPrice(); + Double fluctuationPrice = supplyRoomConfigManager.getDisposableGoodsFluctuationPrice(price); + + JsonObject data = new JsonObject(); + data.addProperty("name", showName); + data.addProperty("showTousseName", showName); + data.addProperty("barcode", expensiveDisposablegoods.getBarcode()); + data.addProperty("diposable", Constants.STR_YES); + data.addProperty("batchNumber",disposableGoodsBatchStock.getBatchNumber()); + data.addProperty("storage", 1); + data.addProperty("price", price); + data.addProperty("fluctuationPrice", fluctuationPrice); + + JsonObject result = new JsonObject(); + result.addProperty("success", true); + result.addProperty("barcode", barcode); + result.addProperty("type", "expensiveDisposablegoods"); + result.add("data", data); + result.add("tips", tips); + return result; + + }else if (barcodeDevice instanceof DisposableGoodsBatch) { // 一次性物品 Long sourceWarehouseId = extraParam.get("sourceWarehouseId").getAsLong(); DisposableGoodsBatch disposableGoodsBatch = (DisposableGoodsBatch) barcodeDevice; @@ -4166,7 +4316,10 @@ private Set getAvaliableInvoiceItem(InvoicePlan invoicePlan, Map sendOutGoods, Map sendOutBarcodeAmountMap, - Map barcodeObjMap,Map barcodeToDisposableGoodsBatchStockMap) { + Map barcodeObjMap, + Map idToDisposableGoodsMap, + Map barcodeToExpensiveDisposablegoodsMap, + Map barcodeToDisposableGoodsBatchStockMap) { String errorMessage = null; Set invoiceItemSet = new HashSet(); // 代理灭菌单 条码要与单做绑定 @@ -4195,64 +4348,144 @@ continue; } String applicationGoodsName = applicationItem.getTousseName(); - Integer sendOutAmount = sendOutGoods.get(applicationGoodsName); - // 扫描物品中是否包含此申请物品 - if (sendOutAmount == null || sendOutAmount <= 0) { - continue; - } + // 未发货数量 Integer notSendAmount = (amount - applicationItem .getSendOutAmount()); - InvoiceItem invoiceItem = null; - + if (TousseItem.TYPE_DIPOSABLE_GOODS.equals(applicationItem.getTousseType())) { - Iterator> iterator = sendOutBarcodeAmountMap - .entrySet().iterator(); - while (iterator.hasNext()) { - Entry next = iterator.next(); - String barcode = next.getKey(); - Integer batchAmount = next.getValue(); - if (batchAmount == 0) { + Long disposableGoodsId = applicationItem.getDisposableGoodsId(); + if(disposableGoodsId == null){ + throw new RuntimeException(String.format("数据异常,一次性物品 %s 的定义id为空", applicationItem.getTousseName())); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsId); + if(disposableGoods == null){ + continue; + } + if(disposableGoods.expensiveDiposablegoods()){//高值耗材 + + int canSendAmount = notSendAmount.intValue(); + int actualSendAmount = 0; + Collection expensiveDisposablegoodsCollection = barcodeToExpensiveDisposablegoodsMap.values(); + if(expensiveDisposablegoodsCollection == null || expensiveDisposablegoodsCollection.isEmpty()){ continue; } - BarcodeDevice barcodeDevice = barcodeObjMap - .get(barcode); - if (barcodeDevice instanceof DisposableGoodsBatch) { - DisposableGoods diposableGoods = ((DisposableGoodsBatch) barcodeDevice) - .getDiposableGoods(); - String name = diposableGoods.getShowName(); - if (name.equals(applicationGoodsName)) { - + List expensiveDisposablegoodsList = new ArrayList(expensiveDisposablegoodsCollection.size()); + // 物品过滤 + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsCollection) { + if(disposableGoodsId.equals(expensiveDisposablegoods.getDisposableGoodsID())){ + expensiveDisposablegoodsList.add(expensiveDisposablegoods); + } + } + if(expensiveDisposablegoodsList.isEmpty()){ + continue; + } + Map batchNumberToInvoiceItemMap = new HashMap(); + + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + if(canSendAmount <= 0){ + break; + } + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + String batchNumber = disposableGoodsBatchStock.getBatchNumber(); + InvoiceItem invoiceItem = batchNumberToInvoiceItemMap.get(batchNumber); + if(invoiceItem == null){ invoiceItem = new InvoiceItem(); - // 完全发货 - if (batchAmount >= notSendAmount) { - applicationItem.setSendOutAmount(amount); - invoiceItem.setAmount(notSendAmount); - // 部分发货 - } else { - applicationItem - .setSendOutAmount((applicationItem - .getSendOutAmount() + batchAmount)); - invoiceItem.setAmount(batchAmount); - } - invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_YES); - invoiceItem.setTousseType(applicationItem - .getTousseType()); - invoiceItem.setTousseName(applicationGoodsName); - invoiceItem.setBarcode(barcode); - invoiceItemSet.add(invoiceItem); + batchNumberToInvoiceItemMap.put(batchNumber, invoiceItem); + } + invoiceItem.setBarcode(disposableGoodsBatchStock.getBarcode()); + invoiceItem.setBatchNumber(batchNumber); + List invoiceItemExpensiveDisposablegoods = invoiceItem.getExpensiveDisposablegoods(); + invoiceItemExpensiveDisposablegoods.add(expensiveDisposablegoods); + sendOutBarcodeAmountMap.remove(expensiveDisposablegoods.getBarcode()); + barcodeToExpensiveDisposablegoodsMap.remove(expensiveDisposablegoods.getBarcode()); + --canSendAmount; + ++actualSendAmount; + } +// actualSendAmount = invoiceItemExpensiveDisposablegoods.size(); + if(actualSendAmount == 0){ + continue; + } + // 完全发货 + if (actualSendAmount >= notSendAmount) { + applicationItem.setSendOutAmount(amount); + // 部分发货 + } else { + applicationItem + .setSendOutAmount((applicationItem + .getSendOutAmount() + actualSendAmount)); + } + for (InvoiceItem invoiceItem : batchNumberToInvoiceItemMap.values()) { + invoiceItem.setAmount(invoiceItem.getExpensiveDisposablegoods().size()); + invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_YES); + invoiceItem.setDisposableGoodsType(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + invoiceItem.setTousseType(applicationItem.getTousseType()); + invoiceItem.setTousseName(applicationGoodsName); + + invoiceItemSet.add(invoiceItem); + } + }else{// 普通物品 + InvoiceItem invoiceItem = null; + Integer sendOutAmount = sendOutGoods.get(applicationGoodsName); + // 扫描物品中是否包含此申请物品 + if (sendOutAmount == null || sendOutAmount <= 0) { + continue; + } + Iterator> iterator = sendOutBarcodeAmountMap + .entrySet().iterator(); + while (iterator.hasNext()) { + Entry next = iterator.next(); + String barcode = next.getKey(); + Integer batchAmount = next.getValue(); + if (batchAmount == 0) { + continue; + } + BarcodeDevice barcodeDevice = barcodeObjMap + .get(barcode); + if (barcodeDevice instanceof DisposableGoodsBatch) { + DisposableGoods diposableGoods = ((DisposableGoodsBatch) barcodeDevice) + .getDiposableGoods(); + String name = diposableGoods.getShowName(); + if (name.equals(applicationGoodsName)) { - sendOutAmount -= invoiceItem.getAmount(); - notSendAmount = notSendAmount - batchAmount; - sendOutGoods.put(applicationGoodsName, - sendOutAmount); - sendOutBarcodeAmountMap.put(barcode, batchAmount - invoiceItem.getAmount()); + invoiceItem = new InvoiceItem(); + // 完全发货 + if (batchAmount >= notSendAmount) { + applicationItem.setSendOutAmount(amount); + invoiceItem.setAmount(notSendAmount); + // 部分发货 + } else { + applicationItem + .setSendOutAmount((applicationItem + .getSendOutAmount() + batchAmount)); + invoiceItem.setAmount(batchAmount); + } + invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_YES); + invoiceItem.setDisposableGoodsType(DisposableGoods.TYPE_DIPOSABLEGOODS); + invoiceItem.setTousseType(applicationItem + .getTousseType()); + invoiceItem.setTousseName(applicationGoodsName); + invoiceItem.setBarcode(barcode); + invoiceItemSet.add(invoiceItem); + + sendOutAmount -= invoiceItem.getAmount(); + notSendAmount = notSendAmount - batchAmount; + sendOutGoods.put(applicationGoodsName, + sendOutAmount); + sendOutBarcodeAmountMap.put(barcode, batchAmount - invoiceItem.getAmount()); + } } } } + } else { - + InvoiceItem invoiceItem = null; + Integer sendOutAmount = sendOutGoods.get(applicationGoodsName); + // 扫描物品中是否包含此申请物品 + if (sendOutAmount == null || sendOutAmount <= 0) { + continue; + } invoiceItem = new InvoiceItem(); // 完全发货 if (sendOutAmount >= notSendAmount) { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java =================================================================== diff -u -r13502 -r13519 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java (.../DisposableGoods.java) (revision 13502) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java (.../DisposableGoods.java) (revision 13519) @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -33,6 +34,8 @@ public final static String CONSTANT_YES = "能"; public final static String CONSTANT_NO = "否"; + public static final String TYPE_DIPOSABLEGOODS = "普通物品"; + public static final String TYPE_EXPENSIVEDIPOSABLEGOODS = "高值耗材"; //public final static String SUPPLYROOMGOODS_YES = "是"; //public final static String SUPPLYROOMGOODS_NO = "否"; @@ -106,6 +109,9 @@ private String inventorySerialNumber; // 物资系统的物资编码,用于与物资系统交互 + private String goodsType = TYPE_DIPOSABLEGOODS; + + private String originalGoodsType;// 不保存到数据库,用于判断是否做了修改 @JsonIgnore public static Map ColumnNameAndPoPropertyNameMap= new LinkedHashMap(8); @@ -378,5 +384,31 @@ public void setGuid(String guid) { this.guid = guid; } - + + public String getGoodsType() { + return goodsType; + } + + public void setGoodsType(String goodsType) { + if(StringUtils.isBlank(goodsType)){ + this.goodsType = TYPE_DIPOSABLEGOODS; + }else{ + this.goodsType = goodsType; + } + } + @Transient + public String getOriginalGoodsType() { + return originalGoodsType; + } + + public void setOriginalGoodsType(String originalGoodsType) { + this.originalGoodsType = originalGoodsType; + } + + public boolean expensiveDiposablegoods() { + if (StringUtils.equals(goodsType, TYPE_EXPENSIVEDIPOSABLEGOODS)) { + return true; + } + return false; + } }