package com.smartor.service;
|
|
import com.ruoyi.patarchive.domain.PatSpecificArchiveGenerateConfig;
|
import com.ruoyi.task.domain.ServiceSubtask;
|
import com.smartor.service.impl.PatSpecificArchiveGenerateServiceImpl;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
import java.io.File;
|
import java.lang.reflect.Field;
|
import java.lang.reflect.Method;
|
|
/**
|
* 住院随访生成专科档案逻辑自检(纯 main,不依赖 JUnit / Spring / 数据库)。
|
*
|
* <p>覆盖:住院随访范围判断、科室/病区/诊断配置匹配、JSON/逗号配置解析、Mapper XML 可解析性。</p>
|
*/
|
public final class InhospFollowupArchiveLogicCheck {
|
|
private static int passed = 0;
|
private static int failed = 0;
|
|
private static void check(String key, Object expected, Object actual) {
|
boolean ok = expected == null ? actual == null : expected.equals(actual);
|
if (ok) {
|
passed++;
|
System.out.println(" [OK] " + key + " = " + actual);
|
} else {
|
failed++;
|
System.out.println(" [FAIL] " + key + " 期望=" + expected + " 实际=" + actual);
|
}
|
}
|
|
private static void setField(Object target, String name, Object value) throws Exception {
|
Field field = target.getClass().getDeclaredField(name);
|
field.setAccessible(true);
|
field.set(target, value);
|
}
|
|
private static ServiceSubtask subtask(String hospType, String serviceType) {
|
ServiceSubtask subtask = new ServiceSubtask();
|
subtask.setId(1001L);
|
subtask.setHospType(hospType);
|
subtask.setServiceType(serviceType);
|
return subtask;
|
}
|
|
private static PatSpecificArchiveGenerateConfig config(String deptType, String archiveType,
|
String deptCodes, String icd10Codes) {
|
PatSpecificArchiveGenerateConfig config = new PatSpecificArchiveGenerateConfig();
|
config.setId(1L);
|
config.setDeptType(deptType);
|
config.setDeptCategory("2");
|
config.setArchiveType(archiveType);
|
config.setDeptCodes(deptCodes);
|
config.setIcd10Codes(icd10Codes);
|
return config;
|
}
|
|
public static void main(String[] args) throws Exception {
|
System.out.println("========== 住院随访生成专科档案逻辑自检 ==========");
|
|
PatSpecificArchiveGenerateServiceImpl service = new PatSpecificArchiveGenerateServiceImpl();
|
setField(service, "inhospFollowupServiceTypes", "2,13,18,19");
|
|
Method isInhosp = PatSpecificArchiveGenerateServiceImpl.class
|
.getDeclaredMethod("isInhospFollowup", ServiceSubtask.class);
|
isInhosp.setAccessible(true);
|
|
System.out.println("-- 1) 住院随访范围 --");
|
check("出院随访 serviceType=2", true, isInhosp.invoke(service, subtask("2", "2")));
|
check("入院随访 serviceType=18", true, isInhosp.invoke(service, subtask("6", "18")));
|
check("门诊任务 hospType=1", false, isInhosp.invoke(service, subtask("1", "3")));
|
check("宣教任务 serviceType=4", false, isInhosp.invoke(service, subtask("2", "4")));
|
check("serviceType 为空", false, isInhosp.invoke(service, subtask("2", null)));
|
|
Method match = PatSpecificArchiveGenerateServiceImpl.class.getDeclaredMethod(
|
"matchConfig", PatSpecificArchiveGenerateConfig.class,
|
String.class, String.class, String.class, String.class);
|
match.setAccessible(true);
|
|
System.out.println("-- 2) 科室匹配 --");
|
PatSpecificArchiveGenerateConfig deptConfig = config("1", "1", "[\"D001\"]", null);
|
check("科室 D001 命中", true, match.invoke(service, deptConfig, "D001", null, null, null));
|
check("科室 D002 不命中", false, match.invoke(service, deptConfig, "D002", null, null, null));
|
|
System.out.println("-- 3) 病区匹配 --");
|
PatSpecificArchiveGenerateConfig wardConfig = config("2", "3", "[\"W001\"]", null);
|
check("病区 W001 命中", true, match.invoke(service, wardConfig, "D001", "W001", null, null));
|
check("科室 D001 对病区配置不命中", false,
|
match.invoke(service, wardConfig, "D001", "D001", null, null));
|
|
System.out.println("-- 4) 诊断匹配 --");
|
PatSpecificArchiveGenerateConfig diagConfig = config("1", "1", null, "[\"E46.x00x003\"]");
|
check("诊断码命中", true, match.invoke(service, diagConfig, "D001", null, "E46.x00x003", "营养不良"));
|
check("无诊断码时按诊断名称兜底", true,
|
match.invoke(service, diagConfig, "D001", null, null, "E46.x00x003"));
|
check("诊断不命中", false, match.invoke(service, diagConfig, "D001", null, "R00", "其他"));
|
|
System.out.println("-- 5) 配置为空 / 非法 JSON --");
|
PatSpecificArchiveGenerateConfig emptyConfig = config("1", "1", null, null);
|
check("科室和诊断都为空", false, match.invoke(service, emptyConfig, "D001", null, null, null));
|
PatSpecificArchiveGenerateConfig commaConfig = config("1", "1", "D001,D002", null);
|
check("逗号分隔配置兜底", true, match.invoke(service, commaConfig, "D002", null, null, null));
|
|
System.out.println("-- 6) Mapper XML 可解析性 --");
|
String[] xmlFiles = new String[]{
|
"smartor/src/main/resources/mapper/smartor/PatMaternityArchiveMapper.xml",
|
"smartor/src/main/resources/mapper/smartor/PatChildArchiveMapper.xml",
|
"smartor/src/main/resources/mapper/smartor/PatMaternityArchiveDetailMapper.xml",
|
"smartor/src/main/resources/mapper/smartor/PatChildArchiveDetailMapper.xml",
|
"smartor/src/main/resources/mapper/smartor/PatSpecificArchiveGenerateLogMapper.xml",
|
"ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml"
|
};
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
|
for (String xmlFile : xmlFiles) {
|
try {
|
factory.newDocumentBuilder().parse(new File(xmlFile));
|
check(xmlFile, "OK", "OK");
|
} catch (Exception e) {
|
check(xmlFile, "OK", e.getClass().getSimpleName() + ":" + e.getMessage());
|
}
|
}
|
|
System.out.println("========== 结果:PASS=" + passed + ",FAIL=" + failed + " ==========");
|
if (failed > 0) {
|
System.exit(1);
|
}
|
}
|
}
|