获取中位值

         主要是有这么一个功能,传入职级和业态,获取中位值.开始的时候,我是这么写的,这个写法比较简单,只能传入一个人的职级和业态,返回一个人的中位值.

/// <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.0
			decimal decFactorValue = 1.0M;


			//城市薪酬系数处理;不结合城市系数和城市系数不存在,直接赋值为1.0
			if (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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值