用C#实现工资计算公式动态编写
1,工资计算公式
每一个企业都一定会用到工资计算,发工资是一件非常神圣的事情,而计算工资就是一项非常重要的工作。Excel有非常强大的公式功能,帮助了很多财务人员计算工资,但如果企业的人数比较多,而且工资的计算公式比较复杂,那使用Excel的人员必须是一个超高手了,但Excel维护起来也是非常困难的。
所以有不少上一定规模的企业会上一套工资系统,做得比较好的工资系统都会提供工资公式的编辑功能,而这些编辑功能就非常类似于Excel的公式,这样财务人员操作起来就比较容易上手。假设某厂企有如下的工资相关基本字段:
|
序号 |
字段 |
说明 |
|
1 |
基本工资 |
员工的基本工资。 |
|
2 |
状态 |
新入职、试用、转正、正式等。 |
|
3 |
员工性质 |
残疾人、正常。 |
|
4 |
月工作天数 |
当月的工作天数。 |
|
5 |
转正前天数 |
当月,员工在转正之前的天数。 |
|
6 |
转正后天数 |
当月,员工在转正之后的天数。 |
|
7 |
平时加班合计小时 |
非节假日和周六日的加班小时数。 |
|
8 |
周末加班合计小时 |
周末日加班合计的小时数。 |
|
9 |
节假日加班合计小时 |
节假日加班合计小时数。 |
|
10 |
平时顶班合计小时 |
平时顶班合计小时数。 |
|
11 |
周末顶班合计小时 |
周末日顶班合计小时数。 |
|
12 |
节假日顶班合计小时 |
节假日顶班合计小时数。 |
|
13 |
实际出勤天数 |
员工实际出勤的天数。 |
|
14 |
高温津贴 |
工厂给员工提供的高温津贴。 |
|
15 |
学历补贴 |
工厂给高学历员工提供的津贴。 |
|
16 |
奖金点数 |
各个员工级别设置不同的资金点数。 |
|
17 |
每点奖金 |
根据每个月的业绩和资金点数和落实的每点奖金。 |
|
18 |
气味津贴 |
工厂给员工提供的气味津贴。 |
|
19 |
粉尘津贴 |
工厂给员工提供的粉尘津贴。 |
|
20 |
事假小时 |
每个月事假的小时数。 |
|
21 |
病假小时 |
每个月病假的小时数。 |
|
22 |
旷工小时 |
每个月旷工的小时数。 |
|
23 |
用餐费 |
员工在饭堂每月的用餐费。 |
|
24 |
餐补 |
工厂给员工提供的用餐补贴。 |
|
25 |
计薪方式 |
销售提成,搬运提成等。 |
工资公式:
|
序号 |
项目 |
公式 |
|
1 |
实发基本工资 |
1, 状态=转正,1310/月工作天数*转正前天数 + 基本工资/月工作天数*转正后天数。 2,状态!=转正,实发基本工资=基本工资/月工作天数*实际出勤天数。 |
|
2 |
平时加班费用 |
员工性质=残疾人,平时加班费用=0,否则平时加班费用=基本工资/21.75/8*平时加班合计小时*1.5。 |
|
3 |
周末加班合计费用 |
员工性质=残疾人,周末加班费用=0,否则周末加班费用=基本工资/21.75/8*周末加班合计小时*2。 |
|
4 |
节假日加班费用 |
员工性质=残疾人,节假日加班费用=0, 否则,节假日加班费用=基本工资/21.75/8*节假日加班合计小时*3。 |
|
5 |
平时顶班费用 |
员工性质=残疾人,平时顶班费用=0, 否则平时顶班费用=基本工资/21.75/8*平时顶班合计小时*1.5。 |
|
6 |
周末顶班费用 |
员工性质=残疾人,周末顶班费用=0, 否则周末顶班费用=基本工资/21.75/8*周末顶班合计小时*2。 |
|
7 |
节假日顶班费用 |
员工性质=残疾人,节假日顶班费用=0, 否则节假日顶班费用=基本工资/21.75/8*节假日顶班合计小时*3。 |
|
8 |
实发高温津贴 |
员工性质=残疾人,实发高温津贴为0, 实发高温津贴=高温津贴/月工作天数*实际出勤天数。 |
|
9 |
实发学历补贴 |
计薪方式包含“提成”,则为0, 否则为学历补贴。 |
|
10 |
奖金数 |
状态=转正,且计薪方式=销售提成,(基本工资-1310)/月工作天数*转正前天数 + 资金点数*每点奖金。 如计薪方式包含“提成”,则资金点数*每点奖金。 |
|
11 |
实发气味津贴 |
气味津贴/月工作天数*实际出勤天数。 |
|
12 |
实发粉尘津贴 |
实发粉尘津贴=粉尘津贴/月工作天数*实际出勤天数。 |
|
13 |
事假扣除 |
事假扣除=基本工资/月工作天数/8*事假小时。 |
|
14 |
病假扣除 |
病假扣除=基本工资/月工作天数/8*病假小时。 |
|
15 |
旷工扣除 |
旷工扣除=基本工资/月工作天数/8*旷工小时。 |
2,技术实现
要在.Net中实现公式编辑功能,则必须实现公式的解释器,而最强大的解释器无疑就是.Net的编译引擎了,编译引擎是可以实现任何功能的。.Net自带动态编译的逻辑,但要组织好一个编译逻辑并且要合理展现出来,也同时结合适度的扩展功能,那就不太简单了。
对上面提及的工资计算公式,可能会经常发生变化的,厂企会根据自带的需求,增加更多的规则,或修改一些规则,甚至各个月的规则都是不同的,只与上个月的部分相同。这种情况下,把工资计算公式交给厂企的财务人员是一个合理的做法。这就对业务系统开发商提出更高的要求了,如果是个人开发者,那就更加困难了。
CKRule规则引擎提供了这个功能,其客户规则池就是允许客户进行自定义公式的。业务系统开发商只需要简单几步就可以实现动态公式了,1,配置好关键字,比较逻辑和结论/操作,2,在业务系统中加载配置,并设置界面,3,用户在友好的界面下编辑规则,保存规则到数据库,4,主规则调用中加载客户规则池。
在工具中自定义类型及传入传出属性:


