获取中位值

来源:互联网 发布: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
原创粉丝点击