Merge branch dev/bug-64815 of zentao/zentaopms (#11081)
This commit is contained in:
@@ -94,6 +94,7 @@ $config->product->dtable->fieldList['testCaseCoverage']['name'] = 'testCaseC
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['title'] = $lang->product->testCaseCoverage;
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['minWidth'] = 86;
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['type'] = 'progress';
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['hint'] = $lang->product->testCaseCoverageInfo;
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['sortType'] = false;
|
||||
$config->product->dtable->fieldList['testCaseCoverage']['border'] = 'right';
|
||||
|
||||
@@ -386,6 +387,7 @@ $config->product->all->dtable->fieldList['testCaseCoverage']['type'] = 'prog
|
||||
$config->product->all->dtable->fieldList['testCaseCoverage']['minWidth'] = 80;
|
||||
$config->product->all->dtable->fieldList['testCaseCoverage']['show'] = true;
|
||||
$config->product->all->dtable->fieldList['testCaseCoverage']['sortType'] = false;
|
||||
$config->product->all->dtable->fieldList['testCaseCoverage']['hint'] = $lang->product->testCaseCoverageInfo;
|
||||
$config->product->all->dtable->fieldList['testCaseCoverage']['group'] = 'g7';
|
||||
|
||||
$config->product->all->dtable->fieldList['unresolvedBugs']['name'] = 'unresolvedBugs';
|
||||
|
||||
+12
-11
@@ -242,17 +242,18 @@ $lang->product->abbr->aclList['open'] = 'Default';
|
||||
$lang->product->aclTips['open'] = "Benutzer mit Rechten für {$lang->productCommon} können zugreifen.";
|
||||
$lang->product->aclTips['private'] = "{$lang->executionCommon} Nur Teammitglieder";
|
||||
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total <strong>%s</strong> {$lang->SRCommon}, <strong>%s</strong> Stunde(n) geplant, Fallabdeckung ist <strong>%s</strong> auf dieser Seite.";
|
||||
$lang->product->checkedSRSummary = "Total <strong>%total%</strong> {$lang->SRCommon}, <strong>%estimate%</strong> Stunde(n) geplant, Fallabdeckung ist <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = '<div>Kein Modul</div><div>Jetzt verwalten</div>';
|
||||
$lang->product->noProduct = 'Kein Produkt. ';
|
||||
$lang->product->noMatched = '"%s" kann nicht gefunden werden.' . $lang->productCommon;
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total <strong>%s</strong> {$lang->SRCommon}, <strong>%s</strong> Stunde(n) geplant, Fallabdeckung ist <strong>%s</strong> auf dieser Seite.";
|
||||
$lang->product->checkedSRSummary = "Total <strong>%total%</strong> {$lang->SRCommon}, <strong>%estimate%</strong> Stunde(n) geplant, Fallabdeckung ist <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = '<div>Kein Modul</div><div>Jetzt verwalten</div>';
|
||||
$lang->product->noProduct = 'Kein Produkt. ';
|
||||
$lang->product->noMatched = '"%s" kann nicht gefunden werden.' . $lang->productCommon;
|
||||
$lang->product->testCaseCoverageInfo = "Case Coverage = Number Of Stories With Cases / Number Of Non-parent Stories * 100%";
|
||||
|
||||
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
|
||||
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
|
||||
|
||||
+12
-11
@@ -242,17 +242,18 @@ $lang->product->abbr->aclList['open'] = 'Default';
|
||||
$lang->product->aclTips['open'] = "Users with privileges to {$lang->productCommon} can access it.";
|
||||
$lang->product->aclTips['private'] = "{$lang->executionCommon} team members only";
|
||||
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total <strong>%s</strong> {$lang->SRCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedSRSummary = "<strong>%total%</strong> {$lang->SRCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = '<div>You have no modules. </div><div>Manage Now</div>';
|
||||
$lang->product->noProduct = "No {$lang->productCommon} yet. ";
|
||||
$lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total <strong>%s</strong> {$lang->SRCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedSRSummary = "<strong>%total%</strong> {$lang->SRCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = '<div>You have no modules. </div><div>Manage Now</div>';
|
||||
$lang->product->noProduct = "No {$lang->productCommon} yet. ";
|
||||
$lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
|
||||
$lang->product->testCaseCoverageInfo = "Case Coverage = Number Of Stories With Cases / Number Of Non-parent Stories * 100%";
|
||||
|
||||
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
|
||||
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
|
||||
|
||||
+12
-11
@@ -242,17 +242,18 @@ $lang->product->abbr->aclList['open'] = 'Défaut';
|
||||
$lang->product->aclTips['open'] = "Les utilisateurs ayant des droits sur {$lang->productCommon} peuvent accéder à ce {$lang->productCommon}.";
|
||||
$lang->product->aclTips['private'] = "les membres de l'équipe et les membres de la Liste blanche peuvent y accéder.";
|
||||
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total de <strong>%s</strong> {$lang->SRCommon} sur cette page. Estimé: <strong>%s</strong> (h), et couverture de la recette: <strong>%s</strong>.";
|
||||
$lang->product->checkedSRSummary = "<strong>%total%</strong> {$lang->SRCommon} sélectionnées, Estimé: <strong>%estimate%</strong>, et couverture de la recette: <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = "<div>Vous n'avez aucun modules. </div><div>Gérer Maintenant</div>";
|
||||
$lang->product->noProduct = "No {$lang->productCommon} à ce jour. ";
|
||||
$lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
|
||||
$lang->product->allSummary = "Total <strong>%s</strong> requirements on this page. Estimates <strong>%s</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%s</strong>.";
|
||||
$lang->product->checkedAllSummary = "<strong>%total%</strong> requirements selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}), and Case Coverage: <strong>%rate%</strong>.";
|
||||
$lang->product->storySummary = "Total de <strong>%s</strong> {$lang->SRCommon} sur cette page. Estimé: <strong>%s</strong> (h), et couverture de la recette: <strong>%s</strong>.";
|
||||
$lang->product->checkedSRSummary = "<strong>%total%</strong> {$lang->SRCommon} sélectionnées, Estimé: <strong>%estimate%</strong>, et couverture de la recette: <strong>%rate%</strong>.";
|
||||
$lang->product->requirementSummary = "Total <strong>%s</strong> {$lang->URCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedURSummary = "<strong>%total%</strong> {$lang->URCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->epicSummary = "Total <strong>%s</strong> {$lang->ERCommon} on this page. Estimates: <strong>%s</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->checkedERSummary = "<strong>%total%</strong> {$lang->ERCommon} selected, Esitmates: <strong>%estimate%</strong> ({$lang->hourCommon}).";
|
||||
$lang->product->noModule = "<div>Vous n'avez aucun modules. </div><div>Gérer Maintenant</div>";
|
||||
$lang->product->noProduct = "No {$lang->productCommon} à ce jour. ";
|
||||
$lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
|
||||
$lang->product->testCaseCoverageInfo = "Case Coverage = Number Of Stories With Cases / Number Of Non-parent Stories * 100%";
|
||||
|
||||
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
|
||||
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
|
||||
|
||||
@@ -242,17 +242,18 @@ $lang->product->abbr->aclList['open'] = '公开';
|
||||
$lang->product->aclTips['open'] = "有{$lang->productCommon}视图权限,即可访问";
|
||||
$lang->product->aclTips['private'] = "{$lang->productCommon}相关负责人、所属项目集的干系人、相关联{$lang->projectCommon}的团队成员和干系人可访问";
|
||||
|
||||
$lang->product->allSummary = "本页共 <strong>%s</strong> 个需求,预计 <strong>%s</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%s</strong>。";
|
||||
$lang->product->checkedAllSummary = "选中 <strong>%total%</strong> 个需求,预计 <strong>%estimate%</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%rate%</strong>。";
|
||||
$lang->product->storySummary = "本页共 <strong>%s</strong> 个{$lang->SRCommon},预计 <strong>%s</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%s</strong>。";
|
||||
$lang->product->checkedSRSummary = "选中 <strong>%total%</strong> 个{$lang->SRCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%rate%</strong>。";
|
||||
$lang->product->requirementSummary = "本页共 <strong>%s</strong> 个{$lang->URCommon},预计 <strong>%s</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->checkedURSummary = "选中 <strong>%total%</strong> 个{$lang->URCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->epicSummary = "本页共 <strong>%s</strong> 个{$lang->ERCommon},预计 <strong>%s</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->checkedERSummary = "选中 <strong>%total%</strong> 个{$lang->ERCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->noModule = "<div>您现在还没有模块信息</div><div>请维护模块</div>";
|
||||
$lang->product->noProduct = "暂时没有{$lang->productCommon}。";
|
||||
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
|
||||
$lang->product->allSummary = "本页共 <strong>%s</strong> 个需求,预计 <strong>%s</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%s</strong>。";
|
||||
$lang->product->checkedAllSummary = "选中 <strong>%total%</strong> 个需求,预计 <strong>%estimate%</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%rate%</strong>。";
|
||||
$lang->product->storySummary = "本页共 <strong>%s</strong> 个{$lang->SRCommon},预计 <strong>%s</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%s</strong>。";
|
||||
$lang->product->checkedSRSummary = "选中 <strong>%total%</strong> 个{$lang->SRCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon},用例覆盖率 <strong>%rate%</strong>。";
|
||||
$lang->product->requirementSummary = "本页共 <strong>%s</strong> 个{$lang->URCommon},预计 <strong>%s</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->checkedURSummary = "选中 <strong>%total%</strong> 个{$lang->URCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->epicSummary = "本页共 <strong>%s</strong> 个{$lang->ERCommon},预计 <strong>%s</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->checkedERSummary = "选中 <strong>%total%</strong> 个{$lang->ERCommon},预计 <strong>%estimate%</strong> 个{$lang->hourCommon}。";
|
||||
$lang->product->noModule = "<div>您现在还没有模块信息</div><div>请维护模块</div>";
|
||||
$lang->product->noProduct = "暂时没有{$lang->productCommon}。";
|
||||
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
|
||||
$lang->product->testCaseCoverageInfo = "用例覆盖率 = 有用例的需求数 / 非父需求数 * 100%";
|
||||
|
||||
$lang->product->featureBar['browse']['allstory'] = '全部';
|
||||
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
|
||||
|
||||
@@ -1779,7 +1779,7 @@ class productModel extends model
|
||||
if(empty($productIdList)) return array();
|
||||
|
||||
/* Get storie list by product ID list. */
|
||||
$storyList = $this->loadModel('story')->getStoriesByProductIdList($productIdList);
|
||||
$storyList = $this->loadModel('story')->getStoriesByProductIdList($productIdList, 'story', false);
|
||||
|
||||
/* Get case count of each story. */
|
||||
$storyIdList = array();
|
||||
|
||||
Regular → Executable
+3
-2
@@ -4,10 +4,11 @@
|
||||
/**
|
||||
|
||||
title=productModel->getCaseCoveragePairs();
|
||||
timeout=0
|
||||
cid=0
|
||||
|
||||
- 获取产品ID为0的用例覆盖率 @0
|
||||
- 获取产品ID为1的用例覆盖率属性1 @30
|
||||
- 获取产品ID为1的用例覆盖率属性1 @20
|
||||
- 获取产品ID为2的用例覆盖率属性2 @20
|
||||
- 获取产品ID为10的用例覆盖率属性10 @20
|
||||
- 获取产品ID不存在的用例覆盖率 @0
|
||||
@@ -34,7 +35,7 @@ $normalDataResult = $tester->objectModel->getCaseCoveragePairs($productIdList[
|
||||
$notExistDataResult = $tester->objectModel->getCaseCoveragePairs($productIdList[2]);
|
||||
|
||||
r($emptyDataResult) && p('') && e('0'); // 获取产品ID为0的用例覆盖率
|
||||
r($normalDataResult) && p('1') && e('30'); // 获取产品ID为1的用例覆盖率
|
||||
r($normalDataResult) && p('1') && e('20'); // 获取产品ID为1的用例覆盖率
|
||||
r($normalDataResult) && p('2') && e('20'); // 获取产品ID为2的用例覆盖率
|
||||
r($normalDataResult) && p('10') && e('20'); // 获取产品ID为10的用例覆盖率
|
||||
r($notExistDataResult) && p('') && e('0'); // 获取产品ID不存在的用例覆盖率
|
||||
@@ -648,12 +648,13 @@ class storyTao extends storyModel
|
||||
* @access protected
|
||||
* @return array
|
||||
*/
|
||||
protected function getStoriesByProductIdList(array $productIdList, string $storyType = ''): array
|
||||
protected function getStoriesByProductIdList(array $productIdList, string $storyType = '', bool $hasParent = true): array
|
||||
{
|
||||
return $this->dao->select('id, product, parent')
|
||||
->from(TABLE_STORY)
|
||||
->where('deleted')->eq('0')
|
||||
->beginIF($storyType)->andWhere('type')->eq($storyType)->fi()
|
||||
->beginIF(!$hasParent)->andWhere("isParent")->eq('0')->fi()
|
||||
->andWhere('product')->in($productIdList)
|
||||
->fetchAll();
|
||||
}
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
|
||||
title=测试 storyModel->getStoriesByProductIdList();
|
||||
timeout=0
|
||||
cid=0
|
||||
|
||||
- 获取产品1下的需求
|
||||
- 第0条的id属性 @1
|
||||
- 第0条的product属性 @1
|
||||
- 获取产品1,2下的需求
|
||||
- 第0条的id属性 @1
|
||||
- 第0条的product属性 @1
|
||||
- 第4条的id属性 @5
|
||||
- 第4条的product属性 @2
|
||||
- 获取产品1,2下的研发需求
|
||||
- 第0条的id属性 @2
|
||||
- 第0条的product属性 @1
|
||||
- 第1条的id属性 @4
|
||||
- 第1条的product属性 @1
|
||||
- 获取产品1,2下的研发需求
|
||||
- 第0条的id属性 @1
|
||||
- 第0条的product属性 @1
|
||||
- 第1条的id属性 @3
|
||||
- 第1条的product属性 @1
|
||||
- 获取产品1,2下的研发需求
|
||||
- 第0条的id属性 @1
|
||||
- 第0条的product属性 @1
|
||||
- 第1条的id属性 @2
|
||||
- 第1条的product属性 @1
|
||||
|
||||
*/
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
su('admin');
|
||||
|
||||
zenData('story')->gen(10);
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('story');
|
||||
|
||||
$productIdList = array('1');
|
||||
r($tester->story->getStoriesByProductIdList($productIdList)) && p("0:id,product") && e('1,1'); //获取产品1下的需求
|
||||
|
||||
$productIdList = array('1', '2');
|
||||
r($tester->story->getStoriesByProductIdList($productIdList)) && p("0:id,product;4:id,product") && e('1,1;5,2'); //获取产品1,2下的需求
|
||||
r($tester->story->getStoriesByProductIdList($productIdList, 'story')) && p("0:id,product;1:id,product") && e('2,1;4,1'); //获取产品1,2下的研发需求
|
||||
r($tester->story->getStoriesByProductIdList($productIdList, 'requirement')) && p("0:id,product;1:id,product") && e('1,1;3,1'); //获取产品1,2下的研发需求
|
||||
r($tester->story->getStoriesByProductIdList($productIdList, '', false)) && p("0:id,product;1:id,product") && e('1,1;2,1'); //获取产品1,2下的研发需求
|
||||
Reference in New Issue
Block a user