Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r20813 -r20832 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20813) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20832) @@ -67,6 +67,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveGoods; import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveGoodsInstance; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; @@ -76,6 +77,7 @@ 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.ExpensiveGoodsItem; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceGoodsVo; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; @@ -91,6 +93,9 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsStockManager; +import com.forgon.disinfectsystem.expensivegoods.ExpensiveGoodsServiceContext; import com.forgon.disinfectsystem.idpredicate.IDOperators; import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; @@ -162,6 +167,9 @@ private DiposableGoodsManager diposableGoodsManager; private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private ExpensiveGoodsManager expensiveGoodsManager; + private ExpensiveGoodsStockManager expensiveGoodsStockManager; private TousseStockManager tousseStockManager; @@ -268,7 +276,16 @@ DiposableGoodBatchStockManager diposableGoodBatchStockManager) { this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; } + + public void setExpensiveGoodsManager(ExpensiveGoodsManager expensiveGoodsManager) { + this.expensiveGoodsManager = expensiveGoodsManager; + } + public void setExpensiveGoodsStockManager( + ExpensiveGoodsStockManager expensiveGoodsStockManager) { + this.expensiveGoodsStockManager = expensiveGoodsStockManager; + } + public void setTousseStockManager(TousseStockManager tousseStockManager) { this.tousseStockManager = tousseStockManager; } @@ -1179,7 +1196,7 @@ JSONArray invoiceItemsLogInfo = new JSONArray(); List submitInvoiceItems = new LinkedList(); DisposableGoodsServiceContext disposableGoodsServiceContext = submitInvoiceContext.getDisposableGoodsServiceContext(); - + ExpensiveGoodsServiceContext expensiveGoodsServiceContext = submitInvoiceContext.getExpensiveGoodsServiceContext(); for (int i = 0; i < jsonArrayInvoiceItems.size(); i++) { JSONObject jsonInvoiceItem = jsonArrayInvoiceItems.getJSONObject(i); SubmitInvoiceItem item = new SubmitInvoiceItem(); @@ -1192,7 +1209,7 @@ submitInvoiceItems.add(item); parseParameters_typeInfo(disposableGoodsServiceContext, jsonInvoiceItem, tousseType); - + parseParameters_expensiveGoodsTypeInfo(expensiveGoodsServiceContext, jsonInvoiceItem, tousseType); JSONObject invoiceItemLogInfo = new JSONObject(); invoiceItemLogInfo.put("barcode", barcode); invoiceItemLogInfo.put("amount", amount); @@ -1251,6 +1268,36 @@ } } + private void parseParameters_expensiveGoodsTypeInfo( + ExpensiveGoodsServiceContext expensiveGoodsServiceContext, + JSONObject jsonInvoiceItem, String tousseType) { + // 类型相关的处理 + if(StringUtils.equals(tousseType,ExpensiveGoods.TYPE_NAME)){ + String typeInfoOnScanned = JSONUtil.optString(jsonInvoiceItem, "typeInfoOnScanned", null); + if(typeInfoOnScanned == null){ + throw new RuntimeException("缺少类型参数!"); + } + JSONObject typeInfoOnScannedObj = JSONObject.fromObject(typeInfoOnScanned); + // 一次性物品 + Long expensiveGoodsId = JSONUtil.optLong(typeInfoOnScannedObj, "expensiveGoodsId", null); + Long expensiveGoodsStockId = JSONUtil.optLong(typeInfoOnScannedObj, "expensiveGoodsStockId", null); + Long expensiveGoodsInstanceId = JSONUtil.optLong(typeInfoOnScannedObj, "expensiveGoodsInstanceId", null); + if(expensiveGoodsId == null){ + throw new RuntimeException("缺少物品定义id参数!"); + } + if(expensiveGoodsStockId == null){ + throw new RuntimeException("缺少物品库存id参数!"); + } + + if(expensiveGoodsInstanceId == null){ + throw new RuntimeException("缺少实例id参数!"); + } + expensiveGoodsServiceContext.getExpensiveGoodsIdsSet().add(expensiveGoodsId); + expensiveGoodsServiceContext.getExpensiveGoodsStockIdsSet().add(expensiveGoodsStockId); + expensiveGoodsServiceContext.getExpensiveGoodsStockIdsSet().add(expensiveGoodsInstanceId); + } + } + /** * 手术预约合并发货 */ @@ -1339,7 +1386,9 @@ Map sendOutBarcodeAmountMap = submitInvoiceContext.getSendOutBarcodeToAmountMap(); Map barcodeObjMap = submitInvoiceContext.getBarcodeToBarcodeDeviceMap(); DisposableGoodsServiceContext disposableGoodsServiceContext = submitInvoiceContext.getDisposableGoodsServiceContext(); + ExpensiveGoodsServiceContext expensiveGoodsServiceContext = submitInvoiceContext.getExpensiveGoodsServiceContext(); Map barcodeToExpensiveDisposablegoodsMap = disposableGoodsServiceContext.getBarcodeToExpensiveDisposablegoodsMap(); + Map barcodeToExpensiveGoodsInstanceMap = expensiveGoodsServiceContext.getBarcodeToExpensiveGoodsInstanceMap(); Map barcodeDiposableGoodBatchMap = disposableGoodsServiceContext.getBarcodeToDisposableGoodsBatchMap(); Map barcodeTousseInstanceMap = submitInvoiceContext.getBarcodeToTousseInstanceMap(); Map idToTousseInstanceMap = submitInvoiceContext.getIdToTousseInstanceMap(); @@ -1367,6 +1416,9 @@ barcodeDevice = barcodeToExpensiveDisposablegoodsMap.get(barcode); } if(barcodeDevice == null){ + barcodeDevice = barcodeToExpensiveGoodsInstanceMap.get(barcode); + } + if(barcodeDevice == null){ throw new RuntimeException("条码" +barcode+ "已不存在!"); } @@ -1490,6 +1542,14 @@ // sendOutAmountMap.put(showName, totalAmount); sendOutBarcodeAmountMap.put(barcode, amount); barcodeObjMap.put(barcode, expensiveDisposablegoods); + }else if (barcodeDevice instanceof ExpensiveGoodsInstance) { + ExpensiveGoodsInstance expensiveGoodsInstance = (ExpensiveGoodsInstance) barcodeDevice; + submitInvoiceItem.setExpensiveGoodsInstance(expensiveGoodsInstance); +// int totalAmount = MapUtils.getInteger(sendOutAmountMap, showName, 0); +// totalAmount += amount; +// sendOutAmountMap.put(showName, totalAmount); + sendOutBarcodeAmountMap.put(barcode, amount); + barcodeObjMap.put(barcode, expensiveGoodsInstance); } } if(submitInvoiceContext.isInvoiceForOperationReservationMerge()){ @@ -1704,6 +1764,28 @@ } } + private void lockExpensiveGoods(SubmitInvoiceContext submitInvoiceContext) { + String sourceWarehouseId = submitInvoiceContext.getSourceWarehouseId(); + ExpensiveGoodsServiceContext expensiveGoodsServiceContext = submitInvoiceContext.getExpensiveGoodsServiceContext(); + expensiveGoodsManager.lockAndGetExpensiveGoodsResources(expensiveGoodsServiceContext); + // 校验仓库 + List expensiveGoodsInstanceList = expensiveGoodsServiceContext.getExpensiveGoodsInstanceList(); + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceList) { + // 校验高值耗材的仓库是否和界面上选择的仓库一致 + Long expensiveExpensiveGoodsWarehouseId = expensiveGoodsInstance.getWarehouseID(); + if(!StringUtils.equals(sourceWarehouseId, expensiveExpensiveGoodsWarehouseId.toString())){ + throw new RuntimeException(String.format("条码为%s的高值耗材仓库和发货仓库不一致", expensiveGoodsInstance.getBarcode())); + } + } + List expensiveGoodsStockList = expensiveGoodsServiceContext.getExpensiveGoodsStockList(); + for (ExpensiveGoodsStock expensiveGoodsStock : expensiveGoodsStockList) { + Long expensiveExpensiveGoodsWarehouseId = expensiveGoodsStock.getWarehouseID(); + if(!StringUtils.equals(sourceWarehouseId, expensiveExpensiveGoodsWarehouseId.toString())){ + throw new RuntimeException(String.format("%s 的仓库和发货仓库不一致", expensiveGoodsStock.getShowName())); + } + } + } + // 发货处理 private Invoice invoice( InvoicePlan invoicePlan,SubmitInvoiceContext submitInvoiceContext , List disposableGoodsStorageAdjustVoTotalList) { @@ -1764,6 +1846,15 @@ objectDao.update(expensiveDisposablegoods); } } + for (InvoiceItem invoiceItem : invoice.getInvoiceItem()) { + for (ExpensiveGoodsInstance expensiveGoodsInstance : invoiceItem.getExpensiveGoodsInstanceList()) { + expensiveGoodsInstance.setInvoiceId(invoice.getId());// 关联发货单 + if(!expensiveGoodsInstance.isAssociatedInfoValidForInvoice()){ + throw new RuntimeException("关联信息不正确!"); + } + objectDao.update(expensiveGoodsInstance); + } + } // 更新代理灭菌外来器械包申请的状态 if(invoicePlan != null){ @@ -2421,6 +2512,8 @@ lockTousseInstances2(submitInvoiceContext); // 锁定一次性物品 lockDiposableGoods2(submitInvoiceContext); + // 锁定高值耗材 + lockExpensiveGoods(submitInvoiceContext); // 获取目标仓库 loadTargetWareHouse(submitInvoiceContext); // 锁定库存记录 @@ -2907,6 +3000,79 @@ autoDeductionDisposableGoodsInvoiceItems); } + private int createInvoiceItem(SubmitInvoiceContext submitInvoiceContext,InvoiceItem invoiceItem,List expensiveGoodsItems,Invoice invoice,String depart,String departCoding){ + double floatPercent = supplyRoomConfigManager + .getDisposableGoodsFluctuationPercent(); + BigDecimal totalPrice = new BigDecimal(invoice.getTotalPrice()); + Map sendOutBarcodeAmount = submitInvoiceContext + .getSendOutBarcodeToAmountMap(); + Map barcodeObjMap = submitInvoiceContext + .getBarcodeToBarcodeDeviceMap(); + Map barcodeToDisposableGoodsBatchStockMap = submitInvoiceContext + .getDisposableGoodsServiceContext() + .getBarcodeToDisposableGoodsBatchStockMap(); + Map> fixedBarcodeTousseIdToAffiliatedTousseInstanceMap = submitInvoiceContext.getFixedBarcodeTousseIdToAffiliatedTousseInstanceMap(); + // 高值耗材 + List expensiveGoodsInstanceList = invoiceItem + .getExpensiveGoodsInstanceList(); + int sendAmount = 0; + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceList) { + if (!expensiveGoodsInstance.inWarehouse()) { + throw new RuntimeException(String.format( + "条码为[%s]的高值耗材状态为%s,不能发货", + expensiveGoodsInstance.getBarcode(), + expensiveGoodsInstance.getStatus())); + } + + expensiveGoodsInstance + .setStatus(ExpensiveDisposablegoods.STATUS_DELIVERED); + expensiveGoodsInstance.adjustAmount(-1); + + ++sendAmount; + expensiveGoodsInstance.setInvoiceItemId(invoiceItem + .getId());// 明细汇总关联 + + // 记录高值耗材位置 + expensiveGoodsInstance.setLocation(departCoding); + expensiveGoodsInstance.setLocationForDisplay(depart); + + invoiceItem.setExpensiveGoodsId(expensiveGoodsInstance.getExpensiveGoods().getId()); + invoiceItem.setExpensiveGoodsInstanceId(expensiveGoodsInstance.getId()); + invoiceItem.setExpensiveGoodsStockId(expensiveGoodsInstance.getExpensiveGoodsStockId()); + Double price = expensiveGoodsInstance.getPrice(); + BigDecimal fluctuationPrice = MathTools.mul(price,floatPercent); + ExpensiveGoodsItem expensiveGoodsItem = new ExpensiveGoodsItem(); + expensiveGoodsItem.setAmount(1); + expensiveGoodsItem.setFluctuationPrice(fluctuationPrice + .doubleValue()); + expensiveGoodsItem.setPrice(price); + expensiveGoodsItem.setName(invoiceItem.getTousseName()); + expensiveGoodsItem.setBarcode(invoiceItem.getBarcode()); + expensiveGoodsItem.setExpensiveGoodsId(expensiveGoodsInstance.getExpensiveGoods().getId()); + expensiveGoodsItem.setExpensiveGoodsInstanceId(expensiveGoodsInstance.getId()); + expensiveGoodsItem.setExpensiveGoodsStockId(expensiveGoodsInstance.getExpensiveGoodsStockId()); + + expensiveGoodsItem.setInvoice(invoice);// 和发货单关联 + expensiveGoodsItem + .setInvoiceItemID(invoiceItem.getId());// 明细汇总关联 + if (!expensiveGoodsItem + .isAssociatedInfoValidForExpensiveDisposablegoodsInvoice()) { + throw new RuntimeException("关联信息不正确!"); + } + expensiveGoodsItems.add(expensiveGoodsItem); + // 发货物品单项总价 + BigDecimal itemPrice = MathTools.mul(fluctuationPrice, expensiveGoodsItem.getAmount()); + + // 发货物品统计总价 + totalPrice = MathTools.add(totalPrice, itemPrice); + double tmpSettlementPrice = invoiceItem + .getSettlementPrice() + itemPrice.doubleValue(); + invoiceItem.setSettlementPrice(tmpSettlementPrice); + + } + return sendAmount; + + } /** * 生成发货单 主要供新的JSON格式的Webservice接口调用 * @@ -2939,6 +3105,7 @@ Map> fixedBarcodeTousseIdToAffiliatedTousseInstanceMap = submitInvoiceContext.getFixedBarcodeTousseIdToAffiliatedTousseInstanceMap(); Invoice invoice = new Invoice(); List diposableGoodsItems = new ArrayList(); + List expensiveGoodsItems = new ArrayList(); // 获得浮动价格系数 double floatPercent = supplyRoomConfigManager .getDisposableGoodsFluctuationPercent(); @@ -2978,7 +3145,10 @@ objectDao.save(invoiceItem); int amountAwaitingSent = invoiceItem.getAmount(); // 一次性物品 - if (InvoiceItem.DIPOSABLE_YES.equals(invoiceItem.getDiposable())) { + if (ExpensiveGoods.TYPE_NAME.equals(invoiceItem.getTousseType())) { + int sendAmount = createInvoiceItem(submitInvoiceContext, invoiceItem,expensiveGoodsItems, invoice,depart,departCoding); + amountAwaitingSent -= sendAmount; + }else if (InvoiceItem.DIPOSABLE_YES.equals(invoiceItem.getDiposable())) { if (invoiceItem.expensiveDisposablegoods()) {// 高值耗材 List expensiveDisposablegoodsList = invoiceItem .getExpensiveDisposablegoods(); @@ -3401,6 +3571,7 @@ invoice.setRecyclingTime(recyclingTime); invoice.setDiposableGoodsItems(diposableGoodsItems); + invoice.setExpensiveGoodsItems(expensiveGoodsItems); invoice.setInvoiceItem(invoiceItems); // 关联发货单ID if (invoicePlan != null) { @@ -5960,7 +6131,100 @@ } } } + private void getAvaliableInvoiceItemForExpensiveGoods( + InvoicePlan invoicePlan, TousseItem applicationItem, + Set invoiceItemSet, + SubmitInvoiceContext submitInvoiceContext) { + Map sendOutGoods = submitInvoiceContext + .getSendOutGoodsNameToAmountMap(); + Map sendOutBarcodeAmountMap = submitInvoiceContext + .getSendOutBarcodeToAmountMap(); + Map barcodeObjMap = submitInvoiceContext + .getBarcodeToBarcodeDeviceMap(); + Map idToExpensiveGoodsMap = submitInvoiceContext + .getExpensiveGoodsServiceContext().getIdToExpensiveGoodsMap(); + Map barcodeToExpensiveGoodsInstanceMap = submitInvoiceContext + .getExpensiveGoodsServiceContext() + .getBarcodeToExpensiveGoodsInstanceMap(); + Long expensiveGoodsId = applicationItem.getExpensiveGoodsId(); + if (expensiveGoodsId == null) { + throw new RuntimeException(String.format("数据异常,一次性物品 %s 的定义id为空", + applicationItem.getTousseName())); + } +// ExpensiveGoods expensiveGoods = idToExpensiveGoodsMap +// .get(expensiveGoodsId); +// if (expensiveGoods == null) { +// return; +// } + int amount = applicationItem.getAmount(); + // 申请数量大于发货数量 + if (amount <= applicationItem.getSendOutAmount()) { + return; + } + String applicationGoodsName = applicationItem.getTousseName(); + // 未发货数量 + Integer notSendAmount = (amount - applicationItem.getSendOutAmount()); + // 高值耗材 + int canSendAmount = notSendAmount.intValue(); + int actualSendAmount = 0; + Collection expensiveGoodsInstanceCollection = barcodeToExpensiveGoodsInstanceMap + .values(); + if (expensiveGoodsInstanceCollection == null + || expensiveGoodsInstanceCollection.isEmpty()) { + return; + } + List expensiveGoodsInstanceList = new ArrayList( + expensiveGoodsInstanceCollection.size()); + // 物品过滤 + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceCollection) { + if (expensiveGoodsId.equals(expensiveGoodsInstance + .getExpensiveGoods().getId())) { + expensiveGoodsInstanceList.add(expensiveGoodsInstance); + } + } + if (expensiveGoodsInstanceList.isEmpty()) { + return; + } + // 高值耗材不合并 + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceList) { + if (canSendAmount <= 0) { + break; + } + InvoiceItem invoiceItem = new InvoiceItem(); + invoiceItemSet.add(invoiceItem); + invoiceItem.setBarcode(expensiveGoodsInstance.getBarcode()); + invoiceItem.setExpensiveGoodsId(expensiveGoodsId); + invoiceItem.setExpensiveGoodsInstanceId(expensiveGoodsInstance.getId()); + invoiceItem.setExpensiveGoodsStockId(expensiveGoodsInstance.getExpensiveGoodsStockId()); + invoiceItem + .getExpensiveGoodsInstanceList().add(expensiveGoodsInstance);; + invoiceItem.setAmount(1); + invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_NO); + invoiceItem.setTousseType(applicationItem.getTousseType()); + invoiceItem.setTousseName(applicationGoodsName); + sendOutBarcodeAmountMap.remove(expensiveGoodsInstance + .getBarcode()); + barcodeToExpensiveGoodsInstanceMap + .remove(expensiveGoodsInstance.getBarcode()); + --canSendAmount; + ++actualSendAmount; + } + // actualSendAmount = invoiceItemExpensiveGoodsInstance.size(); + if (actualSendAmount == 0) { + return; + } + // 完全发货 + if (actualSendAmount >= notSendAmount) { + applicationItem.setSendOutAmount(amount); + // 部分发货 + } else { + applicationItem.setSendOutAmount((applicationItem + .getSendOutAmount() + actualSendAmount)); + } + + } + private void getAvaliableInvoiceItemForTousse(InvoicePlan invoicePlan, TousseItem applicationItem, Set invoiceItemSet, SubmitInvoiceContext submitInvoiceContext) { @@ -6275,6 +6539,8 @@ if (TousseItem.TYPE_DIPOSABLE_GOODS.equals(applicationItem.getTousseType())) { getAvaliableInvoiceItemForDisposableGoods(invoicePlan,applicationItem,invoiceItemSet, submitInvoiceContext); + } else if (applicationItem.isExpensiveGoods()) { + getAvaliableInvoiceItemForExpensiveGoods(invoicePlan,applicationItem,invoiceItemSet, submitInvoiceContext); } else { getAvaliableInvoiceItemForTousse(invoicePlan, applicationItem, invoiceItemSet, submitInvoiceContext); }