From 4c8f74e5a342280b74d34f30cc246a8e11677c46 Mon Sep 17 00:00:00 2001 From: songchenxuan Date: Wed, 16 Oct 2024 09:40:16 +0800 Subject: [PATCH] *[task#130344,1.5h,done]. --- module/program/model.php | 15 +----- module/project/control.php | 9 ++-- module/project/model.php | 58 ++++++++++++++++++++++ module/project/ui/ajaxgetdropmenu.html.php | 14 +++--- 4 files changed, 73 insertions(+), 23 deletions(-) diff --git a/module/program/model.php b/module/program/model.php index 32f7e0a4af..0b63db2c9d 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -510,7 +510,7 @@ class programModel extends model } $stmt = $this->dao->select('DISTINCT t1.*, CAST(t1.budget AS DECIMAL) AS budget')->from(TABLE_PROJECT)->alias('t1'); - if($this->cookie->involved) $stmt->leftJoin(TABLE_TEAM)->alias('t2')->on('t1.id=t2.root')->leftJoin(TABLE_STAKEHOLDER)->alias('t3')->on('t1.id=t3.objectID'); + if($this->cookie->involved) $stmt = $this->loadModel('project')->leftJoinInvolvedTable($stmt); $stmt->where('t1.deleted')->eq('0') ->andWhere('t1.vision')->eq($this->config->vision) ->beginIF($browseType == 'bysearch' && $query)->andWhere($query)->fi() @@ -524,18 +524,7 @@ class programModel extends model ->beginIF($path)->andWhere('t1.path')->like($path . '%')->fi() ->beginIF(!$queryAll && !$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi(); - if($this->cookie->involved) - { - $stmt->andWhere('t2.type')->eq('project') - ->andWhere('t1.openedBy', true)->eq($this->app->user->account) - ->orWhere('t1.PM')->eq($this->app->user->account) - ->orWhere('t2.account')->eq($this->app->user->account) - ->orWhere('(t3.user')->eq($this->app->user->account) - ->andWhere('t3.deleted')->eq(0) - ->markRight(1) - ->orWhere("CONCAT(',', t1.whitelist, ',')")->like("%,{$this->app->user->account},%") - ->markRight(1); - } + if($this->cookie->involved) $stmt = $this->project->appendInvolvedCondition($stmt); $projectList = $stmt->orderBy($orderBy)->page($pager, 't1.id')->fetchAll('id'); /* Determine how to display the name of the program. */ diff --git a/module/project/control.php b/module/project/control.php index 1efae6720d..392c29b640 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -101,8 +101,9 @@ class project extends control $_COOKIE['showClosed'] = 1; /* Query user's project and program. */ - $projects = $this->project->getListByCurrentUser(); - $programs = $this->loadModel('program')->getPairs(true); + $projects = $this->project->getListByCurrentUser(); + $involvedProjects = $this->project->getInvolvedListByCurrentUser(); + $programs = $this->loadModel('program')->getPairs(true); /* Generate project tree. */ $orderedProjects = array(); @@ -116,11 +117,13 @@ class project extends control $this->view->link = $this->project->getProjectLink($module, $method, $projectID, $extra); // Create the link from module,method. $this->view->projectID = $projectID; - $this->view->projects = $orderedProjects; $this->view->module = $module; $this->view->method = $method; $this->view->programs = $programs; + $this->view->projects = $orderedProjects; + $this->view->involvedProjects = $involvedProjects; + $this->display(); } diff --git a/module/project/model.php b/module/project/model.php index 90a102fb16..a0f38381af 100755 --- a/module/project/model.php +++ b/module/project/model.php @@ -21,6 +21,64 @@ class projectModel extends model ->fetchAll('id'); } + /** + * 获取当前登录用户有权限查看的项目列表. + * Get project list by current user. + * + * @param string $fields + * @access public + * @return array + */ + public function getInvolvedListByCurrentUser(string $fields = 't1.*') :array + { + $stmt = $this->dao->select($fields)->from(TABLE_PROJECT)->alias('t1'); + $stmt = $this->leftJoinInvolvedTable($stmt); + + $stmt->where('t1.type')->eq('project') + ->beginIF($this->config->vision)->andWhere('t1.vision')->eq($this->config->vision)->fi() + ->andWhere('t1.deleted')->eq(0) + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi(); + $stmt = $this->appendInvolvedCondition($stmt); + + return $stmt->orderBy('order_asc,id_desc') + ->fetchAll('id'); + } + + /** + * 左链接 "我参与的" 条件需要的表,传入的$stmt t1应为 TABLE_PROJECT 表 + * LeftJoin "I participate" condition required table. + * + * @param object $stmt + * @access public + * @return object + */ + public function leftJoinInvolvedTable($stmt) + { + return $stmt->leftJoin(TABLE_TEAM)->alias('t2')->on('t1.id = t2.root') + ->leftJoin(TABLE_STAKEHOLDER)->alias('t3')->on('t1.id=t3.objectID'); + } + + /** + * 添加 "我参与的" 条件所需的查询条件,项目的PM、项目的成员、项目的干系人、项目的白名单 + * Add the query condition for the "I Participate". + * + * @param object $stmt + * @access public + * @return object + */ + public function appendInvolvedCondition($stmt) + { + return $stmt->andWhere('t2.type')->eq('project') + ->andWhere('t1.openedBy', true)->eq($this->app->user->account) + ->orWhere('t1.PM')->eq($this->app->user->account) + ->orWhere('t2.account')->eq($this->app->user->account) + ->orWhere('(t3.user')->eq($this->app->user->account) + ->andWhere('t3.deleted')->eq(0) + ->markRight(1) + ->orWhere("CONCAT(',', t1.whitelist, ',')")->like("%,{$this->app->user->account},%") + ->markRight(1); + } + /** * 查找项目执行下关联的产品 * Get linked products with execution under the project. diff --git a/module/project/ui/ajaxgetdropmenu.html.php b/module/project/ui/ajaxgetdropmenu.html.php index fb3627710a..d5ddd3829d 100644 --- a/module/project/ui/ajaxgetdropmenu.html.php +++ b/module/project/ui/ajaxgetdropmenu.html.php @@ -23,12 +23,12 @@ if(in_array("{$module}-{$method}", $config->index->oldPages)) * @param object $project * @return string */ -$getProjectGroup = function($project): string +$getProjectGroup = function($project) use($involvedProjects): string { global $app; - if($project->status != 'done' and $project->status != 'closed' and $project->PM == $app->user->account) return 'my'; - if($project->status != 'done' and $project->status != 'closed' and $project->PM != $app->user->account) return 'other'; - return 'closed'; + if(isset($involvedProjects[$project->id])) return 'my'; + if($project->status == 'closed') return 'closed'; + return 'other'; }; /** @@ -69,7 +69,7 @@ foreach($projects as $programID => $programProjects) if(empty($project->multiple) || $project->type == 'kanban' || $project->model == 'kanban') $item['url'] = helper::createLink('project', 'index', "projectID={$project->id}"); - if(empty($activeGroup) && $projectID == $project->id) $activeGroup = $group; + if(empty($activeGroup) && $projectID == $project->id) $activeGroup = $group;  if($config->systemMode == 'light' || $config->vision == 'lite') { @@ -91,8 +91,8 @@ foreach($data as $key => $value) $data[$key] = array_values($value); * Define every group name, include expanded group. */ $tabs = array(); -if(!empty($data['my'])) $tabs[] = array('name' => 'my', 'text' => $lang->project->myProject, 'active' => $activeGroup === 'my'); -if(!empty($data['other'])) $tabs[] = array('name' => 'other', 'text' => $lang->project->other, 'active' => $activeGroup === 'other'); +$tabs[] = array('name' => 'my', 'text' => $lang->project->mine, 'active' => $activeGroup === 'my'); +$tabs[] = array('name' => 'other', 'text' => $lang->project->other, 'active' => $activeGroup === 'other'); $tabs[] = array('name' => 'closed', 'text' => $lang->project->closedProject); /**