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

2022-10-08 22:27:31 +08:00
 Lindp
##合计 = 个人利益 + 管理利益
合计 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
}
3139 次点击
所在节点    程序员
19 条回复
Lindp
2022-10-08 22:28:06 +08:00
我贴了部分,这种表达式维护完后端如何解析呢?这是不是种开发语言啊?
renmu
2022-10-08 22:30:39 +08:00
这不就是中文编程
Lindp
2022-10-08 22:35:20 +08:00
@renmu 知道是哪种语言吗?我觉得也像是种中文开发语言。
lmshl
2022-10-08 22:36:59 +08:00
没什么高深技术,而且不建议自创语言,大部分场景下都可以内嵌一个 JavaScript 解释器来做

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

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

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

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

实现时候就两种,要么就是技术看完在原有技术栈的系统里做一次实现,要么就是写系统的时候把这些做成一个标准计算和运算符的实现,产品或业务人员简单学习后自己按照“标准语法”扔进去套就行了,省嘴皮子。
boshok
2022-10-09 15:01:23 +08:00
@Maxwe11 #17 没错,我们一般称为"语义层",目的就是为了降低沟通成本,最终用户也可以直接上手。
shellus
2022-10-09 16:17:34 +08:00
<?php
eval(preg_replace_callback('查找中文','替换成 $中文'));

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX