From f12014703f6fa56a95470579bec7f872ee0df7be Mon Sep 17 00:00:00 2001 From: leiyong <1549684884@qq.com> Date: Wed, 23 Sep 2020 16:07:06 +0800 Subject: [PATCH] * Add program project method. --- config/filter.php | 1 + module/program/control.php | 73 ++++++++++++++ module/program/lang/zh-cn.php | 8 +- module/program/model.php | 122 +++++++++++++++++++++++- module/program/view/pgmproject.html.php | 110 +++++++++++++++++++++ module/program/view/prjgroup.html.php | 2 +- 6 files changed, 312 insertions(+), 4 deletions(-) create mode 100644 module/program/view/pgmproject.html.php diff --git a/config/filter.php b/config/filter.php index 55c105625c..e7787bcb88 100644 --- a/config/filter.php +++ b/config/filter.php @@ -141,6 +141,7 @@ $filter->product->export->cookie['checkedItem'] = 'reg::checked'; $filter->program->prjbrowse->cookie['programType'] = 'code'; $filter->program->prjbrowse->cookie['PRJMine'] = 'code'; +$filter->program->pgmproject->cookie['PRJMine'] = 'code'; $filter->program->prjbrowse->cookie['mine'] = 'code'; $filter->program->pgmbrowse->cookie['showClosed'] = 'code'; $filter->program->export->cookie['checkedItem'] = 'reg::checked'; diff --git a/module/program/control.php b/module/program/control.php index 731b9b39f2..93bce2873f 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -592,6 +592,44 @@ class program extends control $this->display(); } + /** + * Export program. + * + * @param int $programID + * @param string $browseType + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function PGMProject($programID = 0, $browseType = 'doing', $orderBy = 'order_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1) + { + $this->lang->navGroup->program = 'program'; + $this->lang->program->switcherMenu = $this->program->getPGMCommonAction() . $this->program->getPGMSwitcher($programID); + $this->program->setPGMViewMenu($programID); + + /* Load pager and get tasks. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $programTitle = $this->loadModel('setting')->getItem('owner=' . $this->app->user->account . '&module=program&key=PRJProgramTitle'); + $projectStats = $this->program->getPRJStats($programID, $browseType, 0, $orderBy, $pager, $programTitle); + + $this->view->title = $this->lang->program->PRJBrowse; + $this->view->position[] = $this->lang->program->PRJBrowse; + + $this->view->projectStats = $projectStats; + $this->view->pager = $pager; + $this->view->programID = $programID; + $this->view->program = $this->program->getPRJByID($programID); + $this->view->users = $this->loadModel('user')->getPairs('noletter|pofirst|nodeleted'); + $this->view->browseType = $browseType; + $this->view->orderBy = $orderBy; + $this->display(); + } + /** * Export program. * @@ -1116,6 +1154,41 @@ class program extends control $this->display(); } + /** + * Manage members of a group. + * + * @param int $groupID + * @param int $deptID + * @access public + * @return void + */ + public function PRJManageGroupMember($groupID, $deptID = 0) + { + if(!empty($_POST)) + { + $this->group->updateUser($groupID); + if(isonlybody()) die(js::closeModal('parent.parent', 'this')); + die(js::locate($this->createLink('group', 'browse'), 'parent')); + } + $group = $this->group->getById($groupID); + $groupUsers = $this->group->getUserPairs($groupID); + $allUsers = $this->loadModel('dept')->getDeptUserPairs($deptID); + $otherUsers = array_diff_assoc($allUsers, $groupUsers); + + $title = $group->name . $this->lang->colon . $this->lang->group->manageMember; + $position[] = $group->name; + $position[] = $this->lang->group->manageMember; + + $this->view->title = $title; + $this->view->position = $position; + $this->view->group = $group; + $this->view->deptTree = $this->loadModel('dept')->getTreeMenu($rooteDeptID = 0, array('deptModel', 'createGroupManageMemberLink'), $groupID); + $this->view->groupUsers = $groupUsers; + $this->view->otherUsers = $otherUsers; + + $this->display('group', 'manageMember'); + } + /** * Project copy a group. * diff --git a/module/program/lang/zh-cn.php b/module/program/lang/zh-cn.php index 82127ba2af..7758d88f6f 100644 --- a/module/program/lang/zh-cn.php +++ b/module/program/lang/zh-cn.php @@ -31,7 +31,7 @@ $lang->program->PRJUpdateOrder = '排序'; $lang->program->common = '项目'; $lang->program->stage = '阶段'; $lang->program->PRJName = '项目名称'; -$lang->program->PRJTemplate = '项目模板'; +$lang->program->PRJModel = '管理类型'; $lang->program->PRJCategory = '项目类型'; $lang->program->PRJDesc = '项目描述'; $lang->program->PRJCode = '项目代号'; @@ -41,6 +41,11 @@ $lang->program->end = '计划完成日期'; $lang->program->PRJStatus = '项目状态'; $lang->program->PRJPM = '项目负责人'; $lang->program->PRJBudget = '项目预算'; +$lang->program->PRJTemplate = '项目模板'; +$lang->program->PRJEstimate = '预计'; +$lang->program->PRJConsume = '消耗'; +$lang->program->PRJSurplus = '剩余'; +$lang->program->PRJProgress = '进度'; $lang->program->dateRange = '起止时间'; $lang->program->to = '至'; $lang->program->realEnd = '实际完成日期'; @@ -51,7 +56,6 @@ $lang->program->mine = '我参与的'; $lang->program->setPlanduration = '设置工期'; $lang->program->auth = '权限控制'; $lang->program->durationEstimation = '工作量估算'; -$lang->program->PRJProgress = '项目进度'; $lang->program->teamCount = '投入人数'; $lang->program->leftStories = '剩余需求'; $lang->program->leftTasks = '剩余任务'; diff --git a/module/program/model.php b/module/program/model.php index 853da83ead..c106a0b8ea 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -997,7 +997,7 @@ class programModel extends model * @param int $programTitle * @param int $PRJMine * @access public - * @return bool + * @return object */ public function getPRJList($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $PRJMine = 0) { @@ -1339,4 +1339,124 @@ class programModel extends model return common::createChanges($oldProject, $project); } } + + /** + * Get project stats. + * + * @param int $programID + * @param string $browseType + * @param string $queryID + * @param string $orderBy + * @param object $pager + * @param int $programTitle + * @param int $PRJMine + * @access public + * @return void + */ + public function getPRJStats($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $PRJMine = 0) + { + /* Init vars. */ + $projects = $this->getPRJList($programID, $browseType, $queryID, $orderBy, $pager, $programTitle, $PRJMine); + if(empty($projects)) return array(); + + $projectKeys = array_keys($projects); + $stats = array(); + $hours = array(); + $emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0); + + /* 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) + ->andWhere('parent')->lt(1) + ->andWhere('deleted')->eq(0) + ->fetchGroup('project', 'id'); + + /* Compute totalEstimate, totalConsumed, totalLeft. */ + foreach($tasks as $projectID => $projectTasks) + { + $hour = (object)$emptyHour; + foreach($projectTasks as $task) + { + if($task->status != 'cancel') + { + $hour->totalEstimate += $task->estimate; + $hour->totalConsumed += $task->consumed; + } + if($task->status != 'cancel' and $task->status != 'closed') $hour->totalLeft += $task->left; + } + $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; + } + + /* Get burndown charts datas. */ + $burns = $this->dao->select('project, date AS name, `left` AS value') + ->from(TABLE_BURN) + ->where('project')->in($projectKeys) + ->andWhere('task')->eq(0) + ->orderBy('date desc') + ->fetchGroup('project', 'name'); + + $this->loadModel('project'); + $itemCounts = 30; + foreach($burns as $projectID => $projectBurns) + { + /* If projectBurns > $itemCounts, split it, else call processBurnData() to pad burns. */ + $begin = $projects[$projectID]->begin; + $end = $projects[$projectID]->end; + if($begin == '0000-00-00') $begin = $projects[$projectID]->openedDate; + $projectBurns = $this->project->processBurnData($projectBurns, $itemCounts, $begin, $end); + + /* Shorter names. */ + foreach($projectBurns as $projectBurn) + { + $projectBurn->name = substr($projectBurn->name, 5); + unset($projectBurn->project); + } + + ksort($projectBurns); + $burns[$projectID] = $projectBurns; + } + + /* Get the number of project teams. */ + $teams = $this->dao->select('root,count(*) as teams')->from(TABLE_TEAM) + ->where('root')->in($projectKeys) + ->andWhere('type')->eq('project') + ->groupBy('root') + ->fetchAll('root'); + + /* Process projects. */ + foreach($projects as $key => $project) + { + $project->end = date(DT_DATE1, strtotime($project->end)); // Process the end time. + + /* 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 burns. */ + $project->burns = array(); + $burnData = isset($burns[$project->id]) ? $burns[$project->id] : array(); + foreach($burnData as $data) $project->burns[] = $data->value; + + /* Process the hours. */ + $project->hours = isset($hours[$project->id]) ? $hours[$project->id] : (object)$emptyHour; + + $project->teamCount = isset($teams[$project->id]) ? $teams[$project->id]->teams : 0; + $stats[] = $project; + } + return $stats; + } } diff --git a/module/program/view/pgmproject.html.php b/module/program/view/pgmproject.html.php new file mode 100644 index 0000000000..8e2a131e67 --- /dev/null +++ b/module/program/view/pgmproject.html.php @@ -0,0 +1,110 @@ + + * @package program + * @version $Id: pgmproject.html.php 4769 2013-05-05 07:24:21Z wwccss $ + * @link http://www.zentao.net + */ +?> + + +