From 5fca2c004a22e771f8738f626c9495574a3a1fea Mon Sep 17 00:00:00 2001 From: guofeilong Date: Thu, 27 Apr 2023 18:25:55 +0800 Subject: [PATCH 1/4] * Code for test in function activate . --- module/project/test/model/activate.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/module/project/test/model/activate.php b/module/project/test/model/activate.php index 9dcd52e0d7..2c569a3568 100755 --- a/module/project/test/model/activate.php +++ b/module/project/test/model/activate.php @@ -52,6 +52,14 @@ $data->comment = 'fgasgqasfdgasfgasg'; $data->readjustTime = 1; $data->readjustTask = 1; -r($project->activate(2, $data)) && p('0:field,old,new') && e('status,closed,doing'); -r($project->activate(3, $data)) && p('0:field,old,new') && e('status,suspended,doing'); +$changes2 = $project->activate(2, $data); +$changes3 = $project->activate(3, $data); + +r($changes2['0']) && p('field') && e('status'); +r($changes2['0']) && p('old') && e('closed'); +r($changes2['0']) && p('new') && e('doing'); + +r($changes3['0']) && p('field') && e('status'); +r($changes3['0']) && p('old') && e('suspended'); +r($changes3['0']) && p('new') && e('doing'); From cce2e182076be4c935735126bd910117a2253a38 Mon Sep 17 00:00:00 2001 From: zhaoke Date: Thu, 27 Apr 2023 18:27:16 +0800 Subject: [PATCH 2/4] * Adjust generate ztf steps. --- test/lib/init.php | 229 ++++++++++++++++++++++++++-------------------- 1 file changed, 131 insertions(+), 98 deletions(-) diff --git a/test/lib/init.php b/test/lib/init.php index 322f019534..95db2db623 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -16,6 +16,12 @@ error_reporting(E_ALL); define('RUN_MODE', 'test'); +if($argc > 1 && $argv[1] == '-extract') +{ + parseScript(); + exit; +} + $testPath = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'test' . DIRECTORY_SEPARATOR; $frameworkRoot = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'framework' . DIRECTORY_SEPARATOR; @@ -69,8 +75,6 @@ if(!empty($config->test->account) and !empty($config->test->password) and !empty $token = $token->body; } -global $isExtractAction; -$isExtractAction = $argc > 1 && $argv[1] == '-extract'; /** * Save variable to $_result. @@ -97,15 +101,10 @@ function r($result) function p($keys = '', $delimiter = ',') { global $_result; - global $_keys; - global $_delimiter; - global $isExtractAction; $_keys = $keys; $_delimiter = $delimiter; - if($isExtractAction) return true; - if(empty($_result)) return print(implode("\n", array_fill(0, substr_count($keys, $delimiter) + 1, 0)) . "\n"); if(is_array($_result) and isset($_result['code']) and $_result['code'] == 'fail') return print((string) $_result['message'] . "\n"); @@ -131,86 +130,154 @@ function p($keys = '', $delimiter = ',') * @access public * @return void */ -function parseScript($expect) +function parseScript() { $debugInfo = debug_backtrace(); if(!empty($debugInfo)) { - global $_keys; - global $_delimiter; - global $_current; - - $keys = $_keys; - $delimiter = $_delimiter; $file = $debugInfo[count($debugInfo)-1]['file']; $contents = file_get_contents($file); + $rpeList = genParamsByRPE($contents); - list($moduleName, $methodName, $methodParam) = genParamsByRPE($contents); - - $isGrup = false; - $stepDesc = ''; - $expects = empty($expect) ? array() : explode($delimiter, $expect); - - $object = ''; - $rowIndex = -1; - $pos = strpos($keys, ':'); - if($pos) + foreach($rpeList as $rpe) { - $arrKey = substr($keys, 0, $pos); - $keys = substr($keys, $pos + 1); - $pos = strpos($arrKey, '['); + list($moduleName, $methodName, $methodParam) = $rpe[0]; + $expectStr = trim($rpe[1], '"\''); + $pParam = $rpe[2]; + $keys = $pParam[0]; + $delimiter = $pParam[1] ? $pParam[1] : ','; + $isGrup = false; + $stepDesc = ''; + $expects = '' === $expectStr ? array() : explode($delimiter, $expectStr); + + $rowIndex = -1; + $pos = strpos($keys, ':'); if($pos) { - $object = substr($arrKey, 0, $pos); - $rowIndex = trim(substr($arrKey, $pos + 1), ']'); + $arrKey = substr($keys, 0, $pos); + $keys = substr($keys, $pos + 1); + $pos = strpos($arrKey, '['); + $rowIndex = $pos ? trim(substr($arrKey, $pos + 1), ']') : $arrKey; + } + $keys = explode($delimiter, $keys); + + if(count($keys) > 1) $isGrup = true; + + if ($methodName === 0 && $methodParam === 0) + { + $stepDesc = "- 执行{$moduleName}" . ($isGrup ? "\n" : ''); } else { - $rowIndex = $arrKey; + $stepDesc = "- 执行{$moduleName}模块的{$methodName}方法,参数是{$methodParam}" . ($isGrup ? "\n" : ''); } - } - $keys = explode($delimiter, $keys); - if(count($keys) > 1) $isGrup = true; + if(empty($keys)) $stepDesc .= " @{$expects[0]}\n"; - if ($methodName === 0 && $methodParam === 0) - { - $stepDesc = "- 执行{$moduleName}" . ($isGrup ? "\n" : ''); - } - else - { - $stepDesc = "- 执行{$moduleName}模块的{$methodName}方法,参数是{$methodParam}" . ($isGrup ? "\n" : ''); - } - - if(empty($keys)) $stepDesc .= " @{$expects[0]}\n"; - - foreach($keys as $index => $row) - { - if(count($keys) < 2) + foreach($keys as $index => $row) { + $stepExpect = isset($expects[$index]) ? $expects[$index] : ''; + if(count($expects) == 1) $stepExpect = $expects[0]; if($rowIndex == -1) { - $stepDesc .= $row ? ",属性{$row}" : ''; - $stepDesc .= " @$expect"; + $stepDesc .= ($isGrup ? ' - ' : '') . "属性{$row} @{$stepExpect}\n"; } else { - $stepDesc .= ($rowIndex == -1 ? '' : ($isGrup ? ' - ' : '') . ",属性{$rowIndex} @{$expects[0]}\n"); + $stepDesc .= ($isGrup ? ' - ' : '') . "第{$rowIndex}条的{$row}属性 @{$stepExpect}\n"; } } - else + echo $stepDesc . ($isGrup ? "\n" : "\n"); + } + } +} + +/** + * Split function params. + * 从p()函数提取传入参数 + * + * @param array $params + * @return array + */ +function splitParam($params) +{ + $newParams = array(); + foreach($params as $param) + { + $param = trim($param); + $firstSymbol = substr($param, 0, 1); + $paramArray = str_split($param); + $delimiterIndex = -1; + + foreach($paramArray as $i => $p) + { + if($i == 0) continue; + if($p === $firstSymbol && (!isset($paramArray[$i-1]) || '\\' != $paramArray[$i-1])) { - if($rowIndex == -1) - { - $stepDesc .= ($isGrup ? ' - ' : '- ') . "属性{$row} @{$expects[$index]}\n"; - } - else { - $stepDesc .= ($isGrup ? ' - ' : '- ') . "第{$rowIndex}条的{$row}属性 @{$expects[$index]}\n"; - } + $delimiterIndex = $i + 1; + break; } } - echo $stepDesc . ($isGrup ? "\n" : "\n"); + + if($delimiterIndex === -1) + { + $newParams[] = array($param, ''); + continue; + } + + $firstParam = substr($param, 0, $delimiterIndex); + $firstParam = trim(trim($firstParam), '\'"'); + $lastParam = substr($param, $delimiterIndex + 1); + $lastParam = trim(trim($lastParam), '\'"'); + $newParams[] = array($firstParam, $lastParam); } + + return $newParams; +} + +/** + * Generate module,method,param from r function. + * 从r()函数提取调用的moduleName,methodName,methodParam + * + * @param array $rParams + * @return array + */ +function genModuleAndMethod($rParams) +{ + $newParams = array(); + foreach($rParams as $index => $param) + { + $param = trim($param, "'"); + $objArrowCount = substr_count($param, '->'); + $rParamsStructureList = explode('->', $param); + + if($objArrowCount == 1) + { + $moduleName = substr($rParamsStructureList[0], 1); + $method = $rParamsStructureList[1]; + $methodName = substr(explode('(', $method)[0], 0, -4); + $methodParam = substr(explode('(', $method)[1], 0, -1); + $methodParam = trim($methodParam, "'"); + } + elseif($objArrowCount == 2) + { + $moduleName = $rParamsStructureList[1]; + $method = $rParamsStructureList[2]; + $methodName = explode('(', $method)[0]; + $methodParam = trim(substr(explode('(', $method)[1], 0, -1), ")"); + $methodParam = trim($methodParam, "'"); + } + else + { + $newParams[] = array($param, 0, 0); + continue; + } + + $methodParam = preg_replace("/,\s*'/", ', ', $methodParam); + $newParams[] = array($moduleName, $methodName, $methodParam); + } + + return $newParams; } /** @@ -222,7 +289,6 @@ function parseScript($expect) */ function genParamsByRPE($rpe) { - global $_current; preg_match_all("/r\((.*?)\)\s*&&\s*p\((.*?)\)\s*&&\s*e\((.*?)\);/", $rpe, $matches); $rParams = !empty($matches[1]) ? $matches[1] : array(); $pParams = !empty($matches[2]) ? $matches[2] : array(); @@ -231,39 +297,13 @@ function genParamsByRPE($rpe) $pParams = is_array($pParams) ? $pParams : array($pParams); $eParams = is_array($eParams) ? $eParams : array($eParams); - $_current = intval($_current); - $param = $rParams[$_current]; - $_current++; - $param = trim($param, "'"); - $objArrowCount = substr_count($param, '->'); - $rParamsStructureList = explode('->', $param); + $pParamsArray = splitParam($pParams); + $rpeList = array(); + $rParamArray = genModuleAndMethod($rParams); - if($objArrowCount == 1) - { - $moduleName = substr($rParamsStructureList[0], 1); - $method = $rParamsStructureList[1]; - $methodName = substr(explode('(', $method)[0], 0, -4); - $methodParam = substr(explode('(', $method)[1], 0, -1); - $methodParam = trim($methodParam, "'"); - } - elseif($objArrowCount == 2) - { - $moduleName = $rParamsStructureList[1]; - $method = $rParamsStructureList[2]; - $methodName = explode('(', $method)[0]; - $methodParam = trim(substr(explode('(', $method)[1], 0, -1), ")"); - $methodParam = trim($methodParam, "'"); - } - else - { - $moduleName = $param; - $methodName = 0; - $methodParam = 0; - } + foreach($rParamArray as $index => $param) $rpeList[] = array($param, $eParams[$index], $pParamsArray[$index]); - $methodParam = preg_replace("/,\s*'/", ', ', $methodParam); - - return array($moduleName, $methodName, $methodParam); + return $rpeList; } /** @@ -347,13 +387,6 @@ function getValues($value, $keys, $delimiter) */ function e($expect) { - global $isExtractAction; - if($isExtractAction) - { - parseScript($expect); - return; - } - } /** From bd48fee90309ff7aef9f993dd7a5b03e9c553d4d Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 27 Apr 2023 18:30:21 +0800 Subject: [PATCH 3/4] * Refactor task-computeHours4Multiple and add unit test. --- module/task/model.php | 64 +------- module/task/tao.php | 56 +++++++ .../task/test/model/computehours4multiple.php | 155 ++++++++---------- .../test/tao/computecurrenttaskstatus.php | 95 +++++++++++ module/task/test/task.class.php | 29 +++- 5 files changed, 253 insertions(+), 146 deletions(-) create mode 100644 module/task/test/tao/computecurrenttaskstatus.php diff --git a/module/task/model.php b/module/task/model.php index f2b067efe6..ca4361141f 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -835,7 +835,6 @@ class taskModel extends model if(!isset($currentTask->status)) $currentTask->status = $oldTask->status; $oldTask->team = $team; - $currentTask->assignedTo = $oldTask->assignedTo; if(!empty($_POST['assignedTo']) and is_string($_POST['assignedTo'])) { $currentTask->assignedTo = $this->post->assignedTo; @@ -844,6 +843,8 @@ class taskModel extends model { $currentTask->assignedTo = $this->getAssignedTo4Multi($members, $oldTask); if($oldTask->assignedTo != $currentTask->assignedTo) $currentTask->assignedDate = $now; + + $oldTask->team = $oldTeam; } $currentTask->estimate = 0; @@ -858,50 +859,7 @@ class taskModel extends model $currentTask->consumed = 0; foreach($efforts as $effort) $currentTask->consumed += (float)$effort->consumed; - $oldTask->team = $oldTeam; - - if(!empty($task)) - { - if(!$autoStatus) return $currentTask; - - if($currentTask->consumed == 0 and empty($efforts)) - { - if(!isset($task->status)) $currentTask->status = 'wait'; - $currentTask->finishedBy = ''; - $currentTask->finishedDate = ''; - } - - if($currentTask->consumed > 0 && $currentTask->left > 0) - { - $currentTask->status = 'doing'; - $currentTask->finishedBy = ''; - $currentTask->finishedDate = ''; - } - - if($currentTask->consumed > 0 and $currentTask->left == 0) - { - $finisedUsers = $this->getFinishedUsers($oldTask->id, $members); - if(count($finisedUsers) != count($team)) - { - if(strpos('cancel,pause', $oldTask->status) === false or ($oldTask->status == 'closed' and $oldTask->reason == 'done')) - { - $currentTask->status = 'doing'; - $currentTask->finishedBy = ''; - $currentTask->finishedDate = ''; - } - } - elseif(strpos('wait,doing,pause', $oldTask->status) !== false) - { - $currentTask->status = 'done'; - $currentTask->assignedTo = $oldTask->openedBy; - $currentTask->assignedDate = $now; - $currentTask->finishedBy = $this->app->user->account; - $currentTask->finishedDate = $task->finishedDate; - } - } - - return $currentTask; - } + if(!empty($task)) return $this->taskTao->computeCurrentTaskStatus($currentTask, $oldTask, $task, $autoStatus, empty($efforts), $members); $this->dao->update(TABLE_TASK)->data($currentTask)->autoCheck()->where('id')->eq($oldTask->id)->exec(); } } @@ -2405,12 +2363,12 @@ class taskModel extends model ->andWhere('t1.vision')->eq($this->config->vision) ->fetch(); if(!$task) return false; - $task->openedDate = substr($task->openedDate, 0, 19); - $task->finishedDate = substr($task->finishedDate, 0, 19); - $task->canceledDate = substr($task->canceledDate, 0, 19); - $task->closedDate = substr($task->closedDate, 0, 19); - $task->lastEditedDate = substr($task->lastEditedDate, 0, 19); - $task->realStarted = substr($task->realStarted, 0, 19); + $task->openedDate = !empty($task->openedDate) ? substr($task->openedDate, 0, 19) : null; + $task->finishedDate = !empty($task->finishedDate) ? substr($task->finishedDate, 0, 19) : null; + $task->canceledDate = !empty($task->canceledDate) ? substr($task->canceledDate, 0, 19) : null; + $task->closedDate = !empty($task->closedDate) ? substr($task->closedDate, 0, 19) : null; + $task->lastEditedDate = !empty($task->lastEditedDate) ? substr($task->lastEditedDate, 0, 19) : null; + $task->realStarted = !empty($task->realStarted) ? substr($task->realStarted, 0, 19) : null; $children = $this->dao->select('*')->from(TABLE_TASK)->where('parent')->eq($taskID)->andWhere('deleted')->eq(0)->fetchAll('id'); $task->children = $children; @@ -2432,10 +2390,6 @@ class taskModel extends model if($setImgSize) $task->desc = $this->file->setImgSize($task->desc); if($task->assignedTo == 'closed') $task->assignedToRealName = 'Closed'; - foreach($task as $key => $value) - { - if((strpos($key, 'Date') !== false or strpos('estStarted|deadline', $key) !== false) and !(int)substr($value, 0, 4)) $task->$key = ''; - } $task->files = $this->loadModel('file')->getByObject('task', $taskID); /* Get related test cases. */ diff --git a/module/task/tao.php b/module/task/tao.php index 4fa4ecdeea..fdafaf0f76 100644 --- a/module/task/tao.php +++ b/module/task/tao.php @@ -210,4 +210,60 @@ class taskTao extends taskModel } return $tasks; } + + /** + * Compute the status of the current task. + * 计算当前任务的状态。 + * + * @param object $currentTask + * @param object $oldTask + * @param object $task + * @param bool $condition true|false + * @param bool $hasEfforts true|false + * @param int $teamCount + * @access protected + * @return object + */ + protected function computeCurrentTaskStatus(object $currentTask, object $oldTask, object $task, bool $autoStatus, bool $hasEfforts, array $members): object + { + if(!$autoStatus) return $currentTask; + + if($currentTask->consumed == 0 and $hasEfforts) + { + if(!isset($task->status)) $currentTask->status = 'wait'; + $currentTask->finishedBy = null; + $currentTask->finishedDate = null; + } + + if($currentTask->consumed > 0 && $currentTask->left > 0) + { + $currentTask->status = 'doing'; + $currentTask->finishedBy = null; + $currentTask->finishedDate = null; + } + + if($currentTask->consumed > 0 and $currentTask->left == 0) + { + $finisedUsers = $this->getFinishedUsers($oldTask->id, $members); + if(count($finisedUsers) != count($members)) + { + if(strpos('cancel,pause', $oldTask->status) === false or ($oldTask->status == 'closed' and $oldTask->reason == 'done')) + { + $currentTask->status = 'doing'; + $currentTask->finishedBy = null; + $currentTask->finishedDate = null; + } + } + elseif(strpos('wait,doing,pause', $oldTask->status) !== false) + { + $currentTask->status = 'done'; + $currentTask->assignedTo = $oldTask->openedBy; + $currentTask->assignedDate = helper::now(); + $currentTask->finishedBy = $this->app->user->account; + $currentTask->finishedDate = $task->finishedDate; + } + } + + return $currentTask; + } } diff --git a/module/task/test/model/computehours4multiple.php b/module/task/test/model/computehours4multiple.php index b568c117f8..ea04d19649 100755 --- a/module/task/test/model/computehours4multiple.php +++ b/module/task/test/model/computehours4multiple.php @@ -2,7 +2,61 @@ id->range('1-5'); +$task->name->range('1-5')->prefix('任务'); +$task->mode->range('multi'); +$task->status->range('wait,doing,done,pause,cancel,closed'); +$task->assignedTo->range('admin,user1'); +$task->openedBy->range('admin,user2,user1'); +$task->gen(5); + +$taskTeam = zdTable('taskteam'); +$taskTeam->id->range('1-20'); +$taskTeam->task->range('1{2},2{3},3{2},4{3}'); +$taskTeam->account->range('admin,user1,admin,user1,user2'); +$taskTeam->estimate->range('1{2},2{3},3,4{2},5'); +$taskTeam->left->range('1{2},0{3},1{3},0{2}'); +$taskTeam->consumed->range('0{11},1{4},0{2},1{3}'); +$taskTeam->status->range('wait{11},doing,done,done,done,wait,wait,doing,done,done'); +$taskTeam->gen(20); + +global $tester; +$tester->loadModel('task'); + +$taskIdList = array(1, 2, 3, 4, 5); +$tasks = array(); +$oldTasks = array(); +foreach($taskIdList as $id) +{ + $task = $tester->task->getByID($id); + $oldTasks[] = $task; + $tasks[] = $task; +} + +$tasks[0]->status = 'doing'; +$tasks[0]->finishedDate = null; + +$tasks[1]->status = 'done'; +$tasks[1]->finishedDate = '2023-04-27'; + +$members1 = new stdclass(); +$members1->account = 'admin'; +$members1->estimate = 1; +$members1->left = 1; + +$members2 = new stdclass(); +$members2->account = 'user1'; +$members2->estimate = 2; +$members2->left = 2; + +$members3 = new stdclass(); +$members3->account = 'user3'; +$members3->estimate = 3; +$members3->left = 3; + +$members = array(array($members1, $members2), array($members3)); /** @@ -10,94 +64,17 @@ title=taskModel->computeHours4Multiple(); cid=1 pid=1 -task状态为wait只有老task计算多人工时 >> 1,po82,wait,3,3,3 -task状态为wait有新老task计算多人工时 >> 1,po82,wait,3,3,3 -task状态为wait有新老task和团队计算多人工时 >> 1,po82,doing,3,3,3 -task状态为done只有老task计算多人工时 >> 903,po82,done,3,3,3 -task状态为done有新老task计算多人工时 >> 903,po82,done,3,3,3 -task状态为done有新老task和团队计算多人工时 >> 903,po82,doing,3,3,3 -task状态为pause只有老task计算多人工时 >> 910,,pause,9,12,9 -task状态为pause有新老task计算多人工时 >> 910,,pause,9,12,9 -task状态为pause只有老task计算多人工时 >> 910,po82,doing,3,3,3 -老task不存在的情况有新老task和团队计算多人工时 >> 0 -老task不存在的情况有新老task计算多人工时 >> 0 -新task不存在的情况有新老task和团队计算多人工时 >> 10001,po82,doing,3,3,3 - */ -$task1 = new stdclass(); -$task1->id = 1; -$task1->status = 'wait'; -$task1->assignedTo = ''; -$task1->openedBy = ''; - -$task2 = new stdclass(); -$task2->id = 1; -$task2->status = 'wait'; -$task2->assignedTo = 'user92'; -$task2->openedBy = ''; - -$task3 = new stdclass(); -$task3->id = 903; -$task3->status = 'done'; -$task3->assignedTo = ''; -$task3->openedBy = ''; - -$task4 = new stdclass(); -$task4->id = 903; -$task4->status = 'done'; -$task4->assignedTo = 'po82'; -$task4->openedBy = ''; - -$task5 = new stdclass(); -$task5->id = 910; -$task5->status = 'pause'; -$task5->assignedTo = ''; -$task5->openedBy = ''; - -$task6 = new stdclass(); -$task6->id = 910; -$task6->status = 'pause'; -$task6->assignedTo = ''; -$task6->openedBy = ''; - -$task7 = new stdclass(); -$task7->id = 100001; -$task7->status = 'done'; -$task7->assignedTo = ''; -$task7->openedBy = ''; - -$task8 = new stdclass(); -$task8->id = 10001; -$task8->status = 'wait'; -$task8->assignedTo = ''; -$task8->openedBy = ''; - -$user1 = new stdclass(); -$user1->account = 'po82'; -$user1->estimate = 1; -$user1->consumed = 1; -$user1->left = 1; - -$user2 = new stdclass(); -$user2->account = 'user92'; -$user2->estimate = 2; -$user2->consumed = 2; -$user2->left = 2; - -$team = array($user1, $user2); - -$autoStatusList = array(true, false); $task = new taskTest(); -r($task->computeHours4MultipleTest($task1)) && p('id,assignedTo,status,estimate,consumed,left') && e('1,po82,wait,3,3,3'); // task状态为wait只有老task计算多人工时 -r($task->computeHours4MultipleTest($task1, $task2)) && p('id,assignedTo,status,estimate,consumed,left') && e('1,po82,wait,3,3,3'); // task状态为wait有新老task计算多人工时 -r($task->computeHours4MultipleTest($task1, $task2, $team)) && p('id,assignedTo,status,estimate,consumed,left') && e('1,po82,doing,3,3,3'); // task状态为wait有新老task和团队计算多人工时 -r($task->computeHours4MultipleTest($task3)) && p('id,assignedTo,status,estimate,consumed,left') && e('903,po82,done,3,3,3'); // task状态为done只有老task计算多人工时 -r($task->computeHours4MultipleTest($task3, $task4)) && p('id,assignedTo,status,estimate,consumed,left') && e('903,po82,done,3,3,3'); // task状态为done有新老task计算多人工时 -r($task->computeHours4MultipleTest($task3, $task4, $team)) && p('id,assignedTo,status,estimate,consumed,left') && e('903,po82,doing,3,3,3'); // task状态为done有新老task和团队计算多人工时 -r($task->computeHours4MultipleTest($task5)) && p('id,assignedTo,status,estimate,consumed,left') && e('910,,pause,9,12,9'); // task状态为pause只有老task计算多人工时 -r($task->computeHours4MultipleTest($task5, $task1, array(), false)) && p('id,assignedTo,status,estimate,consumed,left') && e('910,,pause,9,12,9'); // task状态为pause有新老task计算多人工时 -r($task->computeHours4MultipleTest($task5, $task6, $team)) && p('id,assignedTo,status,estimate,consumed,left') && e('910,po82,doing,3,3,3'); // task状态为pause只有老task计算多人工时 -r($task->computeHours4MultipleTest($task7)) && p('id,assignedTo,status,estimate,consumed,left') && e('0'); // 老task不存在的情况有新老task和团队计算多人工时 -r($task->computeHours4MultipleTest($task7, $task8)) && p('id,assignedTo,status,estimate,consumed,left') && e('0'); // 老task不存在的情况有新老task计算多人工时 -r($task->computeHours4MultipleTest($task1, $task8, $team)) && p('id,assignedTo,status,estimate,consumed,left') && e('10001,po82,doing,3,3,3'); // 新task不存在的情况有新老task和团队计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[0])) && p('id,assignedTo,status,estimate,consumed,left') && e('1,admin,doing,5,0,4'); // taskID 1 只有老task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[1])) && p('id,assignedTo,status,estimate,consumed,left') && e('2,user1,done,13,0,0'); // taskID 2 只有老task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[2])) && p('id,assignedTo,status,estimate,consumed,left') && e('3,admin,done,15,0,4'); // taskID 3 只有老task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[3])) && p('id,assignedTo,status,estimate,consumed,left') && e('4,user1,pause,17,0,2'); // taskID 4 只有老task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[4])) && p('id,assignedTo,status,estimate,consumed,left') && e('5,admin,cancel,0,0,0'); // taskID 5 只有老task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[0], $tasks[0])) && p('id,assignedTo,status,estimate,consumed,left') && e('1,admin,doing,5,0,4'); // taskID 1 有传入task计算多人工时 +r($task->computeHours4MultipleTest($oldTasks[1], $tasks[1])) && p('id,assignedTo,status,estimate,consumed,left') && e('2,user1,done,13,0,0'); // taskID 2 有传入task计算多人工时 +r($task->computehours4multipletest($oldTasks[0], $tasks[0], $members[0])) && p('id,assignedTo,status,estimate,consumed,left') && e('1,admin,doing,3,0,3'); // taskID 1 有传入task 传入members计算多人工时 +r($task->computehours4multipletest($oldTasks[1], $tasks[1], $members[1])) && p('id,assignedTo,status,estimate,consumed,left') && e('2,user1,done,3,0,3'); // taskID 2 有传入task 传入members计算多人工时 +r($task->computehours4multipletest($oldTasks[0], $tasks[0], $members[0], false)) && p('id,assignedTo,status,estimate,consumed,left') && e('1,admin,doing,3,0,3'); // taskID 1 有传入task 传入members 不自动更新状态计算多人工时 +r($task->computehours4multipletest($oldTasks[1], $tasks[1], $members[1], false)) && p('id,assignedTo,status,estimate,consumed,left') && e('2,user1,done,3,0,3'); // taskID 2 有传入task 传入members 不自动更新状态计算多人工时 diff --git a/module/task/test/tao/computecurrenttaskstatus.php b/module/task/test/tao/computecurrenttaskstatus.php new file mode 100644 index 0000000000..bc0d69c456 --- /dev/null +++ b/module/task/test/tao/computecurrenttaskstatus.php @@ -0,0 +1,95 @@ +#!/usr/bin/env php +id->range('1-5'); +$task->name->range('1-5')->prefix('任务'); +$task->mode->range('multi'); +$task->status->range('wait,doing,done,pause,cancel,closed'); +$task->assignedTo->range('admin,user1'); +$task->openedBy->range('admin,user2,user1'); +$task->gen(5); + +$taskTeam = zdTable('taskteam'); +$taskTeam->id->range('1-20'); +$taskTeam->task->range('1{2},2{3},3{2},4{3}'); +$taskTeam->account->range('admin,user1,admin,user1,user2'); +$taskTeam->estimate->range('1{2},2{3},3,4{2},5'); +$taskTeam->left->range('1{2},0{3},1{3},0{2}'); +$taskTeam->consumed->range('0{11},1{4},0{2},1{3}'); +$taskTeam->status->range('wait{11},doing,done,done,done,wait,wait,doing,done,done'); +$taskTeam->gen(20); + +global $tester; +$tester->loadModel('task'); + +$taskIdList = array(1, 2, 3, 4, 5); + +$tasks = array(); +$oldTasks = array(); +$currentTasks = array(); +foreach($taskIdList as $id) +{ + $task = $tester->task->getByID($id); + $oldTasks[] = $task; + $tasks[] = $task; + $currentTasks[] = $task; +} + +$tasks[0]->status = 'doing'; +$tasks[0]->finishedDate = null; + +$tasks[1]->status = 'done'; +$tasks[1]->finishedDate = '2023-04-27'; + +$currentTasks[0]->assignedTo = 'user1'; +$currentTasks[0]->estimate = 9; +$currentTasks[0]->left = 0; +$currentTasks[0]->consumed = 10; + +$currentTasks[1]->assignedTo = 'admin'; +$currentTasks[1]->estimate = 8; +$currentTasks[1]->left = 8; +$currentTasks[1]->consumed = 0; + +$member1 = new stdclass(); +$members = array(array('admin', 'user1'), array('user2')); +$autoStatus = array(true, false); +$hasEfforts = array(true, false); + +/** + +title=taskModel->computeCurrentTaskStatus(); +timeout=0 +cid=1 + +*/ + +$task = new taskTest(); +$task1 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[0], $tasks[0], $autoStatus[0], $hasEfforts[0], $members[0]); +$task2 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[1], $tasks[0], $autoStatus[0], $hasEfforts[0], $members[0]); +$task3 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[1], $tasks[1], $autoStatus[0], $hasEfforts[0], $members[0]); +$task4 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[0], $members[0]); +$task5 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[1], $members[0]); +$task6 = $task->computeCurrentTaskStatusTest($currentTasks[0], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[1], $members[1]); +$task7 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[0], $tasks[0], $autoStatus[0], $hasEfforts[0], $members[0]); +$task8 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[1], $tasks[0], $autoStatus[0], $hasEfforts[0], $members[0]); +$task9 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[1], $tasks[1], $autoStatus[0], $hasEfforts[0], $members[0]); +$task10 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[0], $members[0]); +$task11 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[1], $members[0]); +$task12 = $task->computeCurrentTaskStatusTest($currentTasks[1], $oldTasks[1], $tasks[1], $autoStatus[1], $hasEfforts[1], $members[1]); + +r($task1) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task1 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态自动变更 没有工时消耗 团队成员members[0] +r($task2) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task2 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态自动变更 没有工时消耗 团队成员members[0] +r($task3) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task3 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态自动变更 没有工时消耗 团队成员members[0] +r($task4) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task4 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态非自动变更 没有工时消耗 团队成员members[0] +r($task5) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task5 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态非自动变更 有工时消耗 团队成员members[0] +r($task6) && p('status,assignedTo,estimate,left,consumed') && e('doing,user1,9,0,10'); // 查询 task6 情况的task信息 currentTask[0] taskID 1 currentTasksestimate 状态非自动变更 有工时消耗 团队成员members[1] +r($task7) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task7 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态自动变更 有工时消耗 团队成员members[0] +r($task8) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task8 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态自动变更 有工时消耗 团队成员members[0] +r($task9) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task9 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态自动变更 有工时消耗 团队成员members[0] +r($task10) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task10 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态非自动变更 有工时消耗 团队成员members[0] +r($task11) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task11 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态非自动变更 没有工时消耗 团队成员members[0] +r($task12) && p('status,assignedTo,estimate,left,consumed') && e('done,admin,8,8,0'); // 查询 task12 情况的task信息 currentTask[1] taskID 2 currentTasksestimate 状态非自动变更 没有工时消耗 团队成员members[1] diff --git a/module/task/test/task.class.php b/module/task/test/task.class.php index 51ad5cb2db..f80cb6435a 100644 --- a/module/task/test/task.class.php +++ b/module/task/test/task.class.php @@ -1558,8 +1558,8 @@ class taskTest /** * Get the assignedTo for the multiply linear task. - * - * @param int $taskID + * + * @param int $taskID * @param string $type current|next * @access public * @return string @@ -1571,4 +1571,29 @@ class taskTest return $this->objectModel->getAssignedTo4Multi($members, $task, $type); } + + /** + * Test fetch tasks of a execution. + * + * @param object $currentTask + * @param object $oldTask + * @param object $task + * @param bool $condition true|false + * @param bool $hasEfforts true|false + * @param int $teamCount + * @access public + * @return object + */ + public function computeCurrentTaskStatusTest(object $currentTask, object $oldTask, object $task, bool $autoStatus, bool $hasEfforts, array $members): object + { + $task = $this->objectModel->computeCurrentTaskStatus($currentTask, $oldTask, $task, $autoStatus, $hasEfforts, $members); + if(dao::isError()) + { + return dao::getError(); + } + else + { + return $task; + } + } } From f913a2dc021a26a595954b85c390002cfe5593f7 Mon Sep 17 00:00:00 2001 From: shenshulong Date: Thu, 27 Apr 2023 10:38:17 +0000 Subject: [PATCH 4/4] * Adjusted todo start function. --- module/todo/control.php | 23 ++++++----------- module/todo/model.php | 11 +++++--- module/todo/test/model/start.php | 44 +++++++++++++++++++++++++------- module/todo/zen.php | 20 +++++++++++++++ 4 files changed, 70 insertions(+), 28 deletions(-) mode change 100644 => 100755 module/todo/control.php mode change 100644 => 100755 module/todo/model.php mode change 100644 => 100755 module/todo/zen.php diff --git a/module/todo/control.php b/module/todo/control.php old mode 100644 new mode 100755 index f2eb02a1dd..eae6bd4e6f --- a/module/todo/control.php +++ b/module/todo/control.php @@ -285,29 +285,22 @@ class todo extends control } /** + * 开启一个待办事项 * Start a todo. * - * @param int $todoID + * @param string $todoID * @access public * @return void */ - public function start($todoID) + public function start(string $todoID): void { - $todo = $this->todo->getById($todoID); + $todoID = (int)$todoID; + $todo = $this->todo->getById($todoID); + if($todo->status == 'wait') $this->todo->start($todoID); - if(in_array($todo->type, array('bug', 'task', 'story'))) - { - $confirmNote = 'confirm' . ucfirst($todo->type); - $confirmURL = $this->createLink($todo->type, 'view', "id=$todo->idvalue"); - $okTarget = isonlybody() ? 'parent' : 'window.parent.$.apps.open'; - if($todo->type == 'bug') $app = 'qa'; - if($todo->type == 'task') $app = 'execution'; - if($todo->type == 'story') $app = 'product'; - $cancelURL = $this->server->HTTP_REFERER; - return print(js::confirm(sprintf($this->lang->todo->$confirmNote, $todo->idvalue), $confirmURL, $cancelURL, $okTarget, 'parent', $app)); - } + if(in_array($todo->type, array('bug', 'task', 'story'))) return $this->todoZen->printConfirm($todo); + if(isonlybody()) return print(js::reload('parent.parent')); - if(isonlybody())return print(js::reload('parent.parent')); echo js::reload('parent'); } diff --git a/module/todo/model.php b/module/todo/model.php old mode 100644 new mode 100755 index d9278195d5..6463d3087f --- a/module/todo/model.php +++ b/module/todo/model.php @@ -226,16 +226,19 @@ class todoModel extends model } /** + * 开启一个待办事项 * Start one todo. * - * @param string $todoID + * @param int $todoID * @access public - * @return void + * @return bool */ - public function start($todoID) + public function start(int $todoID): bool { - $this->dao->update(TABLE_TODO)->set('status')->eq('doing')->where('id')->eq((int)$todoID)->exec(); + $this->dao->update(TABLE_TODO)->set('status')->eq('doing')->where('id')->eq($todoID)->exec(); $this->loadModel('action')->create('todo', $todoID, 'started'); + + return !dao::isError(); } diff --git a/module/todo/test/model/start.php b/module/todo/test/model/start.php index 00b4d7d9c8..eac4050b91 100755 --- a/module/todo/test/model/start.php +++ b/module/todo/test/model/start.php @@ -4,22 +4,48 @@ include dirname(__FILE__, 5) . "/test/lib/init.php"; include dirname(__FILE__, 2) . '/todo.class.php'; su('admin'); +function initData() +{ + $todo = zdTable('todo'); + $todo->id->range('1-5'); + $todo->account->prefix('admin')->range('1-5'); + $todo->begin->range('1710'); + $todo->end->range('1740'); + $todo->feedback->range('0'); + $todo->type->range('custom'); + $todo->cycle->range('0'); + $todo->idvalue->range('0'); + $todo->pri->range("3"); + $todo->name->prefix('测试待办')->range('1-5'); + $todo->desc->range('描述'); + $todo->status->range('wait'); + $todo->private->range('0'); + $todo->assignedTo->prefix('admin')->range('1-5'); + $todo->assignedBy->prefix('admin')->range('1-5'); + $todo->finishedBy->prefix('admin')->range('1-5'); + $todo->closedBy->prefix('admin')->range('1-5'); + $todo->deleted->range('0'); + $todo->vision->range('1.0'); + + $todo->gen(5); +} + /** title=测试 todoModel->start(); +timeout=0 cid=1 -pid=1 -开始一个状态为wait的todo >> doing -开始一个状态为doing的todo >> doing -开始一个状态为done的todo >> doing +读取文件/var/www/html/studyProject/zin//var/www/html/studyProject/zin/module/todo/test/model/data/todo_start.yaml失败。 +- 执行todo模块的start方法,参数是1,属性status @doing +- 执行todo模块的start方法,参数是2,属性status @doing + */ -$todoIDList = array('1', '2', '3'); - $todo = new todoTest(); -r($todo->startTest($todoIDList[0])) && p('status') && e('doing'); // 开始一个状态为wait的todo -r($todo->startTest($todoIDList[1])) && p('status') && e('doing'); // 开始一个状态为doing的todo -r($todo->startTest($todoIDList[2])) && p('status') && e('doing'); // 开始一个状态为done的todo +initData(); + +r($todo->startTest(1)) && p('status') && e('doing'); +r($todo->startTest(2)) && p('status') && e('doing'); \ No newline at end of file diff --git a/module/todo/zen.php b/module/todo/zen.php old mode 100644 new mode 100755 index a27d9c0a67..f5ccfe9f9c --- a/module/todo/zen.php +++ b/module/todo/zen.php @@ -239,4 +239,24 @@ class todoZen extends todo return $formData; } + + /** + * 输出确认弹框 + * Output confirm alert. + * + * @param object $todo + * @access protected + * @return int + */ + protected function printConfirm(object $todo): int + { + $confirmNote = 'confirm' . ucfirst($todo->type); + $confirmURL = $this->createLink($todo->type, 'view', "id=$todo->idvalue"); + $okTarget = isonlybody() ? 'parent' : 'window.parent.$.apps.open'; + if($todo->type == 'bug') $app = 'qa'; + if($todo->type == 'task') $app = 'execution'; + if($todo->type == 'story') $app = 'product'; + $cancelURL = $this->server->HTTP_REFERER; + return print(js::confirm(sprintf($this->lang->todo->$confirmNote, $todo->idvalue), $confirmURL, $cancelURL, $okTarget, 'parent', $app)); + } }