diff --git a/.gitfox/lint.yaml b/.gitfox/lint.yaml index 318f4d8ff9..abf897e7cc 100644 --- a/.gitfox/lint.yaml +++ b/.gitfox/lint.yaml @@ -39,7 +39,7 @@ spec: type: run spec: container: - image: hub.zentao.net/ci/zentao-package:master + image: hub.zentao.net/ci/zentao-package:master-250527 script: - DOWNGRADE_CODE_DIR=$(mktemp -d) - mkdir $DOWNGRADE_CODE_DIR/diff diff --git a/lib/base/dao/dao.class.php b/lib/base/dao/dao.class.php index b46d7d51e6..f817b7fea2 100644 --- a/lib/base/dao/dao.class.php +++ b/lib/base/dao/dao.class.php @@ -163,6 +163,15 @@ class baseDAO */ public $autoLang; + /** + * 是否自动增加isTpl条件。 + * If auto add isTpl statement. + * + * @var bool + * @access public + */ + public $autoTpl; + /** * 上一次插入的数据id。 * Last insert id. @@ -301,6 +310,20 @@ class baseDAO return $this; } + /** + * 设置autoTpl项。 + * Set autoTpl item. + * + * @param bool $autoTpl + * @access public + * @return void + */ + public function setAutoTpl($autoTpl) + { + $this->autoTpl = $autoTpl; + return $this; + } + /** * 重置属性。 * Reset the vars. @@ -316,6 +339,7 @@ class baseDAO $this->setMode(''); $this->setMethod(''); $this->setAutoLang(isset($this->config->framework->autoLang) and $this->config->framework->autoLang); + $this->setAutoTpl(true); } //-----根据请求的方式,调用sql类相应的方法(Call according method of sql class by query method. -----// @@ -859,7 +883,7 @@ class baseDAO $sql .= '(`' . implode('`,`', array_keys($values)) . '`)' . ' VALUES(' . implode(',', $values) . ')'; } - elseif($this->method == 'select' && $filterTpl) + elseif($this->method == 'select' && $filterTpl && $this->autoTpl) { /* 过滤模板类型的数据 */ foreach(array('project', 'task') as $table) diff --git a/module/execution/model.php b/module/execution/model.php index 8019d389c8..4cc3bcc3e8 100755 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1146,6 +1146,7 @@ class executionModel extends model return $this->dao->select('*,whitelist')->from(TABLE_EXECUTION) ->where('id')->in($executionIdList) ->beginIF($mode != 'all')->andWhere('deleted')->eq(0)->fi() + ->setAutoTpl(false) ->fetchAll('id'); } @@ -1439,7 +1440,7 @@ class executionModel extends model { /* Construct the query SQL at search executions. */ $executionQuery = $browseType == 'bySearch' ? $this->getExecutionQuery($param) : ''; - $project = $this->dao->select('model,isTpl')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch(); + if($projectID) $project = $this->dao->select('model,isTpl')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch(); return $this->dao->select('t1.*,t2.name projectName, t2.model as projectModel')->from(TABLE_EXECUTION)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') @@ -1448,9 +1449,9 @@ class executionModel extends model ->andWhere('t1.deleted')->eq('0') ->andWhere('t1.vision')->eq($this->config->vision) ->andWhere('t1.multiple')->eq('1') - ->beginIF($project->model == 'ipd')->andWhere('t1.enabled')->eq('on')->fi() - ->beginIF($project->isTpl)->andWhere('t1.isTpl')->eq('1')->fi() - ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->sprints)->fi() + ->beginIF(!empty($project->isTpl))->andWhere('t1.isTpl')->eq('1')->fi() + ->beginIF(!empty($project->model) && $project->model == 'ipd')->andWhere('t1.enabled')->eq('on')->fi() + ->beginIF(!$this->app->user->admin && !$project->isTpl)->andWhere('t1.id')->in($this->app->user->view->sprints)->fi() ->beginIF(!empty($executionQuery))->andWhere($executionQuery)->fi() ->beginIF($productID)->andWhere('t3.product')->eq($productID)->fi() ->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi() @@ -1989,6 +1990,7 @@ class executionModel extends model ->beginIF($filterStatus)->andWhere('t1.status')->notin('closed,cancel')->fi() ->andWhere('t1.execution')->in($executionIdList) ->orderBy('t1.order_asc, t1.id_desc') + ->setAutoTpl(false) ->fetchGroup('execution', 'id'); $today = helper::today(); @@ -3757,6 +3759,7 @@ class executionModel extends model ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') ->where('t1.deleted')->eq(0) ->andWhere($condition) + ->setAutoTpl(false) ->orderBy($orderBy) ->page($pager, 't1.id') ->fetchAll('id'); @@ -5245,6 +5248,7 @@ class executionModel extends model return $this->dao->select('id,name')->from(TABLE_EXECUTION) ->where('id')->in($executionIdList) ->beginIF(!empty($type))->andWhere('type')->in($type)->fi() + ->setAutoTpl(false) ->orderBy($orderBy) ->fetchPairs(); } diff --git a/module/execution/test/model/fetchexecutionlist.php b/module/execution/test/model/fetchexecutionlist.php index 47e28d60a5..9b09bfd9a5 100755 --- a/module/execution/test/model/fetchexecutionlist.php +++ b/module/execution/test/model/fetchexecutionlist.php @@ -23,6 +23,41 @@ title=测试 executionModel->fetchExecutionList(); timeout=0 cid=1 +- 获取没有限制条件时执行的个数 @20 +- 获取进行中执行的个数 @11 +- 获取敏捷项目1下的执行的个数 @3 +- 获取全部状态执行的个数 @24 +- 获取未关闭的执行的个数 @20 +- 获取未开始的执行的个数 @6 +- 获取进行中的执行的个数 @11 +- 获取已暂停的执行的个数 @3 +- 获取已关闭的执行的个数 @4 +- 获取我参与的执行的个数 @24 +- 获取关联产品5的执行的个数 @1 +- 获取敏捷项目下全部的执行 + - 第101条的project属性 @11 + - 第101条的name属性 @迭代5 +- 获取敏捷项目下未关闭的执行 + - 第101条的project属性 @11 + - 第101条的name属性 @迭代5 +- 获取敏捷项目下未开始的执行 + - 第101条的project属性 @11 + - 第101条的name属性 @迭代5 +- 获取敏捷项目下进行中的执行 + - 第103条的project属性 @11 + - 第103条的name属性 @迭代7 +- 获取敏捷项目下已暂停的执行 @0 +- 获取敏捷项目下已关闭的执行 @0 +- 获取敏捷项目下我参与的执行 + - 第103条的project属性 @11 + - 第103条的name属性 @迭代7 +- 获取敏捷项目下按照开始日期倒序排列全部的执行 + - 第103条的project属性 @11 + - 第103条的name属性 @迭代7 +- 获取按照开始日期倒序排列执行 + - 第126条的project属性 @100 + - 第126条的name属性 @看板30 + */ $projectIdList = array(0, 11); diff --git a/module/execution/test/model/getbyidlist.php b/module/execution/test/model/getbyidlist.php index 56d145438c..8bca2d8490 100755 --- a/module/execution/test/model/getbyidlist.php +++ b/module/execution/test/model/getbyidlist.php @@ -22,6 +22,12 @@ title=测试executionModel->getByIdListTest(); timeout=0 cid=1 +- 敏捷项目查询第3条的name属性 @迭代1 +- 瀑布项目查询第4条的type属性 @stage +- 看板项目查询第5条的status属性 @doing +- 看板项目查询第5条的type属性 @kanban +- 看板项目查询第5条的name属性 @迭代3 + */ $executionIdList = array(3, 4, 5); @@ -31,6 +37,8 @@ $tester->loadModel('execution'); $executionList = $tester->execution->getByIdList($executionIdList); -r($executionList) && p('3:name') && e('迭代1'); // 敏捷项目查询 -r($executionList) && p('4:type') && e('stage'); // 瀑布项目查询 -r($executionList) && p('5:status') && e('doing'); // 看板项目查询 +r($executionList) && p('3:name') && e('迭代1'); // 敏捷项目查询 +r($executionList) && p('4:type') && e('stage'); // 瀑布项目查询 +r($executionList) && p('5:status') && e('doing'); // 看板项目查询 +r($executionList) && p('5:type') && e('kanban'); // 看板项目查询 +r($executionList) && p('5:name') && e('迭代3'); // 看板项目查询 diff --git a/module/execution/test/model/getpairsbylist.php b/module/execution/test/model/getpairsbylist.php index 941b4f3b89..cf8d712b63 100644 --- a/module/execution/test/model/getpairsbylist.php +++ b/module/execution/test/model/getpairsbylist.php @@ -13,6 +13,12 @@ title=测试executionModel->getByIdListTest(); timeout=0 cid=1 +- 测试查找执行 ID 1 2 3 的名称 @项目集1,项目集2,项目集3 +- 测试查找执行 ID 4 5 6 的名称 @项目集4,项目集5,项目集6 +- 测试查找执行 ID 7 8 9 的名称 @项目集7,项目集8,项目集9 +- 测试查找执行 ID 10 11 12 的名称 @项目集10,项目11,项目12 +- 测试查找执行 ID 13 14 15 的名称 @项目13,项目14,项目15 + */ $executionIdList = array('1,2,3', '4,5,6', '7,8,9', '10,11,12', '13,14,15'); diff --git a/module/execution/test/model/getsearchtasks.php b/module/execution/test/model/getsearchtasks.php index eacd888731..6a1de13b6d 100755 --- a/module/execution/test/model/getsearchtasks.php +++ b/module/execution/test/model/getsearchtasks.php @@ -39,8 +39,29 @@ title=executionModel->getSearchTasks(); timeout=0 cid=1 +- 测试通过sql语句获取3个任务 id 倒序 execution = '3' and deleted = '0' and parent >= 0第10条的name属性 @任务10 +- 测试通过sql语句获取3个任务 id 正序 execution = '3' and deleted = '0' and parent >= 0第1条的name属性 @任务1 +- 测试通过sql语句获取5个任务 id 倒序 execution = '3' and deleted = '0' and parent >= 0第10条的name属性 @任务10 +- 测试通过sql语句获取5个任务 id 正序 execution = '3' and deleted = '0' and parent >= 0第1条的name属性 @任务1 +- 测试通过sql语句获取3个任务 id 倒序 type = 'devel' and fromBug != '0' and parent >= 0第8条的name属性 @任务8 +- 测试通过sql语句获取3个任务 id 正序 type = 'devel' and fromBug != '0' and parent >= 0第2条的name属性 @任务2 +- 测试通过sql语句获取5个任务 id 倒序 type = 'devel' and fromBug != '0' and parent >= 0第8条的name属性 @任务8 +- 测试通过sql语句获取5个任务 id 正序 type = 'devel' and fromBug != '0' and parent >= 0第2条的name属性 @任务2 +- 测试通过sql语句获取3个任务 id 倒序 execution = '3' and story != '0' and parent >= 0第10条的name属性 @任务10 +- 测试通过sql语句获取3个任务 id 正序 execution = '3' and story != '0' and parent >= 0第2条的name属性 @任务2 +- 测试通过sql语句获取5个任务 id 倒序 execution = '3' and story != '0' and parent >= 0第10条的name属性 @任务10 +- 测试通过sql语句获取5个任务 id 正序 execution = '3' and story != '0' and parent >= 0第2条的name属性 @任务2 +- 测试通过sql语句获取3个任务 id 倒序 module like '%2%' and type = 'design' and parent >= 0第6条的name属性 @任务6 +- 测试通过sql语句获取3个任务 id 正序 module like '%2%' and type = 'design' and parent >= 0第6条的name属性 @任务6 +- 测试通过sql语句获取5个任务 id 倒序 module like '%2%' and type = 'design' and parent >= 0第6条的name属性 @任务6 +- 测试通过sql语句获取5个任务 id 正序 module like '%2%' and type = 'design' and parent >= 0第6条的name属性 @任务6 + */ +global $app; +$app->rawModule = 'execution'; +$app->rawMethod = 'task'; + $condition = array(); $condition[] = "t1.execution = '3' AND t1.deleted = '0' AND t1.parent >= 0"; $condition[] = "t1.type = 'devel' AND t1.fromBug != '0' AND t1.parent >= 0"; diff --git a/module/execution/test/model/gettaskgroupbyexecution.php b/module/execution/test/model/gettaskgroupbyexecution.php index af6dc048f4..8e2f8d14b2 100755 --- a/module/execution/test/model/gettaskgroupbyexecution.php +++ b/module/execution/test/model/gettaskgroupbyexecution.php @@ -31,7 +31,7 @@ $task->gen(10); $story = zenData('story'); $story->id->range('1-10'); -$story->status->range('active,changed'); +$story->status->range('active,changing'); $story->version->range('1{6},2{2},3{2}'); $story->gen(10); @@ -43,6 +43,21 @@ title=测试 executionModel->getTaskGroupByExecution(); timeout=0 cid=1 +- 测试空数据 @0 +- 测试获取执行的任务 @3 +- 测试获取执行ID=3的任务关联需求版本跟需求状态 + - 第1条的storyVersion属性 @1 + - 第1条的storyStatus属性 @active + - 第1条的needConfirm属性 @~~ +- 测试获取执行ID=4的任务关联需求版本跟需求状态 + - 第2条的storyVersion属性 @1 + - 第2条的storyStatus属性 @~~ + - 第2条的needConfirm属性 @~~ +- 测试获取执行ID=5的任务关联需求版本跟需求状态 + - 第9条的storyVersion属性 @2 + - 第9条的storyStatus属性 @active + - 第9条的needConfirm属性 @1 + */ @@ -53,6 +68,6 @@ r($execution->getTaskGroupByExecutionTest()) && p() && e('0'); r($execution->getTaskGroupByExecutionTest($executionIdList)) && p() && e('3'); // 测试获取执行的任务 $taskGroup = $execution->getTaskGroupByExecutionTest($executionIdList, false); -r($taskGroup[3]) && p('1:storyVersion,storyStatus,needConfirm') && e('1,active,~~'); // 测试获取执行ID=3的任务关联需求版本跟需求状态 -r($taskGroup[4]) && p('2:storyVersion,storyStatus,needConfirm') && e('1,~~,~~'); // 测试获取执行ID=4的任务关联需求版本跟需求状态 -r($taskGroup[5]) && p('9:storyVersion,storyStatus,needConfirm') && e('2,active,1'); // 测试获取执行ID=5的任务关联需求版本跟需求状态 +r($taskGroup[3]) && p('1:storyVersion,storyStatus,needConfirm') && e('1,active,~~'); // 测试获取执行ID=3的任务关联需求版本跟需求状态 +r($taskGroup[4]) && p('2:storyVersion,storyStatus,needConfirm') && e('1,changing,~~'); // 测试获取执行ID=4的任务关联需求版本跟需求状态 +r($taskGroup[5]) && p('9:storyVersion,storyStatus,needConfirm') && e('2,active,1'); // 测试获取执行ID=5的任务关联需求版本跟需求状态 diff --git a/module/product/model.php b/module/product/model.php index 631c7670fb..feb53a801b 100755 --- a/module/product/model.php +++ b/module/product/model.php @@ -1653,6 +1653,7 @@ class productModel extends model ->andWhere("FIND_IN_SET('{$this->app->user->account}', t1.reviewers)") ->andWhere('t1.reviewStatus')->eq('doing') ->fi() + ->setAutoTpl(false) ->orderBy("{$programOrder}t1.line_desc, t1.order_asc") ->beginIF($limit > 0)->limit($limit)->fi() ->fetchAll('id'); diff --git a/module/programplan/model.php b/module/programplan/model.php index 8634d78d33..e67c87851b 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -869,6 +869,7 @@ class programplanModel extends model ->where('t1.deleted')->eq(0) ->andWhere('t1.project')->eq($projectID) ->andWhere('t1.execution')->in($planIdList) + ->setAutoTpl(false) ->orderBy('execution_asc, order_asc, id_asc') ->fetchAll('id'); } diff --git a/module/project/model.php b/module/project/model.php index 302d607324..a459fff199 100755 --- a/module/project/model.php +++ b/module/project/model.php @@ -1233,7 +1233,7 @@ class projectModel extends model $linkedProductsCount = $this->projectTao->getLinkedProductsCount($project, $postData->rawdata); } - $needCreateProduct = !$project->hasProduct || isset($postData->rawdata->newProduct) || empty($linkedProductsCount); + $needCreateProduct = !$project->hasProduct || isset($postData->rawdata->newProduct) || (empty($linkedProductsCount) && !$project->isTpl); if($needCreateProduct && !$this->projectTao->createProduct($projectID, $project, $postData, $program)) return false; /* Save order. */ diff --git a/module/project/test/model/create.php b/module/project/test/model/create.php index 03e4c72525..5c1c6c0825 100755 --- a/module/project/test/model/create.php +++ b/module/project/test/model/create.php @@ -18,6 +18,12 @@ title=测试 projectModel->create(); timeout=0 cid=1 +- 执行projectClass模块的create方法,参数是$normalProject, $postData 属性name @测试新增项目一 +- 执行projectClass模块的create方法,参数是$emptyNameProject, $postData 第message[name]条的0属性 @『项目名称』不能为空。 +- 执行projectClass模块的create方法,参数是$emptyEndProject, $postData 第message[end]条的0属性 @『计划完成』不能为空。 +- 执行projectClass模块的create方法,参数是$beginGtEndProject, $postData 第message[end]条的0属性 @『计划完成』应当大于『2022-02-07』。 +- 执行projectClass模块的create方法,参数是$emptyBeginProject, $postData 第message[begin]条的0属性 @『计划开始』不能为空。 + */ global $tester; diff --git a/module/project/ui/view.html.php b/module/project/ui/view.html.php index e3e719c0ed..ecbd679065 100644 --- a/module/project/ui/view.html.php +++ b/module/project/ui/view.html.php @@ -302,6 +302,7 @@ row /* Linked product and plan. */ $project->hasProduct ? h::table ( + setID('products'), setClass('table condensed bordered productsBox'), h::thead ( @@ -345,6 +346,7 @@ row /* Project team. */ h::table ( + setID('teams'), setClass('table condensed bordered teams ' . ($project->hasProduct ? 'mt-4' : '')), h::thead ( diff --git a/module/project/zen.php b/module/project/zen.php index e6c8884eaf..cdefdb4e7c 100755 --- a/module/project/zen.php +++ b/module/project/zen.php @@ -329,7 +329,7 @@ class projectZen extends project $hasProduct = isset($copyProject->hasProduct) ? $copyProject->hasProduct : 1; if($this->config->edition != 'open') { - $workflowGroups = $this->loadModel('workflowgroup')->getPairs('project', $model, $hasProduct, 'normal', '0'); + $workflowGroups = $this->loadModel('workflowgroup')->getPairs('project', $model, (int)$hasProduct, 'normal', '0'); $this->view->workflowGroupPairs = $workflowGroups; $this->view->workflowGroups = $this->workflowgroup->appendBuildinLabel($workflowGroups); } diff --git a/module/task/tao.php b/module/task/tao.php index d3fb94ff4d..6f795ece95 100644 --- a/module/task/tao.php +++ b/module/task/tao.php @@ -486,6 +486,8 @@ class taskTao extends taskModel $actionIDList = array(); if($type == 'assignedbyme') $actionIDList = $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq('task')->andWhere('action')->eq('assigned')->andWhere('actor')->eq($this->app->user->account)->fetchPairs('objectID', 'objectID'); + if($executionID) $execution = $this->fetchByID($executionID, 'project'); + $tasks = $this->dao->select($fields) ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') @@ -493,6 +495,7 @@ class taskTao extends taskModel ->beginIF($productID)->leftJoin(TABLE_MODULE)->alias('t4')->on('t1.module = t4.id')->fi() ->beginIF($this->config->edition == 'max' or $this->config->edition == 'ipd')->leftJoin(TABLE_DESIGN)->alias('t5')->on('t1.design= t5.id')->fi() ->where('t1.execution')->eq((int)$executionID) + ->beginIF(!empty($execution->isTpl))->andWhere('t1.isTpl')->eq('1')->fi() ->beginIF($type == 'myinvolved') ->andWhere("((t3.`account` = '{$this->app->user->account}') OR t1.`assignedTo` = '{$this->app->user->account}' OR t1.`finishedby` = '{$this->app->user->account}')") ->fi() diff --git a/module/task/test/tao/fetchexecutiontasks.php b/module/task/test/tao/fetchexecutiontasks.php index 0ccf30f6d6..ecd079cd5e 100755 --- a/module/task/test/tao/fetchexecutiontasks.php +++ b/module/task/test/tao/fetchexecutiontasks.php @@ -66,6 +66,85 @@ title=taskModel->fetchExecutionTasks(); timeout=0 cid=1 +- 测试获取执行ID 0 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 0 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务数量 @10 +- 测试获取执行ID 1 product 1 type all module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type all module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 1 type assignedbyme module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 1 type assignedbyme module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 1 type myinvolved module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type myinvolved module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 1 product 1 type undone module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type undone module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 1 type needconfirm module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 1 type needconfirm module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 1 type assignedtome module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type assignedtome module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 1 product 1 type finishedbyme module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type finishedbyme module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 1 product 1 type delayed module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type delayed module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 1 type wait module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type wait module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 1 product 1 type doing module 空 orederBy 'status_asc, id_desc' 的任务第11条的name属性 @任务11 +- 测试获取执行ID 1 product 1 type doing module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 1 product 1 type done module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 1 type done module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 1 type pause module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 1 type pause module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 1 type cancel module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 1 type cancel module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 1 type array('wait', 'doing', 'done', 'pause', 'cancel') module 空 orederBy 'status_asc, id_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 1 type array('wait', 'doing', 'done', 'pause', 'cancel') module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 0 type all module array(2) orederBy 'status_asc, id_desc' 的任务第17条的name属性 @任务17 +- 测试获取执行ID 1 product 0 type all module array(2) orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 0 type all module array(8) orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 1 product 0 type all module array(8) orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 1 product 0 type all module array(2,8) orederBy 'status_asc, id_desc' 的任务第17条的name属性 @任务17 +- 测试获取执行ID 1 product 0 type all module array(2,8) orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 1 product 0 type all module 空 orederBy 'pri_desc' 的任务第1条的name属性 @任务1 +- 测试获取执行ID 1 product 0 type all module 空 orederBy 'pri_desc' 的任务数量 @10 +- 测试获取执行ID 2 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务第18条的name属性 @任务18 +- 测试获取执行ID 2 product 0 type all module 空 orederBy 'status_asc, id_desc' 的任务数量 @10 +- 测试获取执行ID 2 product 1 type all module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type all module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 1 type assignedbyme module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type assignedbyme module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type myinvolved module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type myinvolved module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 1 type undone module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type undone module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 2 product 1 type needconfirm module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type needconfirm module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 1 type assignedtome module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type assignedtome module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 1 type finishedbyme module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type finishedbyme module 空 orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 1 type delayed module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type delayed module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type wait module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type wait module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type doing module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type doing module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type done module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type done module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type pause module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type pause module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 2 product 1 type cancel module 空 orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 1 type cancel module 空 orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 1 type array('wait', 'doing', 'done', 'pause', 'cancel') module 空 orederBy 'status_asc, id_desc' 的任务第6条的name属性 @任务6 +- 测试获取执行ID 2 product 1 type array('wait', 'doing', 'done', 'pause', 'cancel') module 空 orederBy 'status_asc, id_desc' 的任务数量 @1 +- 测试获取执行ID 2 product 0 type all module array(2) orederBy 'status_asc, id_desc' 的任务第2条的name属性 @任务2 +- 测试获取执行ID 2 product 0 type all module array(2) orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 0 type all module array(8) orederBy 'status_asc, id_desc' 的任务 @0 +- 测试获取执行ID 2 product 0 type all module array(8) orederBy 'status_asc, id_desc' 的任务数量 @0 +- 测试获取执行ID 2 product 0 type all module array(2,8) orederBy 'status_asc, id_desc' 的任务第2条的name属性 @任务2 +- 测试获取执行ID 2 product 0 type all module array(2,8) orederBy 'status_asc, id_desc' 的任务数量 @2 +- 测试获取执行ID 2 product 0 type all module 空 orederBy 'pri_desc' 的任务第20条的name属性 @任务20 +- 测试获取执行ID 2 product 0 type all module 空 orederBy 'pri_desc' 的任务数量 @10 + */ $executionIdList = array(0, 1, 2);