Index: ssts-web/src/test/resources/test/forgon/AllTests.xml =================================================================== diff -u -r17148 -r17506 --- ssts-web/src/test/resources/test/forgon/AllTests.xml (.../AllTests.xml) (revision 17148) +++ ssts-web/src/test/resources/test/forgon/AllTests.xml (.../AllTests.xml) (revision 17506) @@ -27,6 +27,7 @@ - + + \ No newline at end of file Index: ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/orgUnit/OrgUnitDataProvider.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/orgUnit/OrgUnitDataProvider.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/orgUnit/OrgUnitDataProvider.java (revision 17506) @@ -0,0 +1,46 @@ +package test.forgon.disinfectsystem.dataProvider.orgUnit; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.tools.SpringBeanManger; +import org.testng.annotations.DataProvider; + +/** + * @author zhonghaowen + * @apiNote 部门数据驱动类 + * @since 2017-03-14 + */ +public class OrgUnitDataProvider { + + private static OrgUnitManager orgUnitManager = (OrgUnitManager) SpringBeanManger.getBean("orgUnitManager"); + + /** + * 根据部门编号查找对应的部门 + * + * @param code 部门的编号 + * @return + */ + public static OrgUnit getOrgUnit(String code) { + return orgUnitManager.getByCode(code); + } + + + @DataProvider(name = "orgUnitProvider") + public static Object[][] orgUnitProvider() { + OrgUnit orgUnit = createOrgUnit("testCSSD"); + return new Object[][]{{orgUnit}}; + } + + /** + * 根据部门编码设置返回部门对象 + * @param code 模板编号 + * @return {@link OrgUnit} + */ + public static OrgUnit createOrgUnit(String code){ + OrgUnit orgUnit = new OrgUnit(); + orgUnit.setOrgUnitCoding(code); + return orgUnit; + } + + +} Index: ssts-web/src/test/java/test/forgon/disinfectsystem/goodFilterConfig/GoodFilterConfigTest.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/goodFilterConfig/GoodFilterConfigTest.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/goodFilterConfig/GoodFilterConfigTest.java (revision 17506) @@ -0,0 +1,347 @@ +package test.forgon.disinfectsystem.goodFilterConfig; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.goodFilterConfig.entity.GoodFilterConfig; +import com.forgon.disinfectsystem.goodFilterConfig.entity.OrgUnitTemplateItem; +import com.forgon.disinfectsystem.goodFilterConfig.entity.TousseDefinitionTemplateItems; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; +import com.forgon.disinfectsystem.goodFilterConfig.vo.GoodFilterConfigVo; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionHelper; +import net.sf.json.JSONObject; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.orm.hibernate4.HibernateTemplate; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; +import test.forgon.disinfectsystem.dataProvider.goodFilterConfig.GoodFilterConfigDataProvider; +import test.forgon.disinfectsystem.dataProvider.orgUnit.OrgUnitDataProvider; +import test.forgon.disinfectsystem.dataProvider.tousseDefinition.TousseDefinitionDataProvider; + +import javax.annotation.Resource; +import java.lang.reflect.InvocationTargetException; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +/** + * @author zhonghaowen + * @apiNote 科室黑白名单过滤测试类 + * @since 2017-03-14 + */ +public class GoodFilterConfigTest extends AbstractCSSDTest { + + @Resource + private GoodFilterConfigManager goodFilterConfigManagerImpl; + + + @BeforeClass + public void setUp() { + initCSSDData(); + makeActiveUser("admin"); + } + + + /** + * 一.创建一个黑名单模板和一个白名单白名单, 模板信息如下:
+ *

1.名字:测试模板名字

+ *

2.配置的部门:测试内科和测试外科

+ *

3.配置的器械包:Test开胸包和Test开颅包

+ * 二.更新该模板的配置部门(删除测试外科,新增测试供应室)
+ * 三.更新该模板的器械包(删除Test开颅包,新增Test穿刺包)
+ * 四.删除该模板
+ * + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + * @param orgUnitCount 期望保存后这个模板下科室个数 + * @param tousseDefinitionTemplateItemsCount 期望保存后这个模板的物品个数 + */ + @Test(dataProvider = "createGoodFilterConfigProvider", dataProviderClass = GoodFilterConfigDataProvider.class) + public void testCreateGoodFilter(GoodFilterConfigVo goodFilterConfigVo, int orgUnitCount, int tousseDefinitionTemplateItemsCount) throws InvocationTargetException, IllegalAccessException { + assertNotNull(goodFilterConfigVo); + goodFilterConfigManagerImpl.saveOrUpdate(goodFilterConfigVo); + HibernateTemplate ht = objectDao.getHt(); + ht.flush(); + @SuppressWarnings("unchecked") + List goodFilterConfigList = (List) ht.find("from GoodFilterConfig"); + assertEquals(goodFilterConfigList.size(), 1); + GoodFilterConfig goodFilterConfig = goodFilterConfigList.get(0); + assertNotNull(goodFilterConfig); + //断言这个模板下的科室数量 + List orgUnitTemplateItems = goodFilterConfig.getOrgUnitTemplateItems(); + assertEquals(orgUnitTemplateItems.size(), orgUnitCount); + //断言这个模板下的物品数量 + List tousseDefinitionTemplateItems = goodFilterConfig.getTousseDefinitionTemplateItems(); + assertEquals(tousseDefinitionTemplateItems.size(), tousseDefinitionTemplateItemsCount); + assertEquals(goodFilterConfig.getListType().getDesc(), goodFilterConfigVo.getTemplateType()); + @SuppressWarnings("unchecked") + List filterGoodByType = goodFilterConfigManagerImpl.findFilterGoodByType(goodFilterConfig.getListType(), Constants.ORG_UNIT_CODE_NEIKE); + assertEquals(filterGoodByType.size(), 2); + goodFilterConfigVo.setId(goodFilterConfig.getId()); + //更新模板下的科室 + goodFilterConfigVo = GoodFilterConfigDataProvider.prepareUpdateOrgUnit(goodFilterConfigVo, orgUnitTemplateItems); + //更新模板下的器械包 + goodFilterConfigVo = GoodFilterConfigDataProvider.prepareUpdateTousse(goodFilterConfigVo, tousseDefinitionTemplateItems); + goodFilterConfigManagerImpl.saveOrUpdate(goodFilterConfigVo); + ht.flush(); + this.assertOrgUnit(goodFilterConfig); + this.assertTousse(goodFilterConfig); + goodFilterConfigManagerImpl.delete(goodFilterConfigVo.getId().toString()); + ht.flush(); + assertEquals(ht.find("select id from GoodFilterConfig ").size(), 0); + } + + + /** + * 测试器械包申请单的查询物品(不启用黑白名单过滤) + */ + @Test(dataProvider = "orgUnitProvider", dataProviderClass = OrgUnitDataProvider.class) + public void testSearchTousseAppFormNotUseBWList(OrgUnit cssd) { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + Set predicates = this.prepareSearch(tousseType); + List list = this.tousseDefinitionManager.getCssdHandleTousseDefinitionList(cssd, "", 0, 1000, predicates, new JSONObject()); + // 查找结果是否包含专科器械组和一次性物品 + Collection select = CollectionUtils.select(list, td -> TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(td.getTousseType()) || TousseItem.TYPE_DIPOSABLE_GOODS.equals(td.getTousseType())); + //断言不包含这两种物品 + assertEquals(select.size(), 0); + } + + /** + * 科室申领物品搜索使用黑名单 + *

1.申请科室为testOR

+ *

2.结算科室为testCSSD

+ *

3.黑名单的物品是Test开胸包

+ * + * @param cssd 结算科室 + */ + @Test(dataProvider = "orgUnitProvider", dataProviderClass = OrgUnitDataProvider.class) + public void testSearchTousseAppFormUseBlackList(OrgUnit cssd) { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + String appCode = "testOR"; + String[] name = new String[]{TousseDefinitionDataProvider.Test开胸包}; + List list = this.doSearchTousseDefinition(tousseType, appCode, name, null, cssd); + //从搜索结果查找Test开胸包 + Collection result = CollectionUtils.select(list, td -> TousseDefinitionDataProvider.Test开胸包.equals(td.getName())); + assertEquals(result.size(), 0); + } + + /** + * 科室申领物品搜索使用白名单 + *

1.申请科室为testOR

+ *

2.结算科室为testCSSD

+ *

3.白名单的物品是Test开胸包

+ * + * @param cssd 结算科室 + */ + @Test(dataProvider = "orgUnitProvider", dataProviderClass = OrgUnitDataProvider.class) + public void testSearchTousseAppFormUseWhiteList(OrgUnit cssd) { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + String appCode = "testOR"; + String[] name = new String[]{TousseDefinitionDataProvider.Test开胸包}; + List list = this.doSearchTousseDefinition(tousseType, appCode, null, name, cssd); + //断言使用白名单后查询出来的结果只有一个 + assertEquals(list.size(), 1); + assertEquals(TousseDefinitionDataProvider.Test开胸包, list.get(0).getName()); + } + + /** + * 科室申领物品搜索黑白名单一起混用(分别是器械包申请单和通用申请单) + *

黑名单里包含白名单的物品,期待结果:只有Test开颅包被屏蔽

+ *

1.黑名单:Test开胸包,Test开颅包

+ *

2.白名单:Test开胸包

+ * + * @param tousseType 申请单的类型 + * @param appCode 申请科室编号 + * @param blackNames 黑名单的器械包 + * @param whiteNames 白名单的器械包 + * @param cssd 结算科室 + */ + + @Test(dataProvider = "searchTousseAppFormUseBWListProvider", dataProviderClass = GoodFilterConfigDataProvider.class) + public void testSearchTousseAppFormUseBWListBGranterThanW(String tousseType, String appCode, String[] blackNames, String[] whiteNames, OrgUnit cssd) { + assertTrue(blackNames.length > whiteNames.length); + List list = this.doSearchTousseDefinition(tousseType, appCode, blackNames, whiteNames, cssd); + //从结果查询是否存在Test开颅包 + Collection result = CollectionUtils.select(list, object -> TousseDefinitionDataProvider.Test开颅包.equals(object.getName())); + //断言结果不存在Test开颅包 + assertEquals(result.size(), 0); + } + + /** + * 科室申领物品搜索黑白名单一起混用(分别是器械包申请单和通用申请单) + *

白名单里包含黑名单的物品,期待结果:只有Test开颅包能被搜索

+ *

1.白名单:Test开胸包,Test开颅包

+ *

2.黑名单:Test开胸包

+ * + * @param tousseType 申请单的类型 + * @param appCode 申请科室编号 + * @param whiteNames 白名单的器械包 + * @param blackNames 黑名单的器械包 + * @param cssd 结算科室 + */ + @Test(dataProvider = "searchTousseAppFormUseBWListProvider", dataProviderClass = GoodFilterConfigDataProvider.class) + public void testSearchTousseAppFormUseBWListWGranterThanB(String tousseType, String appCode, String[] whiteNames, String[] blackNames, OrgUnit cssd) { + assertTrue(whiteNames.length > blackNames.length); + List list = this.doSearchTousseDefinition(tousseType, appCode, blackNames, whiteNames, cssd); + //断言查到的结果只有一条 + assertEquals(list.size(), 1); + //断言器械包的名字是Test开颅包 + assertEquals(list.get(0).getName(), TousseDefinitionDataProvider.Test开颅包); + } + + /** + * 科室申领物品搜索黑白名单一起混用(分别是器械包申请单和通用申请单) + *

白名单和黑名单数量一样,期待结果:只有Test开胸包搜索不到

+ *

1.白名单:Test开胸包

+ *

2.黑名单:Test开胸包

+ * @param tousseType 申请单的类型 + * @param appCode 申请科室编号 + * @param whiteNames 白名单的器械包 + * @param blackNames 黑名单的器械包 + * @param cssd 结算科室 + */ + @Test(dataProvider = "searchTousseAppFormUseBWListProvider2", dataProviderClass = GoodFilterConfigDataProvider.class) + public void testSearchTousseAppFormUseBWListWEqualsB(String tousseType, String appCode, String[] whiteNames, String[] blackNames, OrgUnit cssd) { + assertEquals(whiteNames.length, blackNames.length); + List list = this.doSearchTousseDefinition(tousseType, appCode, blackNames, whiteNames, cssd); + //从结果查询是否存在Test开胸包 + Collection result = CollectionUtils.select(list, object -> TousseDefinitionDataProvider.Test开胸包.equals(object.getName())); + //断言结果不存在Test开胸包 + assertEquals(result.size(), 0); + } + + /** + * 科室申领物品搜索黑白名单一起混用(分别是器械包申请单和通用申请单) + *

白名单和黑名单数量一样,期待结果:只有Test开颅包能搜到

+ *

1.白名单:Test开颅包

+ *

2.黑名单:Test开胸包

+ * @param tousseType 申请单的类型 + * @param appCode 申请科室编号 + * @param whiteNames 白名单的器械包 + * @param blackNames 黑名单的器械包 + * @param cssd 结算科室 + */ + @Test(dataProvider = "searchTousseAppFormUseBWListProvider3", dataProviderClass = GoodFilterConfigDataProvider.class) + public void testSearchTousseAppFormUseBWListWEqualsB2(String tousseType, String appCode, String[] whiteNames, String[] blackNames, OrgUnit cssd) { + assertEquals(whiteNames.length, blackNames.length); + List list = this.doSearchTousseDefinition(tousseType, appCode, blackNames, whiteNames, cssd); + //断言查到的结果只有一条 + assertEquals(list.size(), 1); + //断言器械包的名字是Test开颅包 + assertEquals(list.get(0).getName(), TousseDefinitionDataProvider.Test开颅包); + } + + /** + * 使用模板来查询对应的器械包 + * + * @param tousseType 申请单类型 + * @param appCode 申请科室编号 + * @param blackNames 模板下黑名单的器械包 + * @param whiteNames 模板下白名单的器械包 + * @param cssd 结算科室 + * @return 返回使用模板过滤后的结果 + */ + private List doSearchTousseDefinition(String tousseType, String appCode, String[] blackNames, String[] whiteNames, OrgUnit cssd) { + //查询前先创建对应的模板 + this.saveGoodFilterConfig(appCode, blackNames, whiteNames); + Set predicates = this.prepareSearch(tousseType); + JSONObject retObj = this.buildBWListPara(appCode); + return this.tousseDefinitionManager.getCssdHandleTousseDefinitionList(cssd, "", 0, 0, predicates, retObj); + } + + /** + * 创建一个黑名单的模板和一个白名单的模板 + * + * @param appCode 模板下的科室编号 + * @param blackNames 模板下黑名单的器械包 + * @param whiteNames 模板下白名单的器械包 + */ + private void saveGoodFilterConfig(String appCode, String[] blackNames, String[] whiteNames) { + if (blackNames != null) { + GoodFilterConfigVo black = GoodFilterConfigDataProvider.createBlackOrWhite(ListType.BLACK, appCode, blackNames); + goodFilterConfigManagerImpl.saveOrUpdate(black); + } + if (whiteNames != null) { + GoodFilterConfigVo white = GoodFilterConfigDataProvider.createBlackOrWhite(ListType.WHITE, appCode, whiteNames); + goodFilterConfigManagerImpl.saveOrUpdate(white); + } + objectDao.getHt().flush(); + } + + /** + * 构建黑白名单过滤的参数 + * + * @param appCode 申请科室编码 + * @return 返回构造好的结果 + */ + private JSONObject buildBWListPara(String appCode) { + JSONObject retObj = new JSONObject(); + retObj.put("needToBw", true); + retObj.put("appCode", appCode); + return retObj; + } + + /** + * 查询前的构造查询参数 + * + * @param tousseType 申请单类型 + * @return 返回去需要过滤的参数set + */ + private Set prepareSearch(String tousseType) { + TousseDefinitionHelper tousseDefinitionHelper = TousseDefinitionHelper.getInstance(); + tousseDefinitionHelper.setTousseDefinitionManager(tousseDefinitionManager); + tousseType = tousseDefinitionHelper.setGoodTypeByFormType(tousseType); + logger.debug(tousseType); + return tousseDefinitionHelper.getPredicates(tousseType); + } + + + /** + * 断言更新模板后的器械包情况 + * + * @param goodFilterConfig {@link GoodFilterConfig} + */ + private void assertTousse(GoodFilterConfig goodFilterConfig) { + TousseDefinition td1 = TousseDefinitionDataProvider.getTousseDefinition("Test穿刺包"); + TousseDefinition td2 = TousseDefinitionDataProvider.getTousseDefinition("Test开胸包"); + assertNotNull(td1); + assertNotNull(td2); + @SuppressWarnings(value = {"unchecked"}) + List newTousseDefinitionTemplateItems = (List) objectDao.getHt().find("from TousseDefinitionTemplateItems where goodFilterConfig.id = ?", goodFilterConfig.getId()); + //更新后断言器械包数量为2 + assertEquals(newTousseDefinitionTemplateItems.size(), 2); + Collection select = CollectionUtils.select(newTousseDefinitionTemplateItems, item -> { + Long id = item.getTousseDefinition().getId(); + return td1.getId().equals(id) || td2.getId().equals(id); + }); + //查找Test穿刺包和Test开胸包,断言该模板下的器械包只剩下这个两个 + assertEquals(select.size(), newTousseDefinitionTemplateItems.size()); + } + + /** + * 断言更新模板后的科室情况 + * + * @param goodFilterConfig {@link GoodFilterConfig} + */ + private void assertOrgUnit(GoodFilterConfig goodFilterConfig) { + List orgUnitTemplateItems = goodFilterConfig.getOrgUnitTemplateItems(); + @SuppressWarnings(value = {"unchecked"}) + List newOrgUnitTemplateItems = (List) objectDao.getHt().find("from OrgUnitTemplateItem where goodFilterConfig.id = ?", goodFilterConfig.getId()); + //更新后断言科室数量为2 + assertEquals(newOrgUnitTemplateItems.size(), 2); + Collection select = CollectionUtils.select(newOrgUnitTemplateItems, orgUnit -> { + String orgUnitCoding = orgUnit.getOrgUnitCoding(); + return Constants.ORG_UNIT_CODE_CSSD.equals(orgUnitCoding) || orgUnitTemplateItems.get(0).getOrgUnitCoding().equals(orgUnitCoding); + }); + //由于上面已经断言该模板下的科室为2,所以现在查找测试内科和测试供应室,如果是2,证明已经成功删除测试外科和新增测试供应室 + assertEquals(select.size(), newOrgUnitTemplateItems.size()); + } + +} Index: ssts-web/src/test/resources/test/forgon/disinfectsystem/goodFilterConfig/AllTests.xml =================================================================== diff -u --- ssts-web/src/test/resources/test/forgon/disinfectsystem/goodFilterConfig/AllTests.xml (revision 0) +++ ssts-web/src/test/resources/test/forgon/disinfectsystem/goodFilterConfig/AllTests.xml (revision 17506) @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java =================================================================== diff -u -r16862 -r17506 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java (.../GoodFilterConfigManagerImpl.java) (revision 16862) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java (.../GoodFilterConfigManagerImpl.java) (revision 17506) @@ -286,7 +286,7 @@ int count = objectDao.countObjectBySql(GoodFilterConfig.class.getSimpleName(), hql); if (count > 0 && !templateName.equals(goodFilterConfig.getTemplateName())) { logger.debug(count); - throw new ParameterException("该模板名称已经存在!不能修改"); + throw new ParameterException("该模板名称已经存在!不能添加"); } goodFilterConfig.setModifyTime(new Date()); goodFilterConfig.setListType(ListType.parseOfDesc(goodFilterConfigVo.getTemplateType())); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/tousseDefinition/TousseDefinitionDataProvider.java =================================================================== diff -u -r17498 -r17506 --- ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/tousseDefinition/TousseDefinitionDataProvider.java (.../TousseDefinitionDataProvider.java) (revision 17498) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/tousseDefinition/TousseDefinitionDataProvider.java (.../TousseDefinitionDataProvider.java) (revision 17506) @@ -23,7 +23,12 @@ private static TousseDefinitionManager tousseDefinitionManager = (TousseDefinitionManager) SpringBeanManger.getBean("tousseDefinitionManager"); + public final static String Test开胸包 = "Test开胸包"; + public final static String Test开颅包 = "Test开颅包"; + + public final static String Test穿刺包 = "Test穿刺包"; + /** * 为这个器械包创建已灭菌的包实例,用于直接扫描条码发货 * Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java =================================================================== diff -u -r17404 -r17506 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 17404) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 17506) @@ -1893,39 +1893,7 @@ return null; } - private Set getPredicates(String tousseType) { - Set predicates = new HashSet(); - Set tousseTypes = new HashSet(); - //如果类型为消毒物品,则只保留类型为消毒物品的数据 - if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { - tousseTypes.add(tousseType); - } - //如果类型为敷料包,则只保留类型为敷料包的数据 - else if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType)) { - tousseTypes.add(tousseType); - } - //如果类型为组合申请单或者器械包申请单,则保留类型为器械包,消毒物品,敷料包(组合申请单后面会添加一次性物品,器械包申请单则不会) - else if (TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) { - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_INSIDE); - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DRESSING); - }else if ("combo".equals(tousseType)) { - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_INSIDE); - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); - tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DRESSING); - } - //如果器械包分组为专科器械组,则只保留类型为专科器械组的数据 - else if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseType)) { - predicates.add(SqlUtils.getStringFieldPredicate("tousseGroupName", TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT)); - } - else { - - } - if(!tousseTypes.isEmpty()){ - predicates.add(SqlUtils.getStringFieldInCollectionsPredicate("tousseType", tousseTypes)); - } - return predicates; - } + // 搜索组合物品,包含器械包和一次性物品 public String searchComboGoodsData() { //下拉框分页(开始记录数及每页记录数) @@ -1977,7 +1945,7 @@ if(!TousseItem.TYPE_DIPOSABLE_GOODS.equals(tousseType)){ OrgUnit cssd = new OrgUnit(); cssd.setOrgUnitCoding(cssdOrgUnitCode); - Set predicates = getPredicates(tousseType); + Set predicates = tousseDefinitionHelper.getPredicates(tousseType); String appIsUseBwList = CssdUtils.getSystemSetConfigByName("appIsUseBwList"); if (StringUtils.isNotBlank(appIsUseBwList) && "true".equals(appIsUseBwList)){ Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java =================================================================== diff -u -r16820 -r17506 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java (.../TousseDefinitionHelper.java) (revision 16820) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java (.../TousseDefinitionHelper.java) (revision 17506) @@ -5,12 +5,15 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.tools.util.SqlUtils; import org.apache.commons.lang.StringUtils; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; /** * Created by zhonghaowen on 2016/10/18. @@ -19,7 +22,7 @@ public class TousseDefinitionHelper { - private static TousseDefinitionHelper tousseDefinitionHelper; + private volatile static TousseDefinitionHelper tousseDefinitionHelper; private TousseDefinitionHelper() { } @@ -90,28 +93,28 @@ // } // return map; // } - + public Map filterResultByTousseType2(String tousseType, TousseDefinition tousseDefinition) { Map map = null; Double price = tousseDefinition.getPrice(); //如果类型为消毒物品,则只保留类型为消毒物品的数据 if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { - price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); + price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); map = this.setReturnResult(tousseDefinition, price); } //如果类型为敷料包,则只保留类型为敷料包的数据 else if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType)) { - map = this.setReturnResult(tousseDefinition, price); + map = this.setReturnResult(tousseDefinition, price); } //如果类型为组合申请单或者器械包申请单,则保留类型为器械包,消毒物品,敷料包(组合申请单后面会添加一次性物品,器械包申请单则不会) else if ("combo".equals(tousseType) || TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) { String type = tousseDefinition.getTousseType(); //器械包和敷料包 - if (tousseDefinition.PACKAGE_TYPE_INSIDE.equals(type) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(type)) { + if (tousseDefinition.PACKAGE_TYPE_INSIDE.equals(type) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(type)) { map = this.setReturnResult(tousseDefinition, price); } //消毒物品 - else if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(type)){ + else if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(type)) { price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); map = this.setReturnResult(tousseDefinition, price); } @@ -188,6 +191,47 @@ } /** + * 根据申请单的类型获得过滤的sql条件 + * + * @param tousseType 物品的类型 + * @return + */ + public Set getPredicates(String tousseType) { + Set predicates = new HashSet(); + Set tousseTypes = new HashSet(); + //如果类型为消毒物品,则只保留类型为消毒物品的数据 + if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { + tousseTypes.add(tousseType); + } + //如果类型为敷料包,则只保留类型为敷料包的数据 + else if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType)) { + tousseTypes.add(tousseType); + } + //如果类型为组合申请单或者器械包申请单,则保留类型为器械包,消毒物品,敷料包(组合申请单后面会添加一次性物品,器械包申请单则不会) + else if (TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) { + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_INSIDE); + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DRESSING); + } + else if ("combo".equals(tousseType)) { + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_INSIDE); + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DISINFECTION); + tousseTypes.add(TousseDefinition.PACKAGE_TYPE_DRESSING); + } + //如果器械包分组为专科器械组,则只保留类型为专科器械组的数据 + else if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseType)) { + predicates.add(SqlUtils.getStringFieldPredicate("tousseGroupName", TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT)); + } + else { + + } + if (!tousseTypes.isEmpty()) { + predicates.add(SqlUtils.getStringFieldInCollectionsPredicate("tousseType", tousseTypes)); + } + return predicates; + } + + /** * 设置返回结果 * * @param tousseDefinition Index: ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/goodFilterConfig/GoodFilterConfigDataProvider.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/goodFilterConfig/GoodFilterConfigDataProvider.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/dataProvider/goodFilterConfig/GoodFilterConfigDataProvider.java (revision 17506) @@ -0,0 +1,208 @@ +package test.forgon.disinfectsystem.dataProvider.goodFilterConfig; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.goodFilterConfig.entity.OrgUnitTemplateItem; +import com.forgon.disinfectsystem.goodFilterConfig.entity.TousseDefinitionTemplateItems; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.vo.GoodFilterConfigVo; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.apache.log4j.Logger; +import org.testng.annotations.DataProvider; +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.dataProvider.orgUnit.OrgUnitDataProvider; +import test.forgon.disinfectsystem.dataProvider.tousseDefinition.TousseDefinitionDataProvider; + +import java.util.List; + +/** + * @author zhonghaowen + * @apiNote 黑白名单数据驱动提供类 + * @since 2017-03-14 + */ +public class GoodFilterConfigDataProvider { + + protected static Logger logger = Logger.getLogger(GoodFilterConfigDataProvider.class); + + + /** + * 黑白名单模板创建驱动 + * + * @return 分别创建一个黑名单模板和一个白名单模板的相关数据 + */ + @DataProvider(name = "createGoodFilterConfigProvider") + public static Object[][] createGoodFilterConfigProvider() { + int orgUnitCount = 2; + int tousseDefinitionTemplateItemsCount = 2; + try { + TousseDefinition td1 = TousseDefinitionDataProvider.getTousseDefinition(TousseDefinitionDataProvider.Test开胸包); + TousseDefinition td2 = TousseDefinitionDataProvider.getTousseDefinition(TousseDefinitionDataProvider.Test开颅包); + TousseDefinition[] tds = {td1, td2}; + //部门是测试内科和测试外科 + String[] orgUnitCoding = {Constants.ORG_UNIT_CODE_NEIKE, Constants.ORG_UNIT_CODE_WAIKE}; + GoodFilterConfigVo black = createGoodFilterConfigVo(ListType.BLACK.getDesc(), tds, orgUnitCoding); + GoodFilterConfigVo white = createGoodFilterConfigVo(ListType.WHITE.getDesc(), tds, orgUnitCoding); + return new Object[][]{ + {black, orgUnitCount, tousseDefinitionTemplateItemsCount}, + {white, orgUnitCount, tousseDefinitionTemplateItemsCount} + }; + } + catch (Exception e) { + //由于数据驱动捕获到runtimeException会跳过测试类,所以这里要捕获返回 + logger.error(e, e); + return new Object[][]{{null, orgUnitCount, tousseDefinitionTemplateItemsCount}}; + } + } + + /** + * 使用黑白名单进行科室申领物品过滤(分别使用器械包申单和通用申请单) + * 物品{Test开胸包,Test开颅包},{Test开胸包} + */ + @DataProvider(name = "searchTousseAppFormUseBWListProvider") + public static Object[][] searchTousseAppFormUseBWListProvider() { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + String combo = "combo"; + String appCode = "testOR"; + OrgUnit orgUnit = OrgUnitDataProvider.createOrgUnit("testCSSD"); + final String[] names1 = new String[]{TousseDefinitionDataProvider.Test开胸包, TousseDefinitionDataProvider.Test开颅包}; + final String[] names2 = new String[]{TousseDefinitionDataProvider.Test开胸包}; + return new Object[][]{ + {tousseType, appCode, names1, names2, orgUnit}, + {combo, appCode, names1, names2, orgUnit} + }; + } + + /** + * 使用黑白名单进行科室申领物品过滤(分别使用器械包申单和通用申请单) + * 物品{Test开胸包},{Test开胸包} + */ + @DataProvider(name = "searchTousseAppFormUseBWListProvider2") + public static Object[][] searchTousseAppFormUseBWListProvider2() { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + String combo = "combo"; + String appCode = "testOR"; + OrgUnit orgUnit = OrgUnitDataProvider.createOrgUnit("testCSSD"); + final String[] names = new String[]{TousseDefinitionDataProvider.Test开胸包}; + return new Object[][]{ + {tousseType, appCode, names, names, orgUnit}, + {combo, appCode, names, names, orgUnit} + }; + } + + /** + * 使用黑白名单进行科室申领物品过滤(分别使用器械包申单和通用申请单) + * 物品{Test开颅包},{Test开胸包} + */ + @DataProvider(name = "searchTousseAppFormUseBWListProvider3") + public static Object[][] searchTousseAppFormUseBWListProvider3() { + String tousseType = InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM; + String combo = "combo"; + String appCode = "testOR"; + OrgUnit orgUnit = OrgUnitDataProvider.createOrgUnit("testCSSD"); + final String[] names1 = new String[]{TousseDefinitionDataProvider.Test开颅包}; + final String[] names2 = new String[]{TousseDefinitionDataProvider.Test开胸包}; + return new Object[][]{ + {tousseType, appCode, names1, names2, orgUnit}, + {combo, appCode, names1, names2, orgUnit} + }; + } + + /** + * 根据类型,部门编号和相关的器械包数组创建GoodFilterConfigVo对象 + * + * @param listType 要创建白名单还是黑名单 + * @param orgUnitCoding 该模板下的模板编号 + * @param tousseNames 改模板下的器械包 + * @return {@link GoodFilterConfigVo} + */ + public static GoodFilterConfigVo createBlackOrWhite(ListType listType, String orgUnitCoding, String[] tousseNames) { + TousseDefinition[] tds = new TousseDefinition[tousseNames.length]; + for (int i = 0, len = tousseNames.length; i < len; i++) { + tds[i] = TousseDefinitionDataProvider.getTousseDefinition(tousseNames[i]); + } + String[] orgUnitCodingS = {orgUnitCoding}; + return createGoodFilterConfigVo(listType.getDesc(), tds, orgUnitCodingS); + } + + + /** + * 创建GoodFilterConfigVo + * + * @param templateType 模板的类型(黑名单或者白名单) + * @param tds 模板下的器械包 + * @param orgUnitCodingS 模板下的部门编码 + * @return {@link GoodFilterConfigVo} + */ + private static GoodFilterConfigVo createGoodFilterConfigVo(String templateType, TousseDefinition[] tds, String[] orgUnitCodingS) { + GoodFilterConfigVo goodFilterConfigVo = new GoodFilterConfigVo(); + JSONArray tousseArray = new JSONArray(); + for (TousseDefinition td : tds) { + JSONObject tousseDefinition = new JSONObject(); + JSONObject id = new JSONObject(); + id.put("id", td.getId()); + tousseDefinition.put("tousseDefinition", id); + tousseArray.add(tousseDefinition); + } + JSONArray orgUnitArray = new JSONArray(); + for (String orgUnitCoding : orgUnitCodingS) { + JSONObject orgUnit = new JSONObject(); + orgUnit.put("orgUnitCoding", orgUnitCoding); + orgUnitArray.add(orgUnit); + } + goodFilterConfigVo.setDeptInfo(orgUnitArray.toString()); + goodFilterConfigVo.setTousseInfo(tousseArray.toString()); + goodFilterConfigVo.setTemplateName(templateType + "测试模板"); + goodFilterConfigVo.setTemplateType(templateType); + logger.debug(goodFilterConfigVo); + return goodFilterConfigVo; + } + + + /** + * 准备更新模板下的部门数据(删除测试外科,新增测试供应室) + * 该模板下的部门有测试供应室,测试内科 + * + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + * @param orgUnitTemplateItems 该模板下的所有部门 + */ + public static GoodFilterConfigVo prepareUpdateOrgUnit(GoodFilterConfigVo goodFilterConfigVo, List orgUnitTemplateItems) { + JSONObject orgUnit1 = new JSONObject(); + JSONObject orgUnit2 = new JSONObject(); + //测试内科 + orgUnit1.put("orgUnitCoding", orgUnitTemplateItems.get(0).getOrgUnitCoding()); + //删除测试外科,新增测试供应室 + orgUnit2.put("orgUnitCoding", Constants.ORG_UNIT_CODE_CSSD); + JSONArray orgUnitArray = new JSONArray(); + orgUnitArray.add(orgUnit1); + orgUnitArray.add(orgUnit2); + goodFilterConfigVo.setDeptInfo(orgUnitArray.toString()); + return goodFilterConfigVo; + } + + /** + * 准备更新模板下的器械包(删除Test开颅包,新增Test穿刺包) + * 该模板下的器械包有:Test开胸包,Test穿刺包 + * + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + * @param tousseDefinitionTemplateItems 该模板下的所有器械包 + */ + public static GoodFilterConfigVo prepareUpdateTousse(GoodFilterConfigVo goodFilterConfigVo, List tousseDefinitionTemplateItems) { + TousseDefinition td = TousseDefinitionDataProvider.getTousseDefinition(TousseDefinitionDataProvider.Test穿刺包); + JSONObject tousseDefinition1 = new JSONObject(); + JSONObject tousseDefinition2 = new JSONObject(); + JSONObject tousseDefinition1_1 = new JSONObject(); + JSONObject tousseDefinition2_1 = new JSONObject(); + //删除Test开颅包,新增Test穿刺包 + tousseDefinition1_1.put("id", tousseDefinitionTemplateItems.get(0).getTousseDefinition().getId()); + tousseDefinition2_1.put("id", td.getId()); + tousseDefinition1.put("tousseDefinition", tousseDefinition1_1); + tousseDefinition2.put("tousseDefinition", tousseDefinition2_1); + JSONArray tousseArray = new JSONArray(); + tousseArray.add(tousseDefinition1); + tousseArray.add(tousseDefinition2); + goodFilterConfigVo.setTousseInfo(tousseArray.toString()); + return goodFilterConfigVo; + } +}