Esempio n. 1
0
        //[ValidateAntiForgeryToken]
        public JsonResult GetTeacherOfficeHourStatistics(ClassHourStatisticsInput input)
        {
            var result        = _teacherOfficeHoursStatisticsAppService.GetClassHourStatistics(input).Items;
            var totalDuration = 0.0M;
            var beginTimeDay  = input.BeginTime.Day;
            var endTimeDay    = input.EndTime.Day;

            decimal[] classHoursArray = new decimal[endTimeDay - beginTimeDay + 1];
            int       index           = 0;

            for (int i = beginTimeDay - 1; i < endTimeDay; i++)
            {
                var duration = 0.0M;
                classHoursArray[index] = duration;
                if (result.Any(v => v.EndTime.Day == i + 1))
                {
                    var maxEndTime   = result.Where(r => r.EndTime.Day == i + 1).Max(t => t.EndTime);
                    var minBeginTime = result.Where(r => r.EndTime.Day == i + 1).Min(t => t.BeginTime);
                    var totalMinutes = (maxEndTime - minBeginTime).TotalMinutes;
                    duration = decimal.Round(Convert.ToDecimal(totalMinutes) / 60, 1);
                    //  duration = decimal.Round(result.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                    classHoursArray[index] = duration;
                }
                totalDuration += classHoursArray[index];
                index++;
            }
            ResultData data = new ResultData();

            data.returnData = new Dictionary <string, object>
            {
                { "durations", classHoursArray },// durations.ToArray()
                { "total", totalDuration }
            };
            return(Json(data, JsonRequestBehavior.AllowGet));
        }
Esempio n. 2
0
        public ListResultDto <ClassHourStatisticsOutput> GetClassHourStatistics(ClassHourStatisticsInput input)
        {
            var classHours = GetArrangesByCondition(input);// _signInRepository.GetAllList();

            if (classHours == null)
            {
                return(new ListResultDto <ClassHourStatisticsOutput>());
            }
            var list = classHours.MapTo <List <ClassHourStatisticsOutput> >();

            SetOtherExtendData(list);
            return(new ListResultDto <ClassHourStatisticsOutput>(list));
        }
