* Merge code.

This commit is contained in:
Yagami
2020-10-12 14:54:02 +08:00
parent a8b95e3fa7
commit f950266577
11 changed files with 378 additions and 10 deletions
+1
View File
@@ -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`');
+17
View File
@@ -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'),
+15
View File
@@ -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,
+2 -2
View File
@@ -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();
+98 -4
View File
@@ -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.
*
+19
View File
@@ -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('<tr class="addedItem">' + item + '</tr>');
var $accounts = $(obj).closest('tr').next().find('select[name*=accounts]');
$accounts.chosen();
}
function deleteItem(obj)
{
$(obj).closest('tr').remove();
}
+3 -1
View File
@@ -121,7 +121,7 @@ $lang->program->waterfall = '瀑布';
$lang->program->waterfallTitle = '瀑布式项目管理';
$lang->program->cannotCreateChild = '该项目已经有实际的内容,无法直接添加子项目。您可以为当前项目创建一个父项目,然后在新的父项目下面添加子项目。';
$lang->program->hasChildren = '该项目有子项目存在,不能删除。';
$lang->program->confirmDelete = "您确定删除项目[%s]吗?";
$lang->program->confirmDelete = "您确定要删除吗?";
$lang->program->emptyPM = '暂无';
$lang->program->cannotChangeToCat = "该项目已经有实际的内容,无法修改为父项目";
$lang->program->cannotCancelCat = "该项目下已经有子项目,无法取消父项目标记";
@@ -181,6 +181,8 @@ $lang->program->PGMManagePriv = '维护权限';
$lang->program->PGMManageMembers = '项目集团队';
$lang->program->PGMExport = '导出';
$lang->program->PGMManageGroupMember = '维护分组用户';
$lang->program->PGMStakeholder = '干系人列表';
$lang->program->createStakeholder = '添加干系人';
/* Fields. */
$lang->program->PGMName = '项目集名称';
+58 -2
View File
@@ -218,7 +218,7 @@ class programModel extends model
{
foreach($this->lang->program->viewMenu as $label => $menu)
{
$this->lang->program->viewMenu->$label = is_array($menu) ? sprintf($menu['link'], $programID) : sprintf($menu, $programID);
$this->lang->program->viewMenu->{$label}['link'] = is_array($menu) ? sprintf($menu['link'], $programID) : sprintf($menu, $programID);
}
foreach($this->lang->personnel->menu as $label => $menu)
@@ -497,7 +497,7 @@ class programModel extends model
* Get children by program id.
*
* @param int $programID
* @access private
* @access public
* @return void
*/
public function getChildren($programID = 0)
@@ -505,6 +505,62 @@ class programModel extends model
return $this->dao->select('count(*) as count')->from(TABLE_PROGRAM)->where('parent')->eq($programID)->fetch('count');
}
/**
* Get stakeholders by program id.
*
* @param int $programID
* @access public
* @return void
*/
public function getStakeholders($programID = 0, $orderBy, $pager = null)
{
return $this->dao->select('t2.*, t1.id')->from(TABLE_STAKEHOLDER)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.user=t2.account')
->where('t1.objectID')->eq($programID)
->andWhere('t1.objectType')->eq('program')
->orderBy($orderBy)
->page($pager)
->fetchAll();
}
/**
* Create stakeholder for a program.
*
* @param int $programID
* @access public
* @return void
*/
public function createStakeholder($programID = 0)
{
$data = (array)fixer::input('post')->get();
$accounts = array_unique($data['accounts']);
$oldJoin = $this->dao->select('`user`, createdDate')->from(TABLE_STAKEHOLDER)->where('objectID')->eq((int)$programID)->andWhere('objectType')->eq('program')->fetchPairs();
$this->dao->delete()->from(TABLE_STAKEHOLDER)->where('objectID')->eq((int)$programID)->andWhere('objectType')->eq('program')->exec();
foreach($accounts as $key => $account)
{
if(empty($account)) continue;
$stakeholder = new stdclass();
$stakeholder->objectID = $programID;
$stakeholder->objectType = 'program';
$stakeholder->user = $account;
$stakeholder->createdBy = $this->app->user->account;
$stakeholder->createdDate = isset($oldJoin[$account]) ? $oldJoin[$account] : helper::today();
$this->dao->insert(TABLE_STAKEHOLDER)->data($stakeholder)->exec();
}
/* 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($programID, 'program', $changedAccounts);
}
/**
* Show accessDenied response.
*
@@ -0,0 +1,88 @@
<?php
/**
* The create stakeholder view of program module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
* @package product
* @version $Id: browse.html.php 5096 2013-07-11 07:02:43Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('programID', $programID);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'>
<?php echo html::a($this->createLink('program', 'craetestakeholder', "programID={$programID}"), "<span class='text'> {$lang->program->createStakeholder}</span>");?>
</span>
<div class='input-group space w-200px'>
<span class='input-group-addon'><?php echo $lang->project->selectDept?></span>
<?php echo html::select('dept', $depts, $dept, "class='form-control chosen' onchange='setDeptUsers(this)' data-placeholder='{$lang->project->selectDeptTitle}'");?>
</div>
</div>
</div>
<div id='mainContent' class='main-content'>
<form class='main-form' method='post' id='teamForm' target='hiddenwin'>
<table class='table table-form'>
<thead>
<tr class='text-center'>
<th><?php echo $lang->team->account;?></th>
<th class="w-90px"> <?php echo $lang->actions;?></th>
</tr>
</thead>
<tbody>
<?php foreach($stakeholders as $stakeholder):?>
<?php if(!isset($users[$stakeholder->account])) continue;?>
<?php unset($users[$stakeholder->account]);?>
<tr>
<td>
<input type='text' name='realnames[]' value='<?php echo $stakeholder->realname;?>' readonly class='form-control' />
<input type='hidden' name='accounts[]' value='<?php echo $stakeholder->account;?>' />
</td>
<td class='c-actions text-center'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
<?php endforeach;?>
<?php foreach($deptUsers as $deptAccount => $userName):?>
<?php if(!isset($users[$deptAccount])) continue;?>
<tr class='addedItem'>
<td><?php echo html::select("accounts[]", $users, $deptAccount, "class='form-control chosen'");?></td>
<td class='c-actions text-center'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
<?php unset($users[$deptAccount]);?>
<?php endforeach;?>
<?php for($j = 0; $j < 5; $j ++):?>
<tr class='addedItem'>
<td><?php echo html::select("accounts[]", $users, '', "class='form-control chosen'");?></td>
<td class='c-actions text-center'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
<?php endfor;?>
</tbody>
<tfoot><tr><td colspan='6' class='text-center form-actions'><?php echo html::submitButton() . ' ' . html::backButton(); ?></td></tr></tfoot>
</table>
</form>
</div>
<div>
<table class='hidden'>
<tr id='addItem' class='hidden'>
<td><?php echo html::select("accounts[]", $users, '', "class='form-control'");?></td>
<td class='c-actions text-center'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
</table>
</div>
<?php include '../../common/view/footer.html.php';?>
@@ -0,0 +1,76 @@
<?php
/**
* The stakeholder view of program module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
* @package product
* @version $Id: browse.html.php 5096 2013-07-11 07:02:43Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('confirmDelete', $lang->program->confirmDelete);?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php echo html::a($this->createLink('program', 'pgmstakeholder', "programID=$programID"), '<span class="text">' . $lang->program->PGMStakeholder . '</span>', '', 'class="btn btn-link btn-active-text"');?>
</div>
<div class="btn-toolbar pull-right">
<?php common::printLink('program', 'createstakeholder', "programID=$programID", "<i class='icon icon-plus'></i>" . $lang->program->createStakeholder, '', "class='btn btn-primary'");?>
</div>
</div>
<div id='mainContent' class='main-row fade'>
<div class='main-col'>
<?php if(!empty($stakeholders)):?>
<form class='main-table table-user' data-ride='table' action='' method='post' id='userListForm'>
<table class='table has-sort-head' id='userList'>
<thead>
<tr>
<?php $vars = "programID=$programID&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
<th class='c-id'>
<?php echo $lang->idAB;?>
</th>
<th><?php echo $lang->user->realname;?></th>
<th class="w-120px"><?php echo $lang->user->role;?></th>
<th class="w-120px"><?php echo $lang->user->phone;?></th>
<th class="w-120px"><?php echo $lang->user->qq;?></th>
<th class="w-120px"><?php echo $lang->user->weixin;?></th>
<th class="w-200px"><?php echo $lang->user->email;?></th>
<th class='c-actions w-100px'><?php echo $lang->actions;?></th>
</tr>
</thead>
<tbody>
<?php foreach($stakeholders as $stakeholder):?>
<tr>
<td class='c-id'>
<?php printf('%03d', $stakeholder->id);?>
</td>
<td><?php echo $stakeholder->realname;?></td>
<td><?php echo zget($lang->user->roleList, $stakeholder->role);?></td>
<td title="<?php echo $stakeholder->phone;?>"><?php echo $stakeholder->phone;?></td>
<td title="<?php echo $stakeholder->qq;?>"><?php echo $stakeholder->qq;?></td>
<td title="<?php echo $stakeholder->weixin;?>"><?php echo $stakeholder->weixin;?></td>
<td title="<?php echo $stakeholder->email;?>"><?php echo $stakeholder->email;?></td>
<td class='c-actions'>
<?php
$deleteClass = common::hasPriv('stakeholder', 'delete') ? 'btn' : 'btn disabled';
echo html::a($this->createLink('program', 'unlinkStakeholder', "id=$stakeholder->id"), '<i class="icon-unlink"></i>', 'hiddenwin', "title='{$lang->delete}' class='{$deleteClass}'");
?>
</td>
</tr>
<?php endforeach;?>
</tbody>
</table>
<?php if($stakeholders):?>
<div class='table-footer'>
<?php $pager->show('right', 'pagerjs');?>
</div>
<?php endif;?>
</form>
<?php else:?>
<div class='table-empty-tip'><?php echo $lang->noData;?></div>
<?php endif;?>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
@@ -4,7 +4,7 @@
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'>
<?php echo html::a($this->createLink('project', 'managemembers', "projectID={$project->id}"), "<span class='text'> {$lang->project->manageMembers}</span>");?>
<?php echo html::a($this->createLink('program', 'prjmanagemembers', "projectID={$project->id}"), "<span class='text'> {$lang->project->manageMembers}</span>");?>
</span>
<div class='input-group space w-200px'>
<span class='input-group-addon'><?php echo $lang->project->selectDept?></span>