Рефакторинг - переход на один класс с временем.
This commit is contained in:
@@ -47,6 +47,7 @@ namespace JiraTimeBot.DI
|
|||||||
_builder.RegisterType<JiraCommitEmulator>().As<IMercurialLog>().AsSelf();
|
_builder.RegisterType<JiraCommitEmulator>().As<IMercurialLog>().AsSelf();
|
||||||
_builder.RegisterAggregateService<IAllMercurialProviders>();
|
_builder.RegisterAggregateService<IAllMercurialProviders>();
|
||||||
|
|
||||||
|
_builder.RegisterType<TaskTimeSpread>().As<ITaskTimeSpread>().AsSelf();
|
||||||
_builder.RegisterType<TaskTimeByCommitsCalculator>().As<ITaskTimeCalculator>().AsSelf();
|
_builder.RegisterType<TaskTimeByCommitsCalculator>().As<ITaskTimeCalculator>().AsSelf();
|
||||||
|
|
||||||
_builder.RegisterType<WorkLogTasksProcessor>().AsSelf().As<ITasksProcessor>();
|
_builder.RegisterType<WorkLogTasksProcessor>().AsSelf().As<ITasksProcessor>();
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
<Compile Include="Mercurial\IMercurialLog.cs" />
|
<Compile Include="Mercurial\IMercurialLog.cs" />
|
||||||
<Compile Include="Mercurial\Modifiers\TechnicalInfoSkipper.cs" />
|
<Compile Include="Mercurial\Modifiers\TechnicalInfoSkipper.cs" />
|
||||||
<Compile Include="TasksProcessors\IAllTasksProcessors.cs" />
|
<Compile Include="TasksProcessors\IAllTasksProcessors.cs" />
|
||||||
|
<Compile Include="TaskTime\TaskTimeSpread.cs" />
|
||||||
<Compile Include="UI\frmMain.cs">
|
<Compile Include="UI\frmMain.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
@@ -12,53 +12,12 @@ namespace JiraTimeBot.TaskTime
|
|||||||
public class TaskTimeByCommitsCalculator: ITaskTimeCalculator
|
public class TaskTimeByCommitsCalculator: ITaskTimeCalculator
|
||||||
{
|
{
|
||||||
private readonly ILog _log;
|
private readonly ILog _log;
|
||||||
|
private readonly ITaskTimeSpread _spreadHelper;
|
||||||
|
|
||||||
public TaskTimeByCommitsCalculator(ILog log)
|
public TaskTimeByCommitsCalculator(ILog log, ITaskTimeSpread spreadHelper)
|
||||||
{
|
{
|
||||||
_log = log;
|
_log = log;
|
||||||
}
|
_spreadHelper = spreadHelper;
|
||||||
|
|
||||||
private List<TaskTimeItem> SpreadTime(List<TaskTimeItem> source, int minutes, int roundToMinutes, bool roundUp = false, bool appendTime = true)
|
|
||||||
{
|
|
||||||
if (source == null || !source.Any())
|
|
||||||
{
|
|
||||||
return new List<TaskTimeItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<TaskTimeItem> newList = new List<TaskTimeItem>();
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TaskTimeItem> CalculateTaskTime(List<TaskTimeItem> commits, Settings settings, CancellationToken cancellationToken = default(CancellationToken))
|
public List<TaskTimeItem> CalculateTaskTime(List<TaskTimeItem> commits, Settings settings, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
@@ -88,8 +47,9 @@ namespace JiraTimeBot.TaskTime
|
|||||||
remainMinutes -= (int)timeControlTask.TimeSpent.TotalMinutes;
|
remainMinutes -= (int)timeControlTask.TimeSpent.TotalMinutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
var workTasks = SpreadTime(commits, remainMinutes, settings.RoundToMinutes);
|
var workTasks = _spreadHelper.SpreadTime(commits, remainMinutes, settings.RoundToMinutes);
|
||||||
workTimeItems.AddRange(workTasks);
|
workTimeItems.AddRange(workTasks);
|
||||||
|
workTimeItems = workTimeItems.OrderByDescending(f => f.TimeSpent).ToList();
|
||||||
|
|
||||||
remainMinutes = minutesPerWorkDay - (int) workTimeItems.Sum(f => f.TimeSpent.TotalMinutes);
|
remainMinutes = minutesPerWorkDay - (int) workTimeItems.Sum(f => f.TimeSpent.TotalMinutes);
|
||||||
if (remainMinutes != 0)
|
if (remainMinutes != 0)
|
||||||
@@ -107,6 +67,7 @@ namespace JiraTimeBot.TaskTime
|
|||||||
return workTimeItems.OrderByDescending(f=>f.TimeSpent).ToList();
|
return workTimeItems.OrderByDescending(f=>f.TimeSpent).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private TaskTimeItem GetTimeControlTask(string timeControlTask, int minutes = 30)
|
private TaskTimeItem GetTimeControlTask(string timeControlTask, int minutes = 30)
|
||||||
{
|
{
|
||||||
//Если указана задача контроля времени - то спишем туда 30 минут и вычеркнем их из общего рабочего времени.
|
//Если указана задача контроля времени - то спишем туда 30 минут и вычеркнем их из общего рабочего времени.
|
||||||
|
|||||||
@@ -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<TaskTimeItem> SpreadTime(List<TaskTimeItem> source,
|
||||||
|
int minutes,
|
||||||
|
int roundToMinutes,
|
||||||
|
bool roundUp = false,
|
||||||
|
bool appendTime = true);
|
||||||
|
}
|
||||||
|
public class TaskTimeSpread: ITaskTimeSpread
|
||||||
|
{
|
||||||
|
public List<TaskTimeItem> SpreadTime(List<TaskTimeItem> source, int minutes, int roundToMinutes, bool roundUp = false, bool appendTime = true)
|
||||||
|
{
|
||||||
|
List<TaskTimeItem> newList = new List<TaskTimeItem>();
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user