diff --git a/module/program/model.php b/module/program/model.php index 6c490b7015..ae3aae418b 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -607,31 +607,33 @@ class programModel extends model } /** + * 获取项目列表数据。 * Get project list data. * - * @param int $programID - * @param string $browseType - * @param string $queryID - * @param string $orderBy - * @param object $pager - * @param int $programTitle - * @param int $involved - * @param bool $queryAll + * @param int $programID + * @param string $browseType all|wait|undone|doing|suspended|closed|bysearch|review + * @param string $queryID + * @param string $orderBy + * @param object|null $pager + * @param string $programTitle 0|base|end + * @param int $involved + * @param bool $queryAll * @access public - * @return object + * @return object[] */ - public function getProjectList($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0, $queryAll = false) + public function getProjectList(int $programID = 0, string $browseType = 'all', int $queryID = 0, string $orderBy = 'id_desc', object|null $pager = null, string $programTitle = '', int $involved = 0, bool $queryAll = false): array { $path = ''; - if($programID) + if($programID) $path = $this->getByID($programID)->path; + + /* Get query project SQL. */ + $query = ''; + if($browseType == 'bysearch') { - $program = $this->getByID($programID); - $path = $program->path; + $this->loadModel('search')->setQuery('project', $queryID); + $query = str_replace('`id`','t1.id', $this->session->projectQuery); } - $this->loadModel('search')->setQuery('project', $queryID); - - $query = str_replace('`id`','t1.id', $this->session->projectQuery); $projectList = $this->dao->select('DISTINCT t1.*')->from(TABLE_PROJECT)->alias('t1') ->leftJoin(TABLE_TEAM)->alias('t2')->on('t1.id=t2.root') ->leftJoin(TABLE_STAKEHOLDER)->alias('t3')->on('t1.id=t3.objectID') @@ -663,21 +665,34 @@ class programModel extends model ->fetchAll('id'); /* Determine how to display the name of the program. */ - if($programTitle and $this->config->systemMode == 'ALM') + if($programTitle and $this->config->systemMode == 'ALM') $projectList = $this->batchProcessProgramName($projectList, $programTitle, $programID); + return $projectList; + } + + /** + * 批量处理项目所属的项目集名称 + * Batch the name of the program to which the project belongs. + * + * @param array $projectList + * @param string $programTitle + * @param int $programID + * @access public + * @return object[] + */ + public function batchProcessProgramName(array $projectList, string $programTitle = '', int $programID = 0): array + { + $programList = $this->getPairs(); + foreach($projectList as $id => $project) { - $programList = $this->getPairs(); - foreach($projectList as $id => $project) - { - $path = explode(',', $project->path); - $path = array_filter($path); - array_pop($path); - $programID = $programTitle == 'base' ? current($path) : end($path); - if(empty($path) || $programID == $id) continue; + $path = explode(',', $project->path); + $path = array_filter($path); + array_pop($path); + $programID = $programTitle == 'base' ? current($path) : end($path); + if(empty($path) || $programID == $id) continue; - $programName = isset($programList[$programID]) ? $programList[$programID] : ''; + $programName = isset($programList[$programID]) ? $programList[$programID] : ''; - if($programName) $projectList[$id]->name = $programName . '/' . $projectList[$id]->name; - } + if($programName) $projectList[$id]->name = $programName . '/' . $projectList[$id]->name; } return $projectList; } @@ -1530,20 +1545,21 @@ class programModel extends model } /** - * Get project stats. + * 获取项目统计数据。 + * Get project stats data. * - * @param int $programID - * @param string $browseType - * @param int $queryID - * @param string $orderBy - * @param object $pager - * @param string $programTitle - * @param int $involved - * @param bool $queryAll + * @param int $programID + * @param string $browseType + * @param int $queryID + * @param string $orderBy + * @param object|null $pager + * @param string $programTitle + * @param int $involved + * @param bool $queryAll * @access public * @return array */ - public function getProjectStats($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0, $queryAll = false) + public function getProjectStats(int $programID = 0, string $browseType = 'undone', int $queryID = 0, string $orderBy = 'id_desc', object|null $pager = null, string $programTitle = '', int $involved = 0, bool $queryAll = false) { if(commonModel::isTutorialMode()) return $this->loadModel('tutorial')->getProjectStats($browseType); @@ -1552,13 +1568,7 @@ class programModel extends model if(empty($projects)) return array(); $projectKeys = array_keys($projects); - $leftTasks = array(); - - $executions = $this->dao->select('id')->from(TABLE_EXECUTION) - ->where('deleted')->eq(0) - ->andWhere('project')->in($projectKeys) - ->andWhere('type')->in('sprint,stage,kanban') - ->fetchAll('id'); + $executions = $this->loadModel('project')->getExecutionList($projectKeys); /* Get all tasks and compute totalEstimate, totalConsumed, totalLeft, progress according to them. */ $tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason, execution') @@ -1571,6 +1581,7 @@ class programModel extends model $hours = $this->computeProjectHours($tasks); /* Get the number of left tasks. */ + $leftTasks = array(); if($this->cookie->projectType and $this->cookie->projectType == 'bycard') { $leftTasks = $this->dao->select('t2.parent as project, count(*) as tasks')->from(TABLE_TASK)->alias('t1') @@ -1590,8 +1601,7 @@ class programModel extends model ->fetchGroup('root', 'account'); $stats = $this->appendStatToProjects($projects, 'hours,teamCount,teamMembers,leftTasks', array('hours' => $hours, 'teams' => $teamMembers, 'leftTasks' => $leftTasks)); - /* Convert predefined HTML entities to characters. */ - foreach($stats as $project) $project->name = htmlspecialchars_decode($project->name, ENT_QUOTES); + foreach($stats as $project) $project->name = htmlspecialchars_decode($project->name, ENT_QUOTES); // Convert predefined HTML entities to characters. return $stats; } diff --git a/module/program/test/model/appendstattoprojects.php b/module/program/test/model/appendstattoprojects.php index ce1e434ad4..4dd3e459bc 100755 --- a/module/program/test/model/appendstattoprojects.php +++ b/module/program/test/model/appendstattoprojects.php @@ -2,6 +2,9 @@ gen(5); +su('admin'); + zdTable('project')->gen(50); $task = zdTable('task'); @@ -10,9 +13,9 @@ $task->gen(100); /** -title=测试 programModel::create(); +title=测试 programModel::appendStatToProjects(); +timeout=0 cid=1 -pid=1 */ @@ -60,4 +63,3 @@ r(isset($stat->hours)) && p() && e('1'); //正常传入数据,检查hour r(isset($stat->teamCount)) && p() && e('1'); //正常传入数据,检查teamCount字段 r(isset($stat->teamMembers)) && p() && e('1'); //正常传入数据,检查teamMembers字段 r(isset($stat->leftTasks)) && p() && e('1'); //正常传入数据,检查leftTasks字段 - diff --git a/module/program/test/model/batchprocessprogramname.php b/module/program/test/model/batchprocessprogramname.php new file mode 100644 index 0000000000..ee017d17d7 --- /dev/null +++ b/module/program/test/model/batchprocessprogramname.php @@ -0,0 +1,51 @@ +#!/usr/bin/env php +id->range('1-5'); +$program->name->range('项目集1,项目集2,项目1,项目2,项目3'); +$program->type->range('program{2},project{3}'); +$program->status->range('doing{3},closed,doing'); +$program->parent->range('0,0,1,1,2'); +$program->grade->range('1{2},2{3}'); +$program->path->range('1,2,`1,3`,`1,4`,`2,5`')->prefix(',')->postfix(','); +$program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD'); +$program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); +$program->gen(5); + +$team = zdTable('team'); +$team->id->range('1-5'); +$team->root->range('3-5'); +$team->type->range('project'); +$team->account->range('admin'); +$team->account->setFields(array( + array('field' => 'account1', 'range' => 'admin,user{4}'), + array('field' => 'account2', 'range' => '[],1-4'), +)); +$team->gen(5); + +zdTable('user')->gen(5); + +su('admin'); + +/** + +title=测试 programModel::batchProcessProgramName(); +timeout=0 +cid=1 + +*/ + +$programTester = new programTest(); + +$allProjects = $programTester->getProjectListTest(0); +$undoneProjects = $programTester->getProjectListTest(0, 'undone'); +$withProgramProjects = $programTester->getProjectListTest(0, 'undone', 0, 'id_desc', null, 1); +$involvedProjects = $programTester->getProjectListTest(0, 'undone', 0, 'id_desc', null, 1, true); + +r($programTester->program->batchProcessProgramName($allProjects)) && p('3:name') && e('项目集1/项目1'); // 测试处理所有项目 +r($programTester->program->batchProcessProgramName($undoneProjects)) && p('3:name') && e('项目集1/项目1'); // 测试处理未关闭项目 +r($programTester->program->batchProcessProgramName($withProgramProjects)) && p('3:name') && e('项目集1/项目集1/项目1'); // 测试处理有项目集项目 +r($programTester->program->batchProcessProgramName($involvedProjects)) && p('3:name') && e('项目集1/项目集1/项目1'); // 测试处理我参与项目 diff --git a/module/program/test/model/computeprojecthours.php b/module/program/test/model/computeprojecthours.php index 922a352cf4..13cc1e2fd4 100755 --- a/module/program/test/model/computeprojecthours.php +++ b/module/program/test/model/computeprojecthours.php @@ -2,6 +2,9 @@ gen(5); +su('admin'); + zdTable('project')->gen(50); $task = zdTable('task'); @@ -10,9 +13,9 @@ $task->gen(100); /** -title=测试 programModel::create(); +title=测试 programModel::computeProjectHours(); +timeout=0 cid=1 -pid=1 */ @@ -25,7 +28,5 @@ $tasks = $tester->program->dao->select('id, project, estimate, consumed, `left`, ->andWhere('deleted')->eq(0) ->fetchGroup('project', 'id'); -$hours = $tester->program->computeProjectHours($tasks); - -r($tester->program->computeProjectHours(array())) && p() && e('0'); +r($tester->program->computeProjectHours(array())) && p() && e('0'); r($tester->program->computeProjectHours($tasks)) && p('11:totalConsumed,totalEstimate,totalLeft,progress') && e('15,30,10,60'); diff --git a/module/program/test/model/getprojectlist.php b/module/program/test/model/getprojectlist.php index 81842d7dab..fd64e075b4 100755 --- a/module/program/test/model/getprojectlist.php +++ b/module/program/test/model/getprojectlist.php @@ -4,16 +4,16 @@ include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/program.class.php'; $program = zdTable('project'); -$program->id->range('1-5'); -$program->name->range('项目集1,项目集2,项目1,项目2,项目3'); -$program->type->range('program{2},project{3}'); -$program->status->range('doing{3},closed,doing'); -$program->parent->range('0,0,1,1,2'); -$program->grade->range('1{2},2{3}'); -$program->path->range('1,2,`1,3`,`1,4`,`2,5`')->prefix(',')->postfix(','); +$program->id->range('1-8'); +$program->name->range('项目集1,项目集2,项目1,项目2,项目3,项目4,项目5,项目6'); +$program->type->range('program{2},project{6}'); +$program->status->range('doing{3},closed,doing,closed,suspended,wait'); +$program->parent->range('0,0,1,1,2,1{3}'); +$program->grade->range('1{2},2{6}'); +$program->path->range('1,2,`1,3`,`1,4`,`2,5`,`1,6`,`1,7`,`1,8`')->prefix(',')->postfix(','); $program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD'); $program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); -$program->gen(5); +$program->gen(8); $team = zdTable('team'); $team->id->range('1-5'); @@ -26,37 +26,70 @@ $team->account->setFields(array( )); $team->gen(5); -zdTable('user')->gen(5); +$userquery = zdTable('userquery'); +$userquery->id->range(1); +$userquery->account->range('admin'); +$userquery->module->range('project'); +$userquery->title->range('搜索进行中的项目'); +$userquery->sql->range("`(( 1 AND `status` = 'doing' ))`"); +$userquery->form->range('``'); +$userquery->gen(1); +zdTable('user')->gen(5); su('admin'); /** title=测试 programModel::getProjectList(); +timeout=0 cid=1 -pid=1 - -获取所有项目列表数量 >> 3 -获取未完成项目列表数量 >> 2 -带项目集名称的项目列表数量 >> 2 -获取我参与的项目列表数量 >> 1 -不带项目集名称的项目名称 >> 项目2 -带项目集名称的项目名称 >> 项目集2/项目3 -我参与的项目的名称 >> 项目集1/项目1 */ -$programTester = new programTest(); +global $tester; +$programTester = $tester->loadModel('program'); -$allProjects = $programTester->getProjectListTest(0); -$undoneProjects = $programTester->getProjectListTest(0, 'undone'); -$withProgramProjects = $programTester->getProjectListTest(0, 'undone', 0, 'id_desc', null, 1); -$involvedProjects = $programTester->getProjectListTest(0, 'undone', 0, 'id_desc', null, 1, true); +$allProjects = $programTester->getProjectList(0); +$undoneProjects = $programTester->getProjectList(0, 'undone'); +$sortProjects = $programTester->getProjectList(0, 'undone'); +$withProgramProjects = $programTester->getProjectList(0, 'undone', 0, 'begin_desc', null, 'end'); +$withBaseProgramProjects = $programTester->getProjectList(0, 'undone', 0, 'begin_desc', null, 'base'); +$involvedProjects = $programTester->getProjectList(0, 'undone', 0, 'id_desc', null, 'end', true); +$queryAllProjects = $programTester->getProjectList(0, 'undone', 0, 'id_desc', null, 'end', true, true); +$programAllProjects = $programTester->getProjectList(1, 'all'); +$programWaitProjects = $programTester->getProjectList(1, 'wait'); +$programUndoneProjects = $programTester->getProjectList(1, 'undone'); +$programDoingProjects = $programTester->getProjectList(1, 'doing'); +$programSuspendedProjects = $programTester->getProjectList(1, 'suspended'); +$programClosedProjects = $programTester->getProjectList(1, 'closed'); +$programSearchProjects = $programTester->getProjectList(1, 'bysearch', 1); -r(count($allProjects)) && p() && e('3'); // 获取所有项目列表数量 -r(count($undoneProjects)) && p() && e('2'); // 获取未完成项目列表数量 -r(count($withProgramProjects)) && p() && e('2'); // 带项目集名称的项目列表数量 -r(count($involvedProjects)) && p() && e('1'); // 获取我参与的项目列表数量 -r($allProjects) && p('4:name') && e('项目2'); // 不带项目集名称的项目名称 -r($withProgramProjects) && p('5:name') && e('项目集2/项目3'); // 带项目集名称的项目名称 -r($involvedProjects) && p('3:name') && e('项目集1/项目1'); // 我参与的项目的名称 +r(count($allProjects)) && p() && e('6'); // 获取所有项目列表数量 +r(count($undoneProjects)) && p() && e('3'); // 获取未完成项目列表数量 +r(count($sortProjects)) && p() && e('3'); // 获取按照开始日期倒序排列的项目列表数量 +r(count($withProgramProjects)) && p() && e('3'); // 带项目集名称的项目列表数量 +r(count($withBaseProgramProjects)) && p() && e('3'); // 带项目集名称的项目列表数量 +r(count($involvedProjects)) && p() && e('1'); // 获取我参与的项目列表数量 +r(count($queryAllProjects)) && p() && e('1'); // 获取数据库所有项目列表数量 +r(count($programAllProjects)) && p() && e('5'); // 获取项目集1下全部项目的数量 +r(count($programWaitProjects)) && p() && e('1'); // 获取项目集1下未开始项目的数量 +r(count($programUndoneProjects)) && p() && e('2'); // 获取项目集1下未关闭项目的数量 +r(count($programDoingProjects)) && p() && e('1'); // 获取项目集1下进行中项目的数量 +r(count($programSuspendedProjects)) && p() && e('1'); // 获取项目集1下已暂停项目的数量 +r(count($programClosedProjects)) && p() && e('2'); // 获取项目集1下已关闭项目的数量 +r(count($programSearchProjects)) && p() && e('1'); // 获取项目集1下进行中项目的数量 + +r($allProjects) && p('4:name') && e('项目2'); // 不带项目集名称的项目名称 +r($undoneProjects) && p('8:name') && e('项目6'); // 获取未完成项目名称 +r($sortProjects) && p('8:name') && e('项目6'); // 获取按照开始日期倒序排列的项目名称 +r($withProgramProjects) && p('5:name') && e('项目集2/项目3'); // 带项目集名称的项目名称 +r($withBaseProgramProjects) && p('5:name') && e('项目集2/项目3'); // 带项目集名称的项目名称 +r($involvedProjects) && p('3:name') && e('项目集1/项目1'); // 我参与的项目的名称 +r($queryAllProjects) && p('3:name') && e('项目集1/项目1'); // 获取数据库所有项目的名称 +r($programAllProjects) && p('3:name') && e('项目1'); // 获取项目集1下全部项目的名称 +r($programWaitProjects) && p('8:name') && e('项目6'); // 获取项目集1下未开始项目的名称 +r($programUndoneProjects) && p('3:name') && e('项目1'); // 获取项目集1下未关闭项目的名称 +r($programDoingProjects) && p('3:name') && e('项目1'); // 获取项目集1下进行中项目的名称 +r($programSuspendedProjects) && p('7:name') && e('项目5'); // 获取项目集1下已暂停项目的名称 +r($programClosedProjects) && p('4:name') && e('项目2'); // 获取项目集1下已关闭项目的名称 +r($programSearchProjects) && p('3:name') && e('项目1'); // 获取项目集1下进行中项目的名称 diff --git a/module/program/test/model/getprojectstats.php b/module/program/test/model/getprojectstats.php index f6a8cd348d..a3d0810716 100755 --- a/module/program/test/model/getprojectstats.php +++ b/module/program/test/model/getprojectstats.php @@ -2,39 +2,94 @@ id->range('1-5'); -$program->name->range('项目集1,项目集2,项目1,项目2,项目3'); -$program->type->range('program{2},project{3}'); -$program->status->range('doing{3},closed,doing'); -$program->parent->range('0,0,1,1,2'); -$program->grade->range('1{2},2{3}'); -$program->path->range('1,2,`1,3`,`1,4`,`2,5`')->prefix(',')->postfix(','); +$program->id->range('1-8'); +$program->name->range('项目集1,项目集2,项目1,项目2,项目3,项目4,项目5,项目6'); +$program->type->range('program{2},project{6}'); +$program->status->range('doing{3},closed,doing,closed,suspended,wait'); +$program->parent->range('0,0,1,1,2,1{3}'); +$program->grade->range('1{2},2{6}'); +$program->path->range('1,2,`1,3`,`1,4`,`2,5`,`1,6`,`1,7`,`1,8`')->prefix(',')->postfix(','); $program->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD'); $program->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); -$program->gen(5); +$program->gen(8); + +$team = zdTable('team'); +$team->id->range('1-5'); +$team->root->range('3-5'); +$team->type->range('project'); +$team->account->range('admin'); +$team->account->setFields(array( + array('field' => 'account1', 'range' => 'admin,user{4}'), + array('field' => 'account2', 'range' => '[],1-4'), +)); +$team->gen(5); + +$userquery = zdTable('userquery'); +$userquery->id->range(1); +$userquery->account->range('admin'); +$userquery->module->range('project'); +$userquery->title->range('搜索进行中的项目'); +$userquery->sql->range("`(( 1 AND `status` = 'doing' ))`"); +$userquery->form->range('``'); +$userquery->gen(1); + +zdTable('user')->gen(5); +su('admin'); /** title=测试 programModel::getProjectStats(); +timeout=0 cid=1 -pid=1 - -查看当前项目集下所有未完成的项目的个数 >> 1 -查看当前项目集下所有未完成的项目的个数 >> 1 -查看当前项目集下所有未完成的项目按照id倒序排的第一个项目集信息 >> 3,项目1 -查看当前项目集下所有未完成的项目按照id正序排的第一个项目集信息 >> 5,项目3 */ -$programTester = new programTest(); +global $tester; +$programTester = $tester->loadModel('program'); -$stats1 = $programTester->getProjectStatsTest(1); -$stats2 = $programTester->getProjectStatsTest(2, 'undone', 0, 'id_asc', null); +$allProjects = $programTester->getProjectStats(0); +$undoneProjects = $programTester->getProjectStats(0, 'undone'); +$sortProjects = $programTester->getProjectStats(0, 'undone'); +$withProgramProjects = $programTester->getProjectStats(0, 'undone', 0, 'begin_desc', null, 'end'); +$withBaseProgramProjects = $programTester->getProjectStats(0, 'undone', 0, 'begin_desc', null, 'base'); +$involvedProjects = $programTester->getProjectStats(0, 'undone', 0, 'id_desc', null, 'end', true); +$queryAllProjects = $programTester->getProjectStats(0, 'undone', 0, 'id_desc', null, 'end', true, true); +$programAllProjects = $programTester->getProjectStats(1, 'all'); +$programWaitProjects = $programTester->getProjectStats(1, 'wait'); +$programUndoneProjects = $programTester->getProjectStats(1, 'undone'); +$programDoingProjects = $programTester->getProjectStats(1, 'doing'); +$programSuspendedProjects = $programTester->getProjectStats(1, 'suspended'); +$programClosedProjects = $programTester->getProjectStats(1, 'closed'); +$programSearchProjects = $programTester->getProjectStats(1, 'bysearch', 1); -r(count($stats1)) && p() && e('1'); // 查看当前项目集下所有未完成的项目的个数 -r(count($stats2)) && p() && e('1'); // 查看当前项目集下所有未完成的项目的个数 -r(current($stats1)) && p('id,name') && e('3,项目1'); // 查看当前项目集下所有未完成的项目按照id倒序排的第一个项目集信息 -r(current($stats2)) && p('id,name') && e('5,项目3'); // 查看当前项目集下所有未完成的项目按照id正序排的第一个项目集信息 +r(count($allProjects)) && p() && e('3'); // 获取所有项目列表数量 +r(count($undoneProjects)) && p() && e('3'); // 获取未完成项目列表数量 +r(count($sortProjects)) && p() && e('3'); // 获取按照开始日期倒序排列的项目列表数量 +r(count($withProgramProjects)) && p() && e('3'); // 带项目集名称的项目列表数量 +r(count($withBaseProgramProjects)) && p() && e('3'); // 带项目集名称的项目列表数量 +r(count($involvedProjects)) && p() && e('1'); // 获取我参与的项目列表数量 +r(count($queryAllProjects)) && p() && e('1'); // 获取数据库所有项目列表数量 +r(count($programAllProjects)) && p() && e('5'); // 获取项目集1下全部项目的数量 +r(count($programWaitProjects)) && p() && e('1'); // 获取项目集1下未开始项目的数量 +r(count($programUndoneProjects)) && p() && e('2'); // 获取项目集1下未关闭项目的数量 +r(count($programDoingProjects)) && p() && e('1'); // 获取项目集1下进行中项目的数量 +r(count($programSuspendedProjects)) && p() && e('1'); // 获取项目集1下已暂停项目的数量 +r(count($programClosedProjects)) && p() && e('2'); // 获取项目集1下已关闭项目的数量 +r(count($programSearchProjects)) && p() && e('1'); // 获取项目集1下进行中项目的数量 + +r($allProjects) && p('8:name') && e('项目6'); // 不带项目集名称的项目名称 +r($undoneProjects) && p('8:name') && e('项目6'); // 获取未完成项目名称 +r($sortProjects) && p('8:name') && e('项目6'); // 获取按照开始日期倒序排列的项目名称 +r($withProgramProjects) && p('5:name') && e('项目集2/项目3'); // 带项目集名称的项目名称 +r($withBaseProgramProjects) && p('5:name') && e('项目集2/项目3'); // 带项目集名称的项目名称 +r($involvedProjects) && p('3:name') && e('项目集1/项目1'); // 我参与的项目的名称 +r($queryAllProjects) && p('3:name') && e('项目集1/项目1'); // 获取数据库所有项目的名称 +r($programAllProjects) && p('3:name') && e('项目1'); // 获取项目集1下全部项目的名称 +r($programWaitProjects) && p('8:name') && e('项目6'); // 获取项目集1下未开始项目的名称 +r($programUndoneProjects) && p('3:name') && e('项目1'); // 获取项目集1下未关闭项目的名称 +r($programDoingProjects) && p('3:name') && e('项目1'); // 获取项目集1下进行中项目的名称 +r($programSuspendedProjects) && p('7:name') && e('项目5'); // 获取项目集1下已暂停项目的名称 +r($programClosedProjects) && p('4:name') && e('项目2'); // 获取项目集1下已关闭项目的名称 +r($programSearchProjects) && p('3:name') && e('项目1'); // 获取项目集1下进行中项目的名称 diff --git a/module/program/test/program.class.php b/module/program/test/program.class.php index 2871829ce6..9452320a8e 100644 --- a/module/program/test/program.class.php +++ b/module/program/test/program.class.php @@ -345,40 +345,6 @@ class programTest return $this->program->getTeamMemberPairs($programID); } - /** - * Get project stats. - * - * @param int $programID - * @param string $browseType - * @param int $queryID - * @param string $orderBy - * @param object $pager - * @access public - * @return array - */ - public function getProjectStatsTest($programID = 0, $browseType = 'undone', $queryID = 0, $orderBy = 'id_desc', $pager = null) - { - return $this->program->getProjectStats($programID, $browseType, $queryID, $orderBy, $pager); - } - - /** - * Get project list. - * - * @param int $programID - * @param string $browseType - * @param int $queryID - * @param string $orderBy - * @param int $pager - * @param int $programTitle - * @param int $involved - * @access public - * @return array - */ - public function getProjectListTest($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $programTitle = 0, $involved = 0) - { - return $this->program->getProjectList($programID, $browseType, $queryID, $orderBy, $pager, $programTitle, $involved); - } - /** * Get progress list. * diff --git a/module/project/model.php b/module/project/model.php index 9c7bea2463..91128bee52 100755 --- a/module/project/model.php +++ b/module/project/model.php @@ -788,6 +788,23 @@ class projectModel extends model ->fetchPairs('id', 'project'); } + /** + * 获取项目下的执行数据。 + * Get execution data under the project. + * + * @param array $projectIdList + * @access public + * @return object[] + */ + public function getExecutionList(array $projectIdList = array()): array + { + return $this->dao->select('*')->from(TABLE_EXECUTION) + ->where('deleted')->eq(0) + ->andWhere('project')->in($projectIdList) + ->andWhere('type')->in('sprint,stage,kanban') + ->fetchAll('id'); + } + /** * 根据项目类型生成权限数据。 * Get project priv data according by the project type. diff --git a/module/project/test/model/getexecutionlist.php b/module/project/test/model/getexecutionlist.php new file mode 100755 index 0000000000..e243ed0d13 --- /dev/null +++ b/module/project/test/model/getexecutionlist.php @@ -0,0 +1,22 @@ +#!/usr/bin/env php +gen(5); +su('admin'); + +zdTable('project')->config('execution', true)->gen(30); + +/** + +title=测试 executionModel->getExecutionList(); +timeout=0 +cid=1 + +*/ + +global $tester; +$projectModel = $tester->loadModel('project'); + +r($projectModel->getExecutionList()) && p() && e('0'); // 测试空数据 +r(count($projectModel->getExecutionList(array(11, 60)))) && p() && e('17'); // 测试获取项目下执行的数量 +r($projectModel->getExecutionList(array(1))) && p() && e('0'); // 测试获取不存在项目下的执行 diff --git a/module/project/test/yaml/execution.yaml b/module/project/test/yaml/execution.yaml new file mode 100644 index 0000000000..7f0d4b4b64 --- /dev/null +++ b/module/project/test/yaml/execution.yaml @@ -0,0 +1,63 @@ +title: execution. +desc: execution data. +author: Wang Yidong +version: "1.0" +fields: + - field: id + range: 11,60,61,100,101-700 + - field: name + note: "名称" + fields: + - field: name1 + range: 敏捷项目,瀑布项目{2},看板项目,迭代{5},阶段{18},看板{5} + - field: name2 + range: 1-10000 + - field: project + range: 0{4},11{5},60{12},61{6},100{5} + - field: model + range: scrum,waterfall{2},kanban,[]{28} + - field: attribute + range: "[]{4},[]{5},request,design,dev,qa,release,review,request,design,dev,qa,release,review,request,design,dev,qa,release,review,[]{5}" + - field: type + range: project{4},sprint{5},stage{18},kanban{5} + - field: budget + range: 800000-1:100 + - field: status + range: doing{4},wait{2},doing{2},suspended{2},closed{2} + - field: auth + range: "extend" + - field: desc + range: 1-10000 + prefix: "迭代描述" + - field: begin + range: "(-2M)-(+M):1D" + type: timestamp + format: "YY/MM/DD" + postfix: "\t" + - field: end + range: "(+1w)-(+2M):1D" + type: timestamp + format: "YY/MM/DD" + postfix: "\t" + - field: grade + range: 1{4},1{5},1{6},2{6},1{6},1{5} + - field: parent + range: 0{4},11{5},60{6},106-111,61{6},100{5} + - field: path + fields: + - field: path1 + prefix: "," + range: 11,60,61,100,11{5},60{12},61{6},100{5} + - field: path2 + prefix: "," + range: "[]{4},101-105,106-111,106-111,118-700" + postfix: "," + - field: path3 + range: "[]{4},[]{5},[]{6},112-117,[]{50}" + postfix: "," + - field: acl + range: open{4},private{4} + - field: multiple + range: 1{4},1{3},0{2},1{18},1{5} + - field: deleted + range: 0{30},1