+
+ createLink('program', 'craetestakeholder', "programID={$programID}"), " {$lang->program->createStakeholder}");?>
+
+
+
+ project->selectDept?>
+ project->selectDeptTitle}'");?>
+
+ diff --git a/config/zentaopms.php b/config/zentaopms.php index 231f74d87d..0e70503285 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -171,6 +171,7 @@ define('TABLE_USERTPL', '`' . $config->db->prefix . 'usertpl`'); define('TABLE_PRODUCT', '`' . $config->db->prefix . 'product`'); define('TABLE_BRANCH', '`' . $config->db->prefix . 'branch`'); +define('TABLE_STAKEHOLDER', '`' . $config->db->prefix . 'stakeholder`'); define('TABLE_STORY', '`' . $config->db->prefix . 'story`'); define('TABLE_STORYSPEC', '`' . $config->db->prefix . 'storyspec`'); define('TABLE_STORYSTAGE', '`' . $config->db->prefix . 'storystage`'); diff --git a/db/update20.0.sql b/db/update20.0.sql index 14956b53e6..5bc654b7c2 100644 --- a/db/update20.0.sql +++ b/db/update20.0.sql @@ -41,6 +41,7 @@ ALTER TABLE `zt_userview` ADD `programs` mediumtext NOT NULL AFTER `account`, AD ALTER TABLE `zt_user` ADD `type` char(30) NOT NULL default 'inside' AFTER `account`; +-- DROP TABLE IF EXISTS `zt_stage`; CREATE TABLE `zt_stage` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, @@ -54,6 +55,22 @@ CREATE TABLE `zt_stage` ( PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; +-- DROP TABLE IF EXISTS `zt_stakeholder`; +CREATE TABLE `zt_stakeholder` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `objectID` mediumint(8) NOT NULL, + `objectType` char(30) NOT NULL, + `user` char(30) NOT NULL, + `type` char(30) NOT NULL, + `key` enum('0','1') NOT NULL, + `from` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + INSERT INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES ('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), ('设计','10','design','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), diff --git a/db/zentao.sql b/db/zentao.sql index 327263ce89..fa57b28677 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -872,6 +872,21 @@ CREATE TABLE `zt_risk` ( `deleted` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; +-- DROP TABLE IF EXISTS `zt_stakeholder`; +CREATE TABLE `zt_stakeholder` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `objectID` mediumint(8) NOT NULL, + `objectType` char(30) NOT NULL, + `user` char(30) NOT NULL, + `type` char(30) NOT NULL, + `key` enum('0','1') NOT NULL, + `from` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_story`; CREATE TABLE IF NOT EXISTS `zt_story` ( `id` mediumint(8) unsigned NOT NULL auto_increment, diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 8969fa5a20..31e2e66b87 100755 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -138,11 +138,11 @@ $lang->program->menu->index = '主页|program|pgmindex|'; $lang->program->menu->browse = array('link' => '项目集|program|pgmbrowse|', 'alias' => 'pgmcreate,pgmedit,pgmgroup,pgmmanagepriv,pgmmanageview,pgmmanagemembers'); $lang->program->viewMenu = new stdclass(); -$lang->program->viewMenu->view = '概况|program|pgmview|program=%s'; +$lang->program->viewMenu->view = array('link' => '概况|program|pgmview|program=%s'); $lang->program->viewMenu->product = array('link' => '产品|program|pgmproduct|program=%s'); $lang->program->viewMenu->project = array('link' => "项目|program|pgmproject|program=%s"); $lang->program->viewMenu->personnel = array('link' => "人员|personnel|accessible|program=%s"); -$lang->program->viewMenu->stakeholder = array('link' => "干系人|program|pgmproject|program=%s"); +$lang->program->viewMenu->stakeholder = array('link' => "干系人|program|pgmstakeholder|program=%s", 'alias' => 'createstakeholder'); $lang->personnel = new stdClass(); $lang->personnel->menu = new stdClass(); diff --git a/module/program/control.php b/module/program/control.php index 1bcd5bd840..0c514551c0 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -318,7 +318,7 @@ class program extends control if($childrenCount) die(js::alert($this->lang->program->hasChildren)); $program = $this->dao->select('*')->from(TABLE_PROGRAM)->where('id')->eq($programID)->fetch(); - if($confirm == 'no') die(js::confirm(sprintf($this->lang->program->confirmDelete, $program->name), $this->createLink('program', 'delete', "programID=$programID&confirm=yes"))); + if($confirm == 'no') die(js::confirm($this->lang->program->confirmDelete, $this->createLink('program', 'delete', "programID=$programID&confirm=yes"))); $this->dao->update(TABLE_PROGRAM)->set('deleted')->eq(1)->where('id')->eq($programID)->exec(); $this->loadModel('action')->create('program', $programID, 'deleted', '', $extra = ACTIONMODEL::CAN_UNDELETED); @@ -372,7 +372,7 @@ class program extends control } /** - * Export program. + * Program project list. * * @param int $programID * @param string $browseType @@ -401,8 +401,8 @@ class program extends control $sortField = zget($this->config->program->sortFields, $order[0], 'id') . '_' . $order[1]; $projectStats = $this->program->getPRJStats($programID, $browseType, 0, $sortField, $pager, $programTitle); - $this->view->title = $this->lang->program->PRJBrowse; - $this->view->position[] = $this->lang->program->PRJBrowse; + $this->view->title = $this->lang->program->PGMProject; + $this->view->position[] = $this->lang->program->PGMProject; $this->view->projectStats = $projectStats; $this->view->pager = $pager; @@ -415,6 +415,100 @@ class program extends control $this->display(); } + /** + * Program stakeholder list. + * + * @param int $programID + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function PGMStakeholder($programID = 0, $orderBy = 't1.id_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1) + { + $this->loadModel('user'); + $this->lang->navGroup->program = 'program'; + $this->lang->program->switcherMenu = $this->program->getPGMCommonAction() . $this->program->getPGMSwitcher($programID); + $this->program->setPGMViewMenu($programID); + + /* Load pager and get tasks. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $this->view->title = $this->lang->program->PGMStakeholder; + $this->view->position[] = $this->lang->program->PGMStakeholder; + + $this->view->stakeholders = $this->program->getStakeholders($programID, $orderBy, $pager); + $this->view->pager = $pager; + $this->view->programID = $programID; + $this->view->program = $this->program->getPRJByID($programID); + $this->view->users = $this->loadModel('user')->getPairs('noletter|pofirst|nodeleted'); + $this->view->orderBy = $orderBy; + + $this->display(); + } + + /** + * Create program stakeholder. + * + * @param int $programID + * @access public + * @return void + */ + public function createStakeholder($programID = 0, $dept = '') + { + if($_POST) + { + $this->program->createStakeholder($programID); + die(js::locate($this->createLink('program', 'PGMStakeholder', "programID=$programID"), 'parent')); + } + + $this->loadModel('user'); + $this->lang->navGroup->program = 'program'; + $this->lang->program->switcherMenu = $this->program->getPGMCommonAction() . $this->program->getPGMSwitcher($programID); + $this->program->setPGMViewMenu($programID); + + $this->loadModel('dept'); + $deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept); + + $this->view->title = $this->lang->program->createStakeholder; + $this->view->position[] = $this->lang->program->createStakeholder; + + $this->view->programID = $programID; + $this->view->program = $this->program->getPRJByID($programID); + $this->view->users = $this->loadModel('user')->getPairs('nodeleted'); + $this->view->deptUsers = $deptUsers; + $this->view->dept = $dept; + $this->view->depts = array('' => '') + $this->dept->getOptionMenu(); + $this->view->stakeholders = $this->program->getStakeholders($programID, 't1.id_desc'); + + $this->display(); + } + + /** + * Unlink program stakeholder. + * + * @param int $programID + * @param string $confirm + * @access public + * @return void + */ + public function unlinkStakeholder($stakeholderID, $confirm = 'no') + { + if($confirm == 'no') + { + die(js::confirm($this->lang->program->confirmDelete, $this->inlink('unlinkStakeholder', "stakeholderID=$stakeholderID&confirm=yes"))); + } + else + { + $this->dao->delete()->from(TABLE_STAKEHOLDER)->where('id')->eq($stakeholderID)->exec(); + + die(js::reload('parent')); + } + } + /** * Export program. * diff --git a/module/program/js/createstakeholder.js b/module/program/js/createstakeholder.js new file mode 100644 index 0000000000..f182d40e58 --- /dev/null +++ b/module/program/js/createstakeholder.js @@ -0,0 +1,19 @@ +function setDeptUsers(obj) +{ + dept = $(obj).val();//Get dept ID. + link = createLink('program', 'createstakeholder', 'programID=' + programID + '&dept=' + dept); + location.href=link; +} + +function addItem(obj) +{ + var item = $('#addItem').html(); + $(obj).closest('tr').after('