公式解析规则 设计"/>
C# 对企业的任意动态工资核算公式解析规则 设计
由于在集团化公司企业内部
会对于组织架构复杂、
在不同的子公司、不同的部门、或者岗位
会套上不同的薪酬计算公式
财务/人事部门 在薪酬管理职能的需求上、
必然要进行若干套公式管理
既要满足、操作者能够录入普通数学公式
系统便于解析准确运算的情况下、
必然要做相应的设计
下面是我自己的一种设计思路
公式格式示例
[PID:1]+[PID:2]-[PID:3]*[PID:4]/[NUM:1]
公式占位逻辑
工资项格式:
[PID:项目编号ID]
常量:
[NUM:常量值]
运算符
+ - * /
比如
要实现的公式:基本工资+绩效工资+奖金+车费补贴100元
——————————————————
工资项目 | 工资项编号
基本工资 | 1
绩效工资 | 2
奖金 | 3
——————————————————
那么在程序中存储的表达式就为
[PID:1]+[PID:2]+[PID:3]+[NUM:100]
张三的基本工资2000、
绩效工资800、
奖金500
然后我们解析公式
为
2000+800+500+100
运算结果
3400
这里我写了一个最简单的参考性的 代码示例
(未考虑性能、仅思路演示)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HaoYue.DynamicMath
{
class Program
{
/// <summary>
/// 动态公式解析和计算 代码实现
/// 研发部 皓月
/// </summary>
/// <param name=\"args\"></param>
static void Main(string[] args)
{
Console.WriteLine(\"【动态公式解析和计算 代码实现研究】\\n研发部 皓月\\n\\n\");
//用一个List集合 模拟待会儿查询数据库工资项集合
List <moneyproject> plist = new List<moneyproject>();
plist.Add(new moneyproject() { ProjectID = 1, Name = \"基本工资\", Number = 1500 });
plist.Add(new moneyproject() { ProjectID = 2, Name = \"绩效工资\", Number = 1000 });
plist.Add(new moneyproject() { ProjectID = 3, Name = \"奖金\", Number = 800 });
plist.Add(new moneyproject() { ProjectID = 4, Name = \"扣分项\", Number = 200 });
//公式字符串
string str = \"[PID:1]+[PID:2]+[PID:3]-[PID:4]+[NUM:100]\";
Console.WriteLine(\"公式字符串为:\" + str);
do
{
int s_start = str.IndexOf(\"[\");
int s_end = str.IndexOf(\"]\");
if (s_start >= 0 && s_end > 0)
{
//取出变量值
string Mathstr = str.Substring(s_start,s_end - s_start + 1);
Console.WriteLine(\"取出变量\"+Mathstr);
string MathstrClear = Mathstr.Substring(1, Mathstr.Length - 2);
Console.WriteLine(\"去掉符号\" + MathstrClear);
//判断数据类型
string TypeString = MathstrClear.Substring(0, MathstrClear.IndexOf(\':\'));
string ValueString = MathstrClear.Substring(MathstrClear.IndexOf(\':\') + 1);
if (TypeString == \"PID\")
{
Console.WriteLine(\"类型为:工资项\");
Console.Write(\"查询对应工资项ID的值金额为:\");
var pinfo = plist.Where(w => w.ProjectID == Convert.ToInt32(ValueString)).FirstOrDefault();
Console.Write(pinfo.Number);
Console.WriteLine(\"类型为:\"+pinfo.Name);
//替换公式为实际数据
Console.WriteLine(\"替换公式为实际数据\");
str = str.Replace(Mathstr, pinfo.Number.ToString());
}
else if (TypeString == \"NUM\")
{
Console.Write(\"类型为:常量 金额为:\");
Console.WriteLine(ValueString);
//替换公式为实际数据
Console.WriteLine(\"替换公式为实际数据\");
str = str.Replace(Mathstr, ValueString);
}
Console.WriteLine(\"处理后公式为:\"+str);
}
else
break;
} while (str.IndexOf(\'[\') >= 0);//如果没有则不继续解析
Console.WriteLine(\"字符串解析并计算公式结果:\" + str);
var finalvalue = new System.Data.DataTable().Compute(str, \"\");
Console.WriteLine(\"实际工资结果为:\"+ finalvalue);
Console.ReadLine();
}
public class moneyproject
{
public int ProjectID { get; set; }
public string Name { get; set; }
public float Number { get; set; }
}
}
}
更多推荐
C# 对企业的任意动态工资核算公式解析规则 设计
发布评论