Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java =================================================================== diff -u -r16121 -r17245 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java (.../MaterialDefinitionManager.java) (revision 16121) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java (.../MaterialDefinitionManager.java) (revision 17245) @@ -30,7 +30,7 @@ public List getMaterialDefinitionByType(String type); /** - * 根据名字和规格获取可再生材料,不包含外来器械 + * 根据名字和规格获取可再生材料,不包含外来器械.. * @param name * @param specification * @return Index: ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/UpdateMterialIsImplantPropertyTest.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/UpdateMterialIsImplantPropertyTest.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/material/service/UpdateMterialIsImplantPropertyTest.java (revision 17245) @@ -0,0 +1,99 @@ +package test.forgon.disinfectsystem.material.service; + +import org.hibernate.Session; +import org.testng.annotations.Test; + +import com.forgon.Constants; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; + +import test.forgon.disinfectsystem.AbstractCSSDTest; +import static org.testng.Assert.*; +/** + * 本类测试修改材料定义的isImplant属性后,相关的一些器械包定义的includeImplant,是否正确同步修改 + * @author Chenjiaru + * + */ +public class UpdateMterialIsImplantPropertyTest extends AbstractCSSDTest { + + /** + 此方法测试的内容主要分两大块(有六种场景): + 一、第一块(两个场景) + Test开胸包材料清单 + 名称 数量 是否植入物 + Test钳子 5 否 + Test镊子 2 否 + 1、把材料“Test钳子”的是否植入物属性(否-》否)预期结果:Test开胸包的IncludeImplant=1 + 2、把材料“Test钳子”的是否植入物属性(否-》是)预期结果:Test开胸包的IncludeImplant=0 + + 二、第二块(四个场景) + Test开胸包材料清单 + 名称 数量 是否植入物 + Test钳子 5 是 + Test镊子 2 否 + 1、把材料“Test钳子”的是否植入物属性(是-》否)预期结果:Test开胸包的IncludeImplant=1 + 2、把材料“Test钳子”的是否植入物属性(是-》是)预期结果:Test开胸包的IncludeImplant=0 + 3、把材料“Test镊子”的是否植入物属性(否-》否)预期结果:Test开胸包的IncludeImplant=0 + 4、把材料“Test镊子”的是否植入物属性(否-》是)预期结果:Test开胸包的IncludeImplant=0 + + */ + @Test + public void testUpdateMterialIsImplantProperty() { + initCSSDData(); + Session session = objectDao.getHibernateSession(); + + /** + Test开胸包材料清单 + 名称 数量 是否植入物 + Test钳子 5 否 + Test镊子 2 否 + */ + MaterialDefinition md_钳子 = materialDefinitionManager.getMaterialDefinitionByName("Test钳子", null); + //1、把材料“Test钳子”的是否植入物属性(否-》否)预期结果:Test开胸包的IncludeImplant=1 + md_钳子.setIsImplant(Constants.STR_NO); + materialDefinitionManager.saveOrUpdate(md_钳子); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(1)); + + //2、把材料“Test钳子”的是否植入物属性(否-》是)预期结果:Test开胸包的IncludeImplant=0 + md_钳子.setIsImplant(Constants.STR_YES); + materialDefinitionManager.saveOrUpdate(md_钳子); + session.refresh(td_开胸包); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(0)); + + /** + Test开胸包材料清单 + 名称 数量 是否植入物 + Test钳子 5 是 + Test镊子 2 否 + */ + //1、把材料“Test钳子”的是否植入物属性(是-》否)预期结果:Test开胸包的IncludeImplant=1 + md_钳子.setIsImplant(Constants.STR_NO); + materialDefinitionManager.saveOrUpdate(md_钳子); + session.refresh(td_开胸包); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(1)); + + //2、把材料“Test钳子”的是否植入物属性(是-》是)预期结果:Test开胸包的IncludeImplant=0 + md_钳子.setIsImplant(Constants.STR_YES); + td_开胸包.setIncludeImplant(TousseDefinition.INCLUDE_IMPLANT); + session.flush(); //上两句是还原测试的数据,(实现一个方法测试用例能测试多个复杂度相对较低的场景) + md_钳子.setIsImplant(Constants.STR_YES); + materialDefinitionManager.saveOrUpdate(md_钳子); + session.refresh(td_开胸包); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(0)); + + //3、把材料“Test镊子”的是否植入物属性(否-》否)预期结果:Test开胸包的IncludeImplant=0 + MaterialDefinition md_镊子 = materialDefinitionManager.getMaterialDefinitionByName("Test镊子", null); + md_镊子.setIsImplant(Constants.STR_NO); + materialDefinitionManager.saveOrUpdate(md_镊子); + session.refresh(td_开胸包); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(0)); + + //4、把材料“Test镊子”的是否植入物属性(否-》是)预期结果:Test开胸包的IncludeImplant=0 + md_镊子.setIsImplant(Constants.STR_YES); + materialDefinitionManager.saveOrUpdate(md_镊子); + session.refresh(td_开胸包); + assertEquals(td_开胸包.getIncludeImplant(), new Integer(0)); + } + +} Index: ssts-web/src/test/resources/test/forgon/disinfectsystem/material/AllTests.xml =================================================================== diff -u -r16910 -r17245 --- ssts-web/src/test/resources/test/forgon/disinfectsystem/material/AllTests.xml (.../AllTests.xml) (revision 16910) +++ ssts-web/src/test/resources/test/forgon/disinfectsystem/material/AllTests.xml (.../AllTests.xml) (revision 17245) @@ -4,6 +4,7 @@ + \ No newline at end of file Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java =================================================================== diff -u -r17158 -r17245 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java (.../MaterialDefinitionManagerImpl.java) (revision 17158) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManagerImpl.java (.../MaterialDefinitionManagerImpl.java) (revision 17245) @@ -9,14 +9,20 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; + import javax.servlet.http.HttpServletRequest; + import net.sf.json.JSONArray; import net.sf.json.JSONObject; + +import org.apache.commons.collections4.Closure; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; @@ -25,6 +31,7 @@ import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; + import com.forgon.Constants; import com.forgon.attachfile.service.AttachFileManager; import com.forgon.directory.acegi.tools.AcegiHelper; @@ -34,10 +41,12 @@ import com.forgon.disinfectsystem.entity.basedatamanager.datasynchronization.HisMaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.datasynchronization.HisMaterialType; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.security.tools.Util; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.MathTools; import com.forgon.tools.Path; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.db.InitDbConnection; @@ -81,18 +90,38 @@ } public void saveOrUpdate(MaterialDefinition materialDefinition) { - if (DatabaseUtil.isPoIdValid(materialDefinition.getId())) { //如果是修改,则需要联动,有此材料定义的包定义的“includeImplant”属性 - Integer includeImplant = TousseDefinition.UNINCLUDE_IMPLANT; + synchronizationUpdate(materialDefinition); + objectDao.saveOrUpdate(materialDefinition); + } + + /** + * 修改MaterialDefinition时,同步修改相关联的一些属性 + * @param materialDefinition 材料定义 + */ + private void synchronizationUpdate(MaterialDefinition materialDefinition) { + if (DatabaseUtil.isPoIdValid(materialDefinition.getId())) { + /** + * 1、如果把材料修改成植入物类型,这时可以不用判断,直接修改相关联的包定义的“是否包含植入物”属性 + * 2、如果把材料修改成非植入物类型,这时还不能立即同步其相关的包定义的“是否包含植入物”属性,需要加以判断,如果某个包定义里面的除本材料以外,还有其他植入物材料,此时不修改此包定义的“是否包含植入物”属性 + */ + String sql = ""; if (StringTools.equals(materialDefinition.getIsImplant(), Constants.STR_YES)) { - includeImplant = TousseDefinition.INCLUDE_IMPLANT; + sql += String.format("update TousseDefinition set includeImplant=%s " + + "where id in(" + + "select td.id from MaterialDefinition md join MaterialInstance mi on mi.materialDefinition_id=md.id join TousseDefinition td on td.id=mi.tousse_id where md.id=%s" + + ") and (includeImplant is null or includeImplant<>%s)", + TousseDefinition.INCLUDE_IMPLANT, materialDefinition.getId(), TousseDefinition.INCLUDE_IMPLANT); + } else { + sql += String.format("update TousseDefinition set includeImplant=%s " + + "where id in(" + + "select td.id from MaterialDefinition md join MaterialInstance mi on mi.materialDefinition_id=md.id join TousseDefinition td on td.id=mi.tousse_id where md.id=%s " + + "and not exists(select 1 from TousseDefinition td2 join MaterialInstance mi2 on mi2.tousse_id=td2.id join MaterialDefinition md2 on md2.id=mi2.materialDefinition_id where td2.id=td.id and md2.id<>md.id and md2.isImplant='%s')" + + ") and (includeImplant is null or includeImplant<>%s)", + TousseDefinition.UNINCLUDE_IMPLANT, materialDefinition.getId(), + Constants.STR_YES, TousseDefinition.UNINCLUDE_IMPLANT); } - String sql = String.format("update TousseDefinition set includeImplant=%s " - + "where id in(select td.id from MaterialDefinition md join MaterialInstance mi on mi.materialDefinition_id=md.id join TousseDefinition td on td.id=mi.tousse_id where md.id=%s) " - + "and (includeImplant is null or includeImplant<>%s)", - includeImplant, materialDefinition.getId(), includeImplant); objectDao.executeUpdate(sql); } - objectDao.saveOrUpdate(materialDefinition); } public MaterialDefinition getMaterialDefinitionById(String id) {