示例#1
0
        public async Task <IActionResult> SearchAsync(
            [FromQuery] ReportTypeEnum reportType,
            [FromQuery] ReportGroupTypeEnum groupType,
            [FromQuery] string project,
            [FromQuery] string user,
            [FromQuery] DateTime?startDate,
            [FromQuery] DateTime?endDate)
        {
            var paramDto = new ReportParamDto
            {
                ReportType = reportType,
                GroupBy    = groupType,
                Project    = project,
                User       = user,
                StartDate  = startDate,
                EndDate    = endDate
            };

            var validation = CheckValidation(paramDto);

            if (!validation.IsValid)
            {
                throw new BadRequestException(validation.Errors);
            }

            IReportDto result = new ReportDto();

            switch (reportType)
            {
            default:
            {
                break;
            }

            case ReportTypeEnum.Daily:
            {
                result = await _reportService.DailyReportAsync(User.Identity.Name, paramDto);

                break;
            }

            case ReportTypeEnum.Weekly:
            {
                result = await _reportService.WeeklyReportAsync(User.Identity.Name, paramDto);

                break;
            }

            case ReportTypeEnum.Monthly:
            {
                result = await _reportService.MonthlyReportAsync(User.Identity.Name, paramDto);

                break;
            }
            }

            return(ResultOk(result));
        }
示例#2
0
        public async Task <IReportDto> MonthlyReportAsync(string userName, ReportParamDto dto)
        {
            var reportData = new List <MonthlyReportDto>();

            var user = await GetUserAsync(userName);

            // TODO: Report detail
            var logTimes = await GetReportDataAsync(user, dto);

            switch (dto.GroupBy)
            {
            default:
                break;

            case ReportGroupTypeEnum.Project:
            {
                var rptData =
                    from u in logTimes
                    group u by new
                {
                    u.Project,
                    u.MonthName
                } into gcs
                    select new MonthlyReportDto
                {
                    Project   = gcs.Key.Project,
                    MonthName = gcs.Key.MonthName,
                    Duration  = gcs.Sum(s => s.Duration)
                };


                reportData.AddRange(rptData);
                break;
            }

            case ReportGroupTypeEnum.User:
            {
                var rptData =
                    from u in logTimes
                    group u by new
                {
                    u.User,
                    u.MonthName
                } into gcs
                    select new MonthlyReportDto
                {
                    User      = gcs.Key.User,
                    MonthName = gcs.Key.MonthName,
                    Duration  = gcs.Sum(s => s.Duration)
                };

                reportData.AddRange(rptData);

                break;
            }
            }

            reportData.ForEach(r => {
                r.IsMarked = r.Duration < ReportLimitionHours.MonthHours;
            });

            return(new ReportDto
            {
                Records = reportData,
                Param = dto,
                ReportType = ReportTypeEnum.Monthly
            });
        }
示例#3
0
        private async Task <IEnumerable <LogTimeTransformDataDto> > GetReportDataAsync(User user, ReportParamDto dto)
        {
            var isAdmin = user.Roles.Contains(RoleSetting.ROLE_ADMIN);

            // TODO: Report detail
            var projects = (true.Equals(isAdmin) ? user.BehaveOfMagager?.AssignedProjects : user.AssignedProjects)?.Select(s => s.Name);

            var records = projects?.Count() > 0 ? await _unitOfWork.TimeRecordRepository.ReadAllAsync(s => projects.Contains(s.Project.Name))
                : await _unitOfWork.TimeRecordRepository.ReadAllAsync();

            if (!string.IsNullOrEmpty(dto.Project))
            {
                records = records.Where(s => s.Project.Name == dto.Project);
            }

            var logTimes = new List <LogTimeTransformDataDto>();

            records.ToList()
            .ForEach(s => {
                var items = s.LogTimeRecords.Select(l => new LogTimeTransformDataDto {
                    Project   = s.Project.Name,
                    User      = l.User.UserName,
                    LogDate   = l.LogTime.Date,
                    WeekName  = GetWeekOfYear(l.LogTime),
                    MonthName = GetMonthOfYear(l.LogTime),
                    Duration  = l.Duration
                });

                logTimes.AddRange(items);
            });

            IEnumerable <LogTimeTransformDataDto> logRows = logTimes;

            if (!string.IsNullOrEmpty(dto.User))
            {
                logRows = logRows.Where(s => s.User == dto.User);
            }

            if (dto.StartDate.HasValue)
            {
                logRows = logRows.Where(s => s.LogDate >= dto.StartDate && s.LogDate <= dto.EndDate);
            }

            return(logRows);
        }