V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
montaro2017
V2EX  ›  Java

字段关联校验有没有好的解决办法

  •  
  •   montaro2017 · 47 天前 · 1874 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。
    字段 a ,字段 b ,字段 c 。

    其中字段 a 是必填,字段 b 当字段 a 为 1 时必填,字段 c 当字段 b 为 2 时必填,有现成的解决方案吗?

    当字段 a 不是 1 时,要把字段 b 设置为 null ,要考虑前端字段 a 选择了 1 ,填写了字段 b ,然后再把字段 a 选择为其他的选项考虑进去。

    现在有 56 个表单,每个表单有大约 200 个字段,每个字段都有一个校验规则,每个表单都有一个 excel 文件描述字段和校验规则,有快速生成的方法吗?

    21 条回复    2024-11-06 15:32:10 +08:00
    murmur
        1
    murmur  
       47 天前
    这种拿低开一配就可以,你们的排平台那么垃圾么校验还得后端做

    企业开发和互联网不一样,企业开发是全内网+实名制,谁改数据开谁,更何况是医生拿自己前程赌?不至于

    后端不管就做前端校验就行
    murmur
        2
    murmur  
       47 天前
    而且我感觉你思路都错了,这个重点不是要校验,是做动态显隐,按你的截图明显是特殊疾病才要填写对应病种的详细信息

    还有一点,这东西不像是医生用的界面,倒像是给医保局的接口
    montaro2017
        3
    montaro2017  
    OP
       47 天前
    @murmur #1 前端做校验也很麻烦啊,总共 1000 多个字段,大部分字段都有校验规则
    montaro2017
        4
    montaro2017  
    OP
       47 天前
    @montaro2017 #3 10000 多个字段
    montaro2017
        5
    montaro2017  
    OP
       47 天前
    @murmur #2 要过一遍审核再调接口上传,必须得做校验,不然上传会被打回
    wolfie
        6
    wolfie  
       47 天前
    工作量永远在那,配置也好,代码硬写也好。

    校验的话,用 Validation 自定义注解,搭配 SpEL ,类似 `@NotNullWhen(expression = "entity.name == ''foobar")`
    Donjote
        7
    Donjote  
       47 天前
    @wolfie 可行
    Belmode
        8
    Belmode  
       47 天前
    做过类似的,无论哪种方式都很麻烦的...这种就是硬工作量
    wineast
        9
    wineast  
       47 天前
    前面回复都说了,工作量都摆在哪里,纯体力活
    设计时别想着重用,除非一模一样。
    我们的做法是做成可配置化,方便后期修改,所有的规则全部做成数据库的一条记录,类似规则引擎。复杂一点的规则,可以用 groovy 脚本;简单点的,正则或者 spel 。写三个解析器(spel, 正则,groovy)解析下,
    但是基本都是单条记录字段间可以做关联校验,如果要做汇总校验(某个字段总和不超过 xxx )。还是要上代码实现。

    和业务交流过,不在乎怎么实现,但是对于新加规则或者调整规则,要快速起效果,简单的一天之内能上线,复杂的一周之内。所以最后采取配置化的方案来实现。但是这个也不能解决你一个个字段都要配置的工作量,这个就是体力活,没法减少
    lujianwen9
        10
    lujianwen9  
       46 天前
    springboot 校验注解可以用
    @AssertTrue(message = "domain 不能为空")
    @JsonIgnore
    public boolean isDomainValid() {
    // 如果是七牛,必须带有 domain
    if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) {
    return false;
    }
    return true;
    }
    也可以用分组校验
    tomatocici2333
        11
    tomatocici2333  
       46 天前
    交给别人做。纯纯体力活
    justdoit123
        12
    justdoit123  
       46 天前
    同意楼上说的。规则化,可配置化。业务的输入源头(就是那个 excel 文件)做好规范校验。

    大概率没有可以直接用的第三方工具、库,别在上面费功夫。
    andyC
        13
    andyC  
       46 天前
    纯体力活, 文档写清楚投喂给 claude
    realpg
        14
    realpg  
       46 天前
    @justdoit123 #12

    其实有现成的库,但是大概率 OP 搜不到,也不知道方向

    我们给医院做 HIS 的数据库信创国产化改造类似的规则问题(原始写在 oracle 存储过程内的校验,新库实现不显示,改为在后端校验),通过架构的知识面 复用一些 js 的库 再用 copilot 把逻辑用 java 转写实现的

    实现之后利用 AI 可以做到自然语言文字描述规则 然后他自动生成配置 90%以上完全正确

    因为 HIS 系统有非常庞大的原始开发需求文档,直接把文档对这里的约束描述丢给 AI 90%概率能生成合适规则
    securityCoding
        15
    securityCoding  
       46 天前
    得自己撸个 dsl 出来了
    ikas
        16
    ikas  
       46 天前
    好熟悉...
    没什么好的办法
    以前我们是自己开发的一套验证框架..规则基本都是手动写,还要前后端都要加...
    jinliming2
        17
    jinliming2  
       46 天前 via iPhone
    hapijs/joi 我记得是支持这种校验模式的,找找有没有 Java 版
    liuby
        18
    liuby  
       46 天前
    可以看一下 JSON Schema 应该能足你的业务场景, 编写一套规则, 前端后端都可以用.
    wujianhua22
        19
    wujianhua22  
       46 天前
    写个代码生成工具,也就个把小时的事
    montaro2017
        20
    montaro2017  
    OP
       46 天前
    @lujianwen9 #10 代码生成自己可以撸一套,就是这个校验规则感觉不好生成
    kandaakihito
        21
    kandaakihito  
       46 天前
    快速生成的方法:我不知道(

    但是建议,看看能不能从这么多规则里面抽象出一点共性,用策略模式搞几个接口封装起来,每条规则要能配置。再写个简单的选择器去匹配规则,项目初期能动就行。

    因为不能确定后期规则会不会有变动,你这里几百条规则,如果全部写 sheme 写死的话后期会很炸裂。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2781 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:47 · PVG 16:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.