diff --git a/module/block/control.php b/module/block/control.php index 18d6fd0e40..5e4761d6aa 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -1468,15 +1468,7 @@ class block extends control */ public function printRecentprogramBlock() { - $programs = $this->block->getRecentProject(); - - $this->loadModel('project'); - foreach($programs as $programID => $program) - { - $program->teamCount = count($this->project->getTeamMembers($program->id)); - } - - $this->view->programs = $programs; + $this->view->programs = $this->block->getRecentPrograms(); } public function printProgramteamBlock() diff --git a/module/block/css/dashboard.css b/module/block/css/dashboard.css index 97ce2ac5d6..6d6324f9c5 100644 --- a/module/block/css/dashboard.css +++ b/module/block/css/dashboard.css @@ -26,24 +26,3 @@ body {padding-bottom: 20px;} #dashboard .block-sm .hide-in-sm {display: none;} #dashboard .block-dynamic .panel-body{overflow-x:hidden;} .modal-body{padding: 10px 20px 20px 20px;} - -#cards {margin: 0 10px;} -#cards > .col {width: 33.33%;} -#cards .panel {margin: 10px 0; border: 1px solid #DCDCDC; border-radius: 2px; box-shadow: none; height: 146px; cursor: pointer;} -#cards .panel:hover {border-color: #006AF1; box-shadow: 0 0 10px 0 rgba(0,0,100,.25);} -#cards .panel-heading {padding: 12px 24px 10px 16px;} -#cards .panel-body {padding: 0 16px 16px;} -#cards .panel-actions {padding: 7px 0;} -#cards .panel-actions .dropdown-menu > li > a {padding-left: 5px; text-align: left;} -#cards .panel-actions .dropdown-menu > li > a > i {opacity: .5; display: inline-block; margin-right: 4px; width: 18px; text-align: center;} -#cards .panel-actions .dropdown-menu > li > a:hover > i {opacity: 1;} -#cards .project-type-label {padding: 1px 2px;} -#cards .project-name {font-size: 16px; font-weight: normal; display: inline-block; max-width: 80%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle;} -#cards .project-infos {font-size: 12px;} -#cards .project-infos > span {display: inline-block; line-height: 12px;} -#cards .project-infos > span > .icon {font-size: 12px; display: inline-block; position: relative; top: -1px} -#cards .project-infos > span + span {margin-left: 15px;} -#cards .project-detail {position: absolute; bottom: 16px; left: 16px; right: 16px; font-size: 12px;} -#cards .project-detail > p {margin-bottom: 8px;} -#cards .project-detail .progress {height: 4px;} -#cards .project-detail .progress-text-left .progress-text {width: 50px; left: -50px;} diff --git a/module/block/model.php b/module/block/model.php index a2c633ad8f..73d9f95db9 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -660,73 +660,68 @@ class blockModel extends model return $data; } - public function getRecentProject() + public function getRecentPrograms() { - $projects = $this->loadModel('program')->getUserPrograms('all', 'id_desc', 3); - if(empty($projects)) return array(); - $this->loadModel('project'); - foreach($projects as $projectID => $project) - { - $project->teamCount = count($this->project->getTeamMembers($project->id)); - } + $programs = $this->loadModel('program')->getUserPrograms('all', 'id_desc', 3); + if(empty($programs)) return array(); - $projectKeys = array_keys($projects); - $hours = array(); - $emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0); + $programIdList = array_keys($programs); + + $projects = $this->dao->select('*')->from(TABLE_PROJECT) + ->where('program')->in($programIdList) + ->andWhere('deleted')->eq(0) + ->andWhere('template')->eq('') + ->orderBy('id_asc') + ->fetchAll('program'); + + $projectIdList = array(); + foreach($projects as $project) $projectIdList[] = $project->id; + + $teams = $this->dao->select('root, count(*) as count')->from(TABLE_TEAM) + ->where('root')->in($programIdList) + ->groupBy('root') + ->fetchAll('root'); + + $consumes = $this->dao->select('program, sum(consumed) as consumed')->from(TABLE_TASK) + ->where('program')->in($programIdList) + ->andWhere('deleted')->eq(0) + ->andWhere('parent')->lt(1) + ->groupBy('program') + ->fetchAll('program'); - /* Get all tasks and compute totalEstimate, totalConsumed, totalLeft, progress according to them. */ $tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason') ->from(TABLE_TASK) - ->where('project')->in($projectKeys) + ->where('project')->in($projectIdList) ->andWhere('parent')->lt(1) ->andWhere('deleted')->eq(0) - ->fetchGroup('project', 'id'); - - /* Compute totalEstimate, totalConsumed, totalLeft. */ - foreach($tasks as $projectID => $projectTasks) + ->fetchAll('id'); + + foreach($programs as $programID => $program) { - $hour = (object)$emptyHour; - foreach($projectTasks as $task) + $program->teamCount = isset($teams[$programID]) ? $teams[$programID]->count : 0; + $program->consumed = isset($consumes[$programID]) ? $consumes[$programID]->consumed : 0; + $program->project = isset($projects[$programID]) ? $projects[$programID] : new stdclass(); + + if(!empty($program->project)) { - if($task->status != 'cancel') + $totalEstimate = $totalConsumed = $totalLeft = 0; + foreach($tasks as $id => $task) { - $hour->totalEstimate += $task->estimate; - $hour->totalConsumed += $task->consumed; + if($task->project != $program->project->id) continue; + if($task->status != 'cancel') + { + $totalEstimate += $task->estimate; + $totalConsumed += $task->consumed; + } + if($task->status != 'cancel' and $task->status != 'closed') $totalLeft += $task->left; } - if($task->status != 'cancel' and $task->status != 'closed') $hour->totalLeft += $task->left; + + $program->project->progress = ($totalLeft + $totalConsumed) == 0 ? 0 : round($totalConsumed / ($totalLeft + $totalConsumed), 3) * 100; } - $hours[$projectID] = $hour; } - /* Compute totalReal and progress. */ - foreach($hours as $hour) - { - $hour->totalEstimate = round($hour->totalEstimate, 1) ; - $hour->totalConsumed = round($hour->totalConsumed, 1); - $hour->totalLeft = round($hour->totalLeft, 1); - $hour->totalReal = $hour->totalConsumed + $hour->totalLeft; - $hour->progress = $hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 3) * 100 : 0; - } - - /* Process projects. */ - foreach($projects as $key => $project) - { - // Process the end time. - $project->end = date(DT_DATE1, strtotime($project->end)); - - /* Judge whether the project is delayed. */ - if($project->status != 'done' and $project->status != 'closed' and $project->status != 'suspended') - { - $delay = helper::diffDate(helper::today(), $project->end); - if($delay > 0) $project->delay = $delay; - } - - /* Process the hours. */ - $project->hours = isset($hours[$project->id]) ? $hours[$project->id] : (object)$emptyHour; - } - - return $projects; + return $programs; } /** diff --git a/module/block/view/programstatisticblock.html.php b/module/block/view/programstatisticblock.html.php index 6f907a9864..a3e9d9770d 100644 --- a/module/block/view/programstatisticblock.html.php +++ b/module/block/view/programstatisticblock.html.php @@ -135,9 +135,9 @@ $(function()
program->ongoingStage; ?>
-program->lastIteration; ?>