Merge branch 'master' of git.zcorp.cc:easycorp/zentaopms

This commit is contained in:
dingguodong
2023-04-27 18:41:33 +08:00
11 changed files with 464 additions and 274 deletions
+10 -2
View File
@@ -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');
+9 -55
View File
@@ -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. */
+56
View File
@@ -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;
}
}
@@ -2,7 +2,61 @@
<?php
include dirname(__FILE__, 5) . "/test/lib/init.php";
include dirname(__FILE__, 2) . '/task.class.php';
su('admin');
$task = zdTable('task');
$task->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 不自动更新状态计算多人工时
@@ -0,0 +1,95 @@
#!/usr/bin/env php
<?php
include dirname(__FILE__, 5) . "/test/lib/init.php";
include dirname(__FILE__, 2) . '/task.class.php';
$task = zdTable('task');
$task->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]
+27 -2
View File
@@ -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;
}
}
}
Regular → Executable
+8 -15
View File
@@ -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');
}
Regular → Executable
+7 -4
View File
@@ -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();
}
+35 -9
View File
@@ -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');
Regular → Executable
+20
View File
@@ -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));
}
}
+131 -98
View File
@@ -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;
}
}
/**