Index: ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/OperationReservationMergeInvoiceTests.java =================================================================== diff -u -r18147 -r18255 --- ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/OperationReservationMergeInvoiceTests.java (.../OperationReservationMergeInvoiceTests.java) (revision 18147) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/OperationReservationMergeInvoiceTests.java (.../OperationReservationMergeInvoiceTests.java) (revision 18255) @@ -12,6 +12,7 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.codec.binary.StringUtils; import org.testng.annotations.Test; import test.forgon.constant.Constants; @@ -24,6 +25,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; public class OperationReservationMergeInvoiceTests extends AbstractCSSDTest { @@ -90,9 +92,7 @@ /** - * 申请器械包 Test开胸包2个、Test开颅包1个 - Test聚合包 包含 Test开胸包2个、Test开颅包1个 - 申请单状态:已发货,聚合包状态:已发货,普通器械包状态:已发货 + * 测试多个手术预约单合并发货 */ @Test public void testInvoiceAll(){ @@ -301,4 +301,92 @@ } + private TousseItem getTousseItem(InvoicePlan invoicePlan,String tousseName){ + for (TousseItem tousseItem : invoicePlan.getApplicationItems()) { + if(StringUtils.equals(tousseItem.getTousseName(), tousseName)){ + return tousseItem; + } + } + return null; + } + /** + * 测试发货时终止申请单 + */ + @Test + public void testInvoiceAndTerminateInvoicePlan(){ + prepareData(); + createTousseApplication_all(); + createTousseInstances(); + //运行前对全局变量清空,以防止影响下一个用例的运行结果 + WareHouse wareHouse_CSSD = wareHouseManager.getDefaultWareHouseByUnitCode(Constants.ORG_UNIT_CODE_CSSD); + assertNotNull(wareHouse_CSSD); + + JSONObject params = new JSONObject(); + JSONArray invoiceItems = new JSONArray(); + JSONArray invoicePlanItemsToTerminateItems = new JSONArray(); + { + // 第一个单 + InvoicePlan invoicePlan = invoicePlanManager.getInvoicePlanBySerialNumber("2017051800001"); + + JSONObject invoiceItem = new JSONObject(); + JSONArray invoiceItems1 = new JSONArray(); + { + JSONObject invoiceItems1_1 = new JSONObject(); + invoiceItems1_1.put("barcode", barcodeArray_开胸包[0]); + invoiceItems1_1.put("tousseType", TousseDefinition.PACKAGE_TYPE_INSIDE); + invoiceItems1_1.put("sendAmount", 1); + invoiceItems1_1.put("isRoutine", TousseInstance.ROUTINE_YES); + invoiceItems1.add(invoiceItems1_1); + } + // 终止治疗巾 + { + JSONObject terminateItem1 = new JSONObject(); + JSONArray tousseItems = new JSONArray(); + JSONObject tousseItem = new JSONObject(); + + terminateItem1.put("invoicePlanId", invoicePlan.getId()); + tousseItem.put("tousseItemId", getTousseItem(invoicePlan,"Test治疗巾").getId()); + tousseItems.add(tousseItem); + terminateItem1.put("tousseItems", tousseItems); + invoicePlanItemsToTerminateItems.add(terminateItem1); + } + + invoiceItem.put("invoicePlanId", invoicePlan.getId()); + invoiceItem.put("invoiceItems", invoiceItems1); + invoiceItems.add(invoiceItem); + } + + params.put("mode", "depart"); + params.put("invoiceType", "手术预约多单合并发货"); + params.put("departCode", "3266"); + params.put("assistantSender", "朱广兴"); + params.put("sender", "朱广兴"); + params.put("invoiceItems", invoiceItems); + params.put("invoicePlanItemsToTerminate", invoicePlanItemsToTerminateItems); + params.put("sourceWarehouseId", wareHouse_CSSD.getId()); + params.put("sourceWarehouseName", wareHouse_CSSD.getName()); + + invoiceManager.submitInvoice(params); + + Invoice invoice1 = (Invoice)objectDao.getByProperty(Invoice.class.getSimpleName(), "invoicePlan.serialNumber", "2017051800001"); + assertNotNull(invoice1); + //断言申请单状态为已发货 + assertEquals(InvoicePlan.DELIVERSTATUS_DELIVERED , invoice1.getInvoicePlan().getDeliverStatus()); + //断言发货单关联的包实例为1个 + assertEquals(1 , invoice1.getTousseInstances(objectDao).size()); + + // 断言开胸包状态 + TousseInstance tousseInstance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray_开胸包[0]); + assertEquals(tousseInstance.getStatus(), TousseInstance.STATUS_SHIPPED); + assertEquals(tousseInstance.getInvoice_id(), invoice1.getId()); + tousseInstance = tousseInstanceManager.getTousseInstanceByBarcode(barcodeArray_开胸包[1]); + assertEquals(tousseInstance.getStatus(), TousseInstance.STATUS_STERILED); + + InvoicePlan invoicePlan1 = invoicePlanManager.getInvoicePlanBySerialNumber("2017051800001"); + assertEquals(InvoicePlan.STATUS_PART_END, invoicePlan1.getEndStatus()); + assertEquals(true, getTousseItem(invoicePlan1,"Test治疗巾").terminated()); + assertEquals(false, getTousseItem(invoicePlan1,"Test开胸包").terminated()); + + + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java =================================================================== diff -u -r18191 -r18255 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java (.../ApplicationGoodsVo.java) (revision 18191) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ApplicationGoodsVo.java (.../ApplicationGoodsVo.java) (revision 18255) @@ -3,9 +3,11 @@ */ package com.forgon.disinfectsystem.recyclingapplication.vo; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; @@ -39,7 +41,9 @@ private int materialAmount; // 材料总数量 private List invoicePlanIDList = new LinkedList(); - + + private Map> invoicePlanIdToTousseItemIdListMap = new HashMap>(); + private List materials = new LinkedList(); private String isCleanedEntirely = Constants.STR_YES; // 是否整包清洗 @@ -140,6 +144,18 @@ } invoicePlanIDList.add(invoicePlanID); } + + public void addTousseItemId(Long invoicePlanID,Long tousseItemId){ + List tousseItemIdList = invoicePlanIdToTousseItemIdListMap.get(invoicePlanID); + if(tousseItemIdList == null){ + tousseItemIdList = new LinkedList(); + invoicePlanIdToTousseItemIdListMap.put(invoicePlanID, tousseItemIdList); + } + if(tousseItemIdList.contains(tousseItemId)){ + return; + } + tousseItemIdList.add(tousseItemId); + } public List getMaterials() { return materials; Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r18191 -r18255 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 18191) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 18255) @@ -1938,9 +1938,53 @@ return invoicePlanIDs; } + public void terminateInvoicePlan(JSONObject params){ + if(!params.containsKey("invoicePlanItemsToTerminate")){ + return; + } + JSONArray invoicePlansToTerminate = params.getJSONArray("invoicePlanItemsToTerminate"); + Map> invoicePlanIdToTousseItemsIdSetmap = new HashMap>(); + for (int i = 0; i < invoicePlansToTerminate.size(); i++) { + JSONObject invoicePlanObj = invoicePlansToTerminate + .getJSONObject(i); + + Long invoicePlanId = JSONUtil.optLong(invoicePlanObj, "invoicePlanId", null); + if(invoicePlanId == null){ + throw new RuntimeException("终止申请单,申请单id不能为空!"); + } + JSONArray tousseItems = invoicePlanObj.optJSONArray("tousseItems"); + if(tousseItems == null || tousseItems.size() == 0){ + throw new RuntimeException(String.format("终止申请单,申请单[id=%s]的申请项不能为空!", invoicePlanId)); + } + Set tousseItemsIdSet = invoicePlanIdToTousseItemsIdSetmap.get(invoicePlanId); + if(tousseItemsIdSet == null){ + tousseItemsIdSet = new HashSet(); + invoicePlanIdToTousseItemsIdSetmap.put(invoicePlanId, tousseItemsIdSet); + } + + for(int j=0;j> entry : invoicePlanIdToTousseItemsIdSetmap.entrySet()) { + Long invoicePlanId = entry.getKey(); + Set tousseItemsIdSet = entry.getValue(); + invoicePlanManager.terminateTousseItemByIds(tousseItemsIdSet, "发货终止"); + } + } public void submitInvoiceForOperationReservation(JSONObject params) { SubmitInvoiceContext submitInvoiceContext = new SubmitInvoiceContext(); setAndValidateParams(params, submitInvoiceContext); + // 终止申请单的处理 + if(submitInvoiceContext.isInvoiceForOperationReservationMerge()){ + terminateInvoicePlan(params); + } List submitInvoiceItems = submitInvoiceContext.getSubmitInvoiceItems(); // 用锁定的方式获取待发货的发货单。 @@ -4902,6 +4946,7 @@ vo.setApplicationAmount(vo.getApplicationAmount()+1); vo.setBeforeToday(vo.isBeforeToday() || beforeToday); vo.addInvoicePlanID(invoicePlan.getId()); + vo.addTousseItemId(invoicePlan.getId(), applicationItem.getId()); } continue; } @@ -4951,6 +4996,7 @@ datas.put(goodsName, vo); } vo.addInvoicePlanID(invoicePlan.getId()); + vo.addTousseItemId(invoicePlan.getId(), applicationItem.getId()); Long disposableGoodsId = applicationItem.getDisposableGoodsId(); if(DatabaseUtil.isPoIdValid(disposableGoodsId)){ vo.getDisposableGoodsIdSet().add(disposableGoodsId);