刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package jnpf.limsService.support;
 
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
 
public class LimsWendingxingFenxiApiChecks {
 
    public static void main(String[] args) throws Exception {
        Path root = Paths.get("").toAbsolutePath().normalize();
        String param = read(root, "jnpf-lims/jnpf-lims-entity/src/main/java/jnpf/limsEntity/LimsWendingxingFenxiParam.java");
        String row = read(root, "jnpf-lims/jnpf-lims-entity/src/main/java/jnpf/limsEntity/LimsWendingxingFenxiRowVo.java");
        String options = read(root, "jnpf-lims/jnpf-lims-entity/src/main/java/jnpf/limsEntity/LimsWendingxingFenxiOptionsVo.java");
        String data = read(root, "jnpf-lims/jnpf-lims-entity/src/main/java/jnpf/limsEntity/LimsWendingxingFenxiDataVo.java");
        String mapper = read(root, "jnpf-lims/jnpf-lims-biz/src/main/resources/mapper/LimsWendingxingFenxiMapper.xml");
        String service = read(root, "jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsWendingxingFenxiServiceImpl.java");
        String controller = read(root, "jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/LimsWendingxingFenxiController.java");
        String workbookBuilder = read(root,
                "jnpf-lims/jnpf-lims-controller/src/main/java/jnpf/limsController/export/LimsWendingxingFenxiWorkbookBuilder.java");
 
        require(param, "@JsonProperty(\"fenlei_bianma\")", "分类字段缺失");
        require(param, "@JsonProperty(\"pihao_keys\")", "批号复合键缺失");
        require(row, "@JsonProperty(\"numeric_result\")", "数值结果字段缺失");
        require(row, "@JsonProperty(\"exception_type\")", "异常类型字段缺失");
        require(row, "@JsonProperty(\"zhouqi_order\")", "周期排序字段缺失");
        require(options, "private List<LimsWendingxingFenxiOptionVo> fenleiList", "分类选项缺失");
        require(options, "private List<LimsWendingxingFenxiOptionVo> pihaoList", "批号选项缺失");
        require(data, "private LimsWendingxingFenxiCompletenessVo completeness", "完整性结果缺失");
        require(data, "private List<LimsWendingxingFenxiExpectedPeriodVo> expectedPeriods", "预期周期明细缺失");
 
        require(mapper, "p.f_flow_state = 2", "筛选项必须来自已批准计划");
        require(mapper, "yp.leixin = ql.fenlei_bianma", "分类编码关联缺失");
        require(mapper, "kx.kaoca_id = p.kaoca_id", "考察配置项目关联缺失");
        require(mapper, "p.f_tenant_id = #{tenantId}", "计划租户过滤缺失");
        require(mapper, "COALESCE(p.f_delete_mark, 0) &lt;&gt; 1", "计划软删除过滤缺失");
        require(mapper, "jx.jianyan_zhuangtai = 'audited'", "正式结果必须只取 audited");
        require(mapper, "jx.f_foreign_id = z.f_id", "当前质量标准关联缺失");
        require(mapper, "LEFT JOIN jianyan_xiangmu_guanli jxm", "检验项目默认单位关联缺失");
        require(mapper, "jxm.bianma = z.jianyan_xiangmu_bianma", "检验项目编码关联缺失");
        require(mapper, "jxm.f_tenant_id = p.f_tenant_id", "检验项目租户关联缺失");
        require(mapper, "COALESCE(NULLIF(TRIM(jxm.moren_danwei), ''), '/') AS unit",
                "空默认单位必须由后端返回斜杠");
        require(mapper, "AND TRIM(z.shuju_leixing) = '数值'",
                "检验项目筛选必须只返回数值型项目");
        require(mapper, "q.wendingxing_zhouqi_id = c.f_id", "请验周期关联缺失");
        require(mapper, "q.wendingxing_jilu_id = p.f_id", "请验计划关联缺失");
        require(mapper, "regexp_split_to_table", "周期项目展开缺失");
        require(mapper, "<resultMap id=\"optionMap\"", "筛选项 ResultMap 缺失");
        require(mapper, "<resultMap id=\"rowMap\"", "明细 ResultMap 缺失");
        require(mapper, "<resultMap id=\"completenessMap\"", "完整性 ResultMap 缺失");
        require(mapper, "COALESCE(NULLIF(c.pihao, ''), py.pihao)", "完整性批号必须与计划样品统一");
        reject(mapper, "resultType=", "Mapper 查询必须使用完整 ResultMap 显式映射");
        reject(mapper, "lims_qingyandan_jiancexiang", "不得使用不存在的旧检测项表");
 
        require(service, "UserProvider.getUser()", "当前租户来源缺失");
        require(service, "strictDecimal", "严格数值解析缺失");
        require(service, "periodOrder", "周期归一化缺失");
        require(service, "exceptionType", "异常分类缺失");
        require(service, "selectCompleteness", "完整性查询缺失");
        require(service, "validateRawFilters", "非法或重复筛选校验缺失");
        require(service, "requireContainsAll(fenxiMapper.selectItems(",
                "数据查询必须复用数值型项目候选范围校验");
        require(workbookBuilder, "new HSSFWorkbook()", "xls 工作簿缺失");
        require(workbookBuilder, "稳定性考察编号", "导出列缺失");
        require(controller, "fenxiService.listData(param).getRows()", "导出必须复用查询结果");
        require(controller, "DictionaryDataApi dictionaryDataApi", "周期单位字典 API 缺失");
        require(controller, "getListByCode(\"zhouqiDanwei\")", "周期单位必须查询 zhouqiDanwei 字典");
        require(controller, "LimsWendingxingFenxiWorkbookBuilder", "稳定性导出构建器缺失");
        require(controller, "FileUploadApi fileUploadApi", "导出必须通过文件服务存储");
        require(controller, "ExcelUtil.workbookToCommonsMultipartFile", "工作簿上传转换缺失");
        require(controller, "fileUploadApi.uploadFile", "文件服务上传调用缺失");
        require(controller, "fileInfo.getFilename()", "下载地址必须使用文件服务返回的文件名");
        reject(controller, "new FileOutputStream", "微服务导出不得写入 LIMS 本地临时目录");
        reject(controller, "getLocalBasePath", "微服务导出不得依赖文件服务本地路径");
 
        require(controller, "@RequestMapping(\"/lims/biz/wendingxing/fenxi\")", "接口前缀缺失");
        require(controller, "@PostMapping(\"/options\")", "筛选项接口缺失");
        require(controller, "@PostMapping(\"/data\")", "数据接口缺失");
        require(controller, "@PostMapping(\"/export\")", "导出接口缺失");
        require(controller, "@SaCheckLogin", "登录校验缺失");
        require(controller, "DownloadVO", "平台下载响应缺失");
    }
 
    private static String read(Path root, String relativePath) throws Exception {
        return new String(Files.readAllBytes(root.resolve(relativePath)));
    }
 
    private static void require(String source, String token, String message) {
        if (!source.contains(token)) {
            throw new AssertionError(message);
        }
    }
 
    private static void reject(String source, String token, String message) {
        if (source.contains(token)) {
            throw new AssertionError(message);
        }
    }
}