public async Task <ChartViewModel <int?> > Qty( string teamId, string listId, DateTime?startDate, DateTime?endDate, string tagNames, string token) { var api = new Infrastructure.WebApi.Api(token); var members = await api.GetListMembers(listId); // タスク取得用タスク var paramsGetTasks = new ParamsGetFilteredTeamTasks() { Subtasks = true, IncludeClosed = true, ListIds = new List <string>() { listId }, Statuses = new List <string>(new[] { "完了" }) }; var getTasksTask = api.GetFilteredTeamTasks(teamId, paramsGetTasks); // 時間取得用タスク var paramsGetTimeEntries = new ParamsGetTimeEntries( startDate ?? DateTime.MinValue, endDate ?? DateTime.Now, members.Select(x => x.Id)); var getTimeEntriesTask = api.GetTimeEntries(teamId, paramsGetTimeEntries); // 並列でapiからデータ取得 await Task.WhenAll(getTasksTask, getTimeEntriesTask); var tasks = getTasksTask.Result; var timeEntries = getTimeEntriesTask.Result; // apiでできない抽出条件を適用 tasks = tasks.Where(x => x.Tags.Any(x => tagNames.Contains(x.Name))).ToList(); var timeEntriesGroupingTask = timeEntries .GroupBy(x => x.Task.Id) .Select(x => new { TaskId = x.Key, Duration = DateTimeOffset.FromUnixTimeMilliseconds(x.Sum(y => y.Duration)), End = DateTimeOffset.FromUnixTimeMilliseconds((x.Max(y => y.End))).Date }) .ToArray(); var dates = timeEntriesGroupingTask .Select(x => x.End) .Distinct() .OrderBy(t => t) .ToArray(); var series = timeEntriesGroupingTask .Join(tasks, x => x.TaskId, x => x.Id, (time, task) => (time, task)) .Select(x => new { Qty = x.task.GetQty(), x.task.Assignees.FirstOrDefault().Username, TagName = x.task.Tags.FirstOrDefault()?.Name, Title = x.task.Name, DurationMinuets = x.time.Duration.TimeOfDay.TotalMinutes, End = x.time.End }) .GroupBy(x => x.TagName) .Select(x => new Series <int?>() { Name = x.Key, Data = dates .GroupJoin( x.GroupBy(y => y.End).Select(y => new { End = y.Key, Qty = y.Sum(z => z.Qty) }), y => y, y => y.End, (date, result) => (date, result) ) .SelectMany( x => x.result.DefaultIfEmpty(), (date, result) => result.Qty == 0 ? null : (int?)result.Qty ) });
public async Task <List <ResponseModelTimeEntry> > GetTimeEntries(string teamId, ParamsGetTimeEntries param) { var queryString = OptionalParamGenerator.GenerateOptionalParams(param); using var response = await _httpClient.GetAsync($"team/{teamId}/time_entries?{queryString}"); var responseData = await response.Content.ReadAsStringAsync(); // task:"0" という変なデータを{}に置換 responseData = responseData.Replace(@"""task"":""0""", @"""task"": null"); var timeEntries = JsonConvert.DeserializeObject <ResponseTimeEntries>(responseData); return(timeEntries.Data.Where(x => x.Task != null).ToList()); // var request = CreateRequest($"team/{teamId}/time_entries?{queryString}", Method.GET); // var res = await RestSharperHelper.ExecuteRequestAsync<ResponseTimeEntries, ResponseError>(_client, request); // if (res.ResponseError != null) // { // throw new Exception($"{res.ResponseError.ECode} {res.ResponseError.Status} {res.ResponseError.Err}"); // } // return res.ResponseSuccess.Data; }