获取中位值
来源:互联网 发布:c语言迭代法求平方根 编辑:程序博客网 时间:2024/06/04 18:05
主要是有这么一个功能,传入职级和业态,获取中位值.开始的时候,我是这么写的,这个写法比较简单,只能传入一个人的职级和业态,返回一个人的中位值.
/// <summary>/// 根据职级和岗位类别获取中位值/// </summary>/// <paramname="vocationLevel">职级,在这里职级就是薪酬等级,不要求精确</param>/// <paramname="specializationCode">岗位类别</param>/// <returns>中位值</returns>private decimal GetMedianByVocationLevel(string vocationLevelCode, string specializationCode){ //1根据岗位类别获取业态信息,2再根据业态信息和职级信息获取默认薪酬水平架构信息 SpecializationCollection specs =SpecializationAdapter.Instance.LoadByCodes(new string[] { specializationCode}); (specs.Count ==0).TrueThrow("未找到岗位信息!"); Specialization spec = specs[0]; DefaultSalarySchema defaultSchemas=DefaultSalarySchemaAdapter.Instance.LoadByBusinessFieldCodeAndLevel(spec.BusinessFieldCode,vocationLevelCode); (defaultSchemas ==null).TrueThrow("业态为【{0}】,薪酬等级为【{1}】的默认薪酬水平架构不存在!",spec.BusinessField.CnName, vocationLevelCode); //检查职级的薪酬水平架构是否为宽带制,不是则返回中位值为0;(或者提示) if(defaultSchemas.SalarySchemaType.IsBroadBand != true) {return 0.00M; } //(defaultSchemas.SalarySchemaType.IsBroadBand !=true).TrueThrow("业态为【{0}】,薪酬等级为【{1}】,不存在宽带制的薪酬水平架构!",spec.BusinessField.CnName, vocationLevelCode); //3根据薪酬水平架构信息,获取中位值 decimal decMedian =defaultSchemas.SalarySchemaGradeBasePayCollection.Sum(p => p.BasePay) /defaultSchemas.SalarySchemaGradeBasePayCollection.Count(); //岗位经费 var standards =PostExpenseStandardAdapter.Instance.LoadAll().SingleOrDefault(s =>s.VocationLevel == vocationLevelCode); decimal postExpense = 0.00M; postExpense = standards == null ? 0: standards.PostExpenseAnnuallyAmount; //4.中位值,需要加上岗位经费 decMedian = decMedian +postExpense; return decMedian;}
后来写好了,发现组长帮我写好了一个空方法.
/// <summary>/// 返回薪酬水平架构的中位值/// </summary>/// <paramname="coll"></param>/// <returns></returns>public static List<SalarySchemaLevelParam> GetSalarySchemaLevelParamList(List<SalarySchemaLevelParam> coll){ //使用SalarySchemaExtend来实现,建议从SalarySchemaLevel这里开始入手 }只好将方法重写,这个方法不像我传入了具体的参数,而是传入了一个对象的List集合,这样就可以处理集合了.
/// <summary>/// 薪酬水平架构参数类,为计划管理而创建/// </summary>public class SalarySchemaLevelParam{/// <summary>/// 编码/// </summary>public string Code { get; set; }/// <summary>/// 岗位类别编码/// </summary>public string SpecializationCode { get; set; }/// <summary>/// 城市编码/// </summary>public string CityCode { get; set; }/// <summary>/// 薪酬等级编码/// </summary>public string SalaryLevelCode { get; set; }/// <summary>/// 薪酬水平架构类型为目标年薪宽带制的中位值或0/// </summary>public Decimal Medium { get; set; }}然后我将方法实现,期间由于传入的参数和返回的参数都是SalarySchemaLevelParam的List集合,所以可以不用返回值,让他们直接用传入的参数即可.然后这样的话,对于GetSalarySchemaLevelParamList这个名字,方法不够见名知意,因为没有任何返回值,所以改名为FillSalarySchemaLevelParamList,并且返回为void.
/// <summary>/// 返回薪酬水平架构的中位值/// </summary>/// <param name="coll"></param>/// <returns></returns>public static void FillSalarySchemaLevelParamList(List<SalarySchemaLevelParam> coll){ //使用SalarySchemaExtend来实现,建议从SalarySchemaLevel这里开始入手 //获取岗位类别集合和岗位经费集合 SpecializationCollection specs = SpecializationAdapter.Instance.LoadByCodes(coll.Select(p => p.SpecializationCode)); PostExpenseStandardCollection standards = PostExpenseStandardAdapter.Instance.LoadAll(); //若有岗位类别 if (specs.Count > 0) {coll.ForEach(param =>{ //获取岗位类别,不存在,则中位值为0 Specialization spec = specs.Find(p => p.Code == param.SpecializationCode); if (spec != null) {//岗位类别存在,根据岗位类别和薪酬等级获取薪酬水平架构SalarySchema salarySchema = SalarySchemaAdapter.Instance.LoadBySpecializationCodeAndSalaryLevelCode(param.SpecializationCode, param.SalaryLevelCode);//若薪酬水平架构为空,则查找默认薪酬水平架构if (salarySchema == null){ DefaultSalarySchema defaultSchema = DefaultSalarySchemaAdapter.Instance.LoadByBusinessFieldCodeAndLevel(spec.BusinessFieldCode, param.SalaryLevelCode); salarySchema = defaultSchema == null ? null : SalarySchema.CopyFrom(defaultSchema, param.SpecializationCode);}//薪酬水平架构不存在,则中位值为0;if (salarySchema != null){ //检查职级的薪酬水平架构是否为宽带制,不是则中位值为0; if (salarySchema.SalarySchemaType.IsBroadBand == true) {//城市系数,默认为1.0decimal decFactorValue = 1.0M;//城市薪酬系数处理;不结合城市系数和城市系数不存在,直接赋值为1.0if (salarySchema.IsNeedCityFactor){ SalarySchemaCityFactor cityFactor = SalarySchemaCityFactorAdapter.Instance.LoadByCityAndBusiField(param.CityCode, spec.BusinessField.Code); decFactorValue = cityFactor != null ? cityFactor.FactorValue : decFactorValue;}//根据薪酬水平架构信息,获取中位值decimal decMedian = salarySchema.SalarySchemaGradeBasePayCollection.Sum(p => p.BasePay * decFactorValue) / salarySchema.SalarySchemaGradeBasePayCollection.Count;//获取岗位经费var standard = standards.Find(s => s.VocationLevel == param.SalaryLevelCode);decimal postExpense = standard == null ? 0 : standard.PostExpenseAnnuallyAmount;//中位值,需要加上岗位经费param.Medium = decMedian + postExpense; }} }}); }}写的代码就是如上所示,可以发现有很多if.之前版本写的是有很多if..else,基本上所有的else内容就是中位值直接取0.之所以会那么写是因为,组长将Medium这个属性,定义为string类型了,然后最后改成了Decimal类型就可以省了else了.
以上就是我写的一段不难,但是经过多次修改的代码.话说,我好想每次写代码都得改个4,5遍,如何才能一次搞定呢?
0 0
- 获取中位值
- 获取句柄获取指针
- C# 获取获取经纬度!
- 获取eclipse获取路径
- 获取版本号、获取手机型号
- 获取定位,获取屏幕
- 获取applicationContext、获取request
- Spring获取request获取session获取路径
- android 机器码获取/ 品牌获取 / 型号获取
- 获取磁盘分区
- 获取字体大小
- 获取文件大小
- 获取缩略图
- 获取cpuid
- 获取IP
- 获取路径
- 获取计算机信息
- 获取文件大小
- 黑龙江耳鼻喉
- visual studio 2012 黑色主题背景设置
- 1、暧昧---王菲
- Java中布尔类型操作&=,|=与^=的使用
- How to fix a "Duplicated Symbols" error on binary files
- 获取中位值
- 黑龙江哈尔滨耳鼻喉
- ShellExecute, WinExec, CreateProcess
- Android 正则表达式验证(一)
- 封装好的的 get 和 post网络请求
- js高级编程-Bom
- iOS_通知中心_传值的一种方法
- 第十周项目七:M$pszi$y是嘛意思(一)
- JavaBean对象与Map对象互相转化