/// <summary> /// 计算最终的收入 /// </summary> /// <param name="rowSalaryInfo"></param> /// <param name="calDetail">输出计算详情</param> /// <returns></returns> private static double GetFinalyMoney(RowSalaryInfo rowSalaryInfo) { var tempFinalySalay = 0.0; var tempcurrentHour = rowSalaryInfo.CurrentHour; var tempTotalHour = rowSalaryInfo.TotalHour; var tempStep = rowSalaryInfo.Step; while (tempcurrentHour != 0) { //时段对应工资 var stepHourMoney = rowSalaryInfo.StartMoney + _stepMoney * tempStep; var stepHour = tempTotalHour - (tempStep - 1) * _stepHour;//待计算的最高时段小时总数 if (tempcurrentHour < stepHour) { stepHour = tempcurrentHour; } tempFinalySalay += stepHourMoney * stepHour; rowSalaryInfo.CalDetail += $"梯度{tempStep}:({rowSalaryInfo.StartMoney.ToString().PadRight(3,'*')} + {(_stepMoney * tempStep).ToString().PadLeft(3,'*')}) x {stepHour.ToString().PadRight(4, '*')} = {stepHourMoney * stepHour}<br/>"; tempTotalHour -= stepHour; tempcurrentHour -= stepHour; tempStep--; } return(tempFinalySalay); }
/// <summary> /// 解析每一行的薪资信息 /// </summary> /// <param name="row"></param> /// <returns></returns> private static RowSalaryInfo AnalyRow(int row, int currentMonthCol) { Debug.WriteLine(row); var rowSalaryInfo = new RowSalaryInfo(); rowSalaryInfo.TeacherName = GetCellValue(row, 5); if (string.IsNullOrEmpty(rowSalaryInfo.TeacherName)) { rowSalaryInfo.IsSuccess = false; return(rowSalaryInfo); } rowSalaryInfo.ClassName = GetCellValue(row, 3); if (string.IsNullOrEmpty(rowSalaryInfo.ClassName)) { rowSalaryInfo.IsSuccess = false; return(rowSalaryInfo); } rowSalaryInfo.StudentName = GetCellValue(row, 2); rowSalaryInfo.StartMoney = GetStartSalary(rowSalaryInfo.ClassName); //获取初始薪水 if (rowSalaryInfo.StartMoney == 0) //没有拿到起始薪资,证明这个年级是不支持的 { rowSalaryInfo.IsSuccess = false; rowSalaryInfo.ErrMsg = "年级[" + rowSalaryInfo.ClassName + "]暂不支持;"; return(rowSalaryInfo); } rowSalaryInfo.Subject = GetCellValue(row, 7); var hourlist = GetHourList(row); rowSalaryInfo.TotalHour = hourlist.Sum(); //如果课时记录的数目符合月份数,证明学生一直在上课 //如果不相等,证明学生已经停课了 rowSalaryInfo.CurrentHour = string.IsNullOrEmpty(GetCellValue(row, currentMonthCol))? 0: hourlist.LastOrDefault(); rowSalaryInfo.Step = (int)Math.Ceiling((double)rowSalaryInfo.TotalHour / _stepHour); rowSalaryInfo.FinalSalay = GetFinalyMoney(rowSalaryInfo); return(rowSalaryInfo); }