V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Lindp
V2EX  ›  程序员

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

  •  
  •   Lindp · 2022-10-08 22:27:31 +08:00 · 3351 次点击
    这是一个创建于 806 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ##合计 = 个人利益 + 管理利益
    合计 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
    @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   ·   实用小工具   ·   851 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.