From e267cad6bacf5a21548800b266444eb46e4c14b3 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 21:32:32 +0800 Subject: [PATCH 01/17] * [perf story #75502] Add count_of_assigned_reviewissue_in_user metric. --- db/update22.0.sql | 3 ++ module/bi/config/metrics.php | 14 ++++++ .../count_of_assigned_reviewissue_in_user.php | 44 +++++++++++++++++++ module/metric/dataset.php | 19 ++++++++ 4 files changed, 80 insertions(+) create mode 100755 module/metric/calc/user/scale/count_of_assigned_reviewissue_in_user.php diff --git a/db/update22.0.sql b/db/update22.0.sql index fba2984763..cf31e50459 100644 --- a/db/update22.0.sql +++ b/db/update22.0.sql @@ -92,3 +92,6 @@ ALTER TABLE `zt_reviewissue` ADD `assignedDate` datetime NULL AFTER `assignedTo` REPLACE INTO `zt_grouppriv`(`group`, `module`, `method`) SELECT `group`, `module`, 'active' as `method` FROM `zt_grouppriv` WHERE `module` = 'reviewissue' AND `method` = 'updateStatus'; REPLACE INTO `zt_grouppriv`(`group`, `module`, `method`) SELECT `group`, `module`, 'close' as `method` FROM `zt_grouppriv` WHERE `module` = 'reviewissue' AND `method` = 'updateStatus'; DELETE FROM `zt_grouppriv` WHERE `module` = 'reviewissue' AND `method` = 'updateStatus'; + +INSERT INTO `zt_metric` (`purpose`, `scope`, `object`, `stage`, `type`, `name`, `alias`, `code`, `unit`, `desc`, `definition`, `when`, `createdBy`, `createdDate`, `builtin`, `deleted`, `dateType`) VALUES +('scale', 'user', 'reviewissue', 'released', 'php', '按人员统计的被指派的评审意见数 ', '被指派的评审意见数', 'count_of_assigned_reviewissue_in_user', 'count', '按人员统计的被指派的评审意见数表示每个人被指派的评审意见数量之和,反映了每个人员需要处理的评审意见数量的规模。该数值越大,说明需要投入越多的时间处理评审意见。', '所有评审意见个数求和\r\n指派给为某人\r\n过滤已删除的评审意见\r\n过滤已关闭的评审意见\r\n过滤已删除项目的评审意见', '', 'system', '2024-05-07 08:00:00', '1', '0', 'nodate'); diff --git a/module/bi/config/metrics.php b/module/bi/config/metrics.php index 5b7dcc902d..950510ff46 100644 --- a/module/bi/config/metrics.php +++ b/module/bi/config/metrics.php @@ -4145,6 +4145,20 @@ $config->bi->builtin->metrics[] = array 'definition' => "所有风险个数求和\n指派给为某人\n过滤已删除的风险\n过滤已关闭的风险\n过滤已删除项目的风险" ); +$config->bi->builtin->metrics[] = array +( + 'name' => '按人员统计的被指派的评审意见数', + 'alias' => '被指派的评审意见数', + 'code' => 'count_of_assigned_reviewissue_in_user', + 'purpose' => 'scale', + 'scope' => 'user', + 'object' => 'reviewissue', + 'unit' => 'count', + 'dateType' => 'nodate', + 'desc' => '按人员统计的被指派的评审意见数表示每个人被指派的评审意见数量之和,反映了每个人员需要处理的评审意见数量的规模。该数值越大,说明需要投入越多的时间处理评审意见', + 'definition' => "所有评审意见个数求和\n指派给为某人\n过滤已删除的评审意见\n过滤已关闭的评审意见\n过滤已删除项目的评审意见" +); + $config->bi->builtin->metrics[] = array ( 'name' => '按人员统计的被指派的问题数', diff --git a/module/metric/calc/user/scale/count_of_assigned_reviewissue_in_user.php b/module/metric/calc/user/scale/count_of_assigned_reviewissue_in_user.php new file mode 100755 index 0000000000..97079bccb9 --- /dev/null +++ b/module/metric/calc/user/scale/count_of_assigned_reviewissue_in_user.php @@ -0,0 +1,44 @@ + + * @package + * @uses func + * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html) + * @Link https://www.zentao.net + */ +class count_of_assigned_reviewissue_in_user extends baseCalc +{ + public $dataset = 'getReviewissues'; + + public $fieldList = array('t1.status', 't1.assignedTo'); + + public $result = array(); + + public function calculate($row) + { + $assignedTo = $row->assignedTo; + + if(empty($assignedTo) || $assignedTo == 'closed' || $row->status == 'closed') return false; + + if(!isset($this->result[$assignedTo])) $this->result[$assignedTo] = 0; + $this->result[$assignedTo] += 1; + } + + public function getResult($options = array()) + { + $records = $this->getRecords(array('user', 'value')); + return $this->filterByOptions($records, $options); + } +} \ No newline at end of file diff --git a/module/metric/dataset.php b/module/metric/dataset.php index 4225b9f477..f24cdb2aa2 100644 --- a/module/metric/dataset.php +++ b/module/metric/dataset.php @@ -971,6 +971,25 @@ class dataset return $this->defaultWhere($stmt, 't2'); } + /** + * 获取评审意见数据。 + * Get reviewissues. + * + * @param string $fieldList + * @access public + * @return PDOStatement + */ + public function getReviewissues($fieldList) + { + $stmt = $this->dao->select($fieldList)->from(TABLE_REVIEWISSUE)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') + ->where('t1.deleted')->eq('0') + ->andWhere('t2.deleted')->eq('0') + ->andWhere('t2.type')->eq('project'); + + return $this->defaultWhere($stmt, 't2'); + } + /** * 获取问题数据。 * Get issues. From 431c5d285e855731041f7168eff092f956431d1f Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 21:35:40 +0800 Subject: [PATCH 02/17] * [perf story #75502] Adjust for printAssignToMeBlock. --- module/block/config/reviewissue.php | 20 ++++++++++++++++++++ module/block/lang/de.php | 1 + module/block/lang/en.php | 1 + module/block/lang/fr.php | 1 + module/block/lang/zh-cn.php | 1 + module/block/zen.php | 28 +++++++++++++++------------- 6 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 module/block/config/reviewissue.php diff --git a/module/block/config/reviewissue.php b/module/block/config/reviewissue.php new file mode 100644 index 0000000000..45a1c442a7 --- /dev/null +++ b/module/block/config/reviewissue.php @@ -0,0 +1,20 @@ +edition, array('max', 'ipd'))) +{ + global $lang, $app; + $app->loadLang('reviewissue'); + + $config->block->reviewissue = new stdclass(); + $config->block->reviewissue->dtable = new stdclass(); + $config->block->reviewissue->dtable->fieldList = array(); + $config->block->reviewissue->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->reviewissue->dtable->fieldList['name'] = array('name' => 'title', 'title' => $lang->reviewissue->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'reviewissue', 'method' => 'view', 'params' => 'reviewissueID={id}')); + $config->block->reviewissue->dtable->fieldList['opinion'] = array('name' => 'opinion', 'title' => $lang->reviewissue->opinion, 'type' => 'text', 'sort' => true); + $config->block->reviewissue->dtable->fieldList['type'] = array('name' => 'type', 'title' => $lang->reviewissue->type, 'type' => 'category', 'map' => $lang->reviewissue->issueType, 'sort' => true); + $config->block->reviewissue->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->reviewissue->status, 'type' => 'status', 'statusMap' => $lang->reviewissue->statusList, 'sort' => true); + + $config->block->reviewissue->dtable->short = new stdclass(); + $config->block->reviewissue->dtable->short->fieldList['id'] = $config->block->reviewissue->dtable->fieldList['id']; + $config->block->reviewissue->dtable->short->fieldList['name'] = $config->block->reviewissue->dtable->fieldList['name']; + $config->block->reviewissue->dtable->short->fieldList['status'] = $config->block->reviewissue->dtable->fieldList['status']; +} diff --git a/module/block/lang/de.php b/module/block/lang/de.php index d9ea37f5e4..cc5d9f1372 100644 --- a/module/block/lang/de.php +++ b/module/block/lang/de.php @@ -234,6 +234,7 @@ $lang->block->availableBlocks['build'] = 'Builds'; $lang->block->availableBlocks['testcase'] = 'Testcase'; $lang->block->availableBlocks['testtask'] = 'Testtask'; $lang->block->availableBlocks['risk'] = 'Risks'; +$lang->block->availableBlocks['reviewissue'] = 'Review Issue'; $lang->block->availableBlocks['issue'] = 'Issues'; $lang->block->availableBlocks['meeting'] = 'Meetings'; $lang->block->availableBlocks['feedback'] = 'Feedbacks'; diff --git a/module/block/lang/en.php b/module/block/lang/en.php index 2408ab9564..4c5187625d 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -234,6 +234,7 @@ $lang->block->availableBlocks['build'] = 'Builds'; $lang->block->availableBlocks['testcase'] = 'Testcase'; $lang->block->availableBlocks['testtask'] = 'Testtask'; $lang->block->availableBlocks['risk'] = 'Risks'; +$lang->block->availableBlocks['reviewissue'] = 'Review Issue'; $lang->block->availableBlocks['issue'] = 'Issues'; $lang->block->availableBlocks['meeting'] = 'Meetings'; $lang->block->availableBlocks['feedback'] = 'Feedbacks'; diff --git a/module/block/lang/fr.php b/module/block/lang/fr.php index 6a686220e9..d519260a2a 100644 --- a/module/block/lang/fr.php +++ b/module/block/lang/fr.php @@ -234,6 +234,7 @@ $lang->block->availableBlocks['build'] = 'Builds'; $lang->block->availableBlocks['testcase'] = 'Testcase'; $lang->block->availableBlocks['testtask'] = 'Testtask'; $lang->block->availableBlocks['risk'] = 'Risks'; +$lang->block->availableBlocks['reviewissue'] = 'Review Issue'; $lang->block->availableBlocks['issue'] = 'Issues'; $lang->block->availableBlocks['meeting'] = 'Meetings'; $lang->block->availableBlocks['feedback'] = 'Feedbacks'; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 7cdbe8ec56..0716bb62e6 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -234,6 +234,7 @@ $lang->block->availableBlocks['build'] = '构建列表'; $lang->block->availableBlocks['testcase'] = '用例'; $lang->block->availableBlocks['testtask'] = '测试单'; $lang->block->availableBlocks['risk'] = '风险'; +$lang->block->availableBlocks['reviewissue'] = '评审意见'; $lang->block->availableBlocks['issue'] = '问题'; $lang->block->availableBlocks['meeting'] = '会议'; $lang->block->availableBlocks['feedback'] = '反馈'; diff --git a/module/block/zen.php b/module/block/zen.php index 027f61ec17..2b702e553d 100644 --- a/module/block/zen.php +++ b/module/block/zen.php @@ -2098,13 +2098,14 @@ class blockZen extends block if((common::hasPriv('task', 'view') && $this->config->vision == 'rnd') || (common::hasPriv('researchtask', 'view') && $this->config->vision == 'or')) $hasViewPriv['task'] = true; if(common::hasPriv('story', 'view') && $this->config->vision != 'lite') $hasViewPriv['story'] = true; if($this->config->URAndSR && common::hasPriv('story', 'view') && $this->config->vision != 'lite') $hasViewPriv['requirement'] = true; - if(common::hasPriv('bug', 'view') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['bug'] = true; - if(common::hasPriv('testcase', 'view') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['testcase'] = true; - if(common::hasPriv('testtask', 'cases') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['testtask'] = true; - if(common::hasPriv('risk', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasRisk) $hasViewPriv['risk'] = true; - if(common::hasPriv('issue', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasIssue) $hasViewPriv['issue'] = true; - if(common::hasPriv('meeting', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasMeeting) $hasViewPriv['meeting'] = true; - if((common::hasPriv('feedback', 'view') || common::hasPriv('feedback', 'adminView')) && in_array($this->config->edition, array('max', 'biz', 'ipd'))) $hasViewPriv['feedback'] = true; + if(common::hasPriv('bug', 'view') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['bug'] = true; + if(common::hasPriv('testcase', 'view') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['testcase'] = true; + if(common::hasPriv('testtask', 'cases') && !in_array($this->config->vision, array('lite', 'or'))) $hasViewPriv['testtask'] = true; + if(common::hasPriv('risk', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasRisk) $hasViewPriv['risk'] = true; + if(common::hasPriv('reviewissue', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasRisk) $hasViewPriv['reviewissue'] = true; + if(common::hasPriv('issue', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasIssue) $hasViewPriv['issue'] = true; + if(common::hasPriv('meeting', 'view') && in_array($this->config->edition, array('max', 'ipd')) && !in_array($this->config->vision, array('lite', 'or')) && $hasMeeting) $hasViewPriv['meeting'] = true; + if((common::hasPriv('feedback', 'view') || common::hasPriv('feedback', 'adminView')) && in_array($this->config->edition, array('max', 'biz', 'ipd'))) $hasViewPriv['feedback'] = true; if(common::hasPriv('ticket', 'view') && in_array($this->config->edition, array('max', 'biz', 'ipd')) && $this->config->vision != 'or') $hasViewPriv['ticket'] = true; $objectList = array('todo' => 'todos', 'task' => 'tasks', 'bug' => 'bugs', 'story' => 'stories', 'requirement' => 'requirements'); @@ -2112,7 +2113,7 @@ class blockZen extends block { if($hasRisk) $objectList += array('risk' => 'risks'); if($hasIssue) $objectList += array('issue' => 'issues'); - $objectList += array('feedback' => 'feedbacks', 'ticket' => 'tickets'); + $objectList += array('feedback' => 'feedbacks', 'ticket' => 'tickets', 'reviewissue' => 'reviewissues'); if($this->config->edition == 'ipd' && $this->config->vision == 'or') $objectList += array('demand' => 'demands'); } @@ -2129,7 +2130,7 @@ class blockZen extends block ->beginIF($objectType == 'story' || $objectType == 'requirement')->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')->fi() ->beginIF($objectType == 'bug')->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')->fi() ->beginIF($objectType == 'task')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution=t2.id')->fi() - ->beginIF($objectType == 'issue' || $objectType == 'risk')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')->fi() + ->beginIF(in_array($objectType, array('issue', 'risk', 'reviewissue')))->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')->fi() ->beginIF($objectType == 'ticket')->leftJoin(TABLE_USER)->alias('t2')->on('t1.openedBy = t2.account')->fi() ->beginIF($objectType == 'demand')->leftJoin(TABLE_DEMANDPOOL)->alias('t2')->on('t1.pool = t2.id')->fi() ->where('t1.deleted')->eq(0) @@ -2141,7 +2142,7 @@ class blockZen extends block ->beginIF($objectType == 'todo')->andWhere('t1.cycle')->eq(0)->andWhere('t1.status')->eq('wait')->andWhere('t1.vision')->eq($this->config->vision)->fi() ->beginIF($objectType != 'todo')->andWhere('t1.status')->ne('closed')->fi() ->beginIF($objectType == 'feedback')->andWhere('t1.status')->in('wait, noreview')->fi() - ->beginIF($objectType == 'issue' || $objectType == 'risk')->andWhere('t2.deleted')->eq(0)->fi() + ->beginIF(in_array($objectType, array('issue', 'risk', 'reviewissue')))->andWhere('t2.deleted')->eq(0)->fi() ->beginIF($objectType == 'ticket')->andWhere('t1.status')->in('wait,doing,done')->fi() ->beginIF($objectType == 'demand')->andWhere('t2.deleted')->eq(0)->fi() ->orderBy($orderBy) @@ -2196,9 +2197,10 @@ class blockZen extends block } } - if($objectType == 'bug') $this->app->loadLang('bug'); - if($objectType == 'risk') $this->app->loadLang('risk'); - if($objectType == 'issue') $this->app->loadLang('issue'); + if($objectType == 'bug') $this->app->loadLang('bug'); + if($objectType == 'risk') $this->app->loadLang('risk'); + if($objectType == 'reviewissue') $this->app->loadLang('reviewissue'); + if($objectType == 'issue') $this->app->loadLang('issue'); if($objectType == 'feedback' || $objectType == 'ticket') { From 56dbfa8aaf99659784bca7c76e6b93bb5c863781 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 21:37:13 +0800 Subject: [PATCH 03/17] * [perf story #75502] Add reviewissue method. --- module/my/control.php | 44 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/module/my/control.php b/module/my/control.php index dc565f531d..ad4d15b82f 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -111,7 +111,7 @@ class my extends control */ public function contribute(string $mode = 'task', string $type = 'openedBy', int $param = 0, string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1) { - if(($mode == 'issue' || $mode == 'risk') && $type == 'openedBy') $type = 'createdBy'; + if((in_array($mode, array('issue', 'risk', 'reviewissue'))) && $type == 'openedBy') $type = 'createdBy'; if($mode == 'testtask' && $type == 'openedBy') $type = 'done'; if(($mode == 'doc' || $mode == 'testcase') && $type == 'openedBy') $type = 'openedbyme'; $this->lang->my->featureBar[$this->app->rawMethod] = $this->lang->my->featureBar[$this->app->rawMethod][strtolower($mode)]; @@ -878,6 +878,48 @@ class my extends control $this->display(); } + public function reviewissue(string $type = 'assignedTo', int $param = 0, string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1) + { + $this->loadModel('reviewissue'); + + /* Set the pager. */ + $this->app->loadClass('pager', true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + /* Build the search form. */ + $currentMethod = $this->app->rawMethod; + $queryID = $type == 'bysearch' ? (int)$param : 0; + $actionURL = $this->createLink('my', $currentMethod, "mode=reviewissue&type=bysearch¶m=myQueryID"); + $this->my->buildReviewissueSearchForm($queryID, $actionURL, $currentMethod); + + /* Get reviewissues by type*/ + if($type == 'assignedBy') + { + $reviewissues = $this->my->getAssignedByMe($this->app->user->account, $pager, $orderBy, 'reviewissue'); + } + elseif($type == 'bysearch') + { + $reviewissues = $this->my->getReviewissuesBySearch($queryID, $currentMethod, $orderBy, $pager); + } + else + { + $reviewissues = $this->reviewissue->getUserReviewissues($type, $this->app->user->account, $orderBy, $pager); + } + + $this->myZen->showWorkCount($recTotal, $recPerPage, $pageID); + + $this->view->title = $this->lang->my->reviewissue; + $this->view->reviewissues = $reviewissues; + $this->view->users = $this->user->getPairs('noclosed|noletter'); + $this->view->orderBy = $orderBy; + $this->view->pager = $pager; + $this->view->type = $type; + $this->view->param = $param; + $this->view->mode = 'reviewissue'; + $this->view->projectList = array(0 => '') + $this->loadModel('project')->getPairsByProgram(); + $this->display(); + } + /** * 评审列表。 * My audits. From 57c94c8f5a3aa9a03e39d67fdf38f62b9c01f55f Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 21:37:27 +0800 Subject: [PATCH 04/17] * [perf story #75502] Add note for reviewissue method. --- module/my/control.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/module/my/control.php b/module/my/control.php index ad4d15b82f..becdc8be7a 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -878,6 +878,19 @@ class my extends control $this->display(); } + /** + * 评审意见列表。 + * My reviewissues. + * + * @param string $type + * @param int $param + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ public function reviewissue(string $type = 'assignedTo', int $param = 0, string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1) { $this->loadModel('reviewissue'); From 038731e33f1aaefdbd97bb1fefe883bb8203179f Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 21:42:49 +0800 Subject: [PATCH 05/17] * [perf story #75502] Add buildreviewissuesearchform method. --- module/my/lang/de.php | 1 + module/my/lang/en.php | 1 + module/my/lang/fr.php | 1 + module/my/lang/zh-cn.php | 1 + module/my/model.php | 36 +++++++++++++++++-- module/my/test/lib/my.unittest.class.php | 9 +++++ .../test/model/buildreviewissuesearchform.php | 35 ++++++++++++++++++ 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100755 module/my/test/model/buildreviewissuesearchform.php diff --git a/module/my/lang/de.php b/module/my/lang/de.php index dae4943c6b..977712c8f1 100644 --- a/module/my/lang/de.php +++ b/module/my/lang/de.php @@ -21,6 +21,7 @@ $lang->my->execution = "My {$lang->execution->common}s"; $lang->my->audit = 'Review'; $lang->my->issue = 'My Issues'; $lang->my->risk = 'My Risks'; +$lang->my->reviewissue = 'My Review Issue'; $lang->my->profile = 'My Profile'; $lang->my->dynamic = 'My Dynamics'; $lang->my->team = 'My Team'; diff --git a/module/my/lang/en.php b/module/my/lang/en.php index dae4943c6b..977712c8f1 100644 --- a/module/my/lang/en.php +++ b/module/my/lang/en.php @@ -21,6 +21,7 @@ $lang->my->execution = "My {$lang->execution->common}s"; $lang->my->audit = 'Review'; $lang->my->issue = 'My Issues'; $lang->my->risk = 'My Risks'; +$lang->my->reviewissue = 'My Review Issue'; $lang->my->profile = 'My Profile'; $lang->my->dynamic = 'My Dynamics'; $lang->my->team = 'My Team'; diff --git a/module/my/lang/fr.php b/module/my/lang/fr.php index dae4943c6b..977712c8f1 100644 --- a/module/my/lang/fr.php +++ b/module/my/lang/fr.php @@ -21,6 +21,7 @@ $lang->my->execution = "My {$lang->execution->common}s"; $lang->my->audit = 'Review'; $lang->my->issue = 'My Issues'; $lang->my->risk = 'My Risks'; +$lang->my->reviewissue = 'My Review Issue'; $lang->my->profile = 'My Profile'; $lang->my->dynamic = 'My Dynamics'; $lang->my->team = 'My Team'; diff --git a/module/my/lang/zh-cn.php b/module/my/lang/zh-cn.php index d416a78baa..b35573fddf 100644 --- a/module/my/lang/zh-cn.php +++ b/module/my/lang/zh-cn.php @@ -21,6 +21,7 @@ $lang->my->execution = "我的{$lang->execution->common}"; $lang->my->audit = '审批'; $lang->my->issue = '我的问题'; $lang->my->risk = '我的风险'; +$lang->my->reviewissue = '我的评审意见'; $lang->my->profile = '我的档案'; $lang->my->dynamic = '我的动态'; $lang->my->team = '团队'; diff --git a/module/my/model.php b/module/my/model.php index 33ebc027cd..2424658429 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -274,7 +274,7 @@ class myModel extends model if($objectType == 'task') return $this->getTaskAssignedByMe($pager, $orderBy, $objectIdList); if($objectType == 'requirement' || $objectType == 'story' || $objectType == 'bug') return $this->myTao->getProductRelatedAssignedByMe($objectIdList, $objectType, $module, $orderBy, $pager); - if($objectType == 'risk' || $objectType == 'issue' || $objectType == 'nc') + if(in_array($objectType, array('risk', 'issue', 'nc'))) { return $this->dao->select('t1.*')->from($this->config->objectTables[$module])->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') @@ -588,7 +588,6 @@ class myModel extends model * * @param int $queryID * @param string $actionURL - * @param string $type risk|contribute * @access public * @return void */ @@ -617,6 +616,39 @@ class myModel extends model $this->loadModel('search')->setSearchParams($this->config->risk->search); } + /* + * 构建评审意见搜索表单。 + * Build reviewissue search form. + * + * @param int $queryID + * @param string $actionURL + * @access public + * @return void + */ + public function buildReviewissueSearchForm(int $queryID, string $actionURL): void + { + $projects = $this->dao->select('id, name')->from(TABLE_PROJECT)->where('type')->eq('project') + ->andWhere('deleted')->eq('0') + ->andWhere('vision')->eq($this->config->vision) + ->andWhere('model')->ne('kanban') + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->orderBy('order_asc') + ->fetchPairs(); + $queryName = $this->app->rawMethod . 'Reviewissue'; + + $this->app->loadConfig('reviewissue'); + $this->config->reviewissue->search['module'] = $queryName; + $this->config->reviewissue->search['actionURL'] = $actionURL; + $this->config->reviewissue->search['queryID'] = $queryID; + + $this->config->reviewissue->search['params']['project']['values'] = array('') + $projects; + + if(!isset($this->config->reviewissue->search['fields'])) $this->config->reviewissue->search['fields'] = array(); + unset($this->config->reviewissue->search['fields']['module']); + + $this->loadModel('search')->setSearchParams($this->config->reviewissue->search); + } + /** * 通过搜索获取风险。 * Get risks by search. diff --git a/module/my/test/lib/my.unittest.class.php b/module/my/test/lib/my.unittest.class.php index bf2a307729..65f43a0dd8 100644 --- a/module/my/test/lib/my.unittest.class.php +++ b/module/my/test/lib/my.unittest.class.php @@ -317,6 +317,15 @@ class myTest return $tester->config->risk->search; } + public function buildReviewissueSearchFormTest(int $queryID, string $actionURL): array + { + $this->objectModel->buildReviewissueSearchForm($queryID, $actionURL); + + if(dao::isError()) return dao::getError(); + global $tester; + return $tester->config->reviewissue->search; + } + /** * 通过搜索获取风险。 * Get risks by search. diff --git a/module/my/test/model/buildreviewissuesearchform.php b/module/my/test/model/buildreviewissuesearchform.php new file mode 100755 index 0000000000..302c6e1d14 --- /dev/null +++ b/module/my/test/model/buildreviewissuesearchform.php @@ -0,0 +1,35 @@ +#!/usr/bin/env php +gen('1'); + +su('admin'); + +/** + +title=测试 myModel->buildReviewIssueSearchForm(); +timeout=0 +cid=1 + +- 测试获取queryID 1 actionURL actionURL1 的搜索表单 + - 属性module @Reviewissue + - 属性queryID @0 + - 属性actionURL @actionURL1 +- 测试获取queryID 0 actionURL actionURL2 的搜索表单 + - 属性module @Reviewissue + - 属性queryID @1 + - 属性actionURL @actionURL2 + +*/ + +$my = new myTest(); + +$queryID = array(0, 1); +$actionURL = array('actionURL1', 'actionURL2'); +$config1 = $my->buildReviewissueSearchFormTest($queryID[0], $actionURL[0]); +$config2 = $my->buildReviewissueSearchFormTest($queryID[1], $actionURL[1]); +r($config1) && p('module,queryID,actionURL') && e('Reviewissue,0,actionURL1'); // 测试获取queryID 1 actionURL actionURL1 的搜索表单 +r($config2) && p('module,queryID,actionURL') && e('Reviewissue,1,actionURL2'); // 测试获取queryID 0 actionURL actionURL2 的搜索表单 \ No newline at end of file From aefb268359245d2e756e456e69a92149610efc1b Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 22:41:10 +0800 Subject: [PATCH 06/17] * [perf story #75502] Adjust zen unit test for block zen. --- .../block/test/zen/printassigntomeblock.php | 80 +++++++++++++++++++ module/block/zen.php | 5 +- 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 module/block/test/zen/printassigntomeblock.php diff --git a/module/block/test/zen/printassigntomeblock.php b/module/block/test/zen/printassigntomeblock.php new file mode 100644 index 0000000000..071a75b3aa --- /dev/null +++ b/module/block/test/zen/printassigntomeblock.php @@ -0,0 +1,80 @@ +#!/usr/bin/env php +gen(10); +$story = zenData('story'); +$story->type->range('story,requirement,epic'); +$story->gen(30); +zenData('bug')->gen(10); +zenData('case')->gen(10); +zenData('testtask')->gen(10); +zenData('risk')->gen(10); +$reviewissue = zenData('reviewissue'); +$reviewissue->project->range('1'); +$reviewissue->review->range('1-5'); +$reviewissue->type->range('review'); +$reviewissue->opinionDate->range('`2025-01-01`'); +$reviewissue->resolutionDate->range('`2025-01-01`'); +$reviewissue->createdDate->range('`2025-01-01`'); +$reviewissue->gen(5); +zenData('nc')->gen(0); +zenData('review')->gen(10); +zenData('auditplan')->gen(10); +zenData('meeting')->gen(10); +zenData('feedback')->gen(10); +zenData('ticket')->gen(10); +zenData('demand')->gen(10); +zenData('todo')->gen(10); +su('admin'); + +global $config, $tester; +$config->URAndSR = 1; +$config->enableER = 1; +$config->edition = 'ipd'; + +$block = new stdclass(); +$block->params = json_decode('{"todoCount":"20","taskCount":"20","bugCount":"20","riskCount":"20","issueCount":"20","storyCount":"20","reviewCount":"20","meetingCount":"20","feedbackCount":"20"}'); + +$tester->app->setModuleName('block'); +$tester->app->rawModule = 'my'; +$tester->app->rawMethod = 'work'; + +$zenTest = initReference('block'); +$method = $zenTest->getMethod('printAssignToMeBlock'); +$method->setAccessible(true); +$count = $method->invokeArgs($zenTest->newInstance(), array($block)); +r(count($count)) && p() && e('12'); +r($count['review']) && p() && e('5'); +r($count['todo']) && p() && e('1'); +r($count['task']) && p() && e('0'); +r($count['bug']) && p() && e('10'); +r($count['story']) && p() && e('2'); +r($count['requirement']) && p() && e('2'); +r($count['risk']) && p() && e('2'); +r($count['issue']) && p() && e('0'); +r($count['feedback']) && p() && e('0'); +r($count['ticket']) && p() && e('0'); +r($count['reviewissue']) && p() && e('0'); +r($count['meeting']) && p() && e('0'); \ No newline at end of file diff --git a/module/block/zen.php b/module/block/zen.php index 2b702e553d..5383651d42 100644 --- a/module/block/zen.php +++ b/module/block/zen.php @@ -2058,9 +2058,9 @@ class blockZen extends block * * @param object $block * @access protected - * @return void + * @return array */ - protected function printAssignToMeBlock(object $block): void + protected function printAssignToMeBlock(object $block): array { $hasIssue = helper::hasFeature('issue'); $hasRisk = helper::hasFeature('risk'); @@ -2249,6 +2249,7 @@ class blockZen extends block $this->view->products = $this->dao->select('id, name')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->fetchPairs('id', 'name'); $this->view->projects = $this->dao->select('id, name')->from(TABLE_PROJECT)->where('deleted')->eq('0')->fetchPairs('id', 'name'); $this->view->count = $count; + return $count; } /** From a9fb091c217918742102f874b1dcc4d8c2eb2f52 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 22:58:46 +0800 Subject: [PATCH 07/17] * [perf story #75502] Adjust getassignedbyme unit test. --- module/my/test/model/getassignedbyme.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/module/my/test/model/getassignedbyme.php b/module/my/test/model/getassignedbyme.php index 76a7c33d0f..e411108402 100755 --- a/module/my/test/model/getassignedbyme.php +++ b/module/my/test/model/getassignedbyme.php @@ -9,7 +9,7 @@ zenData('bug')->gen('10'); zenData('task')->gen('10'); zenData('story')->gen('10'); zenData('user')->gen('1'); -zenData('project')->gen('0'); +zenData('project')->gen('10'); zenData('product')->gen('10'); su('admin'); @@ -23,6 +23,9 @@ cid=1 - 当插入一条action为admin指派了task的动态时,查询结果为1条数据 @0 - 当插入一条action为admin指派了bug的动态时,查询结果为1条数据 @4 - 当插入一条action为admin指派了需求的动态时,查询结果为0条数据 @0 +- 当插入一条action为user1指派了task的动态时,查询结果为1条数据 @0 +- 当插入一条action为user1指派了bug的动态时,查询结果为1条数据 @4 +- 当插入一条action为user1指派了需求的动态时,查询结果为0条数据 @0 */ @@ -33,4 +36,13 @@ $story = array('admin', 'id_desc', 'story'); r($my->getAssignedByMeTest($task[0], $task[1], $task[2])) && p() && e('0'); // 当插入一条action为admin指派了task的动态时,查询结果为1条数据 r($my->getAssignedByMeTest($bug[0], $bug[1], $bug[2])) && p() && e('4'); // 当插入一条action为admin指派了bug的动态时,查询结果为1条数据 -r($my->getAssignedByMeTest($story[0], $story[1], $story[2])) && p() && e('0'); // 当插入一条action为admin指派了需求的动态时,查询结果为0条数据 \ No newline at end of file +r($my->getAssignedByMeTest($story[0], $story[1], $story[2])) && p() && e('0'); // 当插入一条action为admin指派了需求的动态时,查询结果为0条数据 + +$task = array('user1', 'id_desc', 'task'); +$bug = array('user1', 'id_desc', 'bug'); +$story = array('user1', 'id_desc', 'story'); + +r($my->getAssignedByMeTest($task[0], $task[1], $task[2])) && p() && e('0'); // 当插入一条action为admin指派了task的动态时,查询结果为1条数据 +r($my->getAssignedByMeTest($bug[0], $bug[1], $bug[2])) && p() && e('4'); // 当插入一条action为admin指派了bug的动态时,查询结果为1条数据 +r($my->getAssignedByMeTest($story[0], $story[1], $story[2])) && p() && e('0'); // 当插入一条action为admin指派了需求的动态时,查询结果为0条数据 + From 2f366f8b9b89ab875909770cfaf236a5c9cd43ea Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Sep 2025 23:14:42 +0800 Subject: [PATCH 08/17] * [perf story #75502] Adjust getassignedbyme unit test. --- module/block/test/zen/printassigntomeblock.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/block/test/zen/printassigntomeblock.php b/module/block/test/zen/printassigntomeblock.php index 071a75b3aa..8e60619dbb 100644 --- a/module/block/test/zen/printassigntomeblock.php +++ b/module/block/test/zen/printassigntomeblock.php @@ -11,9 +11,9 @@ cid=1 - 执行$count['todo'] @1 - 执行$count['task'] @0 - 执行$count['bug'] @10 -- 执行$count['story'] @2 -- 执行$count['requirement'] @2 -- 执行$count['risk'] @2 +- 执行$count['story'] @3 +- 执行$count['requirement'] @3 +- 执行$count['risk'] @1 - 执行$count['issue'] @0 - 执行$count['feedback'] @0 - 执行$count['ticket'] @0 @@ -47,6 +47,7 @@ zenData('feedback')->gen(10); zenData('ticket')->gen(10); zenData('demand')->gen(10); zenData('todo')->gen(10); +zenData('approval')->gen(10); su('admin'); global $config, $tester; @@ -70,11 +71,11 @@ r($count['review']) && p() && e('5'); r($count['todo']) && p() && e('1'); r($count['task']) && p() && e('0'); r($count['bug']) && p() && e('10'); -r($count['story']) && p() && e('2'); -r($count['requirement']) && p() && e('2'); -r($count['risk']) && p() && e('2'); +r($count['story']) && p() && e('3'); +r($count['requirement']) && p() && e('3'); +r($count['risk']) && p() && e('1'); r($count['issue']) && p() && e('0'); r($count['feedback']) && p() && e('0'); r($count['ticket']) && p() && e('0'); r($count['reviewissue']) && p() && e('0'); -r($count['meeting']) && p() && e('0'); \ No newline at end of file +r($count['meeting']) && p() && e('0'); From 3f9d46dabc89567ce92158ea26899eb80ba3e9af Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 14:54:55 +0800 Subject: [PATCH 09/17] * [perf story #75502] Adjust code. --- module/block/config/feedback.php | 12 ++++++------ module/block/config/issue.php | 14 +++++++------- module/block/config/meeting.php | 12 ++++++------ module/block/config/reviewissue.php | 10 +++++----- module/block/config/risk.php | 12 ++++++------ module/block/config/ticket.php | 12 ++++++------ 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/module/block/config/feedback.php b/module/block/config/feedback.php index 69497b3b71..3feecd977e 100644 --- a/module/block/config/feedback.php +++ b/module/block/config/feedback.php @@ -7,12 +7,12 @@ if(in_array($config->edition, array('max', 'biz', 'ipd'))) $config->block->feedback = new stdclass(); $config->block->feedback->dtable = new stdclass(); $config->block->feedback->dtable->fieldList = array(); - $config->block->feedback->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => $lang->feedback->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => $config->vision == 'lite' ? 'view' : 'adminView', 'params' => 'feedbackID={id}')); - $config->block->feedback->dtable->fieldList['product'] = array('name' => 'product', 'title' => $lang->feedback->product, 'type' => 'category', 'sort' => true); - $config->block->feedback->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => $lang->feedback->pri, 'type' => 'pri', 'sort' => true); - $config->block->feedback->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->feedback->status, 'type' => 'status', 'sort' => true, 'statusMap' => $lang->feedback->statusList); - $config->block->feedback->dtable->fieldList['type'] = array('name' => 'type', 'title' => $lang->feedback->type, 'type' => 'category', 'sort' => true, 'map' => $lang->feedback->typeList); + $config->block->feedback->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => zge($lang->feedback, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => $config->vision == 'lite' ? 'view' : 'adminView', 'params' => 'feedbackID={id}')); + $config->block->feedback->dtable->fieldList['product'] = array('name' => 'product', 'title' => zge($lang->feedback, 'product'), 'type' => 'category', 'sort' => true); + $config->block->feedback->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zge($lang->feedback, 'pri'), 'type' => 'pri', 'sort' => true); + $config->block->feedback->dtable->fieldList['status'] = array('name' => 'status', 'title' => zge($lang->feedback, 'status'), 'type' => 'status', 'sort' => true, 'statusMap' => zget($lang->feedback, 'statusList', array())); + $config->block->feedback->dtable->fieldList['type'] = array('name' => 'type', 'title' => zge($lang->feedback, 'type'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->feedback, 'typeList', array())); $config->block->feedback->dtable->short = new stdclass(); $config->block->feedback->dtable->short->fieldList['id'] = $config->block->feedback->dtable->fieldList['id']; diff --git a/module/block/config/issue.php b/module/block/config/issue.php index 1947b29b90..be206ad868 100644 --- a/module/block/config/issue.php +++ b/module/block/config/issue.php @@ -7,13 +7,13 @@ if(in_array($config->edition, array('max', 'ipd'))) $config->block->issue = new stdclass(); $config->block->issue->dtable = new stdclass(); $config->block->issue->dtable->fieldList = array(); - $config->block->issue->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->issue->dtable->fieldList['title'] = array('name' => 'title', 'title' => $lang->issue->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'issue', 'method' => 'view', 'params' => 'issueID={id}')); - $config->block->issue->dtable->fieldList['type'] = array('name' => 'type', 'title' => $lang->issue->type, 'type' => 'category', 'sort' => true, 'map' => $lang->issue->typeList); - $config->block->issue->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => $lang->issue->priAB, 'type' => 'pri', 'sort' => true); - $config->block->issue->dtable->fieldList['severity'] = array('name' => 'severity', 'title' => $lang->issue->severity, 'type' => 'severity', 'sort' => true); - $config->block->issue->dtable->fieldList['owner'] = array('name' => 'owner', 'title' => $lang->issue->owner, 'type' => 'user', 'sort' => true); - $config->block->issue->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->issue->status, 'type' => 'status', 'sort' => true, 'statusMap' => $lang->issue->statusList); + $config->block->issue->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->issue->dtable->fieldList['title'] = array('name' => 'title', 'title' => zget($lang->issue, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'issue', 'method' => 'view', 'params' => 'issueID={id}')); + $config->block->issue->dtable->fieldList['type'] = array('name' => 'type', 'title' => zget($lang->issue, 'type'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->issue, 'typeList', array())); + $config->block->issue->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zget($lang->issue, 'priAB'), 'type' => 'pri', 'sort' => true); + $config->block->issue->dtable->fieldList['severity'] = array('name' => 'severity', 'title' => zget($lang->issue, 'severity'), 'type' => 'severity', 'sort' => true); + $config->block->issue->dtable->fieldList['owner'] = array('name' => 'owner', 'title' => zget($lang->issue, 'owner'), 'type' => 'user', 'sort' => true); + $config->block->issue->dtable->fieldList['status'] = array('name' => 'status', 'title' => zget($lang->issue, 'status'), 'type' => 'status', 'sort' => true, 'statusMap' => zget($lang->issue, 'statusList', array())); $config->block->issue->dtable->short = new stdclass(); $config->block->issue->dtable->short->fieldList['id'] = $config->block->issue->dtable->fieldList['id']; diff --git a/module/block/config/meeting.php b/module/block/config/meeting.php index 3fa767e0a0..ad325e335d 100644 --- a/module/block/config/meeting.php +++ b/module/block/config/meeting.php @@ -7,12 +7,12 @@ if(in_array($config->edition, array('max', 'ipd'))) $config->block->meeting = new stdclass(); $config->block->meeting->dtable = new stdclass(); $config->block->meeting->dtable->fieldList = array(); - $config->block->meeting->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->meeting->dtable->fieldList['name'] = array('name' => 'name', 'title' => $lang->meeting->name, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'meeting', 'method' => 'view', 'params' => 'meetingID={id}')); - $config->block->meeting->dtable->fieldList['mode'] = array('name' => 'mode', 'title' => $lang->meeting->mode, 'type' => 'category', 'sort' => true, 'map' => $lang->meeting->modeList); - $config->block->meeting->dtable->fieldList['dept'] = array('name' => 'dept', 'title' => $lang->meeting->dept, 'type' => 'category', 'sort' => true); - $config->block->meeting->dtable->fieldList['date'] = array('name' => 'date', 'title' => $lang->meeting->date, 'type' => 'date', 'sort' => true); - $config->block->meeting->dtable->fieldList['host'] = array('name' => 'host', 'title' => $lang->meeting->host, 'type' => 'user', 'sort' => true); + $config->block->meeting->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->meeting->dtable->fieldList['name'] = array('name' => 'name', 'title' => zget($lang->meeting, 'name'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'meeting', 'method' => 'view', 'params' => 'meetingID={id}')); + $config->block->meeting->dtable->fieldList['mode'] = array('name' => 'mode', 'title' => zget($lang->meeting, 'mode'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->meeting, 'modeList', array())); + $config->block->meeting->dtable->fieldList['dept'] = array('name' => 'dept', 'title' => zget($lang->meeting, 'dept'), 'type' => 'category', 'sort' => true); + $config->block->meeting->dtable->fieldList['date'] = array('name' => 'date', 'title' => zget($lang->meeting, 'date'), 'type' => 'date', 'sort' => true); + $config->block->meeting->dtable->fieldList['host'] = array('name' => 'host', 'title' => zget($lang->meeting, 'host'), 'type' => 'user', 'sort' => true); $config->block->meeting->dtable->short = new stdclass(); $config->block->meeting->dtable->short->fieldList['id'] = $config->block->meeting->dtable->fieldList['id']; diff --git a/module/block/config/reviewissue.php b/module/block/config/reviewissue.php index 45a1c442a7..caca0290ef 100644 --- a/module/block/config/reviewissue.php +++ b/module/block/config/reviewissue.php @@ -7,11 +7,11 @@ if(in_array($config->edition, array('max', 'ipd'))) $config->block->reviewissue = new stdclass(); $config->block->reviewissue->dtable = new stdclass(); $config->block->reviewissue->dtable->fieldList = array(); - $config->block->reviewissue->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->reviewissue->dtable->fieldList['name'] = array('name' => 'title', 'title' => $lang->reviewissue->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'reviewissue', 'method' => 'view', 'params' => 'reviewissueID={id}')); - $config->block->reviewissue->dtable->fieldList['opinion'] = array('name' => 'opinion', 'title' => $lang->reviewissue->opinion, 'type' => 'text', 'sort' => true); - $config->block->reviewissue->dtable->fieldList['type'] = array('name' => 'type', 'title' => $lang->reviewissue->type, 'type' => 'category', 'map' => $lang->reviewissue->issueType, 'sort' => true); - $config->block->reviewissue->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->reviewissue->status, 'type' => 'status', 'statusMap' => $lang->reviewissue->statusList, 'sort' => true); + $config->block->reviewissue->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->reviewissue->dtable->fieldList['name'] = array('name' => 'title', 'title' => zget($lang->reviewissue, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'reviewissue', 'method' => 'view', 'params' => 'reviewissueID={id}')); + $config->block->reviewissue->dtable->fieldList['opinion'] = array('name' => 'opinion', 'title' => zget($lang->reviewissue, 'opinion'), 'type' => 'text', 'sort' => true); + $config->block->reviewissue->dtable->fieldList['type'] = array('name' => 'type', 'title' => zget($lang->reviewissue, 'type'), 'type' => 'category', 'map' => zget($lang->reviewissue, 'issueType', array()), 'sort' => true); + $config->block->reviewissue->dtable->fieldList['status'] = array('name' => 'status', 'title' => zget($lang->reviewissue, 'status'), 'type' => 'status', 'statusMap' => zget($lang->reviewissue, 'statusList', array()), 'sort' => true); $config->block->reviewissue->dtable->short = new stdclass(); $config->block->reviewissue->dtable->short->fieldList['id'] = $config->block->reviewissue->dtable->fieldList['id']; diff --git a/module/block/config/risk.php b/module/block/config/risk.php index a348ef9437..47e6ebe1a0 100644 --- a/module/block/config/risk.php +++ b/module/block/config/risk.php @@ -7,12 +7,12 @@ if(in_array($config->edition, array('max', 'ipd'))) $config->block->risk = new stdclass(); $config->block->risk->dtable = new stdclass(); $config->block->risk->dtable->fieldList = array(); - $config->block->risk->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->risk->dtable->fieldList['name'] = array('name' => 'name', 'title' => $lang->risk->name, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'risk', 'method' => 'view', 'params' => 'riskID={id}')); - $config->block->risk->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => $lang->risk->priAB, 'type' => 'status', 'statusMap' => $lang->risk->priList, 'sort' => true); - $config->block->risk->dtable->fieldList['rate'] = array('name' => 'rate', 'title' => $lang->risk->rate, 'type' => 'number', 'width' => '100px', 'sort' => true); - $config->block->risk->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->risk->status, 'type' => 'status', 'statusMap' => $lang->risk->statusList, 'sort' => true); - $config->block->risk->dtable->fieldList['strategy'] = array('name' => 'strategy', 'title' => $lang->risk->strategy, 'type' => 'status', 'statusMap' => $lang->risk->strategyList, 'sort' => true); + $config->block->risk->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->risk->dtable->fieldList['name'] = array('name' => 'name', 'title' => zget($lang->risk, 'name'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'risk', 'method' => 'view', 'params' => 'riskID={id}')); + $config->block->risk->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zget($lang->risk, 'priAB'), 'type' => 'status', 'statusMap' => zget($lang->risk, 'priList', array()), 'sort' => true); + $config->block->risk->dtable->fieldList['rate'] = array('name' => 'rate', 'title' => zget($lang->risk, 'rate'), 'type' => 'number', 'width' => '100px', 'sort' => true); + $config->block->risk->dtable->fieldList['status'] = array('name' => 'status', 'title' => zget($lang->risk, 'status'), 'type' => 'status', 'statusMap' => zget($lang->risk, 'statusList', array()), 'sort' => true); + $config->block->risk->dtable->fieldList['strategy'] = array('name' => 'strategy', 'title' => zget($lang->risk, 'strategy'), 'type' => 'status', 'statusMap' => zget($lang->risk, 'strategyList', array()), 'sort' => true); $config->block->risk->dtable->short = new stdclass(); $config->block->risk->dtable->short->fieldList['id'] = $config->block->risk->dtable->fieldList['id']; diff --git a/module/block/config/ticket.php b/module/block/config/ticket.php index 58abb3eaba..5a1ef7a6f1 100644 --- a/module/block/config/ticket.php +++ b/module/block/config/ticket.php @@ -7,12 +7,12 @@ if(in_array($config->edition, array('max', 'biz', 'ipd'))) $config->block->ticket = new stdclass(); $config->block->ticket->dtable = new stdclass(); $config->block->ticket->dtable->fieldList = array(); - $config->block->ticket->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->ticket->dtable->fieldList['title'] = array('name' => 'title', 'title' => $lang->ticket->title, 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'ticket', 'method' => 'view', 'params' => 'ticketID={id}')); - $config->block->ticket->dtable->fieldList['product'] = array('name' => 'product', 'title' => $lang->ticket->product, 'type' => 'category', 'sort' => true); - $config->block->ticket->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => $lang->ticket->priAB, 'type' => 'pri', 'sort' => true); - $config->block->ticket->dtable->fieldList['status'] = array('name' => 'status', 'title' => $lang->ticket->status, 'type' => 'status', 'sort' => true, 'statusMap' => $lang->ticket->statusList); - $config->block->ticket->dtable->fieldList['type'] = array('name' => 'type', 'title' => $lang->ticket->type, 'type' => 'category', 'sort' => true, 'map' => $lang->ticket->typeList); + $config->block->ticket->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); + $config->block->ticket->dtable->fieldList['title'] = array('name' => 'title', 'title' => zget($lang->ticket, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'ticket', 'method' => 'view', 'params' => 'ticketID={id}')); + $config->block->ticket->dtable->fieldList['product'] = array('name' => 'product', 'title' => zget($lang->ticket, 'product'), 'type' => 'category', 'sort' => true); + $config->block->ticket->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zget($lang->ticket, 'priAB'), 'type' => 'pri', 'sort' => true); + $config->block->ticket->dtable->fieldList['status'] = array('name' => 'status', 'title' => zget($lang->ticket, 'status'), 'type' => 'status', 'sort' => true, 'statusMap' => zget($lang->ticket, 'statusList', array())); + $config->block->ticket->dtable->fieldList['type'] = array('name' => 'type', 'title' => zget($lang->ticket, 'type'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->ticket, 'typeList', array())); $config->block->ticket->dtable->short = new stdclass(); $config->block->ticket->dtable->short->fieldList['id'] = $config->block->ticket->dtable->fieldList['id']; From 7e49e2a45924fd4d7d0cf0f64baebd4247c0b0a2 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 14:57:23 +0800 Subject: [PATCH 10/17] * [perf story #75502] Adjust code. --- module/block/config/feedback.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/module/block/config/feedback.php b/module/block/config/feedback.php index 3feecd977e..1b8bb024d3 100644 --- a/module/block/config/feedback.php +++ b/module/block/config/feedback.php @@ -8,11 +8,11 @@ if(in_array($config->edition, array('max', 'biz', 'ipd'))) $config->block->feedback->dtable = new stdclass(); $config->block->feedback->dtable->fieldList = array(); $config->block->feedback->dtable->fieldList['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id' , 'sort' => 'number'); - $config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => zge($lang->feedback, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => $config->vision == 'lite' ? 'view' : 'adminView', 'params' => 'feedbackID={id}')); - $config->block->feedback->dtable->fieldList['product'] = array('name' => 'product', 'title' => zge($lang->feedback, 'product'), 'type' => 'category', 'sort' => true); - $config->block->feedback->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zge($lang->feedback, 'pri'), 'type' => 'pri', 'sort' => true); - $config->block->feedback->dtable->fieldList['status'] = array('name' => 'status', 'title' => zge($lang->feedback, 'status'), 'type' => 'status', 'sort' => true, 'statusMap' => zget($lang->feedback, 'statusList', array())); - $config->block->feedback->dtable->fieldList['type'] = array('name' => 'type', 'title' => zge($lang->feedback, 'type'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->feedback, 'typeList', array())); + $config->block->feedback->dtable->fieldList['title'] = array('name' => 'title', 'title' => zget($lang->feedback, 'title'), 'type' => 'title', 'sort' => true, 'flex' => 1, 'link' => array('module' => 'feedback', 'method' => $config->vision == 'lite' ? 'view' : 'adminView', 'params' => 'feedbackID={id}')); + $config->block->feedback->dtable->fieldList['product'] = array('name' => 'product', 'title' => zget($lang->feedback, 'product'), 'type' => 'category', 'sort' => true); + $config->block->feedback->dtable->fieldList['pri'] = array('name' => 'pri', 'title' => zget($lang->feedback, 'pri'), 'type' => 'pri', 'sort' => true); + $config->block->feedback->dtable->fieldList['status'] = array('name' => 'status', 'title' => zget($lang->feedback, 'status'), 'type' => 'status', 'sort' => true, 'statusMap' => zget($lang->feedback, 'statusList', array())); + $config->block->feedback->dtable->fieldList['type'] = array('name' => 'type', 'title' => zget($lang->feedback, 'type'), 'type' => 'category', 'sort' => true, 'map' => zget($lang->feedback, 'typeList', array())); $config->block->feedback->dtable->short = new stdclass(); $config->block->feedback->dtable->short->fieldList['id'] = $config->block->feedback->dtable->fieldList['id']; From 711d77584088a76f6fb0b3a947bad41fdd1aad35 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:06:57 +0800 Subject: [PATCH 11/17] * [perf story #75502] Adjust for unit test. --- module/my/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/my/model.php b/module/my/model.php index 2424658429..2cef4aaf98 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -1193,7 +1193,8 @@ class myModel extends model { if($this->config->edition != 'max' and $this->config->edition != 'ipd') return array(); - $pendingList = $this->loadModel('approval')->getPendingReviews('review'); + $this->loadModel('approval'); + $pendingList = $this->approval ? $this->approval->getPendingReviews('review') : array(); $projectReviews = $this->loadModel('review')->getByList(0, $pendingList, $orderBy); if($checkExists) return !empty($projectReviews); From 025f2cadf6f5e2079af51efa5b49b7c9c7665809 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:19:26 +0800 Subject: [PATCH 12/17] * [perf story #75502] Adjust for unit test. --- module/bi/config/metrics.php | 3 +-- module/block/test/zen/printassigntomeblock.php | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/module/bi/config/metrics.php b/module/bi/config/metrics.php index 950510ff46..dc4d519584 100644 --- a/module/bi/config/metrics.php +++ b/module/bi/config/metrics.php @@ -4145,8 +4145,7 @@ $config->bi->builtin->metrics[] = array 'definition' => "所有风险个数求和\n指派给为某人\n过滤已删除的风险\n过滤已关闭的风险\n过滤已删除项目的风险" ); -$config->bi->builtin->metrics[] = array -( +$config->bi->builtin->metrics[] = array( 'name' => '按人员统计的被指派的评审意见数', 'alias' => '被指派的评审意见数', 'code' => 'count_of_assigned_reviewissue_in_user', diff --git a/module/block/test/zen/printassigntomeblock.php b/module/block/test/zen/printassigntomeblock.php index 8e60619dbb..c8894f5810 100644 --- a/module/block/test/zen/printassigntomeblock.php +++ b/module/block/test/zen/printassigntomeblock.php @@ -53,14 +53,13 @@ su('admin'); global $config, $tester; $config->URAndSR = 1; $config->enableER = 1; -$config->edition = 'ipd'; $block = new stdclass(); $block->params = json_decode('{"todoCount":"20","taskCount":"20","bugCount":"20","riskCount":"20","issueCount":"20","storyCount":"20","reviewCount":"20","meetingCount":"20","feedbackCount":"20"}'); $tester->app->setModuleName('block'); -$tester->app->rawModule = 'my'; -$tester->app->rawMethod = 'work'; +$tester->app->rawModule = 'block'; +$tester->app->rawMethod = 'printBlock'; $zenTest = initReference('block'); $method = $zenTest->getMethod('printAssignToMeBlock'); From e9d9f3d216a4dec53dc8b660b031d2dbd24ac983 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:32:06 +0800 Subject: [PATCH 13/17] * [perf story #75502] Adjust for sorna. --- module/bi/config/metrics.php | 24 +++++++++---------- .../block/test/zen/printassigntomeblock.php | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/module/bi/config/metrics.php b/module/bi/config/metrics.php index dc4d519584..43a094d3cc 100644 --- a/module/bi/config/metrics.php +++ b/module/bi/config/metrics.php @@ -4145,18 +4145,18 @@ $config->bi->builtin->metrics[] = array 'definition' => "所有风险个数求和\n指派给为某人\n过滤已删除的风险\n过滤已关闭的风险\n过滤已删除项目的风险" ); -$config->bi->builtin->metrics[] = array( - 'name' => '按人员统计的被指派的评审意见数', - 'alias' => '被指派的评审意见数', - 'code' => 'count_of_assigned_reviewissue_in_user', - 'purpose' => 'scale', - 'scope' => 'user', - 'object' => 'reviewissue', - 'unit' => 'count', - 'dateType' => 'nodate', - 'desc' => '按人员统计的被指派的评审意见数表示每个人被指派的评审意见数量之和,反映了每个人员需要处理的评审意见数量的规模。该数值越大,说明需要投入越多的时间处理评审意见', - 'definition' => "所有评审意见个数求和\n指派给为某人\n过滤已删除的评审意见\n过滤已关闭的评审意见\n过滤已删除项目的评审意见" -); +$reviewissueMetrics = array(); +$reviewissueMetrics['name'] = '按人员统计的被指派的评审意见数'; +$reviewissueMetrics['alias'] = '被指派的评审意见数'; +$reviewissueMetrics['code'] = 'count_of_assigned_reviewissue_in_user'; +$reviewissueMetrics['purpose'] = 'scale'; +$reviewissueMetrics['scope'] = 'user'; +$reviewissueMetrics['object'] = 'reviewissue'; +$reviewissueMetrics['unit'] = 'count'; +$reviewissueMetrics['dateType'] = 'nodate'; +$reviewissueMetrics['desc'] = '按人员统计的被指派的评审意见数表示每个人被指派的评审意见数量之和,反映了每个人员需要处理的评审意见数量的规模。该数值越大,说明需要投入越多的时间处理评审意见'; +$reviewissueMetrics['definition'] = "所有评审意见个数求和\n指派给为某人\n过滤已删除的评审意见\n过滤已关闭的评审意见\n过滤已删除项目的评审意见"; +$config->bi->builtin->metrics[] = $reviewissueMetrics; $config->bi->builtin->metrics[] = array ( diff --git a/module/block/test/zen/printassigntomeblock.php b/module/block/test/zen/printassigntomeblock.php index c8894f5810..4652646924 100644 --- a/module/block/test/zen/printassigntomeblock.php +++ b/module/block/test/zen/printassigntomeblock.php @@ -53,6 +53,7 @@ su('admin'); global $config, $tester; $config->URAndSR = 1; $config->enableER = 1; +$config->edition = 'ipd'; $block = new stdclass(); $block->params = json_decode('{"todoCount":"20","taskCount":"20","bugCount":"20","riskCount":"20","issueCount":"20","storyCount":"20","reviewCount":"20","meetingCount":"20","feedbackCount":"20"}'); From 08453e39523523c4a7df2d8a86e48bc2a731b4c6 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:52:27 +0800 Subject: [PATCH 14/17] * [perf story #75502] Add getReviewissuesBySearch method. --- module/my/model.php | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/module/my/model.php b/module/my/model.php index 2cef4aaf98..c92892645d 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -710,6 +710,55 @@ class myModel extends model return $risks; } + public function getReviewissuesBySearch(int $queryID, string $type, string $orderBy, ?object $pager = null): array + { + $queryName = $type == 'contribute' ? 'contributeReviewissueQuery' : 'workReviewissueQuery'; + if($queryID && $queryID != 'myQueryID') + { + $query = $this->loadModel('search')->getQuery($queryID); + if($query) + { + $this->session->set($queryName, $query->sql); + $this->session->set($queryName . 'Form', $query->form); + } + else + { + $this->session->set($queryName, ' 1 = 1'); + } + } + else + { + if($this->session->{$queryName} == false) $this->session->set($queryName, ' 1 = 1'); + } + + $reviewissueQuery = $this->session->{$queryName}; + + if($type == 'contribute') + { + $assignedByMe = $this->getAssignedByMe($this->app->user->account, null, 'id_desc', 'reviewissue'); + $reviewissues = $this->dao->select('*')->from(TABLE_REVIEWISSUE) + ->where($reviewissueQuery) + ->andWhere('deleted')->eq('0') + ->andWhere('createdBy',1)->eq($this->app->user->account) + ->orWhere('id')->in(array_keys($assignedByMe)) + ->markRight(1) + ->orderBy($orderBy) + ->page($pager) + ->fetchAll('id', false); + } + elseif($type == 'work') + { + $reviewissues = $this->dao->select('*')->from(TABLE_REVIEWISSUE) + ->where($reviewissueQuery) + ->andWhere('deleted')->eq('0') + ->andWhere('assignedTo')->eq($this->app->user->account) + ->orderBy($orderBy) + ->page($pager) + ->fetchAll('id', false); + } + return $reviewissues; + } + /** * 构建需求搜索表单。 * Build Story search form. From c1b26a96598528c71c498e3dfeba9e9b3b2201c1 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:53:11 +0800 Subject: [PATCH 15/17] * [perf story #75502] Add unit test for getReviewissuesBySearch method. --- module/my/model.php | 52 +------------ module/my/test/lib/my.unittest.class.php | 28 +++++++ .../my/test/model/getreviewissuesbysearch.php | 78 +++++++++++++++++++ 3 files changed, 107 insertions(+), 51 deletions(-) create mode 100755 module/my/test/model/getreviewissuesbysearch.php diff --git a/module/my/model.php b/module/my/model.php index c92892645d..2424658429 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -710,55 +710,6 @@ class myModel extends model return $risks; } - public function getReviewissuesBySearch(int $queryID, string $type, string $orderBy, ?object $pager = null): array - { - $queryName = $type == 'contribute' ? 'contributeReviewissueQuery' : 'workReviewissueQuery'; - if($queryID && $queryID != 'myQueryID') - { - $query = $this->loadModel('search')->getQuery($queryID); - if($query) - { - $this->session->set($queryName, $query->sql); - $this->session->set($queryName . 'Form', $query->form); - } - else - { - $this->session->set($queryName, ' 1 = 1'); - } - } - else - { - if($this->session->{$queryName} == false) $this->session->set($queryName, ' 1 = 1'); - } - - $reviewissueQuery = $this->session->{$queryName}; - - if($type == 'contribute') - { - $assignedByMe = $this->getAssignedByMe($this->app->user->account, null, 'id_desc', 'reviewissue'); - $reviewissues = $this->dao->select('*')->from(TABLE_REVIEWISSUE) - ->where($reviewissueQuery) - ->andWhere('deleted')->eq('0') - ->andWhere('createdBy',1)->eq($this->app->user->account) - ->orWhere('id')->in(array_keys($assignedByMe)) - ->markRight(1) - ->orderBy($orderBy) - ->page($pager) - ->fetchAll('id', false); - } - elseif($type == 'work') - { - $reviewissues = $this->dao->select('*')->from(TABLE_REVIEWISSUE) - ->where($reviewissueQuery) - ->andWhere('deleted')->eq('0') - ->andWhere('assignedTo')->eq($this->app->user->account) - ->orderBy($orderBy) - ->page($pager) - ->fetchAll('id', false); - } - return $reviewissues; - } - /** * 构建需求搜索表单。 * Build Story search form. @@ -1242,8 +1193,7 @@ class myModel extends model { if($this->config->edition != 'max' and $this->config->edition != 'ipd') return array(); - $this->loadModel('approval'); - $pendingList = $this->approval ? $this->approval->getPendingReviews('review') : array(); + $pendingList = $this->loadModel('approval')->getPendingReviews('review'); $projectReviews = $this->loadModel('review')->getByList(0, $pendingList, $orderBy); if($checkExists) return !empty($projectReviews); diff --git a/module/my/test/lib/my.unittest.class.php b/module/my/test/lib/my.unittest.class.php index 65f43a0dd8..7ff28ec4b0 100644 --- a/module/my/test/lib/my.unittest.class.php +++ b/module/my/test/lib/my.unittest.class.php @@ -317,6 +317,15 @@ class myTest return $tester->config->risk->search; } + /** + * 测试构建评审意见搜索表单。 + * Test build reviewissue search form. + * + * @param int $queryID + * @param string $actionURL + * @access public + * @return array + */ public function buildReviewissueSearchFormTest(int $queryID, string $actionURL): array { $this->objectModel->buildReviewissueSearchForm($queryID, $actionURL); @@ -345,6 +354,25 @@ class myTest return array_keys($objects); } + /** + * 通过搜索获取评审意见。 + * Get reviewissues by search. + * + * @param int $queryID + * @param string $type + * @param string $orderBy + * @access public + * @return array + */ + public function getReviewissuesBySearchTest(int $queryID, string $type, string $orderBy): array + { + $objects = $this->objectModel->getReviewissuesBySearch($queryID, $type, $orderBy , null); + + if(dao::isError()) return dao::getError(); + + return array_keys($objects); + } + /** * 测试构建需求搜索表单。 * Test build story search form. diff --git a/module/my/test/model/getreviewissuesbysearch.php b/module/my/test/model/getreviewissuesbysearch.php new file mode 100755 index 0000000000..e662a2a12f --- /dev/null +++ b/module/my/test/model/getreviewissuesbysearch.php @@ -0,0 +1,78 @@ +#!/usr/bin/env php +project->range('1'); +$reviewissue->review->range('1-5'); +$reviewissue->type->range('review'); +$reviewissue->opinionDate->range('`2025-01-01`'); +$reviewissue->resolutionDate->range('`2025-01-01`'); +$reviewissue->createdDate->range('`2025-01-01`'); +$reviewissue->assignedTo->range('admin,user1,user2'); +$reviewissue->gen(20); +zenData('userquery')->loadYaml('userquery')->gen('1'); +zenData('user')->gen('1'); + +su('admin'); + +/** + +title=测试 myModel->getReviewissuesBySearch(); +cid=1 + +- 测试通过搜索获取 query id 0 类型 work id_desc 评审意见id @19,16,13,10,7,4,1 +- 测试通过搜索获取 query id 0 类型 work id_desc 评审意见数量 @7 +- 测试通过搜索获取 query id 0 类型 work id_asc 评审意见id @1,4,7,10,13,16,19 +- 测试通过搜索获取 query id 0 类型 work id_asc 评审意见数量 @7 +- 测试通过搜索获取 query id 0 类型 contribute id_desc 评审意见id @1 +- 测试通过搜索获取 query id 0 类型 contribute id_desc 评审意见数量 @1 +- 测试通过搜索获取 query id 0 类型 contribute id_asc 评审意见id @1 +- 测试通过搜索获取 query id 0 类型 contribute id_asc 评审意见数量 @1 +- 测试通过搜索获取 query id 5 类型 work id_desc 评审意见id @19,16,13,10,7,4,1 +- 测试通过搜索获取 query id 5 类型 work id_desc 评审意见数量 @7 +- 测试通过搜索获取 query id 5 类型 work id_asc 评审意见id @1,4,7,10,13,16,19 +- 测试通过搜索获取 query id 5 类型 work id_asc 评审意见数量 @7 +- 测试通过搜索获取 query id 5 类型 contribute id_desc 评审意见id @1 +- 测试通过搜索获取 query id 5 类型 contribute id_desc 评审意见数量 @1 +- 测试通过搜索获取 query id 5 类型 contribute id_asc 评审意见id @1 +- 测试通过搜索获取 query id 5 类型 contribute id_asc 评审意见数量 @1 + +*/ + +$my = new myTest(); +$queryID = array(0, 1); +$type = array('work', 'contribute'); +$orderBy = array('id_desc', 'id_asc'); + +global $tester; +$tester->session->set('workReviewissueQuery', "`title` like '%问题%'"); +$tester->session->set('contributeReviewissueQuery', "`title` like '%问题%'"); + +$tasks1 = $my->getReviewissuesBySearchTest($queryID[0], $type[0], $orderBy[0]); +$tasks2 = $my->getReviewissuesBySearchTest($queryID[0], $type[0], $orderBy[1]); +$tasks3 = $my->getReviewissuesBySearchTest($queryID[0], $type[1], $orderBy[0]); +$tasks4 = $my->getReviewissuesBySearchTest($queryID[0], $type[1], $orderBy[1]); +$tasks5 = $my->getReviewissuesBySearchTest($queryID[1], $type[0], $orderBy[0]); +$tasks6 = $my->getReviewissuesBySearchTest($queryID[1], $type[0], $orderBy[1]); +$tasks7 = $my->getReviewissuesBySearchTest($queryID[1], $type[1], $orderBy[0]); +$tasks8 = $my->getReviewissuesBySearchTest($queryID[1], $type[1], $orderBy[1]); + +r(implode(',', $tasks1)) && p() && e('19,16,13,10,7,4,1'); // 测试通过搜索获取 query id 0 类型 work id_desc 评审意见id +r(count($tasks1)) && p() && e('7'); // 测试通过搜索获取 query id 0 类型 work id_desc 评审意见数量 +r(implode(',', $tasks2)) && p() && e('1,4,7,10,13,16,19'); // 测试通过搜索获取 query id 0 类型 work id_asc 评审意见id +r(count($tasks2)) && p() && e('7'); // 测试通过搜索获取 query id 0 类型 work id_asc 评审意见数量 +r(implode(',', $tasks3)) && p() && e('1'); // 测试通过搜索获取 query id 0 类型 contribute id_desc 评审意见id +r(count($tasks3)) && p() && e('1'); // 测试通过搜索获取 query id 0 类型 contribute id_desc 评审意见数量 +r(implode(',', $tasks4)) && p() && e('1'); // 测试通过搜索获取 query id 0 类型 contribute id_asc 评审意见id +r(count($tasks4)) && p() && e('1'); // 测试通过搜索获取 query id 0 类型 contribute id_asc 评审意见数量 +r(implode(',', $tasks5)) && p() && e('19,16,13,10,7,4,1'); // 测试通过搜索获取 query id 5 类型 work id_desc 评审意见id +r(count($tasks5)) && p() && e('7'); // 测试通过搜索获取 query id 5 类型 work id_desc 评审意见数量 +r(implode(',', $tasks6)) && p() && e('1,4,7,10,13,16,19'); // 测试通过搜索获取 query id 5 类型 work id_asc 评审意见id +r(count($tasks6)) && p() && e('7'); // 测试通过搜索获取 query id 5 类型 work id_asc 评审意见数量 +r(implode(',', $tasks7)) && p() && e('1'); // 测试通过搜索获取 query id 5 类型 contribute id_desc 评审意见id +r(count($tasks7)) && p() && e('1'); // 测试通过搜索获取 query id 5 类型 contribute id_desc 评审意见数量 +r(implode(',', $tasks8)) && p() && e('1'); // 测试通过搜索获取 query id 5 类型 contribute id_asc 评审意见id +r(count($tasks8)) && p() && e('1'); // 测试通过搜索获取 query id 5 类型 contribute id_asc 评审意见数量 From 34c224b2dfa06bbd49626ca14315650cf986f0f0 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 15:53:59 +0800 Subject: [PATCH 16/17] * [perf story #75502] Add zen unit test for showworkcount. --- module/my/test/lib/myzen.unittest.class.php | 40 +++++++++++ module/my/test/zen/showworkcount.php | 74 +++++++++++++++++++++ module/my/zen.php | 12 +++- 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 module/my/test/lib/myzen.unittest.class.php create mode 100644 module/my/test/zen/showworkcount.php diff --git a/module/my/test/lib/myzen.unittest.class.php b/module/my/test/lib/myzen.unittest.class.php new file mode 100644 index 0000000000..987f7a48ef --- /dev/null +++ b/module/my/test/lib/myzen.unittest.class.php @@ -0,0 +1,40 @@ +tester = $tester; + $tester->app->setModuleName('my'); + $this->objectModel = $tester->loadModel('my'); + + $this->myZenTest = initReference('my'); + } + + /** + * 获取批量创建需求的表单字段。 + * Get form fields for batch create. + * + * @param int $recTotal + * @param string $recPerPage + * @param string $pageID + * @access public + * @return array + */ + public function showWorkCountTest(int $recTotal = 0, int $recPerPage = 20, int $pageID = 1): array + { + global $tester; + $tester->app->rawModule = 'my'; + $tester->app->rawMethod = 'work'; + + $method = $this->myZenTest->getMethod('showWorkCount'); + $method->setAccessible(true); + + $count = $method->invokeArgs($this->myZenTest->newInstance(), [$recTotal, $recPerPage, $pageID]); + + if(dao::isError()) return dao::getError(); + return $count; + } +} diff --git a/module/my/test/zen/showworkcount.php b/module/my/test/zen/showworkcount.php new file mode 100644 index 0000000000..2e7e2ba5a1 --- /dev/null +++ b/module/my/test/zen/showworkcount.php @@ -0,0 +1,74 @@ +#!/usr/bin/env php +gen(10); +$story = zenData('story'); +$story->type->range('story,requirement,epic'); +$story->gen(30); +zenData('bug')->gen(10); +zenData('case')->gen(10); +zenData('testtask')->gen(10); +zenData('risk')->gen(10); +$reviewissue = zenData('reviewissue'); +$reviewissue->project->range('1'); +$reviewissue->review->range('1-5'); +$reviewissue->type->range('review'); +$reviewissue->opinionDate->range('`2025-01-01`'); +$reviewissue->resolutionDate->range('`2025-01-01`'); +$reviewissue->createdDate->range('`2025-01-01`'); +$reviewissue->gen(5); +zenData('nc')->gen(0); +zenData('auditplan')->gen(10); +zenData('meeting')->gen(10); +zenData('feedback')->gen(10); +zenData('ticket')->gen(10); +zenData('demand')->gen(10); +su('admin'); + +global $config; +$config->URAndSR = 1; +$config->enableER = 1; +$config->edition = 'ipd'; + +$myTester = new myZenTest(); +$count = $myTester->showWorkCountTest(0, 20, 1); +r(count($count)) && p() && e('14'); +r($count['task']) && p() && e('0'); +r($count['story']) && p() && e('2'); +r($count['bug']) && p() && e('10'); +r($count['case']) && p() && e('3'); +r($count['testtask']) && p() && e('0'); +r($count['requirement']) && p() && e('2'); +r($count['epic']) && p() && e('1'); +r($count['issue']) && p() && e('0'); +r($count['risk']) && p() && e('2'); +r($count['reviewissue']) && p() && e('0'); +r($count['qa']) && p() && e('0'); +r($count['meeting']) && p() && e('0'); +r($count['ticket']) && p() && e('0'); +r($count['feedback']) && p() && e('0'); \ No newline at end of file diff --git a/module/my/zen.php b/module/my/zen.php index 96dd4528c0..17ad403cd7 100644 --- a/module/my/zen.php +++ b/module/my/zen.php @@ -162,16 +162,16 @@ class myZen extends my * @param int $recPerPage * @param int $pageID * @access public - * @return void + * @return array */ - public function showWorkCount(int $recTotal = 0, int $recPerPage = 20, int $pageID = 1): void + public function showWorkCount(int $recTotal = 0, int $recPerPage = 20, int $pageID = 1): array { /* Load pager. */ $this->app->loadClass('pager', true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $pager = pager::init($recTotal, $recPerPage, $pageID); - $count = array('task' => 0, 'story' => 0, 'bug' => 0, 'case' => 0, 'testtask' => 0, 'requirement' => 0, 'issue' => 0, 'risk' => 0, 'qa' => 0, 'meeting' => 0, 'ticket' => 0, 'feedback' => 0); + $count = array('task' => 0, 'story' => 0, 'bug' => 0, 'case' => 0, 'testtask' => 0, 'requirement' => 0, 'epic' => 0, 'issue' => 0, 'risk' => 0, 'reviewissue' => 0, 'qa' => 0, 'meeting' => 0, 'ticket' => 0, 'feedback' => 0); /* Get the number of tasks assigned to me. */ $this->loadModel('task')->getUserTasks($this->app->user->account, 'assignedTo', 0, $pager); @@ -233,6 +233,7 @@ class myZen extends my $this->view->todoCount = $count; $this->view->isOpenedURAndSR = $isOpenedURAndSR; + return $count; } /** @@ -275,6 +276,11 @@ class myZen extends my $this->loadModel('risk')->getUserRisks('assignedTo', $this->app->user->account, 'id_desc', $pager); $count['risk'] = $pager->recTotal; + /* Get the number of reviewissues assigned to me. */ + $pager->recTotal = 0; + $issues = $this->loadModel('reviewissue')->getUserReviewissues('assignedTo', $this->app->user->account, 'id_desc', $pager); + $count['reviewissue'] = $pager->recTotal; + /* Get the number of nc assigned to me. */ $pager->recTotal = 0; $this->my->getNcList('assignedToMe', 'id_desc', $pager, 'active'); From 62912c5c668ba263164a4e5d9ebb783435fd3a90 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Sep 2025 16:10:50 +0800 Subject: [PATCH 17/17] * [perf story #75502] Add zen unit test showworkcountnotinopen. --- module/my/test/lib/myzen.unittest.class.php | 29 +++++++- module/my/test/zen/showworkcountnotinopen.php | 72 +++++++++++++++++++ module/my/zen.php | 2 +- 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 module/my/test/zen/showworkcountnotinopen.php diff --git a/module/my/test/lib/myzen.unittest.class.php b/module/my/test/lib/myzen.unittest.class.php index 987f7a48ef..fc7a4ef2af 100644 --- a/module/my/test/lib/myzen.unittest.class.php +++ b/module/my/test/lib/myzen.unittest.class.php @@ -14,8 +14,8 @@ class myZenTest } /** - * 获取批量创建需求的表单字段。 - * Get form fields for batch create. + * 获取待处理各项数据。 + * Get work count. * * @param int $recTotal * @param string $recPerPage @@ -37,4 +37,29 @@ class myZenTest if(dao::isError()) return dao::getError(); return $count; } + + /** + * 获取收费版待处理各项数据。 + * Get work count not in open edition. + * + * @param int $recTotal + * @param string $recPerPage + * @param string $pageID + * @access public + * @return array + */ + public function showWorkCountNotInOpenTest(object $pager): array + { + global $tester; + $tester->app->rawModule = 'my'; + $tester->app->rawMethod = 'work'; + + $method = $this->myZenTest->getMethod('showWorkCountNotInOpen'); + $method->setAccessible(true); + + $count = $method->invokeArgs($this->myZenTest->newInstance(), [array(), $pager]); + + if(dao::isError()) return dao::getError(); + return $count; + } } diff --git a/module/my/test/zen/showworkcountnotinopen.php b/module/my/test/zen/showworkcountnotinopen.php new file mode 100644 index 0000000000..7345f3a65f --- /dev/null +++ b/module/my/test/zen/showworkcountnotinopen.php @@ -0,0 +1,72 @@ +#!/usr/bin/env php +gen(10); +$story = zenData('story'); +$story->type->range('story,requirement,epic'); +$story->gen(30); +zenData('bug')->gen(10); +zenData('case')->gen(10); +zenData('testtask')->gen(10); +zenData('risk')->gen(10); +$reviewissue = zenData('reviewissue'); +$reviewissue->project->range('1'); +$reviewissue->review->range('1-5'); +$reviewissue->type->range('review'); +$reviewissue->opinionDate->range('`2025-01-01`'); +$reviewissue->resolutionDate->range('`2025-01-01`'); +$reviewissue->createdDate->range('`2025-01-01`'); +$reviewissue->gen(5); +zenData('nc')->gen(0); +zenData('auditplan')->gen(10); +zenData('meeting')->gen(10); +zenData('feedback')->gen(10); +zenData('ticket')->gen(10); +zenData('demand')->gen(10); +su('admin'); + +global $config, $tester; +$config->URAndSR = 1; +$config->enableER = 1; +$config->edition = 'ipd'; + +$tester->app->rawModule = 'my'; +$tester->app->rawMethod = 'work'; +$tester->app->loadClass('pager', true); +$pager = pager::init(0, 10, 1); + +$myTester = new myZenTest(); +$count = $myTester->showWorkCountNotInOpenTest($pager); +r(count($count)) && p() && e('7'); +r($count['issue']) && p() && e('0'); +r($count['risk']) && p() && e('1'); +r($count['reviewissue']) && p() && e('0'); +r($count['qa']) && p() && e('0'); +r($count['meeting']) && p() && e('0'); +r($count['ticket']) && p() && e('0'); +r($count['feedback']) && p() && e('0'); \ No newline at end of file diff --git a/module/my/zen.php b/module/my/zen.php index 17ad403cd7..72914f487d 100644 --- a/module/my/zen.php +++ b/module/my/zen.php @@ -278,7 +278,7 @@ class myZen extends my /* Get the number of reviewissues assigned to me. */ $pager->recTotal = 0; - $issues = $this->loadModel('reviewissue')->getUserReviewissues('assignedTo', $this->app->user->account, 'id_desc', $pager); + $this->loadModel('reviewissue')->getUserReviewissues('assignedTo', $this->app->user->account, 'id_desc', $pager); $count['reviewissue'] = $pager->recTotal; /* Get the number of nc assigned to me. */