主要是有这么一个功能,传入职级和业态,获取中位值.开始的时候,我是这么写的,这个写法比较简单,只能传入一个人的职级和业态,返回一个人的中位值.
/// <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遍,如何才能一次搞定呢?