Index: forgon-tools/src/main/java/com/forgon/tools/hibernate/BasePoManager.java =================================================================== diff -u -r17162 -r17189 --- forgon-tools/src/main/java/com/forgon/tools/hibernate/BasePoManager.java (.../BasePoManager.java) (revision 17162) +++ forgon-tools/src/main/java/com/forgon/tools/hibernate/BasePoManager.java (.../BasePoManager.java) (revision 17189) @@ -69,7 +69,7 @@ * 获取属性值属于对应集合的所有对象 * @param property * @param values - * @return + * @return 成功返回对应对象的集合,否则返回null */ public List getCollection(String property,Collection values); /** Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r17149 -r17189 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 17149) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 17189) @@ -1281,23 +1281,20 @@ // 设置新器械包列表 List tousseInstanceList = new ArrayList( tousseInstanceBarcodes.size()); - for (String barcode : tousseInstanceBarcodes) { - BarcodeDevice barcodeDevice = barcodeManager - .getBarcodeByBarcode(barcode); - if (!(barcodeDevice instanceof TousseInstance)) { - continue; - } - TousseInstance tousseInstance = (TousseInstance) barcodeDevice; - //只有已审核的包才能入到灭菌记录中 - if(tousseInstance.isReviewed()){ - // 设置器械包位置 - if(barcodePositionMap != null){ - String positoin = barcodePositionMap.get(barcode); - if(StringUtils.isNotBlank(positoin)){ - tousseInstance.setSterilizerPosition(positoin); + List list = tousseInstanceManager.getCollection("barcode", tousseInstanceBarcodes); + if(CollectionUtils.isNotEmpty(list)){ + for (TousseInstance tousseInstance : list) { + //只有已审核的包才能入到灭菌记录中 + if(tousseInstance.isReviewed()){ + // 设置器械包位置 + if(barcodePositionMap != null){ + String positoin = barcodePositionMap.get(tousseInstance.getBarcode()); + if(StringUtils.isNotBlank(positoin)){ + tousseInstance.setSterilizerPosition(positoin); + } } + tousseInstanceList.add(tousseInstance); } - tousseInstanceList.add(tousseInstance); } } sterilizationRecord.setTousseInstanceList(tousseInstanceList); @@ -1399,6 +1396,7 @@ Log.MODEL_STERILIZATION, "U", "id:" + sterilizationRecord.getId() + ",data:" + param.toString() + msg); } +// throw new RuntimeException("保存测试"); return result; } // 计算并更新灭菌记录的器械统计信息 Index: forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java =================================================================== diff -u -r17162 -r17189 --- forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 17162) +++ forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 17189) @@ -116,6 +116,9 @@ } @Override public List getCollection(String objectPOName,String propertyName,Collection values){ + if(CollectionUtils.isEmpty(values)){ + return null; + } final String queryString = "from " + objectPOName + " po where po." + propertyName + " in (:value_list)"; @SuppressWarnings("unchecked") List list = (List)getHibernateTemplate().executeWithNativeSession( Index: ssts-web/src/test/java/test/forgon/disinfectsystem/packing/SterilizationRecordManagerTestsForSaveOrUpdateSterilizationRecord.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/packing/SterilizationRecordManagerTestsForSaveOrUpdateSterilizationRecord.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/packing/SterilizationRecordManagerTestsForSaveOrUpdateSterilizationRecord.java (revision 17189) @@ -0,0 +1,370 @@ +package test.forgon.disinfectsystem.packing; +import static org.testng.Assert.*; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.testng.annotations.Test; + +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; +import com.forgon.disinfectsystem.basedatamanager.sterilisation.service.SterilisationManager; +import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.packing.service.PackingManager; +import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.runwithtrans.model.RunWithTransNewTask; + +/** + * 保存灭菌记录的测试用例。测试速度及多线程并发 + * @author kzh + * + */ +public class SterilizationRecordManagerTestsForSaveOrUpdateSterilizationRecord extends AbstractCSSDTest { + @Autowired + private SterilizationRecordManager sterilizationRecordManager; + @Autowired + private TousseInstanceManager tousseInstanceManager; + @Autowired + private PackingManager packingManager; + @Autowired + private SterilisationManager sterilisationManager; + @Autowired + private ReviewedBasketManager reviewedBasketManager; + /** + * 同一种包定义,包实例数量1000个,都是篮筐外灭菌 + */ + @Test + @Rollback(false) + public void testWithSameTousseDefinition(){ + int basketCount = 0; //灭菌筐的数量 + int basketTousseCount = 0; //入灭菌筐里的包实例的数量 + int tousseCount = 1000; //每种包定义的包实例的数量 + int tousseDefCount = 1; //包定义的数量 + doMyTest(basketCount, basketTousseCount, tousseCount, tousseDefCount); + } + /** + * 每种包定义一个包实例,包定义共1000个,都是篮筐外灭菌 + */ + @Test + public void testWithDifferentTousseDefinition(){ + int basketCount = 0; //灭菌筐的数量 + int basketTousseCount = 0; //入灭菌筐里的包实例的数量 + int tousseCount = 1; //每种包定义的包实例的数量 + int tousseDefCount = 1000; //包定义的数量 + doMyTest(basketCount, basketTousseCount, tousseCount, tousseDefCount); + } + + /** + * 每种包定义一个包实例,包定义共1000个。共20个篮筐,每篮筐装50个 + */ + @Test + public void testWithDifferentTousseDefinitionMultiBasket(){ + int basketCount = 20; //灭菌筐的数量 + int basketTousseCount = 50; //每个灭菌筐里的包实例的数量 + int tousseCount = 1; //每种包定义的包实例的数量 + int tousseDefCount = 1000; //包定义的数量 + doMyTest(basketCount, basketTousseCount, tousseCount, tousseDefCount); + } + /** + * 每种包定义一个包实例,包定义共1000个。共1000个篮筐,每篮筐装1个 + */ + @Test + public void testWithDifferentOnceToussePerBasket(){ + int basketCount = 100; //灭菌筐的数量 + int basketTousseCount = 10; //每个灭菌筐里的包实例的数量 + int tousseCount = 1; //每种包定义的包实例的数量 + int tousseDefCount = 1000; //包定义的数量 + doMyTest(basketCount, basketTousseCount, tousseCount, tousseDefCount); + } + /** + * 多线程处理,共5个线程,每个线程创建1种包定义200个包实例,放入5个篮筐,每个篮筐20个包实例。另外100个包实例在篮筐外 + * @throws InterruptedException + */ + @Test + @Rollback(false) + public void testWithMultiThread() throws InterruptedException{ + //1.初始化基础数据 + initCSSDData(); + int basketCount = 25; //每个线程5个,5个线程共25个 + basketIndex = 0; + int barcodeStart = barcodeIndex; + + List sterilizationRecords = new ArrayList<>(); + List> tousseInstanceBarcodesList = new ArrayList>(); + List> containerBarcodesList = new ArrayList>(); + + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + initMyData(basketCount); + + for(int i = 0;i < 5;++i){ + SterilizationRecord sterilizationRecord1 = prepareTousse(1, 200); + sterilizationRecords.add(sterilizationRecord1); + + List tousseInstanceBarcodes1 = new ArrayList<>(); + List containerBarcodes1 = new ArrayList<>(); + prepareBarcode(barcodeStart + i*200,tousseInstanceBarcodes1,containerBarcodes1,5,20); + + tousseInstanceBarcodesList.add(tousseInstanceBarcodes1); + containerBarcodesList.add(containerBarcodes1); + } + } + }); + + class ThreadRoute implements Runnable{ + SterilizationRecord sterilizationRecord; + List tousseInstanceBarcodes; + List containerBarcodes; + ThreadRoute(SterilizationRecord sterilizationRecord,List tousseInstanceBarcodes,List containerBarcodes){ + this.sterilizationRecord = sterilizationRecord; + this.tousseInstanceBarcodes = tousseInstanceBarcodes; + this.containerBarcodes = containerBarcodes; + } + @Override + public void run() { + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + long b = Calendar.getInstance().getTimeInMillis(); + Map result = sterilizationRecordManager.saveOrUpdateSterilizationRecord(sterilizationRecord, tousseInstanceBarcodes, containerBarcodes, null); + boolean success = (boolean) result.get("success"); + assertEquals(success, true,(String)result.get("message")); + long a = Calendar.getInstance().getTimeInMillis(); + System.out.println("time:" + (a - b)); + assertEquals(sterilizationRecord.getStatus(), SterilizationRecord.STERILIZATION_STATUS_BEGIN); + } + }); + } + } + + Thread t1 = new Thread(new ThreadRoute(sterilizationRecords.get(0),tousseInstanceBarcodesList.get(0),containerBarcodesList.get(0))); + Thread t2 = new Thread(new ThreadRoute(sterilizationRecords.get(1),tousseInstanceBarcodesList.get(1),containerBarcodesList.get(1))); + Thread t3 = new Thread(new ThreadRoute(sterilizationRecords.get(2),tousseInstanceBarcodesList.get(2),containerBarcodesList.get(2))); + Thread t4 = new Thread(new ThreadRoute(sterilizationRecords.get(3),tousseInstanceBarcodesList.get(3),containerBarcodesList.get(3))); + Thread t5 = new Thread(new ThreadRoute(sterilizationRecords.get(4),tousseInstanceBarcodesList.get(4),containerBarcodesList.get(4))); + + t1.start(); + t2.start(); + t3.start(); + t4.start(); + t5.start(); + + t1.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); + List allBasketBarcode = getAllBaseketBarcodes(); + assertEquals(allBasketBarcode.size(), 25); + for(String barcode : allBasketBarcode){ + ReviewedBasket rb = (ReviewedBasket) objectDao.getByProperty(ReviewedBasket.class.getSimpleName(), "container.barcode", barcode); + assertEquals(rb.getContainer().getStatus(),Container.CONTAINER_STATUS_STERILIZING); + } + + List tousses = tousseInstanceManager.getCollection("barcode", getAllTousseBarcodes(barcodeStart)); + assertEquals(tousses.size(), 1000); + for(TousseInstance tousse: tousses){ + assertEquals(tousse.getStatus(), TousseInstance.STATUS_STERILING); + } + } + private void doMyTest(int basketCount, int basketTousseCount, + int tousseCount, int tousseDefCount) { + //1.初始化基础数据 + initCSSDData(); + basketIndex = 0; + + initMyData(basketCount); + int barcodeStart = barcodeIndex; + List tousseInstanceBarcodes = new ArrayList<>(); + List containerBarcodes = new ArrayList<>(); + SterilizationRecord sterilizationRecord = prepareTousse(tousseDefCount, tousseCount); + prepareBarcode(barcodeStart,tousseInstanceBarcodes,containerBarcodes,basketCount,basketTousseCount); + long b = Calendar.getInstance().getTimeInMillis(); + sterilizationRecordManager.saveOrUpdateSterilizationRecord(sterilizationRecord, tousseInstanceBarcodes, containerBarcodes, null); + long a = Calendar.getInstance().getTimeInMillis(); + + System.out.println("time:" + (a - b)); + assertEquals(sterilizationRecord.getStatus(), SterilizationRecord.STERILIZATION_STATUS_BEGIN); + + assertEquals(containerBarcodes.size(), basketCount); + for(String barcode : containerBarcodes){ + ReviewedBasket rb = (ReviewedBasket) objectDao.getByProperty(ReviewedBasket.class.getSimpleName(), "container.barcode", barcode); + assertEquals(rb.getContainer().getStatus(),Container.CONTAINER_STATUS_STERILIZING); + } + + List tousses = tousseInstanceManager.getCollection("barcode", getAllTousseBarcodes(barcodeStart)); + if(tousses == null){ + assertEquals(0, tousseCount * tousseDefCount); + }else{ + assertEquals(tousses.size(), tousseCount * tousseDefCount); + for(TousseInstance tousse: tousses){ + assertEquals(tousse.getStatus(), TousseInstance.STATUS_STERILING); + } + } + } + private void initMyData(int basketCount) { + for(int i = 0;i < basketCount;++i){ + Container container6 = new Container(); + container6.setBarcode(getBaseketBarcode(i)); + container6.setContainerName("灭菌筐03"); + container6.setPurpose(Container.CONTAINER_PURPOSE_DISINFECTION); + container6.setContainerType(Container.CONTAINERTYPE_BASKET); + container6.setStatus(Container.CONTAINER_STATUS_FREE); + container6.setType(BarcodeDevice.BARCODE_TYPE_CONTAINER); + containerManager.saveOrUpdate(container6); + } + } + private String getBaseketBarcode(int index){ + return "24003" + String.format("%04d", index); + } + private String getTousseInstanceBarcode(int index){ + return "11002" + String.format("%04d", index); + } + private List getAllTousseBarcodes(int start){ + List barcodes = new ArrayList<>(); + for(int i = start;i < barcodeIndex;++i){ + barcodes.add(getTousseInstanceBarcode(i)); + } + return barcodes; + } + private List getAllBaseketBarcodes(){ + List barcodes = new ArrayList<>(); + for(int i = 0;i < basketIndex;++i){ + barcodes.add(getBaseketBarcode(i)); + } + return barcodes; + } + /** + * 准备篮筐和包实例的条码 + * @param barcodeStart + * @param tousseInstanceBarcodes + * @param containerBarcodes + * @param basketCount + * @param basketTousseCount + */ + private void prepareBarcode(int barcodeStart, + List tousseInstanceBarcodes, List containerBarcodes,int basketCount,int basketTousseCount) { + for(int i = 0;i tousseBarcodes = new ArrayList(); + for(int j = 0;j < basketTousseCount;++j){ + tousseBarcodes.add(getTousseInstanceBarcode(barcodeStart++)); + } + String basketBarcode = getBaseketBarcode(getBasketIndex()); + tousseInstanceManager.addTousseInstanceToBasket(basketBarcode, tousseBarcodes, null); + containerBarcodes.add(basketBarcode); + } + for(int i = barcodeStart;i tousseInstances = new ArrayList(); + + for(int i = 0;i()); + tousseDefinition1.getMaterialInstances().add(materialInstance1); + tousseDefinitionManager.saveOrUpdate(tousseDefinition1); + + for(int tousseIndex = 0;tousseIndex < tousseInstanceCount;++tousseIndex){ + TousseInstance tousseInstance2 = new TousseInstance(); + tousseInstance2.setTousseDefinition(tousseDefinition1); + tousseInstance2.setOrgUnitCoding(orgUnitCode); + tousseInstance2.setReviewer(""); + tousseInstance2.setReviewerCode(""); + tousseInstance2.setReviewTime(new Date()); + tousseInstance2.setDisinfectIdentification(""); + tousseInstance2.setDisinfectProgram(""); + tousseInstance2.setFluctuationPrice(123D); + tousseInstance2.setPackageType(""); + tousseInstance2.setTousseName(tousseDefinition1.getName()); + tousseInstance2.setStatus(TousseInstance.STATUS_REVIEWED); + tousseInstance2.setVirtualBasketSeqNum("001"); + tousseInstance2.setBarcode(getTousseInstanceBarcode(getBarcodeIndex())); + tousseInstanceManager.saveOrUpdate(tousseInstance2); + tousseInstances.add(tousseInstance2); + } + } + return sterilizationRecord; + } +} Index: ssts-web/src/test/resources/test/forgon/disinfectsystem/packing/AllTests.xml =================================================================== diff -u -r17148 -r17189 --- ssts-web/src/test/resources/test/forgon/disinfectsystem/packing/AllTests.xml (.../AllTests.xml) (revision 17148) +++ ssts-web/src/test/resources/test/forgon/disinfectsystem/packing/AllTests.xml (.../AllTests.xml) (revision 17189) @@ -14,6 +14,7 @@ + \ No newline at end of file