定义客户规则池的关键字和操作符。
关键字可以与传入传出类型一样,也可以新建,结论操作则为了让用户适应类似Excel的操作使用IIF语法。


设置主规则,在主规则中,只需要调用数据库中的规则,再执行规则池即可。代码如下:
var _table = LookDB(@"
select
'' as id,
sindex as ""index"",
'' as returnType,
'Get' + name as propname,
0 as codestyle,
'' as ifcode,
0 as thencodeisscript,
'结果.' + name + ' = ' + CalcCode + ' ;' as thencode,
0 as priority ,
'' as execstep
from poolset
");
InitPool(_table);
ExePool();

业务系统实现
下图是业务系统的一部分,开发商可以根据需要将界面定义得比较友好。以适应原有系统的需要。设置公式界面也可以定义得更加的友好,用户设置完公式之后,工资计算就会使用新的公式进行。


源代码下载 关联工具下载:http://www.ckrule.com/cn/product/software/186.html
用C#实现工资计算公式动态编写的更多相关文章
- EasyUI单击行数据时动态编写editor
$.extend($.fn.treegrid.methods, { addEditor: function (jq, param) { if (param instanceof Array) { $. ...
- 2014年4月份第2周51Aspx源码发布详情
HFC代码转化工具源码 2014-4-8 [VS2010]源码描述:HFC代码转化工具源码 1.主要实现HTML代码转化为C#或者JS代码,为我们平时编码节省时间. 2.把代码复制到面板上,通过右键 ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
- CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类
以英雄联盟为例.界面上经常有Load....xxxx.dll.一般都是加载子系统.比如装备系统.英雄系统等.在实际开发中很多项目非常庞大.都会分割成独立子解决方案开发.后期就需要加载回来.一般都是利用 ...
- C语言-用函数实现社保工资查询系统
需求: 1.有登陆操作,超过三次需重新打开登录 2.查询五险一金.税前税后工资计算,个人与单位应缴明细 3.输入税后工资和税前工资都可查询 4.退出有询问确认操作 代码如下; #include< ...
- C语言-社保工资查询系统
一.简述 此次程序没有涉及函数,完成工资.保险和住房公积金税前税后的查询.工资和社保公积金算法是依据最新的北京标准计算. 五险一金标准: 税率: 1.输入编号1~6查询保险,然后再选择是依据税前工资还 ...
- CentOS7下Oracle的自动备份
概述 Linux下Oracle自动备份就没有MSSQL那么简单,在Linux下Oracle的备份需要借助crontab 指令,crontab 能够自动执行系统定时任务,通过配置crontab 指向Or ...
- 如何在ExtJS 6中使用Fashion美化应用程序
在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的最好应用程序.它还带来了一种美化应用程序的新方式. 在本文,重点是Sencha Fashio ...
- javassist AOP
对于AOP,这个概念,不用解释,主要用途很多,我这里主要是为了后续研究如何实现APM做准备.前面研究了动态代理实现AOP,考虑到性能的问题,改用javassist直接修改直接码实现! javassis ...
随机推荐
- Domoticz 中添加彩云天气
前言 用过一段时间的彩云天气 APP,最吸引我的地方是精确到局部区域的天气预测,虽然准确度并不算高,但是对于预测下雨还是不错的选择.在 Domoticz 中添加彩云天气的数据,利用的是彩云天气提供的 ...
- hibernate自动生成时报错问题
创建好了实体类和.hbm.xml文件,运行项目报上错: 实体类和xml文件中的字段要一致.(顺序和字段)
- LeetCode268.缺失数字
268.缺失数字 描述 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 示例 1: 输入: [3,0,1] 输出: 2 示例 ...
- CF914E Palindromes in a Tree(点分治)
题面 洛谷 CF 题解 题意:给你一颗 n 个顶点的树(连通无环图).顶点从 1 到 n 编号,并且每个顶点对应一个在'a'到't'的字母. 树上的一条路径是回文是指至少有一个对应字母的排列为回文. ...
- 1149 Dangerous Goods Packaging (25 分)
When shipping goods with containers, we have to be careful not to pack some incompatible goods into ...
- C++ GUI Qt4编程(10)-3.4spreadsheet
1. C++ GUI Qt4编程第三章,增加spreadsheet. 2. spreadsheet.h /**/ #ifndef SPREADSHEET_H #define SPREADSHEET_H ...
- esper(4-3)-Non-Overlapping Context
语法 create context context_name start start_condition end end_condition 如: // 9点到17点此context才可用(以引擎的时 ...
- Quartz和TopShelf Windows服务作业调度
上一次写了一遍关于Quartz作业调度的文章 Quartz.NET 作业调度使用 现在使用TopShelf和Quartz实现windows服务作业调度 TopShelf版本4.0 Quartz版本3. ...
- 小程序 开发阶段请求网络报 不在以下 request 合法域名列表中
1.在工具栏右边,点开详情, 把图片最后一项选上,再重新编译一下项目就可以了. 2.管理员将需要使用的域名添加到小程序后台 1. 地址:http://mp.weixin.qq.com (需要请求的域名 ...
- 一个优秀的app应该考虑的问题
带着团队做了3个app,需求是客户决定的,甚至连进度都不是项目经理可以控制的(譬如说一个app要在6周内,3个人完成).现在的状态是基本上没有用户量,当然原因是多方面的,下面说一说我认为app设计的原 ...