看到个业务系统用的这种表达式是如何实现的?有什么高深的技术吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Lindp
V2EX    程序员

看到个业务系统用的这种表达式是如何实现的?有什么高深的技术吗?

  •  
  •   Lindp 2022-10-08 22:27:31 +08:00 3748 次点击
    这是一个创建于 1166 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ##合计 = 个人利益 + 管理利益
    合计 temp = 个人利益 + 管理利益
    合计 = 当前状态 == "在职" ? 合计 temp : 0


    # 储存取值

    当年收入 temp = 佣金归档[n=>n.报表日期 >= date(format_date(结佣日期,"YYYY-01-01")) and n.报表日期 < date(format_date(date_add(结佣日期,1 月),"YYYY-MM-01"))]
    当月数据 = {"报表日期":结佣日期,"月份":月份,"寿险保费": 寿险月首期保费,"寿险标保": 寿险月首期标保,"寿险件数": 寿险首期件数,"寿险佣金": 寿险月首期佣金,"总收入": 合计}
    当年收入 temp = append(当年收入 temp,当月数据)
    当年收入 = map((1~12),(i)=>{
    月份 = i ++ "月"
    数据 = 当年收入 temp[n=>n.月份 == (i++"月")]
    寿险保费 = 数据.寿险保费
    总收入 = 数据.总收入
    return{
    月份 : 月份,
    寿险保费 : 寿险保费 == nil ? 0 : 寿险保费,
    总收入 : 总收入 == nil ? 0 : 总收入
    }
    })

    ## 维持晋升
    当月数据 2 = {"报表日期":结佣日期,"月份":月份,"寿险保费": 寿险月首期保费,"寿险标保": 寿险月首期标保,"寿险件数": 寿险首期件数,"寿险佣金": 寿险月首期佣金,"总收入": 合计}
    前 2 月数据 = 佣金归档[n=>n.报表日期 >= date(format_date(date_add(结佣日期,-2 月),"YYYY-MM-01")) and n.报表日期 <= date(format_date(结佣日期, "YYYY-MM-01"))]
    前 11 月数据 = 佣金归档[n=>n.报表日期 >= date(format_date(date_add(结佣日期,-11 月),"YYYY-MM-01")) and n.报表日期 <= date(format_date(结佣日期, "YYYY-MM-01"))]
    前 3 月归档 = append(前 2 月数据,当月数据 2)
    前 12 月归档 = append(前 11 月数据,当月数据 2)
    连续 2 季度归档 = 佣金归档[n=>n.报表日期 >= date(format_date(date_add(结佣日期,-6 月),"YYYY-MM-01")) and n.报表日期 <= date(format_date(结佣日期, "YYYY-MM-01"))]
    连续 4 季度归档 = 佣金归档[n=>n.报表日期 >= date(format_date(date_add(结佣日期,-12 月),"YYYY-MM-01")) and n.报表日期 <= date(format_date(结佣日期, "YYYY-MM-01"))]


    入职 24 月归档 temp = 佣金归档[n=>n.报表日期 >= date(format_date(date_add(结佣日期,-23 月),"YYYY-MM-01")) and n.报表日期 <= date(format_date(结佣日期, "YYYY-MM-01"))]
    入职 24 月归档 = append(入职 24 月归档 temp,当月数据 2)



    #维持晋升考核
    #维持
    维持佣金考核 = sum(入职 24 月归档.寿险佣金)

    维持考核 temp = 维持佣金考核 > 0 and 学习考试 == "通过"? "维持" : "清退"

    #晋升
    晋升个人考核 = sum(前 3 月归档.寿险佣金)


    晋升团队考核 = sum(所辖.前 3 月归档.寿险佣金)
    团队活动人力 = count(所辖[n=>n.出勤率 >= 0.7 and n.首期佣金 >= 1000])

    晋升考核 temp = 晋升个人考核 >= 12000 and 晋升团队考核 >= 90000 and R13 >= 0.88 and 出勤率 >= 0.7 and 学习考试 == "通过" and 团队活动人力 >= 2 ? "晋升" : "晋升不达标"


    晋升考核 = 晋升考核 temp
    维持考核 = 入职月数 == 24 ? 维持考核 temp : "非考核时间"


    本月考核 = 晋升考核 == "晋升" ? "晋升" : 维持考核
    升降职级 = 本月考核 == "晋升" ? "DM" : (维持考核 == "清退" ? "清退" : "")

    # 储存内容
    save("报表日期", 结佣日期)
    save("月份", 月份)
    save("寿险佣金", 寿险月首期佣金)
    save("总收入", 合计)
    save("寿险件数", 寿险首期件数)
    save("寿险保费", 寿险月首期保费)
    save("寿险标保", 寿险月首期标保)

    # 税的计算

    个人总收入 = 合计

    个人总收入 A = 个人总收入
    入职时间=自己.入职时间
    #年初 = date(format_date(佣金报表.结佣时间,"YYYY-01-01"))
    年初 = date(format_date(佣金报表.计税日期,"YYYY-01-01"))
    报表时间=佣金报表.计税日期
    #报表时间='2019-10-28'
    当年度在职月数=(入职时间>=年初)?date_diff(报表时间,入职时间,月)+1:date_diff(报表时间,年初,月)+1

    历史收入 = format_date(报表时间,"YYYY") == "2021" ? 历史总收入 : 0 #判断历史数据所在年份,通过在业务员上面增加字段实现
    历史扣税 = format_date(报表时间,"YYYY") == "2021" ? 历史总扣税 : 0 #判断历史数据所在年份

    #增值税及附加
    增值税率=(个人总收入 A<=103000)?0:0.03
    应缴增值税 B=个人总收入 A/(1+增值税率)*增值税率
    地方税费附加税率=(个人总收入 A<=103000)?0:(0.07+0.03+0.02)
    应缴地方税费附加税 C=应缴增值税 B*地方税费附加税率

    #个税
    不含税收入=个人总收入 A-应缴增值税 B
    减除费用 D=不含税收入*0.20

    归档数据 = 归档[n => n.创建时间 >= 年初 and n.创建时间 <= 报表时间]
    累计总收入 = sum(归档数据.不含税收入) + 历史收入 + 个人总收入 A
    累计总扣除 = sum(归档数据.减除费用) + 减除费用 D + 历史收入 * 0.2
    累计总扣税 = sum(归档数据.个税扣税) + 历史扣税

    累计税前收入 = 累计总收入 - 累计总扣除

    展业成本 E=(累计税前收入-应缴增值税 B)*0.25
    并入综合所得的劳务报酬所得 F=个人总收入 A-应缴增值税 B-应缴地方税费附加税 C-减除费用 D-展业成本 E
    法定减除费用 G=5000*当年度在职月数
    个人所得税计税基数=累计税前收入-法定减除费用 G-展业成本 E

    个人所得税率=match{
    个人所得税计税基数<=36000:0.03
    36000<个人所得税计税基数 && 个人所得税计税基数<=144000:0.10
    144000<个人所得税计税基数 && 个人所得税计税基数<=300000:0.20
    300000<个人所得税计税基数 && 个人所得税计税基数<=420000:0.25
    420000<个人所得税计税基数 && 个人所得税计税基数<=660000:0.30
    660000<个人所得税计税基数 && 个人所得税计税基数<=960000:0.35
    960000<个人所得税计税基数:0.45
    }
    19 条回复    2022-10-09 16:17:34 +08:00
    Lindp
        1
    Lindp  
    OP
       2022-10-08 22:28:06 +08:00
    我贴了部分,这种表达式维护完后端如何解析呢?这是不是种开发语言啊?
    renmu
        2
    renmu  
       2022-10-08 22:30:39 +08:00 via Android
    这不就是中文编程
    Lindp
        3
    Lindp  
    OP
       2022-10-08 22:35:20 +08:00
    @a href="/member/renmu">renmu 知道是哪种语言吗?我觉得也像是种中文开发语言。
    lmshl
        4
    lmshl  
       2022-10-08 22:36:59 +08:00
    没什么高深技术,而且不建议自创语言,大部分场景下都可以内嵌一个 Javascript 解释器来做

    参考:
    https://www.yinwang.org/blog-cn/2017/05/25/dsl
    learningman
        5
    learningman  
       2022-10-08 23:04:58 +08:00 via Android
    这看着不就是个中文变量吗。。。
    renmu
        6
    renmu  
       2022-10-08 23:19:45 +08:00 via Android
    看着像 JS ,三目运算,箭头函数。但是没有 match{}语法
    westoy
        7
    westoy  
       2022-10-08 23:33:57 +08:00
    有点像魔改过的 prolog

    自己造的吧
    qeqv
        8
    qeqv  
       2022-10-08 23:56:58 +08:00
    其实你用支持中文变量的语言也可以做到这种效果。不过话说回来,中文变量+英文符号,可不那么好受
    buliugu
        9
    buliugu  
       2022-10-09 01:40:54 +08:00
    安利一下 AviatorScript
    yinzhili
        10
    yinzhili  
       2022-10-09 09:05:14 +08:00
    有点像规则引擎实现的
    lower
        11
    lower  
       2022-10-09 09:09:02 +08:00
    DSL
    lower
        12
    lower  
       2022-10-09 09:25:43 +08:00
    @lmshl 搞这种噱头的一般都是吹嘘自己系统,可以让非开发人员来写业务脚本、吹易用性作为卖点;跟所谓低代码开发差不多……不过事实上,这种业务逻辑一旦复杂了咋弄都不好使
    tool2d
        13
    tool2d  
       2022-10-09 09:36:18 +08:00
    支持 json 的 sql 表达式,也能实现这个效果。

    楼上说不要自己发明 DSL ,但问题是大部分情况下,往往并没有现成的 runtime compile 语言给你用,只能自己硬着头皮写。现在有了 llvm 可能会好不少。
    lmshl
        14
    lmshl  
       2022-10-09 09:42:02 +08:00
    @tool2d JS 的 JIT 也够用了,或者还可以用 WASM ,甚至 GraalVM 那种 polyglot 支持。
    7911364440
        15
    7911364440  
       2022-10-09 10:21:43 +08:00
    自己写的一个表达式解析器,可以看下:
    https://github.com/rainy-zhang/expression
    interim
        16
    interim  
       2022-10-09 10:43:08 +08:00   3
    @qeqv 一些行业大量中文术语,用中文变量反而更加合适
    Maxwe11
        17
    Maxwe11  
       2022-10-09 14:48:29 +08:00   1
    这个和用哪种方法实现无关,一般有点儿技术背景的且和金融相关的产品,为了降低沟通成本,大多都用这种表述方法,当然具体的表述可能根据自己的技术背景有所差异;

    主要是省事儿,因为很多时候稍微复杂一点点,用日常用语做业务交互,费时费力还不准确,时间长了换谁都烦,尤其是不太有技术抽象思维的业务之类部门再掺进来,东一句西一句,企业沟通就是这样,一来和技术打交道,费了半天话不如给个公式,那些没什么抽象思维的就知道 blablabla 的,看见一个公式出现,都会说话开始慎重;

    实现时候就两种,要么就是技术看完在原有技术栈的系统里做一次实现,要么就是写系统的时候把这些做成一个标准计算和运算符的实现,产品或业务人员简单学习后自己按照“标准语法”扔进去套就行了,省嘴皮子。
    boshok
        18
    boshok  
       2022-10-09 15:01:23 +08:00
    @Maxwe11 #17 没错,我们一般称为"语义层",目的就是为了降低沟通成本,最终用户也可以直接上手。
    shellus
        19
    shellus  
       2022-10-09 16:17:34 +08:00
    <?php
    eval(preg_replace_callback('查找中文','替换成 $中文'));
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5171 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 07:11 PVG 15:11 LAX 23:11 JFK 02:11
    Do have faith in what you're doing.
    ubao msn 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