Merge branch 'feature/workflowgroup' of https://gitfox.zcorp.cc/git/zentao/zentaopms into feature/workflowgroup

This commit is contained in:
sunguangming
2025-07-29 05:38:26 +00:00
7 changed files with 76 additions and 27 deletions
+2 -1
View File
@@ -87,4 +87,5 @@ CREATE TABLE IF NOT EXISTS `zt_deliverablestage` (
`required` varchar(30) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE UNIQUE INDEX `unique` ON `zt_deliverablestage`(`deliverable`,`stage`);
CREATE UNIQUE INDEX `unique` ON `zt_deliverablestage`(`deliverable`,`stage`);
ALTER TABLE `zt_module` ADD `extra` varchar(30) NOT NULL DEFAULT '';
+28 -18
View File
@@ -1318,6 +1318,7 @@ CREATE TABLE IF NOT EXISTS `zt_module` (
`owner` varchar(30) NOT NULL DEFAULT '',
`collector` text NULL,
`short` varchar(60) NOT NULL DEFAULT '',
`extra` varchar(30) NOT NULL DEFAULT '',
`deleted` enum('0','1') NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@@ -13588,23 +13589,23 @@ REPLACE INTO `zt_workflowrule`(`type`, `name`, `rule`, `createdBy`, `createdDate
('system','电话','phone','admin','2020-10-14 14:06:14'),
('system','IP','ip','admin','2020-10-14 14:06:14');
INSERT INTO `zt_workflowgroup` (`type`, `projectModel`, `projectType`, `name`, `code`, `status`, `vision`, `main`) VALUES
('product', '', 'project', '默认流程', 'productproject', 'normal', 'rnd', '1'),
('project', 'scrum', 'product', '敏捷式产品研发', 'scrumproduct', 'normal', 'rnd', '1'),
('project', 'scrum', 'project', '敏捷式项目研发', 'scrumproject', 'normal', 'rnd', '1'),
('project', 'waterfall', 'product', '瀑布式产品研发', 'waterfallproduct', 'normal', 'rnd', '1'),
('project', 'waterfall', 'project', '瀑布式项目研发', 'waterfallproject', 'normal', 'rnd', '1'),
('project', 'agileplus', 'product', '融合敏捷式产品研发', 'agileplusproduct', 'normal', 'rnd', '1'),
('project', 'agileplus', 'project', '融合敏捷式项目研发', 'agileplusproject', 'normal', 'rnd', '1'),
('project', 'waterfallplus', 'product', '融合瀑布式产品研发', 'waterfallplusproduct', 'normal', 'rnd', '1'),
('project', 'waterfallplus', 'project', '融合瀑布式项目研发', 'waterfallplusproject', 'normal', 'rnd', '1'),
('project', 'kanban', 'product', '看板式产品研发', 'kanbanproduct', 'normal', 'rnd', '1'),
('project', 'kanban', 'project', '看板式项目研发', 'kanbanproject', 'normal', 'rnd', '1'),
('project', 'ipd', 'ipd', 'IPD集成产品研发', 'ipdproduct', 'normal', 'rnd', '1'),
('project', 'ipd', 'tpd', 'IPD预研产品研发', 'tpdproduct', 'normal', 'rnd', '1'),
('project', 'ipd', 'cbb', 'IPD平台产品研发', 'cbbproduct', 'normal', 'rnd', '1'),
('project', 'ipd', 'cpdproduct', 'IPD定制产品研发', 'cpdproduct', 'normal', 'rnd', '1'),
('project', 'ipd', 'cpdproject', 'IPD定制项目研发', 'cpdproject', 'normal', 'rnd', '1');
INSERT INTO `zt_workflowgroup` (`id`, `type`, `projectModel`, `projectType`, `name`, `code`, `status`, `vision`, `main`) VALUES
('1', 'product', '', 'project', '默认流程', 'productproject', 'normal', 'rnd', '1'),
('2', 'project', 'scrum', 'product', '敏捷式产品研发', 'scrumproduct', 'normal', 'rnd', '1'),
('3', 'project', 'scrum', 'project', '敏捷式项目研发', 'scrumproject', 'normal', 'rnd', '1'),
('4', 'project', 'waterfall', 'product', '瀑布式产品研发', 'waterfallproduct', 'normal', 'rnd', '1'),
('5', 'project', 'waterfall', 'project', '瀑布式项目研发', 'waterfallproject', 'normal', 'rnd', '1'),
('6', 'project', 'agileplus', 'product', '融合敏捷式产品研发', 'agileplusproduct', 'normal', 'rnd', '1'),
('7', 'project', 'agileplus', 'project', '融合敏捷式项目研发', 'agileplusproject', 'normal', 'rnd', '1'),
('8', 'project', 'waterfallplus', 'product', '融合瀑布式产品研发', 'waterfallplusproduct', 'normal', 'rnd', '1'),
('9', 'project', 'waterfallplus', 'project', '融合瀑布式项目研发', 'waterfallplusproject', 'normal', 'rnd', '1'),
('10', 'project', 'kanban', 'product', '看板式产品研发', 'kanbanproduct', 'normal', 'rnd', '1'),
('11', 'project', 'kanban', 'project', '看板式项目研发', 'kanbanproject', 'normal', 'rnd', '1'),
('12', 'project', 'ipd', 'ipd', 'IPD集成产品研发', 'ipdproduct', 'normal', 'rnd', '1'),
('13', 'project', 'ipd', 'tpd', 'IPD预研产品研发', 'tpdproduct', 'normal', 'rnd', '1'),
('14', 'project', 'ipd', 'cbb', 'IPD平台产品研发', 'cbbproduct', 'normal', 'rnd', '1'),
('15', 'project', 'ipd', 'cpdproduct', 'IPD定制产品研发', 'cpdproduct', 'normal', 'rnd', '1'),
('16', 'project', 'ipd', 'cpdproject', 'IPD定制项目研发', 'cpdproject', 'normal', 'rnd', '1');
INSERT INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `vision`, `createdBy`, `createdDate`, `datasource`, `view`, `keyField`, `valueField`) VALUES
('system', '产品', 'products', '1', 'rnd', 'admin', '1970-01-01 00:00:01', '{\"app\":\"system\",\"module\":\"product\",\"method\":\"getPairs\",\"methodDesc\":\"Get product pairs.\",\"params\":[{\"name\":\"mode\",\"type\":\"string\",\"desc\":\"\",\"value\":\"all\"}]}', '', '', ''),
@@ -15671,7 +15672,16 @@ INSERT INTO `zt_module`(`id`, `root`, `branch`, `name`, `parent`, `path`, `grade
(99, 3, 0, '组织', 0, ',99,', 1, 40, 'pivot', 0, 'system', 'staff', '', '0'),
(100, 3, 0, 'Bug', 98, ',98,100,', 2, 10, 'pivot', 0, '', NULL, '', '0'),
(102, 1, 0, 'DevOps', 0, ',102,', 1, 50, 'chart', 0, '', NULL, '', '0'),
(103, 1, 0, 'DevOps', 102, ',102,103,', 2, 10, 'chart', 0, '', NULL, '', '0');
(103, 1, 0, 'DevOps', 102, ',102,103,', 2, 10, 'chart', 0, '', NULL, '', '0'),
(104, 4, 0, '设计类', 0, ',104,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(105, 5, 0, '设计类', 0, ',105,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(106, 8, 0, '设计类', 0, ',106,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(107, 9, 0, '设计类', 0, ',107,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(108, 12, 0, '设计类', 0, ',108,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(109, 13, 0, '设计类', 0, ',109,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(110, 14, 0, '设计类', 0, ',110,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(111, 15, 0, '设计类', 0, ',111,', 1, 10, 'deliverable', 0, '', NULL, '', '0'),
(112, 16, 0, '设计类', 0, ',112,', 1, 10, 'deliverable', 0, '', NULL, '', '0');
-- DROP TABLE IF EXISTS `zt_space`;
CREATE TABLE IF NOT EXISTS `zt_space` (
+1 -1
View File
@@ -36,7 +36,7 @@ class designZen extends control
$count = 1;
foreach(array_filter($this->lang->design->{$typeList}) as $key => $value)
{
$key = strtolower($key);
$key = strtolower((string)$key);
$exclude = $type == $key ? '' : 'design';
$alias = $type == $key ? $this->app->rawMethod : '';
+2 -1
View File
@@ -87,7 +87,7 @@ class treeModel extends model
}
if($this->isMergeModule($rootID, $type))
{
return $this->dao->select('id, name, root, branch, grade, path, parent, owner, type')->from(TABLE_MODULE)
return $this->dao->select('id, name, root, branch, grade, path, parent, owner, type, extra')->from(TABLE_MODULE)
->where('root')->eq((int)$rootID)
->beginIF($type == 'task')->andWhere('type')->eq('task')->fi()
->beginIF($type != 'task')->andWhere('type')->in("story,$type")->fi()
@@ -1255,6 +1255,7 @@ class treeModel extends model
$data->parent = (string)$module->parent;
$data->name = $module->name;
$data->url = helper::createLink('deliverable', 'browse', "groupID={$module->root}&browseType={$extra}&param={$module->id}");
$data->extra = $module->extra;
return $data;
}
+6 -6
View File
@@ -17,11 +17,11 @@ cid=0
- 测试查询root 43 type story 的查询语句 @SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '43' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`
- 测试查询root 101 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '101' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 101 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '101' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 102 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '102' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 102 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '102' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 103 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '103' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 103 type task 的查询语句 @SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '103' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc
- 测试查询root 41 type story startModule 1821的查询语句 @SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '41' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`
@@ -49,8 +49,8 @@ r($tree->buildMenuQueryTest($root[2], $type[0])) && p(
r($tree->buildMenuQueryTest($root[3], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '41' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`"); // 测试查询root 41 type story 的查询语句
r($tree->buildMenuQueryTest($root[4], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '42' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`"); // 测试查询root 42 type story 的查询语句
r($tree->buildMenuQueryTest($root[5], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '43' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`"); // 测试查询root 43 type story 的查询语句
r($tree->buildMenuQueryTest($root[6], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '101' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 101 type task 的查询语句
r($tree->buildMenuQueryTest($root[7], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '102' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 102 type task 的查询语句
r($tree->buildMenuQueryTest($root[8], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type FROM `zt_module` WHERE `root` = '103' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 103 type task 的查询语句
r($tree->buildMenuQueryTest($root[6], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '101' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 101 type task 的查询语句
r($tree->buildMenuQueryTest($root[7], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '102' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 102 type task 的查询语句
r($tree->buildMenuQueryTest($root[8], $type[1])) && p() && e("SELECT id, name, root, branch, grade, path, parent, owner, type, extra FROM `zt_module` WHERE `root` = '103' AND `type` = 'task' AND `deleted` = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 103 type task 的查询语句
r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[0])) && p() && e("SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '41' AND ( `type` = 'story') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`"); // 测试查询root 41 type story startModule 1821的查询语句
r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[1], $branch)) && p() && e("SELECT * FROM `zt_module` WHERE 1=1 AND `root` = '41' AND ( `type` = 'story') AND (branch = '0' OR `branch` = '1') AND `deleted` = '0' ORDER BY `root`,`grade` desc,`order`"); // 测试查询root 41 type story startModule 0 branch 1 的查询语句
+1
View File
@@ -112,6 +112,7 @@ $config->upgrade->execFlow['21_6_beta'] = array('functions' => 'processCharter
$config->upgrade->execFlow['21_6_1'] = array('xxsqls' => "$appRoot/db/upgradexuanxuan9.1.2.sql");
$config->upgrade->execFlow['21_7'] = array('functions' => 'fixWorkflowNameForExecution');
$config->upgrade->execFlow['21_7_1'] = array('functions' => 'convertCharset,processActionProduct');
$config->upgrade->execFlow['21_7_3'] = array('functions' => 'addDefaultDeliverableModule');
if(!empty($config->isINT))
{
+36
View File
@@ -11196,4 +11196,40 @@ class upgradeModel extends model
return array('blockTitle' => $blockTitle, 'exportUrl' => $exportUrl, 'fetcherUrl' => $fetcherUrl);
}
/**
* 为指定模型的项目流程内置默认设计类。
* Add default deliverable module.
*
* @access public
* @return void
*/
public function addDefaultDeliverableModule()
{
$this->app->loadLang('deliverable');
$modelList = array('waterfall', 'waterfallplus', 'ipd');
$groupList = $this->dao->select('*')->from(TABLE_WORKFLOWGROUP)->where('projectModel')->in($modelList)->fetchAll();
foreach($groupList as $group)
{
$module = new stdclass();
$module->root = $group->id;
$module->branch = '0';
$module->name = $this->lang->deliverable->designModule;
$module->parent = '0';
$module->path = '';
$module->grade = '1';
$module->order = '0';
$module->type = 'deliverable';
$module->from = '0';
$module->owner = '';
$module->collector = null;
$module->short = '';
$module->extra = 'design';
$module->deleted = '0';
$this->dao->insert(TABLE_MODULE)->data($module)->exec();
$moduleID = $this->dao->lastInsertID();
$this->dao->update(TABLE_MODULE)->set('path')->eq(",$moduleID,")->where('id')->eq($moduleID)->exec();
}
}
}