diff --git a/db/update20.0.sql b/db/update20.0.sql index dc79444af7..611487e6ee 100644 --- a/db/update20.0.sql +++ b/db/update20.0.sql @@ -298,3 +298,5 @@ ALTER TABLE `zt_block` ADD UNIQUE `account_module_type_order` (`account`, `modul INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('1', '0', '*', '*', '*', 'moduleName=weekly&methodName=computeWeekly', '更新项目周报', 'system', 0, 'normal', '2020-08-27 10:07:53'); ALTER TABLE `zt_story` ADD `URChanged` enum('0','1') NOT NULL DEFAULT '0' AFTER `version`; + +ALTER TABLE `zt_team` MODIFY COLUMN `type` enum('project','task','stage','sprint') NOT NULL DEFAULT 'project' AFTER `root`; diff --git a/db/zentao.sql b/db/zentao.sql index 8570bd5b6a..b508f42906 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1032,7 +1032,7 @@ CREATE TABLE IF NOT EXISTS `zt_taskestimate` ( CREATE TABLE IF NOT EXISTS `zt_team` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `root` mediumint(8) unsigned NOT NULL default '0', - `type` enum('project','task') NOT NULL DEFAULT 'project', + `type` enum('project','task','stage','sprint') NOT NULL DEFAULT 'project', `account` char(30) NOT NULL default '', `role` char(30) NOT NULL default '', `limited` char(8) NOT NULL default 'no', diff --git a/module/dept/model.php b/module/dept/model.php index 76055131a6..cec038f5aa 100644 --- a/module/dept/model.php +++ b/module/dept/model.php @@ -384,7 +384,7 @@ class deptModel extends model ->orderBy('account') ->fetchPairs(); } - + /** * Delete a department. * diff --git a/module/programplan/model.php b/module/programplan/model.php index d52776fb9f..ea528587ef 100644 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -276,7 +276,7 @@ class programplanModel extends model $start = $task->estStarted == '0000-00-00' ? '' : date('d-m-Y', strtotime($task->estStarted)); $end = $task->deadline == '0000-00-00' ? '' : $task->deadline; - $realBegan = $task->realBegan == '0000-00-00' ? '' : $task->realBegan; + $realBegan = $task->realStarted == '0000-00-00' ? '' : $task->realStarted; $realEnd = $task->finishedDate == '0000-00-00 00:00:00' ? '' : substr($task->finishedDate, 5, 11); $priIcon = sprintf($taskPri, $task->pri, $task->pri, $task->pri); diff --git a/module/project/control.php b/module/project/control.php index a1381d1292..3253893be1 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1918,10 +1918,11 @@ class project extends control * * @param int $projectID * @param int $team2Import the team to import. + * @param int $dept * @access public * @return void */ - public function manageMembers($projectID = 0, $team2Import = 0, $dept = '') + public function manageMembers($projectID = 0, $team2Import = 0, $dept = 0) { if(!empty($_POST)) { @@ -1936,7 +1937,7 @@ class project extends control $project = $this->project->getById($projectID); $users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback', '', $this->config->maxCount); $roles = $this->user->getUserRoles(array_keys($users)); - $deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept); + $deptUsers = empty($dept) ? array() : $this->dept->getDeptUserPairs($dept); $currentMembers = $this->project->getTeamMembers($projectID); $members2Import = $this->project->getMembers2Import($team2Import, array_keys($currentMembers)); $teams2Import = $this->project->getTeams2Import($this->app->user->account, $projectID); diff --git a/module/project/model.php b/module/project/model.php index 93e7e8b978..0640158821 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1823,10 +1823,14 @@ class projectModel extends model public function getTeamMembers($projectID) { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getTeamMembers(); + + $project = $this->getByID($projectID); + if(empty($project)) return array(); + return $this->dao->select("t1.*, t1.hours * t1.days AS totalHours, if(t2.deleted='0', t2.realname, t1.account) as realname")->from(TABLE_TEAM)->alias('t1') ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account') ->where('t1.root')->eq((int)$projectID) - ->andWhere('t1.type')->eq('project') + ->andWhere('t1.type')->eq($project->type) ->andWhere('t2.deleted')->eq('0') ->fetchAll('account'); } @@ -1942,12 +1946,15 @@ class projectModel extends model { $project = $this->getByID($projectID); $data = (array)fixer::input('post')->get(); - extract($data); - $accounts = array_unique($accounts); - $limited = array_values($limited); - $oldJoin = $this->dao->select('`account`, `join`')->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq('project')->fetchPairs(); - $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq('project')->exec(); + extract($data); + $projectType = $project->type; + $accounts = array_unique($accounts); + $limited = array_values($limited); + $oldJoin = $this->dao->select('`account`, `join`')->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq($projectType)->fetchPairs(); + $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq($projectType)->exec(); + + $projectMember = array(); foreach($accounts as $key => $account) { if(empty($account)) continue; @@ -1961,8 +1968,49 @@ class projectModel extends model $member->root = (int)$projectID; $member->account = $account; $member->join = isset($oldJoin[$account]) ? $oldJoin[$account] : helper::today(); - $member->type = 'project'; + $member->type = $projectType; + $projectMember[$account] = $member; + $this->dao->insert(TABLE_TEAM)->data($member)->exec(); + } + + /* Add iteration or phase team members to the project team. */ + if($projectType == 'stage' || $projectType == 'sprint') $this->addProjectMembers($project->parent, $projectMember); + + /* Only changed account update userview. */ + $oldAccounts = array_keys($oldJoin); + $changedAccounts = array_diff($accounts, $oldAccounts); + $changedAccounts = array_merge($changedAccounts, array_diff($oldAccounts, $accounts)); + $changedAccounts = array_unique($changedAccounts); + + $this->loadModel('user')->updateUserView($projectID, $projectType, $changedAccounts); + + $products = $this->getProducts($projectID, false); + if($products) $this->user->updateUserView(array_keys($products), 'product', $changedAccounts); + } + + /** + * Add iteration or phase team members to the project team. + * + * @param int $projectID + * @param array $members + * @access public + * @return void + */ + public function addProjectMembers($projectID, $members = array()) + { + $project = $this->getByID($projectID); + $projectType = $project->type; + $oldJoin = $this->dao->select('`account`, `join`')->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq($projectType)->fetchPairs(); + + $accounts = array(); + foreach($members as $account => $member) + { + if(isset($oldJoin[$account])) continue; + + $accounts[] = $account; + $member->root = $projectID; + $member->type = $projectType; $this->dao->insert(TABLE_TEAM)->data($member)->exec(); } @@ -1972,8 +2020,7 @@ class projectModel extends model $changedAccounts = array_merge($changedAccounts, array_diff($oldAccounts, $accounts)); $changedAccounts = array_unique($changedAccounts); - $objectType = $project->model ? 'program' : 'project'; - $this->loadModel('user')->updateUserView($projectID, $objectType, $changedAccounts); + $this->loadModel('user')->updateUserView($projectID, $projectType, $changedAccounts); $products = $this->getProducts($projectID, false); if($products) $this->user->updateUserView(array_keys($products), 'product', $changedAccounts); @@ -1989,9 +2036,10 @@ class projectModel extends model */ public function unlinkMember($projectID, $account) { - $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq('project')->andWhere('account')->eq($account)->exec(); + $project = $this->getByID($projectID); + $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq($project->type)->andWhere('account')->eq($account)->exec(); - $this->loadModel('user')->updateUserView($projectID, 'project', array($account)); + $this->loadModel('user')->updateUserView($projectID, $project->type, array($account)); $products = $this->getProducts($projectID, false); if($products) $this->user->updateUserView(array_keys($products), 'product', array($account)); } diff --git a/module/user/model.php b/module/user/model.php index 666498e26c..03d955cf52 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -1516,9 +1516,9 @@ class userModel extends model /** * Update user view. * - * @param int|array $objectID - * @param string $objectType - * @param array $users + * @param int|array $objectID + * @param string $objectType + * @param array $users * @access public * @return void */