diff --git a/module/task/config/form.php b/module/task/config/form.php index acb2226339..97708e9c18 100644 --- a/module/task/config/form.php +++ b/module/task/config/form.php @@ -43,32 +43,34 @@ $config->task->form->manageTeam['lastEditedDate'] = array('type' => 'string', 'r $config->task->form->manageTeam['assignedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now()); $config->task->form->edit = array(); -$config->task->form->edit['name'] = array('type' => 'string', 'required' => true); -$config->task->form->edit['color'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['desc'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['execution'] = array('type' => 'int', 'required' => true); -$config->task->form->edit['story'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->task->form->edit['module'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->task->form->edit['parent'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->task->form->edit['mailto'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['mode'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['assignedTo'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['type'] = array('type' => 'string', 'required' => true); -$config->task->form->edit['status'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['pri'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->task->form->edit['estStarted'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['deadline'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['estimate'] = array('type' => 'float', 'required' => false, 'default' => 0); -$config->task->form->edit['left'] = array('type' => 'float', 'required' => false, 'default' => 0); -$config->task->form->edit['consumed'] = array('type' => 'float', 'required' => false, 'default' => 0); -$config->task->form->edit['realStarted'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['finishedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['finishedDate'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['canceledBy'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['canceledDate'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['closedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['closedReason'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['closedDate'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['name'] = array('type' => 'string', 'required' => true); +$config->task->form->edit['color'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['desc'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['execution'] = array('type' => 'int', 'required' => true); +$config->task->form->edit['story'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->task->form->edit['module'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->task->form->edit['parent'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->task->form->edit['mailto'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->edit['mode'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['assignedTo'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['type'] = array('type' => 'string', 'required' => true); +$config->task->form->edit['status'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['pri'] = array('type' => 'int', 'required' => false, 'default' => 0); +$config->task->form->edit['estStarted'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['deadline'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['estimate'] = array('type' => 'float', 'required' => false, 'default' => 0); +$config->task->form->edit['left'] = array('type' => 'float', 'required' => false, 'default' => 0); +$config->task->form->edit['consumed'] = array('type' => 'float', 'required' => false, 'default' => 0); +$config->task->form->edit['realStarted'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['finishedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['finishedDate'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['canceledBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['canceledDate'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['closedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['closedReason'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['closedDate'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account); +$config->task->form->edit['lastEditedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now()); $config->task->form->team->edit = array(); $config->task->form->team->edit['team'] = array('type' => 'array', 'required' => false, 'default' => array()); diff --git a/module/task/control.php b/module/task/control.php index 5c8f7b815f..7d78cb8198 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -167,25 +167,20 @@ class task extends control if(!empty($_POST)) { - $changes = array(); - $taskDataFixer = form::data($this->config->task->form->edit); - $teamDataFixer = form::data($this->config->task->form->team->edit); - $rawData = $taskDataFixer->rawdata; - /* Prepare and check data. */ - $task = $this->taskZen->prepareEdit($taskDataFixer, $taskID); - $team = $teamDataFixer->get(); + $postData = form::data()->getAll(true); + $task = $this->taskZen->buildTaskForEdit($taskID, $postData); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); /* Update task. */ - $changes = $this->task->update($task, $team, $rawData); + $changes = $this->task->update($task, $postData); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); /* Record log. */ - if($rawData->comment != '' or !empty($changes)) + if($postData->comment != '' or !empty($changes)) { $action = !empty($changes) ? 'Edited' : 'Commented'; - $actionID = $this->loadModel('action')->create('task', $taskID, $action, $rawData->comment); + $actionID = $this->loadModel('action')->create('task', $taskID, $action, $postData->comment); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } diff --git a/module/task/model.php b/module/task/model.php index 6e1409b71c..59e2fcaceb 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -586,12 +586,12 @@ class taskModel extends model /** * Update a task. * - * @param object $task - * @param object $team + * @param object $task + * @param object $postData * @access public * @return array|string|false */ - public function update(object $task, object $team): array|string|false + public function update(object $task, object $postData): array|string|false { $taskID = $task->id; if($taskID <= 0) return false; @@ -599,16 +599,24 @@ class taskModel extends model $oldTask = $this->getByID($taskID); /* When the selected parent task is a common task and has consumption, select other parent tasks. */ - if($this->post->parent > 0) + if($postData->parent > 0) { $taskConsumed = 0; - $taskConsumed = $this->dao->select('consumed')->from(TABLE_TASK)->where('id')->eq($this->post->parent)->andWhere('parent')->eq(0)->fetch('consumed'); - if($taskConsumed > 0) return print(js::error($this->lang->task->error->alreadyConsumed)); + $taskConsumed = $this->dao->select('consumed')->from(TABLE_TASK)->where('id')->eq($postData->parent)->andWhere('parent')->eq(0)->fetch('consumed'); + if($taskConsumed > 0) + { + dao::$errors[] = $this->lang->task->error->alreadyConsumed; + return false; + } } - if($task->consumed < $oldTask->consumed) return print(js::error($this->lang->task->error->consumedSmall)); + if($task->consumed < $oldTask->consumed) + { + dao::$errors[] = $this->lang->task->error->consumedSmall; + return false; + } - if($this->post->team and count(array_filter($this->post->team)) > 1) + if($postData->team and count(array_filter($postData->team)) > 1) { $teams = $this->manageTaskTeam($oldTask->mode, $taskID, $task->status); if(!empty($teams)) $task = $this->computeMultipleHours($oldTask, $task, array(), false); @@ -623,9 +631,9 @@ class taskModel extends model if(isset($task->version) && $task->version > $oldTask->version) $this->taskTao->recordTaskVersion($task); - if($this->post->story != $oldTask->story) + if($postData->story != $oldTask->story) { - $this->loadModel('story')->setStage($this->post->story); + $this->loadModel('story')->setStage($postData->story); $this->story->setStage($oldTask->story); } if($task->status == 'done') $this->loadModel('score')->create('task', 'finish', $taskID); @@ -668,10 +676,10 @@ class taskModel extends model $oldTask->team = ''; foreach($oldTeams as $team) $oldTask->team .= "{$this->lang->task->teamMember}: " . zget($users, $team->account) . ", {$this->lang->task->estimateAB}: " . (float)$team->estimate . ", {$this->lang->task->consumedAB}: " . (float)$team->consumed . ", {$this->lang->task->leftAB}: " . (float)$team->left . "\n"; $task->team = ''; - foreach($this->post->team as $i => $account) + foreach($postData->team as $i => $account) { if(empty($account)) continue; - $task->team .= "{$this->lang->task->teamMember}: " . zget($users, $account) . ", {$this->lang->task->estimateAB}: " . zget($this->post->teamEstimate, $i, 0) . ", {$this->lang->task->consumedAB}: " . zget($this->post->teamConsumed, $i, 0) . ", {$this->lang->task->leftAB}: " . zget($this->post->teamLeft, $i, 0) . "\n"; + $task->team .= "{$this->lang->task->teamMember}: " . zget($users, $account) . ", {$this->lang->task->estimateAB}: " . zget($postData->teamEstimate, $i, 0) . ", {$this->lang->task->consumedAB}: " . zget($postData->teamConsumed, $i, 0) . ", {$this->lang->task->leftAB}: " . zget($postData->teamLeft, $i, 0) . "\n"; } } diff --git a/module/task/zen.php b/module/task/zen.php index 63019d7858..f8463ef5ae 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -38,66 +38,61 @@ class taskZen extends task /* Set menu. */ $this->execution->setMenu($this->view->execution->id); - $this->view->position[] = html::a($this->createLink('execution', 'browse', "execution={$this->view->task->execution}"), $this->view->execution->name); } /** - * 准备编辑数据。 - * Prepare edit data. + * 构造待更新的任务数据。 + * Build the task data to be updated. * - * @param form $postDataFixer - * @param int $taskID + * @param int $taskID * @access protected * @return object|false */ - protected function prepareEdit(form $postDataFixer, int $taskID): object|false + protected function buildTaskForEdit(int $taskID): object|false { - $now = helper::now(); $oldTask = $this->task->getByID($taskID); - $postData = $postDataFixer->get(); + $postData = form::data()->getAll(true); - /* Check that the data is reasonable. */ + /* Check if the input post meets the requirements. */ if($postData->estimate < 0 or $postData->left < 0 or $postData->consumed < 0) dao::$errors[] = $this->lang->task->error->recordMinus; if(!empty($this->config->limitTaskDate)) $this->task->checkEstStartedAndDeadline($oldTask->execution, $postData->estStarted, $postData->deadline); if(!empty($postData->lastEditedDate) && $oldTask->lastEditedDate != $postData->lastEditedDate) dao::$errors[] = $this->lang->error->editedByOther; if(dao::isError()) return false; - $task = $postDataFixer->add('id', $taskID) - ->setIF(!$postData->assignedTo && !empty($oldTask->team) && !empty($postDataFixer->rawdata->team), 'assignedTo', $this->task->getAssignedTo4Multi($postDataFixer->rawdata->team, $oldTask)) - ->setIF(!$oldTask->mode && !$postData->assignedTo && !empty($postDataFixer->rawdata->team), 'assignedTo', $postDataFixer->rawdata->team[0]) - - ->setIF($oldTask->parent == 0 && $postData->parent == '', 'parent', 0) - ->setIF($postData->story !== false && $postData->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($postData->story)) + $now = helper::now(); + $task = form::data()->add('id', $taskID) + ->setIF(!$postData->assignedTo && !empty($oldTask->team) && !empty($postData->team), 'assignedTo', $this->task->getAssignedTo4Multi($postData->team, $oldTask)) + ->setIF($postData->assignedTo != $oldTask->assignedTo, 'assignedDate', $now) ->setIF($postData->mode == 'single', 'mode', '') - ->setIF($postData->status == 'done', 'left', 0) - ->setIF($postData->status == 'done' && !$postData->finishedBy, 'finishedBy', $this->app->user->account) - ->setIF($postData->status == 'done' && !$postData->finishedDate, 'finishedDate', $now) + ->setIF(!$oldTask->mode && !$postData->assignedTo && !empty($postData->team), 'assignedTo', $postData->team[0]) + ->setIF($postData->story !== false && $postData->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($postData->story)) + ->setIF($postData->status == 'wait' && $postData->left == $oldTask->left && $postData->consumed == 0 && $postData->estimate, 'left', $postData->estimate) - ->setIF($postData->status == 'cancel' && !$postData->canceledBy, 'canceledBy', $this->app->user->account) - ->setIF($postData->status == 'cancel' && !$postData->canceledDate, 'canceledDate', $now) + ->setIF($postData->status == 'done', 'left', 0) + ->setIF($postData->status == 'done' && empty($postData->finishedBy), 'finishedBy', $this->app->user->account) + ->setIF($postData->status == 'done' && empty($postData->finishedDate), 'finishedDate', $now) + + ->setIF($postData->status == 'cancel' && empty($postData->canceledBy), 'canceledBy', $this->app->user->account) + ->setIF($postData->status == 'cancel' && empty($postData->canceledDate), 'canceledDate', $now) ->setIF($postData->status == 'cancel', 'assignedTo', $oldTask->openedBy) ->setIF($postData->status == 'cancel', 'assignedDate', $now) - ->setIF($postData->status == 'closed' && !$postData->closedBy, 'closedBy', $this->app->user->account) - ->setIF($postData->status == 'closed' && !$postData->closedDate, 'closedDate', $now) + ->setIF($postData->status == 'closed' && empty($postData->closedBy), 'closedBy', $this->app->user->account) + ->setIF($postData->status == 'closed' && empty($postData->closedDate), 'closedDate', $now) + ->setIF($postData->consumed > 0 && $postData->left > 0 && $postData->status == 'wait', 'status', 'doing') - ->setIF($postData->assignedTo != $oldTask->assignedTo, 'assignedDate', $now) - - ->setIF($postData->status == 'wait' && $postData->left == $oldTask->left && $postData->consumed == 0 && $postData->estimate, 'left', $postData->estimate) - ->setIF($oldTask->parent > 0 && !$postData->parent, 'parent', 0) + ->setIF($oldTask->parent >= 0 && empty($postData->parent), 'parent', 0) ->setIF($oldTask->parent < 0, 'estimate', $oldTask->estimate) ->setIF($oldTask->parent < 0, 'left', $oldTask->left) ->setIF($oldTask->name != $postData->name || $oldTask->estStarted != $postData->estStarted || $oldTask->deadline != $postData->deadline, 'version', $oldTask->version + 1) - ->add('lastEditedBy', $this->app->user->account) - ->add('lastEditedDate', $now) ->stripTags($this->config->task->editor->edit['id'], $this->config->allowedTags) ->join('mailto', ',') ->get(); - return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $postDataFixer->rawData->uid); + return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $postData->uid); } /**