Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r19909 -r19929 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 19909) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 19929) @@ -1843,41 +1843,8 @@ } for (InvoicePlan invoicePlan : invoicePlans) { if((invoicePlan instanceof ForeignTousseApplication)){ - ForeignTousseApplication fta = (ForeignTousseApplication)invoicePlan; - List tousseInstanceList = fta.getTousseInstanceList(objectDao); - boolean allSent = true; - if(tousseInstanceList != null){ - for (TousseInstance tousseInstance : tousseInstanceList) { - if(tousseInstances.contains(tousseInstance)){ - continue; - } - if(!DatabaseUtil.isPoIdValid(tousseInstance.getInvoice_id())){ - if(!submitInvoiceContext.isAllowPartlyInvoiceForeignTousse()){ - // 不允许部分发货 - throw new RuntimeException(String.format("外来器械申请单不允许部分发货,流水号[%s]", fta.getSerialNumber())); - }else{ - allSent = false; - } - } - } - } - - if(allSent){ - List applicationItems = fta.getApplicationItems(); - if(applicationItems != null){ - for (TousseItem tousseItem : applicationItems) { - tousseItem.setSendOutAmount(tousseItem.getAmount()); - objectDao.update(tousseItem); - } - } - fta.setDeliverStatus(InvoicePlan.DELIVERSTATUS_DELIVERED); - fta.setOrderByFiled(InvoicePlan.DELIVER_DELIVERED); - }else{ - // sendOutAmount为0,但是状态为部分发货 - fta.setDeliverStatus(InvoicePlan.DELIVERSTATUS_PARTDELIVERED); - fta.setOrderByFiled(InvoicePlan.DELIVER_PARTDELIVERED); - } - objectDao.update(fta); + setForeignTousseItemAndAppliactionStatusAfterInvoice(invoicePlan, submitInvoiceContext,true); + updateInvoicePlanStatus(invoicePlan); }else{ // throw new RuntimeException("目前只支持更新关联的外来器械包申请单状态!"); } @@ -5690,6 +5657,7 @@ if(applicationItems == null || applicationItems.size()==0){ return invoiceItemSet; } + List sendTousseItems = new LinkedList(); Long invoicePlanId = invoicePlan.getId(); for (TousseItem item : applicationItems) { if(item.terminated()){// 对终止状态的处理 @@ -5701,7 +5669,7 @@ if(submitInvoiceContext.isSendOnlyUrgentGoods() && (item.safelyGetUrgentAmount() == 0)){ continue;// 如果是发送紧急物品模式,当前申请项的紧急数量为0,那么跳过 } - + boolean itemSend = false; // 外来器械包拆包处理,因为外来器械每个器械包实例的包定义都不同,InvoiceItem记了包定义id,所以InvoiceItem不需要也不应该合并 for (Map.Entry entry : sendOutBarcodeAmountMap.entrySet()) { String barcode = entry.getKey(); @@ -5713,6 +5681,9 @@ continue; } TousseInstance tousseInstance = (TousseInstance)barcodeDevice; + if(!TousseItemUtils.IsForeignTousseItemMatchTousseInstance(item, tousseInstance)){ + continue; + } Integer amount = entry.getValue(); if(amount == null || amount == 0){ continue; @@ -5743,74 +5714,136 @@ invoiceItemSet.add(invoiceItem); amount = amount - 1; sendOutBarcodeAmountMap.put(barcode, amount); + itemSend = true; + } + if(itemSend){ + sendTousseItems.add(item); + } } - // 目前外来器械只能申请一个物品 -// if (invoiceItemMap.size() > 0) { -// TousseItem item = invoicePlan.getApplicationItems().get(0); -// item.setSendOutAmount(1); -// } if (invoiceItemSet.size() > 0) { - if(submitInvoiceContext.isAllowPartlyInvoiceForeignTousse()){ + setForeignTousseItemAndAppliactionStatusAfterInvoice(invoicePlan, submitInvoiceContext, false); + } + return invoiceItemSet; + } + private void setForeignTousseItemAndAppliactionStatusAfterInvoice(InvoicePlan invoicePlan,SubmitInvoiceContext submitInvoiceContext,boolean verifyPartInvoiceImmediately){ + List applicationItems = invoicePlan.getApplicationItems(); + if(applicationItems == null){ + return ; + } + Long invoicePlanId = invoicePlan.getId(); + if(applicationItems.size() == 1){ + TousseItem item = applicationItems.get(0); + if(item.terminated()){// 对终止状态的处理 + return; + } + if(!TousseItemUtils.IsInvoice(item)){ + return; + } + Integer sendOutAmount = item.getSendOutAmount(); + if(sendOutAmount != null && sendOutAmount == 1){// 不管已发货的 + return; + } + // 允许部分发货 + boolean allSent = true; + if(submitInvoiceContext.isAllowPartlyInvoiceForeignTousse() || verifyPartInvoiceImmediately){ List tousseInstanceList = tousseInstanceManager .getToussInstanceByForeignTousseApplicationIdForInvoice(invoicePlan .getId()); - boolean allSent = true; // 外来器械允许部分发货 for (TousseInstance tousseInstance : tousseInstanceList) { // 必须所有器械包实例状态都变为已发货状态,才能将已发货数量改为1 - if (!tousseInstance.isShipped()) { -// errorMessage = String.format("%s 拆分的包不能部分发货,必须一起发货!", -// tousseInstance.getTousseName(), -// tousseInstance.getBarcode()); -// throw new RuntimeException(errorMessage); + if (!tousseInstance.hasShipped()) { allSent = false; break; } } - for (TousseItem item : applicationItems) { - boolean itemAllSent = true; - for (TousseInstance tousseInstance : tousseInstanceList) { - Long itemTousseDefinitionId = item.getTousseDefinitionId(); - Long tdId = tousseInstance.getTousseDefinition().getId(); - Long parentId = tousseInstance.getTousseDefinition().getParentID(); - if(itemTousseDefinitionId.equals(tdId) || tdId.equals(parentId)){ - if (!tousseInstance.isShipped()) { - itemAllSent = false; - } - } - } - if(itemAllSent){ - item.setSendOutAmount(1); - if(submitInvoiceContext.isSendOnlyUrgentGoods()){ - item.setUrgentAmount(0);// 修改紧急数量 - item.setUrgent(Constants.STR_NO);// 修改紧急状态 - } - } - } - if(!allSent){ - // sendOutAmount为0,但是状态为部分发货 - invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_PARTDELIVERED); - invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_PARTDELIVERED); - } + } + + // 旧的功能,一个单只允许申请一个外来器械包 + if(submitInvoiceContext.isAllowPartlyInvoiceForeignTousse()){ - }else{ - for (TousseItem item : applicationItems) { + if(allSent){ item.setSendOutAmount(1); if(submitInvoiceContext.isSendOnlyUrgentGoods()){ item.setUrgentAmount(0);// 修改紧急数量 item.setUrgent(Constants.STR_NO);// 修改紧急状态 } + }else{ + invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_PARTDELIVERED); + invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_PARTDELIVERED); } + }else{ + item.setSendOutAmount(1); + if(submitInvoiceContext.isSendOnlyUrgentGoods()){ + item.setUrgentAmount(0);// 修改紧急数量 + item.setUrgent(Constants.STR_NO);// 修改紧急状态 + } // 最后一起验证 - submitInvoiceContext.getInvoicedForeignTousseAppliactionIdSet().add(invoicePlanId); + if(!verifyPartInvoiceImmediately){ + submitInvoiceContext.getInvoicedForeignTousseAppliactionIdSet().add(invoicePlanId); + }else{ + if(!allSent){ + // 不允许部分发货 + throw new RuntimeException(String.format("外来器械申请单不允许部分发货,流水号[%s]", invoicePlan.getSerialNumber())); + } + + } } - - + }else{ + setForeignTousseItemAndAppliactionStatusAfterInvoice(invoicePlan, submitInvoiceContext); } - return invoiceItemSet; } + // 发货之后设置外来器械申请单和申请项的状态。 + private void setForeignTousseItemAndAppliactionStatusAfterInvoice(InvoicePlan invoicePlan,SubmitInvoiceContext submitInvoiceContext){ + List applicationItems = invoicePlan.getApplicationItems(); + if(applicationItems == null){ + return ; + } + List tousseInstanceList = tousseInstanceManager + .getToussInstanceByForeignTousseApplicationIdForInvoice(invoicePlan + .getId()); + boolean partDelivered = false; + for (TousseItem item : applicationItems) { + if(item.terminated()){// 对终止状态的处理 + continue; + } + if(!TousseItemUtils.IsInvoice(item)){ + continue; + } + Integer sendOutAmount = item.getSendOutAmount(); + if(sendOutAmount != null && sendOutAmount == 1){// 不管已发货的 + continue; + } + int invoiceAmount = 0; + int waitingInvoiceAmount = 0; + for (TousseInstance tousseInstance : tousseInstanceList) { + if(!TousseItemUtils.IsForeignTousseItemMatchTousseInstance(item, tousseInstance)){ + continue; + } + if(tousseInstance.hasShipped()){ + ++invoiceAmount; + }else{ + ++waitingInvoiceAmount; + } + + } + if(invoiceAmount > 0 && waitingInvoiceAmount == 0){ + item.setSendOutAmount(1); + if(submitInvoiceContext.isSendOnlyUrgentGoods()){ + item.setUrgentAmount(0);// 修改紧急数量 + item.setUrgent(Constants.STR_NO);// 修改紧急状态 + } + }else{ + partDelivered = true; + } + } + if(partDelivered){ + invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_PARTDELIVERED); + invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_PARTDELIVERED); + } + } // 获取固定条码的消毒物品能发货的数量 // 判断是否是固定条码