Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r19139 -r19509 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 19139) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 19509) @@ -1652,9 +1652,18 @@ } else if(CollectionUtils.matchesAll(needSendTousseItems, notSendPred)){ // 所有应发货的物品,都未发货 - invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); - invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_AWAITDELIVER); + if(!invoicePlan.isForeignTousseAppliaction()){ + invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_AWAITDELIVER); + }else{ + if(!invoicePlan.partDelivered()){ + // 外来器械申请单,tousseItem发货数量为0,也有可能是部分发货状态 + invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + invoicePlan.setOrderByFiled(InvoicePlan.DELIVER_AWAITDELIVER); + } + } + } else if (CollectionUtils.matchesAll(needSendTousseItems, sendedPred)){ // 所有应发货的物品,都已发货 invoicePlan.setDeliverStatus(InvoicePlan.DELIVERSTATUS_DELIVERED); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r18547 -r19509 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 18547) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 19509) @@ -85,7 +85,7 @@ private Set autoDeductionDisposableGoodsInvoiceItems = new HashSet(); private List autoDeductionDisposableGoodsItems = new LinkedList(); private List allGoodsStocksInDB = new LinkedList<>();//数据库中的库存对象 - + private boolean allowPartlyInvoiceForeignTousse = false;// 外来器械允许部分发货 public List getAllGoodsStocksInDB() { return allGoodsStocksInDB; } @@ -448,4 +448,13 @@ this.autoDeductionDisposableGoodsItems = autoDeductionDisposableGoodsItems; } + public boolean isAllowPartlyInvoiceForeignTousse() { + return allowPartlyInvoiceForeignTousse; + } + + public void setAllowPartlyInvoiceForeignTousse( + boolean allowPartlyInvoiceForeignTousse) { + this.allowPartlyInvoiceForeignTousse = allowPartlyInvoiceForeignTousse; + } + } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/TestPDAForeignTousseGoodsInvoiceManager.java =================================================================== diff -u -r19069 -r19509 --- ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/TestPDAForeignTousseGoodsInvoiceManager.java (.../TestPDAForeignTousseGoodsInvoiceManager.java) (revision 19069) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/TestPDAForeignTousseGoodsInvoiceManager.java (.../TestPDAForeignTousseGoodsInvoiceManager.java) (revision 19509) @@ -68,89 +68,29 @@ tousseItemManager.save(item); // + for (String barcode : barcodeArray1) { + TousseInstance tousseInstance = new TousseInstance(); + tousseInstance.setTousseDefinition(foreignTousseTousseDefinition); + tousseInstance.setTousseName("test骨科外来器械包"); + tousseInstance.setForeignTousseApp_id(foreignTousseApplication.getId()); + tousseInstance.setInvoicePlanID(foreignTousseApplication.getId()); + tousseInstance.setBarcode(barcode); + tousseInstance.setType(TousseDefinition.PACKAGE_TYPE_FOREIGN); + tousseInstance.setStatus(TousseInstance.STATUS_STERILED); + tousseInstance.setPrice(356.00); + tousseInstance.setFluctuationPrice(356.00); + tousseInstance.setOrgUnitCoding(Constants.ORG_UNIT_CODE_OR); + tousseInstance.setOrgUnitName(Constants.ORG_UNIT_NAME_OR); + tousseInstance.setStatisticsAmount(10); + tousseInstance.setPackageType("纸塑"); + tousseInstanceManager.setToDefaultWareHouse(tousseInstance, Constants.ORG_UNIT_CODE_OR); + tousseInstanceManager.saveOrUpdate(tousseInstance); + } - TousseInstance tousseInstance = new TousseInstance(); - tousseInstance.setTousseDefinition(foreignTousseTousseDefinition); - tousseInstance.setTousseName("test骨科外来器械包"); - tousseInstance.setForeignTousseApp_id(foreignTousseApplication.getId()); - tousseInstance.setInvoicePlanID(foreignTousseApplication.getId()); - tousseInstance.setBarcode(barcodeArray1[0]); - tousseInstance.setType(TousseDefinition.PACKAGE_TYPE_FOREIGN); - tousseInstance.setStatus(TousseInstance.STATUS_STERILED); - tousseInstance.setPrice(356.00); - tousseInstance.setFluctuationPrice(356.00); - tousseInstance.setOrgUnitCoding(Constants.ORG_UNIT_CODE_OR); - tousseInstance.setOrgUnitName(Constants.ORG_UNIT_NAME_OR); - tousseInstance.setStatisticsAmount(10); - tousseInstance.setPackageType("纸塑"); - tousseInstanceManager.setToDefaultWareHouse(tousseInstance, Constants.ORG_UNIT_CODE_OR); - tousseInstanceManager.saveOrUpdate(tousseInstance); // foreignTousseApplicationManager.saveOrUpdate(foreignTousseApplication); } - /** - * 创建外来器械包实例 - */ - private void createForeignTousseGoodsInstance(){ - TousseDefinition disinfectionTousse = tousseDefinitionManager.getTousseDefinitionByName("test骨科外来器械包"); - TousseInstance tousseInstance = new TousseInstance(); - tousseInstance.setTousseDefinition(disinfectionTousse); - tousseInstance.setTousseName("test骨科外来器械包"); - tousseInstance.setInvoicePlanID(foreignTousseApplication.getId()); - tousseInstance.setBarcode(barcodeArray1[0]); - tousseInstance.setType(TousseDefinition.PACKAGE_TYPE_FOREIGN); - tousseInstance.setStatus(TousseInstance.STATUS_STERILED); - tousseInstance.setPrice(356.00); - tousseInstance.setFluctuationPrice(356.00); - tousseInstance.setOrgUnitCoding(Constants.ORG_UNIT_CODE_OR); - tousseInstance.setOrgUnitName(Constants.ORG_UNIT_NAME_OR); - tousseInstance.setStatisticsAmount(10); - tousseInstance.setPackageType("纸塑"); - tousseInstanceManager.setToDefaultWareHouse(tousseInstance, Constants.ORG_UNIT_CODE_OR); - tousseInstanceManager.saveOrUpdate(tousseInstance); - } - /** - * 创建一张用于代理灭菌单 - */ - @SuppressWarnings("unchecked") - private void createProxyDisifectionApplication(){ - TousseInstance tousseInstance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[0]); - List proxyTousses = new ArrayList(); - proxyTousses.add(tousseInstance); - ProxyDisinfection proxyDisinfection = new ProxyDisinfection(); - proxyDisinfection.setApplicant("朱广兴"); - proxyDisinfection.setCommittedStatus(true); - proxyDisinfection.setApplicationTime(new Date()); - proxyDisinfection.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); - proxyDisinfection.setDepart(Constants.ORG_UNIT_NAME_OR); - proxyDisinfection.setDepartCoding(Constants.ORG_UNIT_CODE_OR); - proxyDisinfection.setType(InvoicePlan.TYPE_PROXYDISINFECTION); - proxyDisinfection.setSettleAccountsDepart(Constants.ORG_UNIT_NAME_OR); - proxyDisinfection.setSettleAccountsDepartCoding(Constants.ORG_UNIT_CODE_OR); - proxyDisinfection.setTotalAmountOfTousses(1); - proxyDisinfection.setSerialNumber("2014101700002"); - objectDao.saveOrUpdate(proxyDisinfection); - - List foreignTousseApplications = objectDao.findByProperty("ForeignTousseApplication", "serialNumber", "2014101700001"); - List items = new ArrayList(); - TousseItem item = new TousseItem(); - item.setTousseName("test骨科外来器械包"); - item.setAmount(1); - item.setDiposable("否"); - item.setInvoicePlan(proxyDisinfection); - items.add(item); - tousseItemManager.save(item); - proxyDisinfection.setApplicationItems(items); - objectDao.saveOrUpdate(proxyDisinfection); - //关联代理灭菌 - tousseInstance.setProxyDisinfection_id(proxyDisinfection.getId()); - tousseInstance.setForeignTousseApp_id(foreignTousseApplications.get(0).getId()); - tousseInstance.setInvoicePlanID(foreignTousseApplications.get(0).getId()); - List plans = objectDao.findByProperty("InvoicePlan", "serialNumber", "2014101700002"); - assertTrue(plans.size()>0); - - } /* * 测试外来器械全部发货 */ @@ -162,14 +102,16 @@ JSONObject params = new JSONObject(); JSONArray invoiceItems1 = new JSONArray(); - String barcode = "201410160001"; //发普通器械包 - JSONObject invoiceItems1_1 = new JSONObject(); - invoiceItems1_1.put("barcode", barcode); - invoiceItems1_1.put("sendAmount", 1); - invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); - invoiceItems1.add(invoiceItems1_1); + for (String barcode : barcodeArray1) { + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcode); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + } + params.put("mode", "depart"); params.put("departCode", Constants.ORG_UNIT_CODE_NEIKE); params.put("assistantSender", "朱广兴"); @@ -200,8 +142,8 @@ //全部发货 if(type.equals(testAll)){ - //断言发货单关联的包实例为1个 - assertEquals(1 , invoice.getTousseInstances(objectDao).size()); + //断言发货单关联的包实例为3个 + assertEquals(3 , invoice.getTousseInstances(objectDao).size()); TousseInstance instance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[0]); //断言发货状态为已发货 @@ -222,16 +164,212 @@ assertEquals(1, departmentStock2.getAmount().intValue());*/ //断言发货单金额 - assertEquals(1 *instance.getPrice() , invoice.getTotalPrice()); + assertEquals(3 *instance.getPrice() , invoice.getTotalPrice()); //断言代理灭菌单状态为已发货 assertEquals(InvoicePlan.DELIVERSTATUS_DELIVERED , foreignTousseApplication.getDeliverStatus()); //断言代理灭菌器械包个数为1个 - assertEquals(1, foreignTousseApplication.getTousseInstanceList(objectDao).size()); + assertEquals(3, foreignTousseApplication.getTousseInstanceList(objectDao).size()); } } + /* + * 测试外来器械全部发货,允许部分发货,一次全部发货 + */ + @Test + public void testSendForeignTousseGoods_allowPartlyInvoiceForeignTousse_1(){ + prepareData(); + WareHouse wareHouse_CSSD = wareHouseManager.getDefaultWareHouseByUnitCode(Constants.ORG_UNIT_CODE_CSSD); + assertNotNull(wareHouse_CSSD); + + JSONObject params = new JSONObject(); + JSONArray invoiceItems1 = new JSONArray(); + //发普通器械包 + for (String barcode : barcodeArray1) { + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcode); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + } + + + params.put("mode", "depart"); + params.put("departCode", Constants.ORG_UNIT_CODE_NEIKE); + params.put("assistantSender", "朱广兴"); + params.put("sender", "朱广兴"); + params.put("invoiceItems", invoiceItems1); + params.put("sourceWarehouseId", wareHouse_CSSD.getId()); + params.put("sourceWarehouseName", wareHouse_CSSD.getName()); + params.put("allowPartlyInvoiceForeignTousse", true); + + invoiceManager.submitInvoice(params); + //外来器械申请单的发货单 + Invoice invoice = (Invoice)objectDao.getByProperty(Invoice.class.getSimpleName(), "invoicePlan.serialNumber", "2014101700001"); + //断言发货单不为空 + assertNotNull(invoice); + //外来器械申请单 + ForeignTousseApplication foreignTousseApplication = foreignTousseApplicationManager.getById(invoice.getInvoicePlan().getId().toString()); + + + //断言发货单关联的包实例为3个 + assertEquals(3 , invoice.getTousseInstances(objectDao).size()); + + TousseInstance instance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[0]); + //断言发货状态为已发货 + assertEquals(TousseInstance.STATUS_SHIPPED , instance.getStatus()); + + //断言申请单状态为已发货 + assertEquals(InvoicePlan.DELIVERSTATUS_DELIVERED , invoice.getInvoicePlan().getDeliverStatus()); + + //断言发货单金额 + assertEquals(3 *instance.getPrice() , invoice.getTotalPrice()); + + //断言代理灭菌单状态为已发货 + assertEquals(InvoicePlan.DELIVERSTATUS_DELIVERED , foreignTousseApplication.getDeliverStatus()); + //断言代理灭菌器械包个数为1个 + assertEquals(3, foreignTousseApplication.getTousseInstanceList(objectDao).size()); + + } + + /* + * 测试外来器械全部发货,允许部分发货,分3次发货 + */ + @Test + public void testSendForeignTousseGoods_allowPartlyInvoiceForeignTousse_2(){ + prepareData(); + WareHouse wareHouse_CSSD = wareHouseManager.getDefaultWareHouseByUnitCode(Constants.ORG_UNIT_CODE_CSSD); + assertNotNull(wareHouse_CSSD); + + { + JSONObject params = new JSONObject(); + JSONArray invoiceItems1 = new JSONArray(); + //发普通器械包 + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcodeArray1[0]); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + + params.put("mode", "depart"); + params.put("departCode", Constants.ORG_UNIT_CODE_NEIKE); + params.put("assistantSender", "朱广兴"); + params.put("sender", "朱广兴"); + params.put("invoiceItems", invoiceItems1); + params.put("sourceWarehouseId", wareHouse_CSSD.getId()); + params.put("sourceWarehouseName", wareHouse_CSSD.getName()); + params.put("allowPartlyInvoiceForeignTousse", true); + + invoiceManager.submitInvoice(params); + //外来器械申请单的发货单 + Invoice invoice = (Invoice)objectDao.getByProperty(Invoice.class.getSimpleName(), "invoicePlan.serialNumber", "2014101700001"); + //断言发货单不为空 + assertNotNull(invoice); + //外来器械申请单 + ForeignTousseApplication foreignTousseApplication = foreignTousseApplicationManager.getById(invoice.getInvoicePlan().getId().toString()); + + + //断言发货单关联的包实例为1个 + assertEquals(1 , invoice.getTousseInstances(objectDao).size()); + + TousseInstance instance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[0]); + //断言发货状态为已发货 + assertEquals(TousseInstance.STATUS_SHIPPED , instance.getStatus()); + + //断言申请单状态为部分发货 + assertEquals(InvoicePlan.DELIVERSTATUS_PARTDELIVERED , invoice.getInvoicePlan().getDeliverStatus()); + + //断言发货单金额 + assertEquals(1 *instance.getPrice() , invoice.getTotalPrice()); + + } + { + JSONObject params = new JSONObject(); + JSONArray invoiceItems1 = new JSONArray(); + //发普通器械包 + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcodeArray1[1]); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + + params.put("mode", "depart"); + params.put("departCode", Constants.ORG_UNIT_CODE_NEIKE); + params.put("assistantSender", "朱广兴"); + params.put("sender", "朱广兴"); + params.put("invoiceItems", invoiceItems1); + params.put("sourceWarehouseId", wareHouse_CSSD.getId()); + params.put("sourceWarehouseName", wareHouse_CSSD.getName()); + params.put("allowPartlyInvoiceForeignTousse", true); + + invoiceManager.submitInvoice(params); + //外来器械申请单的发货单 + Invoice invoice = (Invoice)objectDao.getByProperty(Invoice.class.getSimpleName(), "invoicePlan.serialNumber", "2014101700001"); + //断言发货单不为空 + assertNotNull(invoice); + //外来器械申请单 + ForeignTousseApplication foreignTousseApplication = foreignTousseApplicationManager.getById(invoice.getInvoicePlan().getId().toString()); + + + //断言发货单关联的包实例为1个 + assertEquals(1 , invoice.getTousseInstances(objectDao).size()); + + TousseInstance instance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[1]); + //断言发货状态为已发货 + assertEquals(TousseInstance.STATUS_SHIPPED , instance.getStatus()); + + //断言申请单状态为部分发货 + assertEquals(InvoicePlan.DELIVERSTATUS_PARTDELIVERED , invoice.getInvoicePlan().getDeliverStatus()); + + //断言发货单金额 + assertEquals(1 *instance.getPrice() , invoice.getTotalPrice()); + + } + { + JSONObject params = new JSONObject(); + JSONArray invoiceItems1 = new JSONArray(); + //发普通器械包 + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcodeArray1[2]); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + + params.put("mode", "depart"); + params.put("departCode", Constants.ORG_UNIT_CODE_NEIKE); + params.put("assistantSender", "朱广兴"); + params.put("sender", "朱广兴"); + params.put("invoiceItems", invoiceItems1); + params.put("sourceWarehouseId", wareHouse_CSSD.getId()); + params.put("sourceWarehouseName", wareHouse_CSSD.getName()); + params.put("allowPartlyInvoiceForeignTousse", true); + + invoiceManager.submitInvoice(params); + //外来器械申请单的发货单 + Invoice invoice = (Invoice)objectDao.getByProperty(Invoice.class.getSimpleName(), "invoicePlan.serialNumber", "2014101700001"); + //断言发货单不为空 + assertNotNull(invoice); + //外来器械申请单 + ForeignTousseApplication foreignTousseApplication = foreignTousseApplicationManager.getById(invoice.getInvoicePlan().getId().toString()); + + + //断言发货单关联的包实例为1个 + assertEquals(1 , invoice.getTousseInstances(objectDao).size()); + + TousseInstance instance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray1[2]); + //断言发货状态为已发货 + assertEquals(TousseInstance.STATUS_SHIPPED , instance.getStatus()); + + //断言申请单状态为已发货 + assertEquals(InvoicePlan.DELIVERSTATUS_DELIVERED , invoice.getInvoicePlan().getDeliverStatus()); + + //断言发货单金额 + assertEquals(1 *instance.getPrice() , invoice.getTotalPrice()); + + } + } + private void prepareData(){ initCSSDData(); makeActiveUser("cssduser1"); Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r19508 -r19509 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 19508) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 19509) @@ -1837,32 +1837,46 @@ if(invoicePlanIds.isEmpty()){ return ; } - List invoicePlans = invoicePlanManager.getInvoicePlanByIDsForInvoice_ForUpdate_TRANS_MANDATORY(invoicePlanIds );; + List invoicePlans = invoicePlanManager.getInvoicePlanByIDsForInvoice_ForUpdate_TRANS_MANDATORY(invoicePlanIds ); if(invoicePlans == null || invoicePlans.size() != invoicePlanIds.size()){ throw new RuntimeException("更新关联申请单状态失败,部分申请单已被删除!"); } 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())){ - throw new RuntimeException(String.format("外来器械申请单不允许部分发货,流水号[%s]", fta.getSerialNumber())); + if(!submitInvoiceContext.isAllowPartlyInvoiceForeignTousse()){ + // 不允许部分发货 + throw new RuntimeException(String.format("外来器械申请单不允许部分发货,流水号[%s]", fta.getSerialNumber())); + }else{ + allSent = false; + } } } } - List applicationItems = fta.getApplicationItems(); - if(applicationItems != null){ - for (TousseItem tousseItem : applicationItems) { - tousseItem.setSendOutAmount(tousseItem.getAmount()); - objectDao.update(tousseItem); + + 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); } - fta.setDeliverStatus(InvoicePlan.DELIVERSTATUS_DELIVERED); objectDao.update(fta); }else{ // throw new RuntimeException("目前只支持更新关联的外来器械包申请单状态!"); @@ -2314,6 +2328,9 @@ String sender = params.optString("sender"); String sourceWarehouseId = JSONUtil.optString(params, "sourceWarehouseId", ""); String sourceWarehouseName = JSONUtil.optString(params, "sourceWarehouseName", ""); + boolean allowPartlyInvoiceForeignTousse = CssdUtils.getSystemSetConfigByNameBool("allowPartlyInvoiceForeignTousse"); + allowPartlyInvoiceForeignTousse = JSONUtil.optBoolean(params, "allowPartlyInvoiceForeignTousse", allowPartlyInvoiceForeignTousse); + submitInvoiceContext.setAllowPartlyInvoiceForeignTousse(allowPartlyInvoiceForeignTousse); if (StringUtils.isBlank(sender)) { throw new RuntimeException("缺失参数sender"); } @@ -5727,22 +5744,45 @@ // item.setSendOutAmount(1); // } if (invoiceItemMap.size() > 0) { - item.setSendOutAmount(1); - if(submitInvoiceContext.isSendOnlyUrgentGoods()){ - item.setUrgentAmount(0);// 修改紧急数量 - item.setUrgent(Constants.STR_NO);// 修改紧急状态 + if(submitInvoiceContext.isAllowPartlyInvoiceForeignTousse()){ + 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); + allSent = false; + break; + } + } + if(allSent){ + item.setSendOutAmount(1); + if(submitInvoiceContext.isSendOnlyUrgentGoods()){ + item.setUrgentAmount(0);// 修改紧急数量 + item.setUrgent(Constants.STR_NO);// 修改紧急状态 + } + }else{ + // sendOutAmount为0,但是状态为部分发货 + 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); } -// for (TousseInstance tousseInstance : tousseInstanceList) { -// // 必须所有器械包实例状态都变为已发货状态,才能将已发货数量改为1 -// if (!tousseInstance.isShippedStatus()) { -// errorMessage = String.format("%s 拆分的包不能部分发货,必须一起发货!", -// tousseInstance.getTousseName(), -// tousseInstance.getBarcode()); -// throw new RuntimeException(errorMessage); -// } -// } - // 最后一起验证 - submitInvoiceContext.getInvoicedForeignTousseAppliactionIdSet().add(invoicePlanId); + + } Iterator itr = invoiceItemMap.keySet().iterator(); while (itr.hasNext()) { Index: ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js =================================================================== diff -u -r19505 -r19509 --- ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 19505) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 19509) @@ -1,4 +1,4 @@ -var sstsConfig = { +var sstsConfig = { //洗手护士巡回护士能否不填 useRecordCircuitNurseAllowBlank : true, useRecordWashHandNurseAllowBlank : true, @@ -199,6 +199,8 @@ storageUseStorageSubtractWaitDeliver : true, //是否统计拆包回收的器械拆分的篮筐数量 enableSplitBasketCount : true, + // 是否允许外来器械部分发货 + allowPartlyInvoiceForeignTousse:true, // 外来器械申请单中材料种类颜色管理 washClassifyTypeColorManager : { '平面类' : 'yellow-row',