public async Task <IActionResult> CalculateAc(string startDate, string endDate)
        {
            // by项目进行计算
            var tasks = await _timeEntryService.GetAvaliableTaskByTimeEntry(DateTime.Parse(startDate), DateTime.Parse(endDate));

            var effortUsed = new List <EffortUsedByRoleByDate>();

            var timeEntries = (await _timeEntryService.WhereAsync(a => a.Date >= DateTime.Parse(startDate) && a.Date < DateTime.Parse(endDate).AddDays(1))).ToList();

            var index    = 0;
            var totalCnt = tasks.Count();

            foreach (var task in tasks)
            {
                effortUsed.AddRange(await _timeEntryService.CalculateACByRoleAndSave(task.ProjectGid, task.Gid, DateTime.Parse(startDate), DateTime.Parse(endDate), timeEntries));
                _logger.LogInformation($"progress: {index++}/{totalCnt}, {(index*100/totalCnt).ToString("F2")}%");
            }

            await _acByRoleByDateService.SqlExecuteNonQuery($"delete from [AcByRoleByDate] where [date]>='{startDate}' and [date]<='{endDate}'");

            await _acByRoleByDateService.AddManyAsync(effortUsed);

            return(new JsonResult(new
            {
                Message = $"Calculate finished! - {tasks.Count()} tasks!, EffortUsed - {effortUsed.Count()} records."
            }));
        }