diff --git a/module/programplan/control.php b/module/programplan/control.php index f175bb02fd..e4e238c6ac 100644 --- a/module/programplan/control.php +++ b/module/programplan/control.php @@ -86,6 +86,18 @@ class programplan extends control $plans = $this->programplan->getDataForGantt($projectID, $this->productID, $baselineID, $selectCustom, false); } + if($type == 'assignedTo') + { + $owner = $this->app->user->account; + $module = 'programplan'; + $section = 'browse'; + $object = 'stageCustom'; + $selectCustom = $this->loadModel('setting')->getItem("owner={$owner}&module={$module}§ion={$section}&key={$object}"); + if(strpos($selectCustom, 'date') !== false) $dateDetails = 0; + + $plans = $this->programplan->getDataForGanttGroupByAssignedTo($projectID, $this->productID, $baselineID, $selectCustom, false); + } + if($type == 'lists') { $sort = common::appendOrder($orderBy); @@ -103,6 +115,7 @@ class programplan extends control $this->view->selectCustom = $selectCustom; $this->view->dateDetails = $dateDetails; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->ganttType = $type; $this->display(); } @@ -248,14 +261,8 @@ class programplan extends control { if(!empty($_POST)) { - if($_POST['type'] == 'task') - { - $objectID = explode('-', $_POST['id'])[1]; - } - else - { - $objectID = $_POST['id']; - } + if(!isset($_POST['id']) or empty($_POST['id'])) return $this->send(array('result' => 'fail', 'message' => '')); + $objectID = $_POST['id']; $this->loadModel('task')->saveTaskDrag($objectID, $_POST['type']); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); diff --git a/module/programplan/lang/zh-cn.php b/module/programplan/lang/zh-cn.php index ff6a2b751f..fb9d36953d 100644 --- a/module/programplan/lang/zh-cn.php +++ b/module/programplan/lang/zh-cn.php @@ -86,3 +86,7 @@ $lang->programplan->error->parentWorkload = '子阶段的工作量之和不能 $lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段'; $lang->programplan->error->sameName = '阶段名称不能相同!'; $lang->programplan->error->taskDrag = '%s的任务不可以拖动'; + + +$lang->programplan->ganttBrowseType['gantt'] = '按阶段分组'; +$lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组'; diff --git a/module/programplan/model.php b/module/programplan/model.php index d877c4bf9b..ae44e791a8 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -144,6 +144,7 @@ class programplanModel extends model * @param int $baselineID * @param string $selectCustom * @param bool $returnJson + * @param string $type * @access public * @return string */ @@ -329,6 +330,193 @@ class programplanModel extends model } $datas['data'] = isset($datas['data']) ? array_values($datas['data']) : array(); +// a($datas['data']);exit; + return $returnJson ? json_encode($datas) : $datas; + } + + public function getDataForGanttGroupByAssignedTo($executionID, $productID, $baselineID = 0, $selectCustom = '', $returnJson = true) + { + $plans = $this->getStage($executionID, $productID); + + $datas = array(); + $planIdList = array(); + $isMilestone = " "; + $stageIndex = array(); + + foreach($plans as $plan) + { + $planIdList[$plan->id] = $plan->id; + } + + $taskSign = "[ T ] "; + $taskPri = "%s "; + + /* Judge whether to display tasks under the stage. */ + $owner = $this->app->user->account; + $module = 'programplan'; + $section = 'browse'; + $object = 'stageCustom'; + if(empty($selectCustom)) $selectCustom = $this->loadModel('setting')->getItem("owner={$owner}&module={$module}§ion={$section}&key={$object}"); + + $tasksGroup = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('execution')->in($planIdList)->fetchGroup('assignedTo','id'); + $users = $this->loadModel('user')->getPairs('noletter'); + + foreach($tasksGroup as $group => $tasks) + { + foreach($tasks as $id => $task) + { + if($task->mode == 'multi') + { + $team = $this->dao->select('t1.*,t2.realname')->from(TABLE_TEAM)->alias('t1') + ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account') + ->where('t1.root')->eq($id)->andWhere('t1.type')->eq('task')->orderBy('t1.order')->fetchAll('account'); + foreach($team as $account => $member) + { + if($account == $group) continue; + if(!isset($taskGroups[$account])) $taskGroups[$account] = array(); + + $taskGroups[$account][$id] = clone $task; + $taskGroups[$account][$id]->id = $id . '_' . $account; + $taskGroups[$account][$id]->realID = $id; + $taskGroups[$account][$id]->assignedTo = $account; + $taskGroups[$account][$id]->realname = $member->realname; + } + } + } + } + + $groupID = 0; + foreach($tasksGroup as $group => $tasks) + { + $groupID --; + $groupName = $group; + $groupName = zget($users, $group); + $dataGroup = new stdclass(); + $dataGroup->id = $groupID; + $dataGroup->type = 'group'; + $dataGroup->text = $groupName; + $dataGroup->percent = ''; + $dataGroup->attribute = ''; + $dataGroup->milestone = ''; + $dataGroup->owner_id = $group; + $dataGroup->status = ''; + $dataGroup->begin = ''; + $dataGroup->deadline = ''; + $dataGroup->realBegan = ''; + $dataGroup->realEnd = ''; + $dataGroup->parent = 0; + $dataGroup->open = true; + $dataGroup->progress = ''; + $dataGroup->start_date = ''; + $dataGroup->endDate = ''; + $dataGroup->duration = 0; + + $groupKey = $groupID . $group; + $datas['data'][$groupKey] = $dataGroup; + + foreach($tasks as $taskID => $task) + { + // if($task->parent > 0 and $task->assignedTo) + // { + // $a = $task->parent; + // a($tasksGroup[$task->assignedTo]); + // a($task->parent);exit; + // } + $execution = zget($plans, $task->execution, array()); + + $priIcon = sprintf($taskPri, $task->pri, $task->pri, $task->pri); + + $estStart = helper::isZeroDate($task->estStarted) ? '' : $task->estStarted; + $estEnd = helper::isZeroDate($task->deadline) ? '' : $task->deadline; + $realBegan = helper::isZeroDate($task->realStarted) ? '' : $task->realStarted; + $realEnd = (in_array($task->status, array('done', 'closed')) and !helper::isZeroDate($task->finishedDate)) ? $task->finishedDate : ''; + + $start = $realBegan ? $realBegan : $estStart; + $end = $realEnd ? $realEnd : $estEnd; + if(empty($start) and $execution) $start = $execution->begin; + if(empty($end) and $execution) $end = $execution->end; + if($start > $end) $end = $start; + + $data = new stdclass(); + $data->id = $task->id; + $data->type = 'task'; + $data->text = $taskSign . $priIcon . $task->name; + $data->percent = ''; + $data->status = $this->processStatus('task', $task); + $data->owner_id = $task->assignedTo; + $data->attribute = ''; + $data->milestone = ''; + $data->begin = $start; + $data->deadline = $end; + $data->realBegan = $realBegan; + $data->realEnd = $realEnd; + $data->pri = $task->pri; + $data->parent = ($task->parent > 0 and $task->assignedTo != '') ? $task->parent : $groupID; + $data->open = true; + $progress = $task->consumed ? round($task->consumed / ($task->left + $task->consumed), 3) : 0; + $data->progress = $progress; + $data->taskProgress = ($progress * 100) . '%'; + $data->start_date = $start; + $data->endDate = $end; + $data->duration = 0; + + /* If multi task then show the teams. */ + // if($task->mode == 'multi' and !empty($taskTeams[$task->id])) + // { + // $teams = array_keys($taskTeams[$task->id]); + // $assigneds = array(); + // foreach($teams as $assignedTo) $assigneds[] = zget($users, $assignedTo); + // $data->owner_id = join(',', $assigneds); + // } + + if($data->endDate > $data->start_date) $data->duration = helper::diffDate($data->endDate, $data->start_date) + 1; + if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date)); + if($data->start_date == '' or $data->endDate == '') $data->duration = 0; + + if(strpos($selectCustom, 'task') !== false) $datas['data'][$data->id] = $data; + + foreach($stageIndex as $index => $stage) + { + if($stage['planID'] == $task->execution) + { + $stageIndex[$index]['progress']['totalConsumed'] += $task->consumed; + $stageIndex[$index]['progress']['totalReal'] += ($task->left + $task->consumed); + + $parent = $stage['parent']; + if(isset($stageIndex[$parent])) + { + $stageIndex[$parent]['progress']['totalConsumed'] += $task->consumed; + $stageIndex[$parent]['progress']['totalReal'] += ($task->left + $task->consumed); + } + } + } + } + } + + /* Calculate the progress of the phase. */ + foreach($stageIndex as $index => $stage) + { + $progress = empty($stage['progress']['totalConsumed']) ? 0 : round($stage['progress']['totalConsumed'] / $stage['progress']['totalReal'], 3); + $datas['data'][$index]->progress = $progress; + + $progress = ($progress * 100) . '%'; + $datas['data'][$index]->taskProgress = $progress; + } + + $datas['links'] = array(); + if($this->config->edition != 'open') + { + $relations = $this->dao->select('*')->from(TABLE_RELATIONOFTASKS)->where('execution')->in($planIdList)->orderBy('task,pretask')->fetchAll(); + foreach($relations as $relation) + { + $link['source'] = $relation->execution . '-' . $relation->pretask; + $link['target'] = $relation->execution . '-' . $relation->task; + $link['type'] = $this->config->execution->gantt->linkType[$relation->condition][$relation->action]; + $datas['links'][] = $link; + } + } + + $datas['data'] = isset($datas['data']) ? array_values($datas['data']) : array(); return $returnJson ? json_encode($datas) : $datas; } diff --git a/module/programplan/view/browse.html.php b/module/programplan/view/browse.html.php index 5a299d37f0..a257219961 100644 --- a/module/programplan/view/browse.html.php +++ b/module/programplan/view/browse.html.php @@ -24,7 +24,7 @@

- + diff --git a/module/programplan/view/gantt.html.php b/module/programplan/view/gantt.html.php index d3089e6ff8..c069805036 100644 --- a/module/programplan/view/gantt.html.php +++ b/module/programplan/view/gantt.html.php @@ -9,6 +9,7 @@ * @version $Id: gantt.html.php 4903 2013-06-26 05:32:59Z wyd621@gmail.com $ * @link http://www.zentao.net */ + ?> @@ -64,6 +65,8 @@ form {display: block; margin-top: 0em; margin-block-end: 1em;} .gantt-fullscreen #mainMenu, .gantt-fullscreen #footer {display: none!important;} .gantt-fullscreen #mainContent {position: fixed; top: 0; right: 0; bottom: 0; left: 0} +.gantt_grid_head_cell.gantt_grid_head_text{overflow:visible;} + createLink('programplan', 'ajaxCustom'));?> @@ -93,6 +96,16 @@ form {display: block; margin-top: 0em; margin-block-end: 1em;} + '; + $typeHtml .= ''; + $typeHtml .= ''; + ?>