Merge pull request '* Modify bug getbyid.' (#18) from sprint/scx_bug_getbyid into master

Reviewed-on: https://git.zcorp.cc/easycorp/zentaopms/pulls/18
This commit is contained in:
綦新志
2023-04-26 15:44:55 +08:00
3 changed files with 152 additions and 111 deletions
+16 -66
View File
@@ -424,48 +424,7 @@ class bugModel extends model
elseif($browseType == 'assignedbyme') $bugs = $this->getByAssignedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
elseif($browseType == 'review') $bugs = $this->getReviewBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
return $this->checkDelayedBugs($bugs);
}
/**
* Check delay bugs.
*
* @param array $bugs
* @access public
* @return array
*/
public function checkDelayedBugs($bugs)
{
foreach ($bugs as $bug) $bug = $this->checkDelayBug($bug);
return $bugs;
}
/**
* Check delay bug.
*
* @param array $bug
* @access public
* @return array
*/
public function checkDelayBug($bug)
{
/* Delayed or not? */
if(!helper::isZeroDate($bug->deadline))
{
if($bug->resolvedDate and !helper::isZeroDate($bug->resolvedDate))
{
$delay = helper::diffDate(substr($bug->resolvedDate, 0, 10), $bug->deadline);
}
elseif($bug->status == 'active')
{
$delay = helper::diffDate(helper::today(), $bug->deadline);
}
if(isset($delay) and $delay > 0) $bug->delay = $delay;
}
return $bug;
return $this->bugTao->checkDelayedBugs($bugs);
}
/**
@@ -547,37 +506,28 @@ class bugModel extends model
* @access public
* @return object
*/
public function getById($bugID, $setImgSize = false)
public function getById(int $bugID, bool $setImgSize = false): object|false
{
$bug = $this->dao->select('t1.*, t2.name AS executionName, t3.title AS storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion, t4.name AS taskName, t5.title AS planName')
->from(TABLE_BUG)->alias('t1')
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')
->leftJoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id')
->leftJoin(TABLE_TASK)->alias('t4')->on('t1.task = t4.id')
->leftJoin(TABLE_PRODUCTPLAN)->alias('t5')->on('t1.plan = t5.id')
->where('t1.id')->eq((int)$bugID)->fetch();
$bug = $this->bugTao->fetchBugInfo($bugID);
if(!$bug) return false;
if(!empty($bug->project)) $bug->projectName = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($bug->project)->fetch('name');
$this->loadModel('file');
$this->loadModel('mr');
$bug = $this->loadModel('file')->replaceImgURL($bug, 'steps');
$bug = $this->file->replaceImgURL($bug, 'steps');
if($setImgSize) $bug->steps = $this->file->setImgSize($bug->steps);
foreach($bug as $key => $value) if(strpos($key, 'Date') !== false and !(int)substr($value, 0, 4)) $bug->$key = '';
if($bug->duplicateBug) $bug->duplicateBugTitle = $this->dao->findById($bug->duplicateBug)->from(TABLE_BUG)->fields('title')->fetch('title');
if($bug->case) $bug->caseTitle = $this->dao->findById($bug->case)->from(TABLE_CASE)->fields('title')->fetch('title');
if($bug->linkBug) $bug->linkBugTitles = $this->dao->select('id,title')->from(TABLE_BUG)->where('id')->in($bug->linkBug)->fetchPairs();
if($bug->toStory > 0) $bug->toStoryTitle = $this->dao->findById($bug->toStory)->from(TABLE_STORY)->fields('title')->fetch('title');
if($bug->toTask > 0) $bug->toTaskTitle = $this->dao->findById($bug->toTask)->from(TABLE_TASK)->fields('name')->fetch('name');
$bug->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($bugID, 'bug');
if($bug->project) $bug->projectName = $this->bugTao->getNameFromTable($bug->project, TABLE_PROJECT, 'name');
if($bug->duplicateBug) $bug->duplicateBugTitle = $this->bugTao->getNameFromTable($bug->duplicateBug, TABLE_BUG, 'title');
if($bug->case) $bug->caseTitle = $this->bugTao->getNameFromTable($bug->case, TABLE_CASE, 'title');
if($bug->linkBug) $bug->linkBugTitles = $this->bugTao->getBugPairsByList($bug->linkBug);
if($bug->toStory) $bug->toStoryTitle = $this->bugTao->getNameFormTable($bug->toStory, TABLE_STORY, 'title');
if($bug->toTask) $bug->toTaskTitle = $this->bugTao->getNameFormTable($bug->toTask, TABLE_TASK, 'name');
$bug->toCases = array();
$toCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('`fromBug`')->eq($bugID)->fetchAll();
foreach($toCases as $toCase) $bug->toCases[$toCase->id] = $toCase->title;
$bug->files = $this->loadModel('file')->getByObject('bug', $bugID);
return $this->checkDelayBug($bug);
$bug->linkMRTitles = $this->mr->getLinkedMRPairs($bugID, 'bug');
$bug->toCases = $this->bugTao->getCasesFromBug($bugID);
$bug->files = $this->file->getByObject('bug', $bugID);
return $this->bugTao->checkDelayBug($bug);
}
/**
+107
View File
@@ -0,0 +1,107 @@
<?php
declare(strict_types=1);
class bugTao extends bugModel
{
/**
* Get bug details, including all contents of the TABLE_BUG, execution name, associated story name, associated story status, associated story version, associated task name, and associated plan name.
* 获取bug的详情,包含bug表的所有内容、所属执行名称、关联需求名称、关联需求状态、关联需求版本、关联任务名称、关联计划名称
*
* @param int $bugID
* @access public
* @return object|false
*/
protected function fetchBugInfo(int $bugID): object|false
{
return $this->dao->select('t1.*, t2.name AS executionName, t3.title AS storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion, t4.name AS taskName, t5.title AS planName')
->from(TABLE_BUG)->alias('t1')
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')
->leftJoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id')
->leftJoin(TABLE_TASK)->alias('t4')->on('t1.task = t4.id')
->leftJoin(TABLE_PRODUCTPLAN)->alias('t5')->on('t1.plan = t5.id')
->where('t1.id')->eq((int)$bugID)->fetch();
}
/**
* Get cases created by bug.
* 获取bug建的用例.
*
* @param int $bugID
* @access public
* @return array
*/
protected function getCasesFromBug(int $bugID): array
{
return $this->dao->select('id, title')->from(TABLE_CASE)->where('`fromBug`')->eq($bugID)->fetchPairs();
}
/**
* Get an array of id and title pairs by buglist.
* 传入一个buglist,获得bug的id和title键值对数组.
*
* @param int $bugList
* @access public
* @return array
*/
protected function getBugPairsByList(string|array $bugList): array
{
return $this->dao->select('id,title')->from(TABLE_BUG)->where('id')->in($bugList)->fetchPairs();
}
/**
* Get object title/name base on the params.
* 根据传入的参数,获取对象名称.
*
* @param int $objectID
* @param string $table
* @param string $field
* @access public
* @return string
*/
protected function getNameFromTable(int $objectID, string $table, string $field): string
{
return $this->dao->findById($objectID)->from($table)->fields($field)->fetch($field);
}
/**
* Call checkDelayBug in foreach to check if the bug is delay.
* 循环调用checkDelayBug,检查bug是否延期
*
* @param array $bugs
* @access public
* @return array
*/
protected function checkDelayedBugs(array $bugs): array
{
foreach ($bugs as $bug) $bug = $this->checkDelayBug($bug);
return $bugs;
}
/**
* If the bug is delayed, add the bug->delay field to show the delay time (day).
* 如果bug延期,添加bug->delay字段,内容为延期的时长(天)
*
* @param object $bug
* @access public
* @return object
*/
protected function checkDelayBug(object $bug): object
{
/* Delayed or not? */
if(!helper::isZeroDate($bug->deadline))
{
if($bug->resolvedDate and !helper::isZeroDate($bug->resolvedDate))
{
$delay = helper::diffDate(substr($bug->resolvedDate, 0, 10), $bug->deadline);
}
elseif($bug->status == 'active')
{
$delay = helper::diffDate(helper::today(), $bug->deadline);
}
if(isset($delay) and $delay > 0) $bug->delay = $delay;
}
return $bug;
}
}
+29 -45
View File
@@ -1,59 +1,43 @@
#!/usr/bin/env php
<?php
include dirname(__FILE__, 5) . "/test/lib/init.php";
include dirname(__FILE__, 2) . '/bug.class.php';
su('admin');
function initData()
{
$project = zdTable('bug');
$project->id->range('2-5');
$project->project->range('2-5');
$project->title->prefix("bug")->range('2-5');
$project->type->range("codeerror");
$project->severity->range("3");
$project->pri->range("1");
$project->status->range("active");
$project->openedBuild->range("trunk");
$project->gen(4);
}
/**
title=bugModel->getById();
title=测试 bugModel::getByID;
timeout=0
cid=1
pid=1
查询id为1的bug的title >> BUG1
查询id为1的bug的status >> active
查询id为1的bug的plan >> 1
查询id为1的bug的module >> 1821
查询id为1的bug的story >> 2
查询id为4的bug的title >> BUG4
查询id为4的bug的status >> active
查询id为4的bug的plan >> 4
查询id为4的bug的module >> 1825
查询id为4的bug的story >> 14
查询id为7的bug的title >> 缺陷!@()(){}|+=%^&*$#测试bug名称到底可以有多长!@#¥%&*":.<>。?/();7
查询id为7的bug的status >> active
查询id为7的bug的plan >> 7
查询id为7的bug的module >> 1831
查询id为7的bug的story >> 26
查询id为不存在的1000001的bug的title >> 0
查询id为不存在的1000001的bug的status >> 0
查询id为不存在的1000001的bug的plan >> 0
查询id为不存在的1000001的bug的module >> 0
查询id为不存在的1000001的bug的story >> 0
- 执行bug模块的getByID方法,参数是2
- 属性pri @1
- 属性type @codeerror
- 执行bug模块的getByID方法,参数是1,属性title @0
*/
$bugIDList = array('1', '4', '7', '1000001');
global $tester;
$tester->loadModel('bug');
$bug=new bugTest();
initData();
r($tester->bug->getByID(2)) && p('pri,type') && e('1,codeerror'); //获取ID等于2的bug
r($tester->bug->getByID(1)) && p('title') && e('0'); //获取不存在的bug
r($bug->getByIdTest($bugIDList[0])) && p('title') && e('BUG1'); // 查询id为1的bug的title
r($bug->getByIdTest($bugIDList[0])) && p('status') && e('active'); // 查询id为1的bug的status
r($bug->getByIdTest($bugIDList[0])) && p('plan') && e('1'); // 查询id为1的bug的plan
r($bug->getByIdTest($bugIDList[0])) && p('module') && e('1821'); // 查询id为1的bug的module
r($bug->getByIdTest($bugIDList[0])) && p('story') && e('2'); // 查询id为1的bug的story
r($bug->getByIdTest($bugIDList[1])) && p('title') && e('BUG4'); // 查询id为4的bug的title
r($bug->getByIdTest($bugIDList[1])) && p('status') && e('active'); // 查询id为4的bug的status
r($bug->getByIdTest($bugIDList[1])) && p('plan') && e('4'); // 查询id为4的bug的plan
r($bug->getByIdTest($bugIDList[1])) && p('module') && e('1825'); // 查询id为4的bug的module
r($bug->getByIdTest($bugIDList[1])) && p('story') && e('14'); // 查询id为4的bug的story
r($bug->getByIdTest($bugIDList[2])) && p('title') && e('缺陷!@()(){}|+=%^&*$#测试bug名称到底可以有多长!@#¥%&*":.<>。?/();7'); // 查询id为7的bug的title
r($bug->getByIdTest($bugIDList[2])) && p('status') && e('active'); // 查询id为7的bug的status
r($bug->getByIdTest($bugIDList[2])) && p('plan') && e('7'); // 查询id为7的bug的plan
r($bug->getByIdTest($bugIDList[2])) && p('module') && e('1831'); // 查询id为7的bug的module
r($bug->getByIdTest($bugIDList[2])) && p('story') && e('26'); // 查询id为7的bug的story
r($bug->getByIdTest($bugIDList[3])) && p('title') && e('0'); // 查询id为不存在的1000001的bug的title
r($bug->getByIdTest($bugIDList[3])) && p('status') && e('0'); // 查询id为不存在的1000001的bug的status
r($bug->getByIdTest($bugIDList[3])) && p('plan') && e('0'); // 查询id为不存在的1000001的bug的plan
r($bug->getByIdTest($bugIDList[3])) && p('module') && e('0'); // 查询id为不存在的1000001的bug的module
r($bug->getByIdTest($bugIDList[3])) && p('story') && e('0'); // 查询id为不存在的1000001的bug的story