Я занимаюсь разработкой многоуровневого списка задач.
1- Level 1 Progress 10%
1.1 Level 2 Progress 50%
1.1.1 Level Progress 100%
........
Я хочу рассчитать ход выполнения каждой задачи.Прогресс родителей зависит от прогресса его подзадач.
Я создаю многоуровневый список, используя рекурсивную функцию, но я изо всех сил рассчитываю процент родительского прогресса.После трехдневной борьбы с Google я отправляю этот вопрос через переполнение стека:)
Пожалуйста, посоветуйте, как этого добиться
Список кодов в иерархии
var first = PredicateBuilder.True<T_Tasks>();
long? projectId = p.projectID;
long num1 = 0;
if (projectId.GetValueOrDefault() > num1 && projectId.HasValue)
first = first.And(w => w.projectID == p.projectID);
long? assignedTo = p.assignedTo;
long num2 = 0;
if (assignedTo.GetValueOrDefault() > num2 && assignedTo.HasValue)
first = first.And(w => w.assignedTo == p.assignedTo);
first = first.And(w => w.compID == p.compID);
first = first.And(w => w.parentID == id);
int ChildCount = 0;
var list = _db.T_Tasks.Where(first).OrderBy(o => o.taskSrl).ToList();
if (depth == false)
{
iDepthCount = 0;
taskList = new List<ent_ProjectTasks>();
}
foreach (var wbs in list)
{
var subTaskWhere = PredicateBuilder.True<T_Tasks>();
if(p.assignedTo>0)
subTaskWhere = subTaskWhere.And(w => w.assignedTo == wbs.assignedTo);
subTaskWhere = subTaskWhere.And(w => w.parentID == wbs.taskID);
subTaskWhere = subTaskWhere.And(w => w.compID == p.compID);
ChildCount =_db.T_Tasks.Count(subTaskWhere);
int spaceCount = 28;
string space = "";
int iSpace = 10;
string dropDownSeprator = "";
for (int iCheck = 0; iCheck <= iDepthCount - 1; iCheck++)
{
dropDownSeprator = dropDownSeprator + "\xA0\xA0\xA0";
iSpace = spaceCount * (iDepthCount == 0 ? 1 : iDepthCount);
space = "<span style='padding-left:" + spaceCount * (iDepthCount == 0 ? 1 : iDepthCount) + "px'></span>";
}
List<string> taskID = new List<string>();
List<SelectListItem> selectedTaskList = new List<SelectListItem>();
if (ChildCount > 0)
{
decimal _actualChildrenManHours = 0;
var _timeSeets = _db.T_TimeSheet.Where(w =>(w.taskID ==wbs.taskID ||w.T_Tasks.parentID==wbs.taskID)&& w.compID == wbs.compID).ToList();
_actualChildrenManHours = (decimal?)_timeSeets.Sum(s =>s.regularTime+s.overTime)??0;
DateTime? _finishedOn = null;
if(_timeSeets.Where(w=>w.percentComplete>=100).Count()>0)
_finishedOn=_timeSeets.OrderByDescending(o => o.addedOn).Take(1).FirstOrDefault().addedOn;
taskList.Add(new ent_ProjectTasks
{
addedBy = wbs.addedBy,
addedOn = wbs.addedOn,
assignedBy = wbs.assignedBy,
assignedTo = wbs.assignedTo,
assignedToName = wbs.T_Employees.First_Name + " " + wbs.T_Employees.Last_Name,
compID = wbs.compID ?? 0,
edittedBy = wbs.edittedBy,
edittedOn = wbs.edittedOn,
endDate = wbs.endDate,
isSubtaskAllowed = wbs.isSubTaskAllowed ?? false,
manHours = wbs.manHours ?? 0,
parentID = wbs.parentID,
//percentComplete=(int)((wbs.manHours/100)*_timeSeets.Sum(s=>s.percentComplete??0)),
percentComplete =_timeSeets.Sum(s => s.percentComplete ?? 0)),
projectID = wbs.projectID,
startDate = wbs.startDate,
taskCode = wbs.taskCode,
taskDesc = dropDownSeprator + "<b>" + wbs.taskDesc + "</b>",
taskID = wbs.taskID,
taskSrl = wbs.taskSrl ?? 0,
weightage = (wbs.parentID > 0 ? 0 : wbs.weightage),
assignmentNew = new SelectListItem { Text = wbs.T_Employees.First_Name + " " + wbs.T_Employees.Last_Name, Value = wbs.assignedTo.ToString() },
_actualManHours = _actualChildrenManHours,
_finishedOn= _finishedOn
});
iDepthCount++;
var para = new ent_ProjectTasks
{
projectID = wbs.projectID ?? 0,
compID=wbs.compID??0
};
para.assignedTo = p.assignedTo;
getHirarchyTasks(wbs.taskID, para, true);
}
else
{
decimal _actualChildrenManHours = 0;
var _timeSeets = _db.T_TimeSheet.Where(w =>(w.T_Tasks.parentID == wbs.taskID || w.taskID== wbs.taskID) && w.compID == wbs.compID).ToList();
_actualChildrenManHours = (decimal?)_timeSeets.Sum(s => s.regularTime + s.overTime) ?? 0;
DateTime? _finishedOn = null;
if (_timeSeets.Where(w => w.percentComplete >= 100).Count() > 0)
_finishedOn = _timeSeets.OrderByDescending(o => o.addedOn).Take(1).FirstOrDefault().addedOn;
taskList.Add(new ent_ProjectTasks
{
addedBy = wbs.addedBy,
addedOn = wbs.addedOn,
assignedBy = wbs.assignedBy,
assignedTo = wbs.assignedTo,
assignedToName = wbs.T_Employees.First_Name + " " + wbs.T_Employees.Last_Name,
compID = wbs.compID ?? 0,
edittedBy = wbs.edittedBy,
edittedOn = wbs.edittedOn,
endDate = wbs.endDate,
isSubtaskAllowed = wbs.isSubTaskAllowed ?? false,
manHours = wbs.manHours ?? 0,
parentID = wbs.parentID,
percentComplete = wbs.T_TimeSheet.Sum(s => s.percentComplete ?? 0),
projectID = wbs.projectID,
startDate = wbs.startDate,
taskCode = wbs.taskCode,
taskDesc = dropDownSeprator + wbs.taskDesc,
taskID = wbs.taskID,
taskSrl = wbs.taskSrl ?? 0,
weightage = (iDepthCount > 0 ? 0 : wbs.weightage),
assignmentNew = new SelectListItem { Text = wbs.T_Employees.First_Name + " " + wbs.T_Employees.Last_Name, Value = wbs.assignedTo.ToString() },
_actualManHours = _actualChildrenManHours,
_finishedOn = _finishedOn
});
}
}
iDepthCount--;
return taskList.ToList();
Большое спасибо заранее