Index: ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/SaveOrPackForeignProxyDisinfectionTest.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/SaveOrPackForeignProxyDisinfectionTest.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/invoicemanager/service/SaveOrPackForeignProxyDisinfectionTest.java (revision 39826) @@ -0,0 +1,316 @@ +package test.forgon.disinfectsystem.invoicemanager.service; + +import static org.junit.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.junit.Test; + +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; + +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; +import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyItem; +import com.forgon.exception.SystemException; +/** + * 保存或装配并打印外部代理灭菌单 + * @author zc.li + * + */ +public class SaveOrPackForeignProxyDisinfectionTest extends AbstractCSSDTest{ + @Test + public void TestsaveOrPackForeignProxyDisinfection() { + // 初始化公共数据 + initTestData(); + + // 场景1: 创建初始消毒申请并验证 + ForeignProxyDisinfection disinfection = createAndVerifyInitialDisinfection(); + + // 场景2: 尝试减少数量应失败 + verifyDecreaseCountNotAllowed(disinfection); + + // 场景3: 允许增加数量 + verifyIncreaseCountAllowed(disinfection); + + // 场景4: 禁止添加同名物品 + verifyDuplicateItemNotAllowed(disinfection); + + // 场景5: 允许添加不同名物品 + verifyNewItemAllowed(disinfection); + + // 场景6: 禁止删除物品 + verifyDeleteItemNotAllowed(disinfection); + + // 场景7: 允许增加一个物品数量并点保存按钮 + verifySaveItemAllowed(disinfection); + + // 场景8: 验证保存后的状态 代理项增加 包不增加 + verifySaveState(disinfection); + + // 场景9: 允许保存后,再打开直接点装配 此时代理项数量不变 但是申请项会更新 包实例会增加场景7的新增的数量 + verifyPackAfterSaveAllowed(disinfection); + + // 场景10: 验证最终状态 + verifyFinalState(disinfection); + } + + //---- 以下是抽取的辅助方法 ---- + + private void initTestData() { + initCSSDData(); + makeActiveUser("oruser1"); + } + + private ForeignProxyDisinfection createBaseDisinfection() { + ForeignProxyDisinfection disinfection = new ForeignProxyDisinfection(); + disinfection.setApplicant("林倩"); + disinfection.setApplicationTime(new Date()); + disinfection.setCommittedStatus(true); + disinfection.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + disinfection.setDepart(Constants.ORG_UNIT_NAME_CSSD); + disinfection.setDepartCoding(Constants.ORG_UNIT_CODE_CSSD); + disinfection.setType(InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION); + disinfection.setSerialNumber("2014101700001"); + disinfection.setHandleDepart(Constants.ORG_UNIT_NAME_CSSD); + disinfection.setHandleDepartCoding(Constants.ORG_UNIT_CODE_CSSD); + disinfection.setSettleAccountsDepart(Constants.ORG_UNIT_NAME_CSSD); + disinfection.setSettleAccountsDepartCoding(Constants.ORG_UNIT_CODE_CSSD); + disinfection.setDisposablePriceFluctuation(supplyRoomConfigManager.getDisposableGoodsFluctuation()); + return disinfection; + } + + private JSONObject buildBaseParams() { + JSONObject params = new JSONObject(); + params.put("applicationTimeStr", formatDate(new Date())); + params.put("arrivedTimeStr", formatDate(new Date())); + params.put("scheduleTimeStr", formatDate(new Date())); + return params; + } + + private JSONObject createItemInfo(String tousseName, Integer count) { + TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName(tousseName); + getOrsaveCssdHandleTousses(td, Constants.ORG_UNIT_CODE_CSSD, Constants.ORG_UNIT_NAME_CSSD); + + JSONObject item = new JSONObject(); + item.put("id", null); + item.put("packageType", "棉布"); + item.put("count", count); + item.put("tousseName", td.getName()); + item.put("tousseType", null); + item.put("sterilingType", "低温灭菌"); + return item; + } + + private ForeignProxyDisinfection createAndVerifyInitialDisinfection() { + // 初始化对象 + ForeignProxyDisinfection disinfection = createBaseDisinfection(); + JSONObject params = buildBaseParams(); + + // 添加初始物品 + JSONArray items = new JSONArray(); + items.add(createItemInfo("4#压力蒸汽灭菌包", 3)); + params.put("itemInfoList", items); + + // 执行创建 + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params); + // 验证初始状态 + assertThat(disinfection.getForeignProxyItems()) + .hasSize(1) + .first() + .extracting(ForeignProxyItem::getTousseName, ForeignProxyItem::getCount) + .containsExactly("4#压力蒸汽灭菌包", 3); + return disinfection; + } + + private void verifyDecreaseCountNotAllowed(ForeignProxyDisinfection disinfection) { + JSONObject params = buildBaseParams(); + ForeignProxyItem item = getForeignProxyItemByTousseName(disinfection, "4#压力蒸汽灭菌包"); + // 尝试减少数量 + JSONArray items = new JSONArray(); + JSONObject modifiedItem = createItemInfo(item.getTousseName(), 2); + modifiedItem.put("id", item.getId()); + items.add(modifiedItem); + params.put("itemInfoList", items); + try { + // 触发可能抛出异常的方法 + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params); + // 如果未抛出异常,测试应失败 + throw new AssertionError("Expected SystemException but no exception was thrown"); + } catch (SystemException e) { + // 验证异常消息 + assertEquals("包已装配,不能扣减数量", e.getMessage()); + } + // 验证数量未变 + assertThat(item.getCount()).isEqualTo(3); + } + + private void verifyIncreaseCountAllowed(ForeignProxyDisinfection disinfection) { + JSONObject params = buildBaseParams(); + ForeignProxyItem item = getForeignProxyItemByTousseName(disinfection, "4#压力蒸汽灭菌包"); + // 增加数量 + JSONArray items = new JSONArray(); + JSONObject modifiedItem = createItemInfo(item.getTousseName(), 5); + modifiedItem.put("id", item.getId()); + items.add(modifiedItem); + params.put("itemInfoList", items); + + // 执行更新 + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params); + + // 验证新数量 + assertThat(item.getCount()).isEqualTo(5); + } + + private void verifyDuplicateItemNotAllowed(ForeignProxyDisinfection disinfection) { + JSONObject params = buildBaseParams(); + ForeignProxyItem existingItem = getForeignProxyItemByTousseName(disinfection, "4#压力蒸汽灭菌包"); + // 添加同名物品 + JSONArray items = new JSONArray(); + items.add(createItemInfo(existingItem.getTousseName(), 2)); // 同名物品 + params.put("itemInfoList", items); + + // --- 触发异常并验证 --- + assertThatThrownBy(() -> + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params) + ) + .isInstanceOf(SystemException.class) + .hasMessage("已经存在同名物品,如需追加请直接修改数量。"); + // 验证物品数量不变 + assertThat(disinfection.getForeignProxyItems()).hasSize(1); + } + /** + * 获取已保存的ForeignProxyItems + * @param disinfection + * @return + */ + public JSONArray getForeignProxyItems(ForeignProxyDisinfection disinfection){ + JSONArray items = new JSONArray(); + for (ForeignProxyItem foreignProxyItem : disinfection.getForeignProxyItems()) { + JSONObject item = new JSONObject(); + item.put("id", foreignProxyItem.getId()); + item.put("packageType", "棉布"); + item.put("count", foreignProxyItem.getCount()); + item.put("tousseName", foreignProxyItem.getTousseName()); + item.put("tousseType", foreignProxyItem.getTousseType()); + item.put("sterilingType", "低温灭菌"); + items.add(item); + } + return items; + } + private void verifyNewItemAllowed(ForeignProxyDisinfection disinfection) { + JSONObject params = buildBaseParams(); + + // 添加新物品 + JSONArray items = new JSONArray(); + JSONArray oldItems = getForeignProxyItems(disinfection); + items.addAll(oldItems); + items.add(createItemInfo("test121#压力蒸汽灭菌包", 2)); + params.put("itemInfoList", items); + + // 执行添加 + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params); + + // 验证新增成功 + assertThat(disinfection.getForeignProxyItems()) + .hasSize(2) + .extracting(ForeignProxyItem::getTousseName) + .containsExactlyInAnyOrder("4#压力蒸汽灭菌包", "test121#压力蒸汽灭菌包"); + } + + private void verifyDeleteItemNotAllowed(ForeignProxyDisinfection disinfection) { + JSONObject params = buildBaseParams(); + + // 尝试删除一个物品 + JSONArray items = new JSONArray(); + JSONArray oldItems = getForeignProxyItems(disinfection); + oldItems.remove(oldItems.get(0)); + items.addAll(oldItems); + params.put("itemInfoList", items); + // 验证异常 + assertThatThrownBy(() -> + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params) + ).isInstanceOf(SystemException.class) + .hasMessage("已装配的物品不能删除!"); + // 验证物品未被删除 + assertThat(disinfection.getForeignProxyItems()).hasSize(2); + } + private void verifySaveItemAllowed(ForeignProxyDisinfection disinfection){ + + JSONObject params = buildBaseParams(); + // 增加数量 + JSONArray items = getForeignProxyItems(disinfection); + for (int i = 0; i < items.size(); i++) { + JSONObject obj = items.getJSONObject(i); + if("4#压力蒸汽灭菌包".equals(obj.optString("tousseName"))){ + obj.put("count", obj.optInt("count")+1); + break; + } + } + System.out.println(items.toString()); + params.put("itemInfoList", items); + + // 执行更新 + foreignProxyDisinfectionManager.saveOrUpdateProxyDisinfection(disinfection, params); + + } + private void verifySaveState(ForeignProxyDisinfection disinfection) { + // 验证最终数量 + Map itemCounts = disinfection.getForeignProxyItems().stream() + .collect(Collectors.toMap(ForeignProxyItem::getTousseName, ForeignProxyItem::getCount)); + assertThat(itemCounts) + .containsEntry("4#压力蒸汽灭菌包", 6) + .containsEntry("test121#压力蒸汽灭菌包", 2); + } + private void verifyPackAfterSaveAllowed(ForeignProxyDisinfection disinfection){ + + JSONObject params = buildBaseParams(); + ForeignProxyItem item = getForeignProxyItemByTousseName(disinfection, "4#压力蒸汽灭菌包"); + + params.put("itemInfoList", getForeignProxyItems(disinfection)); + + // 执行更新 + foreignProxyDisinfectionManager.packForeignProxyDisinfection(disinfection, params); + + // 验证新数量 + assertThat(item.getCount()).isEqualTo(6); + + } + private void verifyFinalState(ForeignProxyDisinfection disinfection) { + // 验证最终数量 + Map itemCounts = disinfection.getForeignProxyItems().stream() + .collect(Collectors.toMap(ForeignProxyItem::getTousseName, ForeignProxyItem::getCount)); + assertThat(itemCounts) + .containsEntry("4#压力蒸汽灭菌包", 6) + .containsEntry("test121#压力蒸汽灭菌包", 2); + // 验证数据库记录 + String query = "SELECT po FROM TousseInstance po WHERE EXISTS " + + "(SELECT 1 FROM ForeignProxyItem fi WHERE " + + "fi.foreignProxyDisinfection.id = "+ disinfection.getId() +" AND fi.id " + + "= po.foreignProxyItem_id)"; + List instances = objectDao.findByHql(query); + assertEquals(8, instances.size()); + } + private ForeignProxyItem getForeignProxyItemByTousseName(ForeignProxyDisinfection disinfection, String tousseName){ + ForeignProxyItem foreignProxyItem = null; + for (ForeignProxyItem item : disinfection.getForeignProxyItems()) { + if(tousseName.equals(item.getTousseName())){ + foreignProxyItem = item; + break; + } + } + return foreignProxyItem; + } + private String formatDate(Date date) { + return com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM.format(date); + } +} Index: build.gradle =================================================================== diff -u -r39805 -r39826 --- build.gradle (.../build.gradle) (revision 39805) +++ build.gradle (.../build.gradle) (revision 39826) @@ -546,6 +546,7 @@ compile group: 'javax.websocket', name: 'javax.websocket-api', version:'1.1' compile group: 'junit', name: 'junit', version:'4.12' + compile group: 'org.assertj', name: 'assertj-core', version:'3.23.1' // 缩略图生成库 compile group: 'net.coobird', name: 'thumbnailator', version: '0.4.8'