在多级树视图中计算进度百分比的最佳方法是什么?

时间:2019-02-11 06:45:45

标签: javascript c# asp.net-mvc

我正在开发一个多级任务列表。

1- Level 1  Progress 10%
     1.1 Level 2   Progress 50%
       1.1.1 Level   Progress 100%
          ........

我想计算每个任务的进度。父级进度取决于其子任务进度。

我正在使用递归函数生成多级列表,但是我正在努力计算父级进度百分比。经过3天的苦苦挣扎以及googlee的大量休假后,我在堆栈溢出中发布了这个问题:)

请告知如何实现

代码到层次结构列表

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();

非常感谢

0 个答案:

没有答案
相关问题