Esempio n. 3
0
        //[ValidateAntiForgeryToken]
        public JsonResult GetTeacherClassHourStatistics(ClassHourStatisticsInput input)
        {
            var            result          = _teacherClassHoursStatisticsAppService.GetClassHourStatistics(input).Items;
            var            classResult     = result.Where(r => r.ClassType == CourseManagerConsts.ClassClassType && r.Type != CourseManagerConsts.NoCourseSignInRecordType).ToList();
            var            one2OneResult   = result.Where(r => r.ClassType == CourseManagerConsts.One2OneClassType && r.Type != CourseManagerConsts.NoCourseSignInRecordType).ToList();
            List <decimal> durations       = new List <decimal>();
            var            totalDuration   = result.Where(r => r.Type != CourseManagerConsts.NoCourseSignInRecordType).Sum(r => r.Duration);
            var            one2oneDuration = one2OneResult.Sum(r => r.Duration);
            var            classDuration   = classResult.Sum(r => r.Duration);
            var            beginTimeDay    = input.BeginTime.Day;
            var            endTimeDay      = input.EndTime.Day;

            decimal[] classHoursArray           = new decimal[endTimeDay - beginTimeDay + 1]; //取得的值是大于等于开始时间 小于结束时间
            decimal[] one2OneDurationsArray     = new decimal[endTimeDay - beginTimeDay + 1];
            decimal[] classCourseDurationsArray = new decimal[endTimeDay - beginTimeDay + 1];
            int       index = 0;

            for (int i = beginTimeDay - 1; i < endTimeDay; i++)
            {
                var duration = 0.0M;
                classHoursArray[index] = duration;
                if (result.Any(v => v.EndTime.Day == i + 1))
                {
                    duration = decimal.Round(result.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                    classHoursArray[index] = duration;
                }
                if (one2OneResult.Any(v => v.EndTime.Day == i + 1))
                {
                    one2OneDurationsArray[index] = decimal.Round(one2OneResult.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                }
                if (classResult.Any(v => v.EndTime.Day == i + 1))
                {
                    classCourseDurationsArray[index] = decimal.Round(classResult.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                }
                index++;
            }
            ResultData data = new ResultData();

            data.returnData = new Dictionary <string, object>
            {
                { "durations", classHoursArray },// durations.ToArray()
                { "one2OneDurations", one2OneDurationsArray },
                { "classCourseDurations", classCourseDurationsArray },
                { "total", decimal.Round(totalDuration / 60, 1) },
                { "one2oneDuration", decimal.Round(one2oneDuration / 60, 1) },
                { "classDuration", decimal.Round(classDuration / 60, 1) }
            };
            return(Json(data, JsonRequestBehavior.AllowGet));
        }
Esempio n. 4
0
        private IQueryable <SignInRecord> GetArrangesByCondition(ClassHourStatisticsInput input)
        {
            var endTime = input.EndTime.AddDays(1);
            var query   = _signInRepository.GetAll()
                          //.WhereIf(input.TeacherId!=null,t=>t.TeacherId==input.TeacherId.Value)
                          .WhereIf(!input.StudentId.IsNullOrEmpty(), t => t.StudentId == input.StudentId)
                          .WhereIf(input.BeginTime != null && input.BeginTime.ToString() != "0001/1/1 0:00:00", o => o.BeginTime > input.BeginTime)
                          .WhereIf(input.BeginTime != null && input.BeginTime.ToString() != "0001/1/1 0:00:00" && input.EndTime != null, o => (input.BeginTime < o.BeginTime && o.EndTime < endTime))
                          .Where(o => o.IsDeleted == false);

            query = string.IsNullOrEmpty(input.Sorting)
                        ? query.OrderByDescending(t => t.CreationTime)
                        : query.OrderBy(t => input.Sorting);
            return(query);
        }
Esempio n. 5
0
        //[ValidateAntiForgeryToken]
        public JsonResult GetPayCalculation(ClassHourStatisticsInput input)
        {
            var result = _teacherClassHoursStatisticsAppService.GetClassHourStatistics(input).Items;

            /*说明:
             * --续学人数 通过group统计 某个学生上课总时长 是否达到15
             * --基本工资 通过计算总课时 是否达到70 如果达到了 其他的一些福利 再进行计算,如果在40-70之间就只是拿到底薪4k
             * --早课和晚课通过 上课开始时间是否小于早上七点半 和开始时间是否大于晚上七点 进行统计
             * --1对1课时数和班级数 通过课程类型来统计
             * --外派次数 通过上课类型来统计
             * --学生当前月上课是否80%达标,防止学生随意请假,影响老师收益(如果学生当月需要上课20小时,然后请假次数太多导致不够80% 也就是不够16个小时 那么缺少的课时按照正常课时的80%费用收取 如仅仅上了8个小时,那么就是缺少8个小时也就是需要补贴老师8*50*0.8=320元) 这里暂只处理 1对1
             * --统计输出的话 就是按照自定义的格式综合输出
             */
            var            classResult     = result.Where(r => r.ClassType == CourseManagerConsts.ClassClassType && r.Type != CourseManagerConsts.NoCourseSignInRecordType).ToList();
            var            one2OneResult   = result.Where(r => r.ClassType == CourseManagerConsts.One2OneClassType && r.Type != CourseManagerConsts.NoCourseSignInRecordType).ToList();
            List <decimal> durations       = new List <decimal>();
            var            totalDuration   = decimal.Round(result.Sum(r => r.Duration) / 60, 1);
            var            one2oneDuration = one2OneResult.Sum(r => r.Duration);
            var            classDuration   = classResult.Sum(r => r.Duration);
            var            beginTimeDay    = input.BeginTime.Day;
            var            endTimeDay      = input.EndTime.Day;

            decimal[] classHoursArray           = new decimal[endTimeDay - beginTimeDay + 1]; //取得的值是大于等于开始时间 小于结束时间
            decimal[] one2OneDurationsArray     = new decimal[endTimeDay - beginTimeDay + 1];
            decimal[] classCourseDurationsArray = new decimal[endTimeDay - beginTimeDay + 1];
            PayCalculationViewModel vm          = new PayCalculationViewModel();
            var totalOfficeHours = 0.0M;

            for (int i = beginTimeDay - 1; i < endTimeDay; i++)
            {
                var duration = 0.0M;
                classHoursArray[i] = duration;
                if (result.Any(v => v.EndTime.Day == i + 1))
                {
                    duration           = decimal.Round(result.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                    classHoursArray[i] = duration;
                }
                if (one2OneResult.Any(v => v.EndTime.Day == i + 1))
                {
                    one2OneDurationsArray[i] = decimal.Round(one2OneResult.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                }
                if (classResult.Any(v => v.EndTime.Day == i + 1))
                {
                    classCourseDurationsArray[i] = decimal.Round(classResult.Where(r => r.EndTime.Day == i + 1).Sum(c => c.Duration) / 60, 1);
                }
                var totalMinutes = 0.0;
                if (result.Any(r => r.EndTime.Day == i + 1))
                {
                    var maxEndTime   = result.Where(r => r.EndTime.Day == i + 1).Max(t => t.EndTime);
                    var minBeginTime = result.Where(r => r.EndTime.Day == i + 1).Min(t => t.BeginTime);
                    totalMinutes = (maxEndTime - minBeginTime).TotalMinutes;
                }
                totalOfficeHours += decimal.Round(Convert.ToDecimal(totalMinutes) / 60, 1);
            }
            vm.TeacherName = string.IsNullOrEmpty(input.TeacherName) ? "胡盼" : input.TeacherName;
            decimal basicSalary = CourseManagerConsts.BasicSalary;

            //底薪说明:20小时以下2000元,20小时~40小时3000元,40以上4000元
            if (totalDuration < CourseManagerConsts.BasicSalaryHours)
            {
                if (totalDuration < 20)
                {
                    basicSalary = 2000;
                }
                else if (totalDuration > 20 && totalDuration < 40)
                {
                    basicSalary = 3000;
                }
            }
            vm.BasicSalary         = basicSalary;
            vm.One2OneDuration     = decimal.Round(one2oneDuration / 60, 1);
            vm.ClassDuration       = decimal.Round(classDuration / 60, 1);
            vm.TotalDuration       = totalDuration;
            vm.EarlyCourseTimes    = result.Where(r => r.BeginTime.Hour <= CourseManagerConsts.EarlyHour).Count();
            vm.NightCourseTimes    = result.Where(r => r.BeginTime.Hour >= CourseManagerConsts.NigthHour).Count();
            vm.AssignmentTimes     = result.Where(r => r.CourseAddressType == CourseManagerConsts.OutSideCourseType).Count(); //外派
            vm.OfficeHours         = totalOfficeHours;
            vm.AllOfficeHoursBonus = totalOfficeHours >= CourseManagerConsts.JuneOfficeHours ? CourseManagerConsts.AllOfficeHoursBonus : 0.0M;

            #region 统计各个学生当前月需要上课多少个小时 以及续学学生
            CountUpStudentCourses(input, result, vm);
            #endregion

            ResultData data = new ResultData()
            {
                returnData = new Dictionary <string, object> {
                    { "result", vm }
                }
            };
            return(Json(data, JsonRequestBehavior.AllowGet));
        }
Esempio n. 6
0
        /// <summary>
        /// 统计各个学生当前月需要上课多少个小时 以及续学学生
        /// </summary>
        /// <param name="input"></param>
        /// <param name="result"></param>
        /// <param name="vm"></param>
        private void CountUpStudentCourses(ClassHourStatisticsInput input, IReadOnlyList <ClassHourStatisticsOutput> result, PayCalculationViewModel vm)
        {
            var result2DealAbsentFee = from p in result
                                       where p.BeginTime > input.BeginTime && p.EndTime <= input.EndTime
                                       select p;
            var allGroupHours = from p in result2DealAbsentFee
                                group p by p.StudentId into g
                                select new PayCalculation2StuViewModel
            {
                TotalDuration = g.Sum(r => r.Duration),
                StudentId     = g.Key
            };

            var allGroupAbsentHours = from p in result2DealAbsentFee
                                      where p.UnNormalType == CourseManagerConsts.StudentNoCourseReasonType //学生请假
                                      group p by p.StudentId into g
                                      select new PayCalculation2StuViewModel
            {
                TotalDuration = g.Sum(r => r.Duration),
                StudentId     = g.Key
            };

            var absentHoursFee = new Dictionary <string, PayCalculation2StuViewModel>();
            var renewFee       = new List <string>();//续学记录

            var stus = _cacheManager.GetCache("ControllerCache").Get("AllStudents", () => _studentAppService.GetStudents().Items);

            //  var stus = _studentAppService.GetStudents().Items;
            foreach (var item in allGroupHours)
            {
                foreach (var absent in allGroupAbsentHours)
                {
                    if (absent.StudentId == item.StudentId)
                    {
                        var realDutaion       = item.TotalDuration - absent.TotalDuration;
                        var ruleBasicDuration = item.TotalDuration * 0.8M;      //合同规定的基数
                        //续学
                        if (realDutaion >= CourseManagerConsts.RenewHours * 60) //
                        {
                            renewFee.Add(stus.SingleOrDefault(s => s.Id == item.StudentId).CnName);
                        }
                        //学生请假次数太多
                        if (ruleBasicDuration > realDutaion)
                        {
                            absentHoursFee.Add(
                                stus.SingleOrDefault(s => s.Id == item.StudentId).CnName,
                                new PayCalculation2StuViewModel
                            {
                                StudentId     = item.StudentId,
                                TotalDuration = decimal.Round(ruleBasicDuration.Value / 60, 1),
                                RealDuration  = decimal.Round(realDutaion.Value / 60, 1),
                                Balance       = decimal.Round((ruleBasicDuration.Value - realDutaion.Value) / 60, 1) * CourseManagerConsts.One2OneClassFees * 0.8M
                            }
                                );
                        }
                    }
                }
            }
            vm.StudentAbsentFees   = 0.0M;
            vm.StudentAbsentFeeDes = string.Empty;
            foreach (KeyValuePair <string, PayCalculation2StuViewModel> kvp in absentHoursFee)
            {
                var model = kvp.Value;
                vm.StudentAbsentFees   += model.Balance;
                vm.StudentAbsentFeeDes += string.Format("学生{0}应上至少{1}h 实上{2}h ,需按照课时费80%付费{3}\r\n", kvp.Key, model.TotalDuration, model.RealDuration, model.Balance);//因请假未到到80%应上课时
            }

            vm.RenewNum = renewFee.Count;
            vm.RenewFee = vm.RenewNum > 0 ? vm.RenewNum * CourseManagerConsts.RenewBonus : 0;
        }