字段关联校验有没有好的解决办法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
montaro2017
V2EX    Java

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

  •  
  •   montaro2017 341 天前 2602 次点击
    这是一个创建于 341 天前的主题,其中的信息可能已经有所发展或是发生改变。
    字段 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  
       341 天前
    这种拿低开一配就可以,你们的排平台那么垃圾么校验还得后端做

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

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

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

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

    和业务交流过,不在乎怎么实现,但是对于新加规则或者调整规则,要快速起效果,简单的一天之内能上线,复杂的一周之内。所以最后采取配置化的方案来实现。但是这个也不能解决你一个个字段都要配置的工作量,这个就是体力活,没法减少
    lujianwen9
        10
    lujianwen9  
       341 天前
    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  
       341 天前
    交给别人做。纯纯体力活
    justdoit123
        12
    justdoit123  
       341 天前
    同意楼上说的。规则化,可配置化。业务的输入源头(就是那个 excel 文件)做好规范校验。

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

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

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

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

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

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

    因为不能确定后期规则会不会有变动,你这里几百条规则,如果全部写 sheme 写死的话后期会很炸裂。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:37 PVG 06:37 LAX 15:37 JFK 18:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86