From 729afd0667b2aed390d2ae6a79def4e420e1f580 Mon Sep 17 00:00:00 2001 From: Danil Kislov Date: Thu, 27 Jun 2019 19:09:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20-=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=BD=D0=B0=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=20=D1=81=20=D0=B2=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JiraTimeBot/DI/ContainerBuilder.cs | 3 +- src/JiraTimeBot/JiraTimeBot.csproj | 1 + .../TaskTime/TaskTimeByCommitsCalculator.cs | 51 ++------------ src/JiraTimeBot/TaskTime/TaskTimeSpread.cs | 66 +++++++++++++++++++ 4 files changed, 75 insertions(+), 46 deletions(-) create mode 100644 src/JiraTimeBot/TaskTime/TaskTimeSpread.cs diff --git a/src/JiraTimeBot/DI/ContainerBuilder.cs b/src/JiraTimeBot/DI/ContainerBuilder.cs index 2c1e6e5..bf27074 100644 --- a/src/JiraTimeBot/DI/ContainerBuilder.cs +++ b/src/JiraTimeBot/DI/ContainerBuilder.cs @@ -46,7 +46,8 @@ namespace JiraTimeBot.DI _builder.RegisterType().As().AsSelf(); _builder.RegisterType().As().AsSelf(); _builder.RegisterAggregateService(); - + + _builder.RegisterType().As().AsSelf(); _builder.RegisterType().As().AsSelf(); _builder.RegisterType().AsSelf().As(); diff --git a/src/JiraTimeBot/JiraTimeBot.csproj b/src/JiraTimeBot/JiraTimeBot.csproj index 4675d8f..704343d 100644 --- a/src/JiraTimeBot/JiraTimeBot.csproj +++ b/src/JiraTimeBot/JiraTimeBot.csproj @@ -92,6 +92,7 @@ + Form diff --git a/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs b/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs index 86fb601..c1131e2 100644 --- a/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs +++ b/src/JiraTimeBot/TaskTime/TaskTimeByCommitsCalculator.cs @@ -12,53 +12,12 @@ namespace JiraTimeBot.TaskTime public class TaskTimeByCommitsCalculator: ITaskTimeCalculator { private readonly ILog _log; + private readonly ITaskTimeSpread _spreadHelper; - public TaskTimeByCommitsCalculator(ILog log) + public TaskTimeByCommitsCalculator(ILog log, ITaskTimeSpread spreadHelper) { _log = log; - } - - private List SpreadTime(List source, int minutes, int roundToMinutes, bool roundUp = false, bool appendTime = true) - { - if (source == null || !source.Any()) - { - return new List(); - } - - List newList = new List(); - int remainMinutes = minutes; - - //Нам нужно раскидать 480 минут в день. - foreach (var taskGroup in source.GroupBy(f => f.Branch).OrderByDescending(f => f.Count())) - { - int currentTaskCommits = taskGroup.Count(); - int currentTaskTime = (int)RoundTo(minutes / source.Count * currentTaskCommits, roundToMinutes, roundUp); - remainMinutes = remainMinutes - currentTaskTime; - - var orderedTasks = taskGroup.OrderBy(f => f.StartTime).ToArray(); - StringBuilder sb = new StringBuilder(); - foreach (var task in orderedTasks) - { - sb.AppendLine($"- {task.Description}"); - } - var taskTimeItem = new TaskTimeItem - { - Branch = taskGroup.Key, - TimeSpent = appendTime ? - TimeSpan.FromMinutes(taskGroup.Sum(f=>f.TimeSpent.TotalMinutes)) + TimeSpan.FromMinutes(currentTaskTime): - TimeSpan.FromMinutes(currentTaskTime) - , - Commits = taskGroup.Sum(f=>f.Commits), - Description = sb.ToString(), - StartTime = taskGroup.Min(f=>f.StartTime), - FilesAffected = taskGroup.Sum(f=>f.FilesAffected) - }; - - newList.Add(taskTimeItem); - } - newList = newList.OrderByDescending(f => f.TimeSpent).ToList(); - - return newList; + _spreadHelper = spreadHelper; } public List CalculateTaskTime(List commits, Settings settings, CancellationToken cancellationToken = default(CancellationToken)) @@ -88,8 +47,9 @@ namespace JiraTimeBot.TaskTime remainMinutes -= (int)timeControlTask.TimeSpent.TotalMinutes; } - var workTasks = SpreadTime(commits, remainMinutes, settings.RoundToMinutes); + var workTasks = _spreadHelper.SpreadTime(commits, remainMinutes, settings.RoundToMinutes); workTimeItems.AddRange(workTasks); + workTimeItems = workTimeItems.OrderByDescending(f => f.TimeSpent).ToList(); remainMinutes = minutesPerWorkDay - (int) workTimeItems.Sum(f => f.TimeSpent.TotalMinutes); if (remainMinutes != 0) @@ -107,6 +67,7 @@ namespace JiraTimeBot.TaskTime return workTimeItems.OrderByDescending(f=>f.TimeSpent).ToList(); } + private TaskTimeItem GetTimeControlTask(string timeControlTask, int minutes = 30) { //Если указана задача контроля времени - то спишем туда 30 минут и вычеркнем их из общего рабочего времени. diff --git a/src/JiraTimeBot/TaskTime/TaskTimeSpread.cs b/src/JiraTimeBot/TaskTime/TaskTimeSpread.cs new file mode 100644 index 0000000..520da39 --- /dev/null +++ b/src/JiraTimeBot/TaskTime/TaskTimeSpread.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using JiraTimeBot.TaskTime.Objects; + +namespace JiraTimeBot.TaskTime +{ + public interface ITaskTimeSpread + { + List SpreadTime(List source, + int minutes, + int roundToMinutes, + bool roundUp = false, + bool appendTime = true); + } + public class TaskTimeSpread: ITaskTimeSpread + { + public List SpreadTime(List source, int minutes, int roundToMinutes, bool roundUp = false, bool appendTime = true) + { + List newList = new List(); + int remainMinutes = minutes; + + //Нам нужно раскидать 480 минут в день. + foreach (var taskGroup in source.GroupBy(f => f.Branch).OrderByDescending(f => f.Count())) + { + int currentTaskCommits = taskGroup.Count(); + int currentTaskTime = (int)RoundTo(minutes / source.Count * currentTaskCommits, roundToMinutes, roundUp); + remainMinutes = remainMinutes - currentTaskTime; + + var orderedTasks = taskGroup.OrderBy(f => f.StartTime).ToArray(); + StringBuilder sb = new StringBuilder(); + foreach (var task in orderedTasks) + { + sb.AppendLine($"- {task.Description}"); + } + var taskTimeItem = new TaskTimeItem + { + Branch = taskGroup.Key, + TimeSpent = appendTime ? + TimeSpan.FromMinutes(taskGroup.Sum(f=>f.TimeSpent.TotalMinutes)) + TimeSpan.FromMinutes(currentTaskTime): + TimeSpan.FromMinutes(currentTaskTime) + , + Commits = taskGroup.Sum(f=>f.Commits), + Description = sb.ToString(), + StartTime = taskGroup.Min(f=>f.StartTime), + FilesAffected = taskGroup.Sum(f=>f.FilesAffected) + }; + + newList.Add(taskTimeItem); + } + + return newList; + } + + private decimal RoundTo(decimal value, decimal to = 15, bool up = true) + { + if ((value % to) == 0) + return value; + if (up) + return (value - (value % to) + to); + + return (value - (value % to)); + } + } +}