Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r23360 -r23473 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 23360) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 23473) @@ -87,6 +87,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceGoodsVo; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice_InvoicePlan; import com.forgon.disinfectsystem.entity.invoicemanager.TimeQuantum; import com.forgon.disinfectsystem.entity.operationreservation.OperationReservation; import com.forgon.disinfectsystem.entity.packing.PackingTask; @@ -1539,16 +1540,19 @@ addTousseToAncestorIdToAffiliatedTousseInstanceMap(ancestorIdToAffiliatedTousseInstanceMap, tousseInstance); } } + // 聚合包整包发货时,不单独发里面的小包,整个包另外一起发货 + if(submitInvoiceContext.isComboTousseSendByWrapperTousse() && tousseInstance.isBelongsToComboTousse()){ + + }else{ + String tousseName = tousseInstance.getTousseName(); + int totalAmount = MapUtils.getInteger(sendOutAmountMap, tousseName, 0); + totalAmount += amount; + sendOutAmountMap.put(tousseName, totalAmount); + sendOutBarcodeAmountMap.put(barcode, amount); + barcodeObjMap.put(barcode, tousseInstance); + idToTousseInstanceMap.put(tousseInstance.getId(), tousseInstance); + } - - String tousseName = tousseInstance.getTousseName(); - int totalAmount = MapUtils.getInteger(sendOutAmountMap, tousseName, 0); - totalAmount += amount; - sendOutAmountMap.put(tousseName, totalAmount); - sendOutBarcodeAmountMap.put(barcode, amount); - barcodeObjMap.put(barcode, tousseInstance); - idToTousseInstanceMap.put(tousseInstance.getId(), tousseInstance); - } else if (barcodeDevice instanceof DisposableGoodsBatch) { DisposableGoodsBatch disposableGoodsBatch = (DisposableGoodsBatch) barcodeDevice; DisposableGoods diposableGoods = disposableGoodsBatch @@ -1946,7 +1950,154 @@ } - + private TousseInstance getTousseInstanceByName(String name,Set tousseInstances){ + for (TousseInstance tousseInstance : tousseInstances) { + if(StringUtils.equals(tousseInstance.getTousseName(), name)){ + return tousseInstance; + } + } + return null; + } + // 聚合包整包发货 + private void invoiceWrapperComboTousse(List filteredList,SubmitInvoiceContext submitInvoiceContext){ + if(!submitInvoiceContext.isComboTousseSendByWrapperTousse()){ + return ; + } + Set comboTousseInstances = submitInvoiceContext.getComboTousseInstances(); + if(comboTousseInstances.isEmpty()){ + return ; + } + List writeBackInvoiceList = submitInvoiceContext.getWriteBackInvoiceList(); + List disposableGoodsStorageAdjustVoList = submitInvoiceContext.getDisposableGoodsStorageAdjustVoList(); + + for (TousseInstance comboTousseInstance : comboTousseInstances) { + Set tousseInstances = submitInvoiceContext.getTousseInstancesByComboTousseInstance(comboTousseInstance); + if(tousseInstances.isEmpty()){ + continue; + } + Set invoicePlans = new HashSet(); + Set invoiceItemSet = new HashSet(); + TousseDefinition comboTousseDefinition = comboTousseInstance.getTousseDefinition(); + InvoiceItem invoiceItem = new InvoiceItem(); + List tousseInstancesToSend = new ArrayList(tousseInstances.size()); + + invoiceItem.setAmount(1); + invoiceItem.setTousseInstances(tousseInstancesToSend); + invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_NO); + invoiceItem.setTousseType(comboTousseDefinition.getTousseType()); + invoiceItem.setTousseName(comboTousseInstance.getTousseName()); + invoiceItem.setTousseDefinitionId(comboTousseDefinition.getId()); + invoiceItem.setSettlementPrice(comboTousseInstance.getPrice()); +// invoiceItem.setSettlementDiscountPrice(settlementDiscountPrice); + invoiceItemSet.add(invoiceItem); + for (InvoicePlan invoicePlan : filteredList) { + if(invoicePlan.delivered() || invoicePlan.deliverEnd()){ + continue; + } + Set tousseInstancesToSend_invoicePlan = new HashSet(); + + // 代理灭菌单 条码要与单做绑定 + if (InvoicePlan.TYPE_PROXYDISINFECTION.equals(invoicePlan.getType())) { + continue; + } else if (InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION.equals(invoicePlan + .getType())) { + continue; + } else if (InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION.equals(invoicePlan + .getType())) { + continue; + }else if (InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION.equals(invoicePlan + .getType())) {// 手术预约申请单 + continue; + } else { + for (TousseItem applicationItem : invoicePlan.getApplicationItems()) { + if(applicationItem.terminated()){// 对终止状态的处理 + continue; + } + if(!TousseItemUtils.IsInvoice(applicationItem)){ + continue; + } + if(submitInvoiceContext.isSendOnlyUrgentGoods() && (applicationItem.safelyGetUrgentAmount() == 0)){ + continue;// 如果是发送紧急物品模式,当前申请项的紧急数量为0,那么跳过 + } + if (TousseItem.TYPE_DIPOSABLE_GOODS.equals(applicationItem.getTousseType())) { + continue; + } else if (applicationItem.isExpensiveGoods()) { + continue; + } else { + SupplyRoomConfig config = submitInvoiceContext.getSupplyRoomConfig(); + String invoiceOrigin = config.getInvoiceOrigin(); + + boolean recycledDeliver = config.getAfterRecyclingTousseDeliver(); + int amount = CssdUtils.getWaitDeliverAmount(applicationItem, + invoiceOrigin, recycledDeliver, invoicePlan, objectDao); + // 申请数量大于发货数量 + if (amount <= applicationItem.getSendOutAmount()) { + continue; + } + if(submitInvoiceContext.isSendOnlyUrgentGoods() && (applicationItem.safelyGetUrgentAmount() == 0)){ + continue ;// 如果是发送紧急物品模式,当前申请项的紧急数量为0,那么跳过 + } + String applicationGoodsName = applicationItem.getTousseName(); + + // 未发货数量 + Integer notSendAmount = (amount - applicationItem.getSendOutAmount()); + + TousseInstance tousseInstanceToSend = getTousseInstanceByName(applicationGoodsName, tousseInstances); + if(tousseInstanceToSend == null){ + continue; + } + if (notSendAmount == null || notSendAmount <= 0) { + continue; + } + + int canSendAmount = 1;// 能发货的数量 + + // 完全发货 + if (canSendAmount >= notSendAmount) { + applicationItem.setSendOutAmount(amount); + // 部分发货 + } else { + applicationItem.setSendOutAmount((applicationItem + .getSendOutAmount() + canSendAmount)); + } + + // 修改紧急数量 + { + int urgentAmount = applicationItem.safelyGetUrgentAmount(); + if(urgentAmount > 0){ + int actualSendAmount = 1; + if(actualSendAmount >= urgentAmount){ + applicationItem.setUrgentAmount(0); + applicationItem.setUrgent(Constants.STR_NO);// 修改紧急状态 + }else{ + applicationItem.setUrgentAmount(urgentAmount - actualSendAmount); + } + } + } + tousseInstancesToSend_invoicePlan.add(tousseInstanceToSend); + tousseInstancesToSend.add(tousseInstanceToSend); + tousseInstances.remove(tousseInstanceToSend); + } + } + } + + if(!tousseInstancesToSend_invoicePlan.isEmpty()){ + invoicePlans.add(invoicePlan); + } + } + if(!tousseInstances.isEmpty()){ + throw new RuntimeException("聚合包不允许部分发货!"); + } + if(invoicePlans.isEmpty()){ + throw new RuntimeException("聚合包发货,发货计划为空!"); + } + // 创建发货单 + Invoice invoice = invoiceComboTousse(invoicePlans, invoiceItemSet, submitInvoiceContext); + if(invoice != null){ + writeBackInvoiceList.add(invoice); + } + } + } // 发货处理 private Invoice invoice( InvoicePlan invoicePlan,SubmitInvoiceContext submitInvoiceContext , List disposableGoodsStorageAdjustVoTotalList) { @@ -2048,6 +2199,66 @@ return invoice; } + private Invoice invoiceComboTousse( + Set invoicePlans,Set avaliableInvoiceItems,SubmitInvoiceContext submitInvoiceContext) { + submitInvoiceContext.getTousseInstancesToUpdate().clear(); + Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo(); + List invoiceList = submitInvoiceContext.getInvoiceList(); + + + Invoice invoice = createComboTousseInvoice(invoicePlans, + avaliableInvoiceItems, + submitInvoiceContext); + + if (invoice != null) { + Set tousseInstancesToUpdate = submitInvoiceContext.getTousseInstancesToUpdate(); + // 设置仓库信息 + invoice.setSourceWarehouseId(Long.valueOf(submitInvoiceContext.getSourceWarehouseId())); + invoice.setSourceWarehouseName(submitInvoiceContext.getSourceWarehouseName()); + setDefaultWarehouse(invoice,invoice.getDepartCoding()); + invoiceList.add(invoice); + updateStockInfo.put(invoice, new HashSet(tousseInstancesToUpdate)); + saveInvoice(invoice); + updateTousseInstanceStatus(tousseInstancesToUpdate,submitInvoiceContext.getSubmitInvoiceItems()); //修改器械包是否常规发货的方法(cjr) + // 设置发货单和器械包实例的关联以及修改器械包状态等属性 + updateTousseInstanceStatus(submitInvoiceContext,invoice,tousseInstancesToUpdate); + + //所发的器械包实例的虚拟篮筐状态重新计算 + List virtualContainerNameList = new ArrayList(); + if(CollectionUtils.isNotEmpty(tousseInstancesToUpdate)){ + for (TousseInstance tousseInstance : tousseInstancesToUpdate) { + String virtualBasketSeqNum = tousseInstance.getVirtualBasketSeqNum(); + if(StringUtils.isNotBlank(virtualBasketSeqNum) && !virtualContainerNameList.contains(virtualBasketSeqNum)){ + virtualContainerNameList.add(virtualBasketSeqNum); + } + } + if(CollectionUtils.isNotEmpty(virtualContainerNameList)){ + tousseInstanceManager.countVirtualContainerStatus(virtualContainerNameList); + } + } + + // 设置invoiceItem和invoice的关联 + for (InvoiceItem invoiceItem : invoice.getInvoiceItem()) { + invoiceItem.setInvoiceID(invoice.getId()); + objectDao.update(invoiceItem); + } + + // 更新发货计划单状态 + for (InvoicePlan invoicePlan : invoicePlans) { + updateInvoicePlanStatus(invoicePlan); + } + + // 发货单和发货计划的多对多关联 + for (InvoicePlan invoicePlan : invoicePlans) { + Invoice_InvoicePlan invoice_InvoicePlan = new Invoice_InvoicePlan(); + invoice_InvoicePlan.setInvoiceId(invoice.getId()); + invoice_InvoicePlan.setInvoicePlanId(invoicePlan.getId()); + objectDao.save(invoice_InvoicePlan); + } + } + return invoice; + } + private void updateOtherInvoicePlanStatus(SubmitInvoiceContext submitInvoiceContext){ Set tousseInstances = new HashSet(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo(); @@ -2288,6 +2499,7 @@ submitInvoiceContext.setSendOnlyUrgentGoods(false); //回写的发货单集合 List writeBackInvoiceList = new ArrayList(); + submitInvoiceContext.setWriteBackInvoiceList(writeBackInvoiceList); //一次性物品库存变动记录(一次性物品标识表及高值耗材库存变动记录) List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); for (InvoicePlan invoicePlan : filteredList) { @@ -2686,6 +2898,8 @@ } SubmitInvoiceContext submitInvoiceContext = new SubmitInvoiceContext(); + boolean comboTousseSendByWrapperTousse = CssdUtils.getSystemSetConfigByNameBool("comboTousseSendByWrapperTousse"); + submitInvoiceContext.setComboTousseSendByWrapperTousse(comboTousseSendByWrapperTousse); setAndValidateParams(params, submitInvoiceContext); List submitInvoiceItems = submitInvoiceContext.getSubmitInvoiceItems(); @@ -2723,8 +2937,10 @@ submitInvoiceContext.setSendOnlyUrgentGoods(true); //回写的发货单集合 List writeBackInvoiceList = new ArrayList(); + submitInvoiceContext.setWriteBackInvoiceList(writeBackInvoiceList); //库存变动记录(一次性物品标识表及高值耗材库存变动记录) List disposableGoodsStorageAdjustVoList = new ArrayList(); + submitInvoiceContext.setDisposableGoodsStorageAdjustVoList(disposableGoodsStorageAdjustVoList); for (InvoicePlan invoicePlan : filteredList) { // 判断如果扫描的物品已经发完货,那么剩下的单就不需要再遍历处理了 if(isSendOutCompletely(submitInvoiceContext)){ @@ -2752,6 +2968,8 @@ writeBackInvoiceList.add(invoice); } } + // 聚合包整包发货 + invoiceWrapperComboTousse(filteredList,submitInvoiceContext); //不管紧急发货还是非紧急发货,统一汇总后回写 writebackForWriteBackInventoryDao(writeBackInvoiceList , disposableGoodsStorageAdjustVoList); @@ -4028,6 +4246,139 @@ return invoice; } + private Invoice createComboTousseInvoice( + Set invoicePlans, + Set invoiceItems, + SubmitInvoiceContext submitInvoiceContext) { + String sourceWarehouseName = submitInvoiceContext + .getSourceWarehouseName(); + if (CollectionUtils.isEmpty(invoiceItems)) { + return null; + } + Invoice invoice = new Invoice(); + List diposableGoodsItems = new ArrayList(); + List expensiveGoodsItems = new ArrayList(); + + String invoicePlanType = "聚合包发货"; + InvoicePlan invoicePlan = null; + if(invoicePlans.size() == 1){ + invoicePlan = invoicePlans.iterator().next(); + } + if (invoicePlan != null) { + invoicePlanType = invoicePlan.getType(); + } + String departCoding = submitInvoiceContext.getDepartCode(); + String depart = submitInvoiceContext.getDepart(); + String settleAccountsDepart = depart; + String settleAccountsDepartCoding = departCoding;// 结算科室部门编码 + Date date = new Date(); + String applicant = null; + Date applicationTime = null; + Date recyclingTime = null; + + if (invoicePlan != null) { + departCoding = invoicePlan.getDepartCoding(); + depart = invoicePlan.getDepart(); + applicant = invoicePlan.getApplicant(); + applicationTime = invoicePlan.getApplicationTime(); + recyclingTime = invoicePlan.getRecyclingTime(); + settleAccountsDepart = invoicePlan.getSettleAccountsDepart(); + settleAccountsDepartCoding = invoicePlan.getSettleAccountsDepartCoding(); + } else { + applicationTime = date; + recyclingTime = date; + } + invoice.setInvoicePlanType(invoicePlanType); + invoice.setDepart(depart); + invoice.setDepartCoding(departCoding); + invoice.setSettleAccountsDepart(settleAccountsDepart); + invoice.setSettleAccountsDepartCoding(settleAccountsDepartCoding); + + Set tousseInstancesToUpdate = submitInvoiceContext + .getTousseInstancesToUpdate(); + for (InvoiceItem invoiceItem : invoiceItems) { + // 先保存invoiceItem,以后需要invoiceItemID + objectDao.save(invoiceItem); + List tousseInstances = invoiceItem + .getTousseInstances(); + for (TousseInstance tousseInstance : tousseInstances) { + BigDecimal itemPrice = new BigDecimal(0.00); + BigDecimal discountedPrice = new BigDecimal(0.00); + +// itemPrice = addItemPriceToTotal( +// tousseInstance.getPrice(), 1, +// itemPrice); +// discountedPrice = addItemPriceToTotal( +// tousseInstance.getDiscountPrice(), 1, discountedPrice); + tousseInstancesToUpdate.add(tousseInstance); + +// invoiceItem.setSettlementPrice(invoiceItem +// .getSettlementPrice() +// + itemPrice.doubleValue()); +// invoiceItem.setSettlementDiscountPrice(invoiceItem +// .getSettlementDiscountPrice() + discountedPrice.doubleValue()); + + + } + + } + + JSONObject params = submitInvoiceContext.getParams(); + String personInCharge = JSONUtil + .optString(params, "personInCharge", ""); + String personInChargeCode = JSONUtil.optString(params, + "personInChargeCode", ""); + invoice.setApplicant(applicant); + invoice.setApplicationTime(applicationTime); + invoice.setRecyclingTime(recyclingTime); + + invoice.setDiposableGoodsItems(diposableGoodsItems); + invoice.setExpensiveGoodsItems(expensiveGoodsItems); + invoice.setInvoiceItem(invoiceItems); + // 关联发货单ID + if (invoicePlan != null) { + for (InvoiceItem invoiceItem : invoiceItems) { + invoiceItem.setInvoicePlanID(invoicePlan.getId()); + } + invoice.setInvoicePlan(invoicePlan); + } + + invoice.setAssistantSender(submitInvoiceContext.getAssistantSender()); + if (invoicePlan != null) { + if (invoicePlan instanceof RecyclingApplication) { + RecyclingApplication application = (RecyclingApplication) invoicePlan; + invoice.setRemark(application.getRemark()); + } + } + + invoice.setSender(submitInvoiceContext.getSender()); + invoice.setPersonInCharge(personInCharge); + invoice.setPersonInChargeCode(personInChargeCode); + invoice.setSendTime(new Date()); + invoice.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INVOICE)); + + invoice.setStatus(Invoice.STATUS_DELIVERED); + invoice.setOrgUnitCoding(AcegiHelper.getLoginUser() + .getCurrentOrgUnitCode()); + // 发货物品总价 + { + BigDecimal totalPrice = new BigDecimal(0.00); + for (InvoiceItem invoiceItem : invoiceItems) { + totalPrice = MathTools.add(totalPrice, invoiceItem.getSettlementPrice()); + } + invoice.setTotalPrice(totalPrice.doubleValue()); + } + + // 工作量统计 + if (invoicePlan != null) { + invoice.setHospitalNumber(invoicePlan.getHospitalNumber()); + } + updateInvoiceStatistics(invoice, + submitInvoiceContext.getTousseInstancesToUpdate()); + return invoice; + } + private BigDecimal addItemPriceToTotal(Double price,int amount,BigDecimal totalPrice){ if(price == null){ price = 0d; @@ -4255,6 +4606,33 @@ // } } + // 生成聚合包的invoiceItem + private void createComboInvoice(SubmitInvoiceContext submitInvoiceContext,Invoice invoice,Collection tousseInstancesToUpdate) { + if(invoice == null || invoice.getId() == null){ + throw new RuntimeException(String.format("发货单不能为空!")); + } + if(invoice.getId() == null){ + throw new RuntimeException(String.format("发货单ID不能为空!")); + } + if(tousseInstancesToUpdate == null){ + throw new RuntimeException(String.format("器械包实例不能为空!")); + } + Map idToTousseInstanceMap = submitInvoiceContext.getIdToTousseInstanceMap(); + + Set comboTousseSet = new HashSet(); + for (TousseInstance tousseInstance : tousseInstancesToUpdate) { + // 聚合包实例 + if(tousseInstance.isBelongsToComboTousse()){ + // 更新聚合包实例的状态 + TousseInstance comboTousseInstance = idToTousseInstanceMap.get(tousseInstance.getComboTousseInstanceId()); + if(comboTousseInstance == null){ + throw new RuntimeException(String.format("id为%s的聚合包实例已不存在!",tousseInstance.getComboTousseInstanceId())); + } + comboTousseSet.add(comboTousseInstance); + } + } + } + private static JsonObject buildErrorMsgJsonResult(String errorMsg) { JsonObject result = new JsonObject(); result.addProperty("success", false); @@ -8906,6 +9284,8 @@ String applyDate = JSONUtil.optString(params, "applyDate", null); String tousseTypes = JSONUtil.optString(params, "tousseTypes", null); boolean auxiliaryInvoice_limitInvoiceDepartByTousseDefinition = CssdUtils.getSystemSetConfigByNameBool("auxiliaryInvoice_limitInvoiceDepartByTousseDefinition"); + + boolean biologicalMonitoringEnable = CssdUtils.getSystemSetConfigByNameBool("biologicalMonitoringEnable"); JSONArray jsonArray = new JSONArray(); SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); String invoiceOrigin = config.getInvoiceOrigin(); @@ -9049,9 +9429,12 @@ } String barcode = tousseInstance.getBarcode(); boolean needRoutineMonitoringWarming = false; - if(tousseInstanceManager.isNeedRoutineMonitoringWarning(barcode)){ - needRoutineMonitoringWarming = true; + if (biologicalMonitoringEnable) { + if (tousseInstanceManager.isNeedRoutineMonitoringWarning(barcode)) { + needRoutineMonitoringWarming = true; + } } + JSONObject obj = new JSONObject(); obj.put("id", tousseInstance.getId()); obj.put("tousseDefinitionId", td.getId()); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r23338 -r23473 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 23338) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 23473) @@ -6307,6 +6307,12 @@ tousseInstance.setOrgUnitName(orgUnitName); tousseInstance.setPackingRecord_id(packingRecord.getId()); tousseInstance.setComboTousseDefinitionId(comboTousseTD.getId()); + + double price = comboTousseTD.getPrice(); + double fluctuationPrice = supplyRoomConfigManager + .getTousseFluctuationPrice(price); + tousseInstance.setPrice(price); + tousseInstance.setFluctuationPrice(fluctuationPrice); objectDao.saveOrUpdate(tousseInstance); return tousseInstance; }