* Revert commit.
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
ALTER TABLE `zt_block` ADD `dashboard` varchar(20) NOT NULL DEFAULT '' AFTER `account`;
|
||||
ALTER TABLE `zt_block` ADD `createdDate` date NULL AFTER `height`;
|
||||
ALTER TABLE `zt_block` CHANGE `block` `code` varchar(30) NOT NULL DEFAULT '' AFTER `module`;
|
||||
ALTER TABLE `zt_block` MODIFY `vision` varchar(10) NOT NULL DEFAULT 'rnd' AFTER `hidden`;
|
||||
|
||||
|
||||
@@ -180,7 +180,7 @@ class block extends control
|
||||
|
||||
/* 永久关闭区块。 */
|
||||
$block = $this->block->getByID($blockID);
|
||||
$this->block->deleteBlock(0, $block->module, $block->code);
|
||||
$this->block->deleteBlock($blockID);
|
||||
|
||||
/* 将关闭的区块保存到配置信息。 */
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
|
||||
@@ -34,7 +34,6 @@ $lang->block->lblModule = '模块';
|
||||
$lang->block->lblBlock = '区块';
|
||||
$lang->block->lblNum = '条数';
|
||||
$lang->block->lblHtml = 'HTML内容';
|
||||
$lang->block->html = 'HTML';
|
||||
$lang->block->dynamic = '最新动态';
|
||||
$lang->block->assignToMe = '待处理';
|
||||
$lang->block->wait = '未开始';
|
||||
@@ -422,18 +421,12 @@ $lang->block->availableBlocks['meeting'] = '会议';
|
||||
$lang->block->availableBlocks['feedback'] = '反馈';
|
||||
$lang->block->availableBlocks['ticket'] = '工单';
|
||||
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
$lang->block->moduleList['project'] = $lang->projectCommon;
|
||||
$lang->block->moduleList['execution'] = $lang->execution->common;
|
||||
$lang->block->moduleList['qa'] = '测试';
|
||||
$lang->block->moduleList['todo'] = '待办';
|
||||
$lang->block->moduleList['doc'] = '文档';
|
||||
$lang->block->moduleList['assigntome'] = $lang->block->assignToMe;
|
||||
$lang->block->moduleList['dynamic'] = $lang->block->dynamic;
|
||||
$lang->block->moduleList['guide'] = $lang->block->guide;
|
||||
$lang->block->moduleList['welcome'] = $lang->block->welcome;
|
||||
$lang->block->moduleList['html'] = $lang->block->html;
|
||||
$lang->block->moduleList['contribute'] = $lang->block->contribute;
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
$lang->block->moduleList['project'] = $lang->projectCommon;
|
||||
$lang->block->moduleList['execution'] = $lang->execution->common;
|
||||
$lang->block->moduleList['qa'] = '测试';
|
||||
$lang->block->moduleList['todo'] = '待办';
|
||||
$lang->block->moduleList['doc'] = '文档';
|
||||
|
||||
$lang->block->modules['project'] = new stdclass();
|
||||
$lang->block->modules['project']->availableBlocks['project'] = "{$lang->projectCommon}列表";
|
||||
@@ -452,8 +445,8 @@ $lang->block->modules['waterfallProject'] = new stdclass();
|
||||
$lang->block->modules['waterfallProject']->availableBlocks['waterfallgantt'] = "{$lang->projectCommon}计划";
|
||||
$lang->block->modules['waterfallProject']->availableBlocks['projectdynamic'] = '最新动态';
|
||||
|
||||
$lang->block->modules['agileplus'] = $lang->block->modules['scrumProject'];
|
||||
$lang->block->modules['waterfallplus'] = $lang->block->modules['waterfallProject'];
|
||||
$lang->block->modules['agileplus']['index'] = $lang->block->modules['scrumProject'];
|
||||
$lang->block->modules['waterfallplus']['index'] = $lang->block->modules['waterfallProject'];
|
||||
|
||||
$lang->block->modules['product'] = new stdclass();
|
||||
$lang->block->modules['product']->availableBlocks['statistic'] = $lang->productCommon . '统计';
|
||||
|
||||
+32
-95
@@ -13,8 +13,8 @@ declare(strict_types=1);
|
||||
class blockModel extends model
|
||||
{
|
||||
/**
|
||||
* 检查ZDOO请求时发起的哈希值是否匹配。
|
||||
* Check if the hash value matches when requesting ZDOO.
|
||||
* 检查然之请求时发起的hash是否匹配。
|
||||
* Check API for ranzhi.
|
||||
*
|
||||
* @param string $hash
|
||||
* @access public
|
||||
@@ -34,8 +34,8 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据区块ID获取区块信息。
|
||||
* Get a block by id.
|
||||
* 根据区块ID获取区块信息.
|
||||
* Get a block by blockID.
|
||||
*
|
||||
* @param int $blockID
|
||||
* @access public
|
||||
@@ -54,68 +54,13 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取被永久关闭的区块数据。
|
||||
* getClosedBlockPairs
|
||||
*
|
||||
* @param int $closedBlock
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getClosedBlockPairs($closedBlock)
|
||||
{
|
||||
$blockPairs = array();
|
||||
if(empty($closedBlock)) return $blockPairs;
|
||||
|
||||
foreach(explode(',', $closedBlock) as $block)
|
||||
{
|
||||
$block = trim($block);
|
||||
if(empty($block)) continue;
|
||||
|
||||
list($moduleName, $blockKey) = explode('|', $block);
|
||||
if($moduleName == $blockKey)
|
||||
{
|
||||
$blockPairs[$block] = $this->lang->block->moduleList[$moduleName];
|
||||
}
|
||||
else
|
||||
{
|
||||
$blockName = $blockKey;
|
||||
if(isset($this->lang->block->modules[$moduleName]->availableBlocks[$blockKey])) $blockName = $this->lang->block->modules[$moduleName]->availableBlocks[$blockKey];
|
||||
if(isset($this->lang->block->availableBlocks[$blockKey])) $blockName = $this->lang->block->availableBlocks[$blockKey];
|
||||
$blockPairs[$block] = "{$this->lang->block->moduleList[$moduleName]}|{$blockName}";
|
||||
}
|
||||
}
|
||||
|
||||
return $blockPairs;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取后台信息区块参数信息。
|
||||
* get admin information block parameter information.
|
||||
*
|
||||
* @param string $startDate
|
||||
* @access public
|
||||
* @return array|false
|
||||
*/
|
||||
public function getAdminBlockList(string $startDate = ''): array|false
|
||||
{
|
||||
return $this->dao->select('code,params')->from(TABLE_BLOCK)
|
||||
->where('account')->eq('system')
|
||||
->andWhere('vision')->eq('rnd')
|
||||
->andWhere('dashboard')->eq('zentao')
|
||||
->andWhere('module')->eq('zentao')
|
||||
->andWhere('code')->in('plugin,patch,publicclass,news')
|
||||
->beginIF($startDate)->andWhere('createdDate')->ge($startDate)->fi()
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户的区块列表。
|
||||
* Get block list of current user.
|
||||
* 获取区块列表.
|
||||
*
|
||||
* @param string $module
|
||||
* @param int $hidden
|
||||
* @access public
|
||||
* @return array|false
|
||||
* @return int[]|false
|
||||
*/
|
||||
public function getMyDashboard(string $dashboard, int $hidden = 0): array|false
|
||||
{
|
||||
@@ -123,12 +68,12 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取隐藏的区块列表。
|
||||
* Get hidden blocks.
|
||||
* 获取隐藏的区块列表.
|
||||
* Get hidden blocks
|
||||
*
|
||||
* @param string $module
|
||||
* @access public
|
||||
* @return array|false
|
||||
* @return int[]|false
|
||||
*/
|
||||
public function getMyHiddenBlocks(string $dashboard): array|false
|
||||
{
|
||||
@@ -136,8 +81,8 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取对应仪表盘下区块的最大排序号。
|
||||
* Get block max order number by dashboard.
|
||||
* 获取对应仪表盘下区块的最大排序号.
|
||||
* Get max order number by block dashboard.
|
||||
*
|
||||
* @param string $dashboard
|
||||
* @access public
|
||||
@@ -242,11 +187,11 @@ class blockModel extends model
|
||||
|
||||
/**
|
||||
* 根据区块索引获取排序靠后的一个区块ID。
|
||||
* Get the last block order on the block index,
|
||||
*
|
||||
* @param string $dashboard
|
||||
* @param string $module
|
||||
* @param string $code
|
||||
* Get my block id by block code,
|
||||
*
|
||||
* @param string $dashboard
|
||||
* @param string $module
|
||||
* @param string $code
|
||||
* @access public
|
||||
* @return int|false
|
||||
*/
|
||||
@@ -265,7 +210,7 @@ class blockModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取区块是否已经初始化的状态。
|
||||
* 获取区块是否已经初始化的状态.
|
||||
* get block is initiated or not.
|
||||
*
|
||||
* @param string $dashboard
|
||||
@@ -274,7 +219,7 @@ class blockModel extends model
|
||||
*/
|
||||
public function getBlockInitStatus(string $dashboard): bool
|
||||
{
|
||||
$result = $this->dao->select('value')->from(TABLE_CONFIG)
|
||||
$result = $this->dao->select('*')->from(TABLE_CONFIG)
|
||||
->where('module')->eq($dashboard)
|
||||
->andWhere('owner')->eq($this->app->user->account)
|
||||
->andWhere('`section`')->eq('common')
|
||||
@@ -282,24 +227,24 @@ class blockModel extends model
|
||||
->andWhere('vision')->eq($this->config->vision)
|
||||
->fetch('value');
|
||||
|
||||
return !empty($result);
|
||||
return $result ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查此区块是否为长区块。
|
||||
* Check whether long block.
|
||||
*
|
||||
* @param object $block
|
||||
* @param object $block
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function isLongBlock(object $block): bool
|
||||
{
|
||||
return (!empty($block->grid) and $block->grid >= 6);
|
||||
return (!empty($block->grid) and $block->grid >= 6) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化用户某个仪表盘下的区块数据。
|
||||
* 初始化用户某个仪表盘下的区块数据.
|
||||
* Init block when account use first.
|
||||
*
|
||||
* @param string $dashboard
|
||||
@@ -341,7 +286,7 @@ class blockModel extends model
|
||||
*
|
||||
* @param object $formData
|
||||
* @access public
|
||||
* @return int
|
||||
* @return void
|
||||
*/
|
||||
public function create(object $formData): int|false
|
||||
{
|
||||
@@ -360,7 +305,7 @@ class blockModel extends model
|
||||
*
|
||||
* @param object $formData
|
||||
* @access public
|
||||
* @return int|false
|
||||
* @return void
|
||||
*/
|
||||
public function update(object $formData): int|false
|
||||
{
|
||||
@@ -381,7 +326,7 @@ class blockModel extends model
|
||||
* 对应仪表盘删除所有区块并更新为待初始化状态。
|
||||
* Reset dashboard blocks.
|
||||
*
|
||||
* @param string $dashboard
|
||||
* @param string $dashboard
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
@@ -400,33 +345,26 @@ class blockModel extends model
|
||||
->andWhere('`key`')->eq('blockInited')
|
||||
->exec();
|
||||
|
||||
return !dao::isError();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID删除一个区块或者根据代号删除多个区块。
|
||||
* Delete a block based on id or multiple blocks based on code.
|
||||
* 删除一个区块。
|
||||
* Delete a block.
|
||||
*
|
||||
* @param int $blockID
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function deleteBlock(int $blockID = 0, string $module = '', string $code = ''): bool
|
||||
public function deleteBlock(int $blockID): bool
|
||||
{
|
||||
$this->dao->delete()->from(TABLE_BLOCK)
|
||||
->where('1=1')
|
||||
->beginIF($blockID)
|
||||
->andWhere('id')->eq($blockID)
|
||||
->where('id')->eq($blockID)
|
||||
->andWhere('account')->eq($this->app->user->account)
|
||||
->andWhere('vision')->eq($this->config->vision)
|
||||
->fi()
|
||||
->beginIF($module and $code)
|
||||
->andWhere('module')->eq($module)
|
||||
->andWhere('code')->eq($code)
|
||||
->fi()
|
||||
->exec();
|
||||
|
||||
return !dao::isError();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -441,7 +379,6 @@ class blockModel extends model
|
||||
public function setOrder(int $blockID, int $order): bool
|
||||
{
|
||||
$this->dao->update(TABLE_BLOCK)->set('order')->eq($order)->where('id')->eq($blockID)->exec();
|
||||
|
||||
return !dao::isError();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,13 +3,13 @@ declare(strict_types=1);
|
||||
class blockTao extends blockModel
|
||||
{
|
||||
/**
|
||||
* 获取当前用户的区块列表。
|
||||
* 获取当前用户的区块列表.
|
||||
* Get block list of current user.
|
||||
*
|
||||
* @param string $dashboard
|
||||
* @param int $hidden 0|1
|
||||
* @access protected
|
||||
* @return array|false
|
||||
* @return int[]|false
|
||||
*/
|
||||
protected function fetchMyBlocks(string $dashboard, int $hidden = 0): array|false
|
||||
{
|
||||
@@ -23,7 +23,6 @@ class blockTao extends blockModel
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增一个区块。
|
||||
* Insert a block data.
|
||||
*
|
||||
* @param object $formData
|
||||
@@ -37,6 +36,6 @@ class blockTao extends blockModel
|
||||
->batchCheck($this->config->block->create->requiredFields, 'notempty')
|
||||
->exec();
|
||||
|
||||
return !dao::isError();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
su('admin');
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
|
||||
Executable → Regular
+4
-13
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -32,12 +32,6 @@ cid=39
|
||||
|
||||
- 测试ID为2的区块的是否存在属性id @0
|
||||
|
||||
- 测试ID为3的区块的是否存在属性id @3
|
||||
|
||||
- 测试根据代号删除区块后的返回结果 @1
|
||||
|
||||
- 测试ID为3的区块的是否存在属性id @0
|
||||
|
||||
- 测试ID为22的区块删除后的返回结果 @1
|
||||
|
||||
*/
|
||||
@@ -48,10 +42,7 @@ $tester->loadModel('block');
|
||||
initData();
|
||||
|
||||
$blockTest = new blockTest();
|
||||
r($tester->block->getByID(2)) && p('id') && e('2'); // 测试ID为2的区块是否存在
|
||||
r($tester->block->deleteBlock(2, '', '')) && p('') && e('1'); // 测试ID为2的区块删除后的返回结果
|
||||
r($tester->block->getByID(2)) && p('id') && e('0'); // 测试ID为2的区块的是否存在
|
||||
r($tester->block->getByID(3)) && p('id') && e('3'); // 测试ID为3的区块的是否存在
|
||||
r($tester->block->deleteBlock(0, 'project', 'statistic')) && p('') && e('1'); // 测试根据代号删除区块后的返回结果
|
||||
r($tester->block->getByID(3)) && p('id') && e('0'); // 测试ID为3的区块的是否存在
|
||||
r($tester->block->getByID(2)) && p('id') && e("2"); // 测试ID为2的区块是否存在
|
||||
r($tester->block->deleteBlock(2)) && p('') && e('1'); // 测试ID为2的区块删除后的返回结果
|
||||
r($tester->block->getByID(2)) && p('id') && e("0"); // 测试ID为2的区块的是否存在
|
||||
r($tester->block->deleteBlock(22)) && p('') && e('1'); // 测试ID为22的区块删除后的返回结果
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
|
||||
function initData()
|
||||
{
|
||||
$block = zdTable('block');
|
||||
$block->id->range('2-5');
|
||||
$block->account->range('system');
|
||||
$block->vision->range('rnd');
|
||||
$block->dashboard->range('zentao');
|
||||
$block->module->range('zentao');
|
||||
$block->code->range('plugin,patch,publicclass,news');
|
||||
$block->createdDate->range('`2020-01-01`,`2021-01-01`');
|
||||
$block->title->prefix('区块')->range('2-5');
|
||||
$block->order->range('2-5');
|
||||
|
||||
$block->gen(4);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
title=测试 block 模块 model下的 getMyDashboard 方法
|
||||
timeout=0
|
||||
cid=39
|
||||
|
||||
- 查询admin用户在我的地盘仪表盘的区块列表数量 @4
|
||||
|
||||
- 查询admin用户在我的地盘仪表盘的区块列表数量 @2
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('block');
|
||||
|
||||
initData();
|
||||
|
||||
r(count($tester->block->getAdminBlockList())) && p('') && e('4'); // 查询admin用户在我的地盘仪表盘的区块列表数量
|
||||
r(count($tester->block->getAdminBlockList('2021-01-01'))) && p('') && e('2'); // 查询admin用户在我的地盘仪表盘的区块列表数量
|
||||
@@ -22,12 +22,6 @@ title=测试 blockModel->getBlockInitStatus();
|
||||
timeout=0
|
||||
cid=1
|
||||
|
||||
- 测试 my 模块下返回为 1 @1
|
||||
|
||||
- 测试 product 模块下返回为 0 @0
|
||||
|
||||
- 测试不存在模块返回为 0 @0
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
@@ -37,4 +31,4 @@ initData();
|
||||
|
||||
r($tester->block->getBlockInitStatus('my')) && p('') && e('1'); // 测试 my 模块下返回为 1
|
||||
r($tester->block->getBlockInitStatus('product')) && p('') && e('0'); // 测试 product 模块下返回为 0
|
||||
r($tester->block->getBlockInitStatus('asda??')) && p('') && e('0'); // 测试不存在模块返回为 0
|
||||
r($tester->block->getBlockInitStatus('asda??')) && p('') && e('0'); // 测试不存在模块返回为 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
su('admin');
|
||||
|
||||
function initData()
|
||||
@@ -44,6 +44,6 @@ $tester->loadModel('block');
|
||||
|
||||
initData();
|
||||
|
||||
r($tester->block->getByID(2)) && p('account,vision,dashboard,module,code,title,order') && e('admin,rnd,my,project,list,区块名称2,1'); // 测试获取正常的block的内容
|
||||
r($tester->block->getByID(4)) && p('order') && e('3'); // 测试获取正常的block的内容
|
||||
r($tester->block->getByID(6)) && p('') && e('0'); // 测试获取不存在的block的内容
|
||||
r($tester->block->getByID(2)) && p('account,vision,dashboard,module,code,title,order') && e('admin,rnd,my,project,list,区块名称2,1'); // 测试获取正常的block的内容
|
||||
r($tester->block->getByID(4)) && p('order') && e('3'); // 测试获取正常的block的内容
|
||||
r($tester->block->getByID(6)) && p('') && e('0'); // 测试获取不存在的block的内容
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 blockModel->getClosedBlockPairs();
|
||||
timeout=0
|
||||
cid=1
|
||||
|
||||
- 测试获取关闭的区块键值对属性product|list @产品|产品列表
|
||||
|
||||
- 测试获取关闭的区块键值对属性assigntome|assigntome @待处理
|
||||
|
||||
*/
|
||||
|
||||
global $tester;
|
||||
$tester->loadModel('block');
|
||||
$data = $tester->block->getClosedBlockPairs('product|list,assigntome|assigntome');
|
||||
r($data) && p('product|list') && e('产品|产品列表'); //测试获取关闭的区块键值对
|
||||
r($data) && p('assigntome|assigntome') && e('待处理'); //测试获取关闭的区块键值对
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
|
||||
su('admin');
|
||||
|
||||
@@ -38,6 +38,6 @@ $tester->loadModel('block');
|
||||
|
||||
initData();
|
||||
|
||||
r($tester->block->getMaxOrderByDashboard('my')) && p('') && e('4'); // 测试 my 模块下最大order 为 4
|
||||
r($tester->block->getMaxOrderByDashboard('my')) && p('') && e('4'); // 测试 my 模块下最大order 为 4
|
||||
r($tester->block->getMaxOrderByDashboard('my')) && p('') && e('4'); // 测试 my 模块下最大order 为 4
|
||||
r($tester->block->getMaxOrderByDashboard('my')) && p('') && e('4'); // 测试 my 模块下最大order 为 4
|
||||
r($tester->block->getMaxOrderByDashboard('bug')) && p('') && e('0'); // 测试数据库中不存在 模块的最大排序 为 0
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -41,8 +41,8 @@ $tester->loadModel('block');
|
||||
|
||||
initData();
|
||||
|
||||
r(count($tester->block->getMyDashboard('my'))) && p('') && e('1'); // 查询admin用户在我的地盘仪表盘的区块列表数量
|
||||
r($tester->block->getMyDashboard('my')) && p('2:title') && e('区块2'); // 查询admin用户在我的地盘仪表盘的区块标题第2条的title属性
|
||||
r(count($tester->block->getMyDashboard('my', 1))) && p('') && e('0'); // 查询admin用户在我的地盘仪表盘的隐藏区块列表数量
|
||||
r(count($tester->block->getMyDashboard('asdas?'))) && p('') && e('0'); // 查询admin用户在不存在仪表盘的区块列表数量
|
||||
r($tester->block->getMyDashboard('my')) && p('2:vision') && e('rnd'); // 查询admin用户在我的地盘仪表盘区块的vision第2条的vision属性
|
||||
r(count($tester->block->getMyDashboard('my'))) && p('') && e('1'); // 查询admin用户在我的地盘仪表盘的区块列表数量
|
||||
r($tester->block->getMyDashboard('my')) && p('2:title') && e('区块2'); // 查询admin用户在我的地盘仪表盘的区块标题第2条的title属性
|
||||
r(count($tester->block->getMyDashboard('my', 1))) && p('') && e('0'); // 查询admin用户在我的地盘仪表盘的隐藏区块列表数量
|
||||
r(count($tester->block->getMyDashboard('asdas?'))) && p('') && e('0'); // 查询admin用户在不存在仪表盘的区块列表数量
|
||||
r($tester->block->getMyDashboard('my')) && p('2:vision') && e('rnd'); // 查询admin用户在我的地盘仪表盘区块的vision第2条的vision属性
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -40,5 +40,5 @@ $tester->loadModel('block');
|
||||
initData();
|
||||
|
||||
r($tester->block->getSpecifiedBlockID('my', 'assingtome', 'assingtome')) && p('') && e('2'); // 测试 assingtome 区块的 区块ID是否为2
|
||||
r($tester->block->getSpecifiedBlockID('qa', 'bug', 'list')) && p('') && e('3'); // 测试 buglist 区块的 区块ID是否为2
|
||||
r($tester->block->getSpecifiedBlockID('my', 'welcome', 'welcome')) && p('') && e('0'); // 测试 找不到的区块的 区块ID 是否为 false
|
||||
r($tester->block->getSpecifiedBlockID('qa', 'bug', 'list')) && p('') && e('3'); // 测试 buglist 区块的 区块ID是否为2
|
||||
r($tester->block->getSpecifiedBlockID('my', 'welcome', 'welcome')) && p('') && e('0'); // 测试 找不到的区块的 区块ID 是否为 false
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
su('admin');
|
||||
|
||||
@@ -10,14 +10,14 @@ title=测试 blockModel->initBlock();
|
||||
timeout=0
|
||||
cid=1
|
||||
|
||||
- 测试获取初始化后第一个的block的内容
|
||||
- 测试获取正常的block的内容
|
||||
- 属性account @admin
|
||||
- 属性dashboard @my
|
||||
- 属性module @welcome
|
||||
- 属性code @welcome
|
||||
- 属性title @欢迎
|
||||
|
||||
- 测试获取初始化后最后一个的block的内容
|
||||
- 测试获取正常的block的内容
|
||||
- 属性account @admin
|
||||
- 属性dashboard @my
|
||||
- 属性module @project
|
||||
@@ -33,5 +33,5 @@ $tester->block->reset('my');
|
||||
$tester->block->initBlock('my');
|
||||
$newBlcoks = $tester->block->getMyDashboard('my');
|
||||
|
||||
r(reset($newBlcoks)) && p('account,dashboard,module,code,title') && e('admin,my,welcome,welcome,欢迎'); // 测试获取初始化后第一个的block的内容
|
||||
r(end($newBlcoks)) && p('account,dashboard,module,code,title') && e('admin,my,project,project,项目列表'); // 测试获取初始化后最后一个的block的内容
|
||||
r(reset($newBlcoks)) && p('account,dashboard,module,code,title') && e('admin,my,welcome,welcome,欢迎'); // 测试获取正常的block的内容
|
||||
r(end($newBlcoks)) && p('account,dashboard,module,code,title') && e('admin,my,project,project,项目列表'); // 测试获取正常的block的内容
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -27,11 +27,11 @@ title=测试 blockModel->isLongBlock();
|
||||
timeout=0
|
||||
cid=1
|
||||
|
||||
- 测试空对象是否为长区块 @0
|
||||
- 测试 空 对象 检查是否为长区块 @0
|
||||
|
||||
- 测试ID为2的对象是否为长区块 @0
|
||||
- 测试 空 对象 检查是否为长区块 @0
|
||||
|
||||
- 测试ID为3的对象是否为长区块 @1
|
||||
- 测试 空 对象 检查是否为长区块 @1
|
||||
|
||||
*/
|
||||
|
||||
@@ -42,6 +42,6 @@ initData();
|
||||
|
||||
$emptyObject = new stdclass();
|
||||
|
||||
r($tester->block->isLongBlock($emptyObject)) && p() && e('0'); // 测试空对象是否为长区块
|
||||
r($tester->block->isLongBlock($tester->block->getByID(2))) && p() && e('0'); // 测试ID为2的对象是否为长区块
|
||||
r($tester->block->isLongBlock($tester->block->getByID(3))) && p() && e('1'); // 测试ID为3的对象是否为长区块
|
||||
r($tester->block->isLongBlock($emptyObject)) && p() && e('0'); // 测试 空 对象 检查是否为长区块
|
||||
r($tester->block->isLongBlock($tester->block->getByID(2))) && p() && e('0'); // 测试 空 对象 检查是否为长区块
|
||||
r($tester->block->isLongBlock($tester->block->getByID(3))) && p() && e('1'); // 测试 空 对象 检查是否为长区块
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -24,7 +24,7 @@ cid=39
|
||||
|
||||
- 检查初始化后的区块初始化状态返回结果 @0
|
||||
|
||||
- 检查初始化后是否存在区块数据属性account @0
|
||||
- 检查初始化前是否存在区块数据属性account @0
|
||||
|
||||
*/
|
||||
|
||||
@@ -36,12 +36,9 @@ $tester->block->reset('my');
|
||||
$tester->block->initBlock('my');
|
||||
|
||||
r($tester->block->getBlockInitStatus('my')) && p('') && e('1'); // 检查初始化前的区块初始化状态返回结果
|
||||
|
||||
$resetBeforeBlocks = $tester->block->getMyDashboard('my');
|
||||
r(reset($resetBeforeBlocks)) && p('account,dashboard,module,code,title') && e('admin,my,welcome,welcome,欢迎'); // 检查初始化前是否存在区块数据
|
||||
|
||||
$myDashboard = $tester->block->getMyDashboard('my');
|
||||
r(reset($myDashboard)) && p('account,dashboard,module,code,title') && e('admin,my,welcome,welcome,欢迎'); // 检查初始化前是否存在区块数据
|
||||
r($tester->block->reset('my')) && p('') && e('1'); // 检查初始化后的返回结果
|
||||
r($tester->block->getBlockInitStatus('my')) && p('') && e('0'); // 检查初始化后的区块初始化状态返回结果
|
||||
|
||||
$resetAfterBlocks = $tester->block->getMyDashboard('my');
|
||||
r(reset($resetAfterBlocks)) && p('account') && e('0'); // 检查初始化后是否存在区块数据
|
||||
$myDashboard2 = $tester->block->getMyDashboard('my');
|
||||
r(reset($myDashboard2)) && p('account') && e('0'); // 检查初始化前是否存在区块数据
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -55,7 +55,7 @@ $block2->order = '1';
|
||||
|
||||
$blockTest = new blockTest();
|
||||
r($tester->block->setOrder($block1->id, $block1->order)) && p('') && e('1'); // 测试ID为2的区块变更排序后的返回结果
|
||||
r($tester->block->getByID($block1->id)) && p('id,order') && e('2,3'); // 测试ID为2的区块的序号
|
||||
r($tester->block->getByID($block1->id)) && p('id,order') && e("2,3"); // 测试ID为2的区块的序号
|
||||
|
||||
r($tester->block->setOrder($block2->id, $block2->order)) && p('') && e('1'); // 测试ID为2的区块变更排序后的返回结果
|
||||
r($tester->block->getByID($block2->id)) && p('id,order') && e('3,1'); // 测试ID为3的区块的序号
|
||||
r($tester->block->getByID($block2->id)) && p('id,order') && e("3,1"); // 测试ID为3的区块的序号
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 5) . "/test/lib/init.php";
|
||||
include dirname(__FILE__, 2) . '/block.class.php';
|
||||
|
||||
su('admin');
|
||||
@@ -85,7 +85,7 @@ $emptyTitleBlock->title = '';
|
||||
$blockTest = new blockTest();
|
||||
$newBlockID = $blockTest->updateTest($block);
|
||||
|
||||
r($tester->block->getByID($newBlockID)) && p('account,vision,dashboard,module,code,title,order') && e('admin2,lite,scrumproject,project,statistic,项目统计区块,1'); // 测试获取正常的block的内容
|
||||
r($tester->block->getByID($newBlockID)) && p('account,vision,dashboard,module,code,title,order') && e("admin2,lite,scrumproject,project,statistic,项目统计区块,1"); // 测试获取正常的block的内容
|
||||
r($blockTest->updateTest($emptyModuleBlock)) && p('module:0') && e('『所属模块』不能为空。'); // 测试所属模块为空
|
||||
r($blockTest->updateTest($emptyCodeBlock)) && p('code:0') && e('『区块』不能为空。'); // 测试所属区块为空
|
||||
r($blockTest->updateTest($emptyTitleBlock)) && p('title:0') && e('『区块名称』不能为空。'); // 测试区块名称为空
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace zin;
|
||||
function getProductTabs($products, $blockNavCode): array
|
||||
{
|
||||
$navTabs = array();
|
||||
$selected = key($products);
|
||||
$selected = key($products);
|
||||
foreach($products as $product)
|
||||
{
|
||||
$navTabs[] = li
|
||||
@@ -65,7 +65,7 @@ function getProductInfo($products, $blockNavID): array
|
||||
{
|
||||
global $lang;
|
||||
|
||||
$selected = key($products);
|
||||
$selected = key($products);
|
||||
$tabItems = array();
|
||||
foreach($products as $product)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace zin;
|
||||
function getProjectTabs($projects, $blockNavCode): array
|
||||
{
|
||||
$navTabs = array();
|
||||
$selected = key($projects);
|
||||
$selected = key($projects);
|
||||
foreach($projects as $project)
|
||||
{
|
||||
$navTabs[] = li
|
||||
@@ -63,7 +63,7 @@ function getProjectTabs($projects, $blockNavCode): array
|
||||
*/
|
||||
function getProjectInfo($projects, $blockNavID): array
|
||||
{
|
||||
$selected = key($projects);
|
||||
$selected = key($projects);
|
||||
$tabItems = array();
|
||||
foreach($projects as $project)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace zin;
|
||||
function getProductTabs($products, $blockNavCode): array
|
||||
{
|
||||
$navTabs = array();
|
||||
$selected = key($products);
|
||||
$selected = key($products);
|
||||
foreach($products as $product)
|
||||
{
|
||||
$navTabs[] = li
|
||||
@@ -65,7 +65,7 @@ function getProductInfo($products, $blockNavID): array
|
||||
{
|
||||
global $lang;
|
||||
|
||||
$selected = key($products);
|
||||
$selected = key($products);
|
||||
$tabItems = array();
|
||||
foreach($products as $product)
|
||||
{
|
||||
|
||||
+10
-9
@@ -16,13 +16,9 @@ class blockZen extends block
|
||||
if($dashboard != 'my') return array();
|
||||
|
||||
$modules = $this->lang->block->moduleList;
|
||||
|
||||
/* Unable to display the doc module on my dashboard. */
|
||||
unset($modules['doc']);
|
||||
|
||||
if($this->config->global->flow != 'full') unset($modules['guide']);
|
||||
if($this->config->vision != 'rnd') unset($modules['contribute']);
|
||||
|
||||
/* 从配置项中取出不同模块的首页对应的控制器方法。*/
|
||||
/* Retrieve the controller method corresponding to the homepage of different modules from the configuration item.*/
|
||||
list($programModule, $programMethod) = explode('-', $this->config->programLink);
|
||||
@@ -30,7 +26,6 @@ class blockZen extends block
|
||||
list($projectModule, $projectMethod) = explode('-', $this->config->projectLink);
|
||||
list($executionModule, $executionMethod) = explode('-', $this->config->executionLink);
|
||||
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
foreach($modules as $moduleKey => $moduleName)
|
||||
{
|
||||
if($moduleKey == 'todo') continue;
|
||||
@@ -45,12 +40,18 @@ class blockZen extends block
|
||||
|
||||
/* After obtaining module permissions, it is necessary to verify whether there is permission for the module homepage. */
|
||||
if(!common::hasPriv($moduleKey, $method)) unset($modules[$moduleKey]);
|
||||
|
||||
/* 被永久关闭的区块删除对应选项。 */
|
||||
/* Delete corresponding options for blocks that have been permanently closed. */
|
||||
if(strpos(",$closedBlock,", ",$moduleKey|$moduleKey,") !== false) unset($modules[$moduleKey]);
|
||||
}
|
||||
|
||||
/* 判断区块是否被永久关闭,如果未被永久关闭则添加相应选项。*/
|
||||
/* Determine whether the block has been permanently closed, and add corresponding options if it has not been permanently closed.*/
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
if(strpos(",$closedBlock,", ",|assigntome,") === false) $modules['assigntome'] = $this->lang->block->assignToMe;
|
||||
if(strpos(",$closedBlock,", ",|dynamic,") === false) $modules['dynamic'] = $this->lang->block->dynamic;
|
||||
if(strpos(",$closedBlock,", ",|guide,") === false and $this->config->global->flow == 'full') $modules['guide'] = $this->lang->block->guide;
|
||||
if(strpos(",$closedBlock,", ",|welcome,") === false and $this->config->global->flow == 'full') $modules['welcome'] = $this->lang->block->welcome;
|
||||
if(strpos(",$closedBlock,", ",|html,") === false) $modules['html'] = 'HTML';
|
||||
if(strpos(",$closedBlock,", ",|contribute,") === false and $this->config->vision == 'rnd') $modules['contribute'] = $this->lang->block->contribute;
|
||||
|
||||
return array('' => '') + $modules;
|
||||
}
|
||||
|
||||
|
||||
+24
-204
@@ -100,8 +100,7 @@ class programplanModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目中的阶段数据键值对。
|
||||
* Get plan pairs in the project.
|
||||
* Get pairs.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param int $productID
|
||||
@@ -109,7 +108,7 @@ class programplanModel extends model
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getPairs(int $executionID, int $productID = 0, string $type = 'all'): array
|
||||
public function getPairs($executionID, $productID = 0, $type = 'all')
|
||||
{
|
||||
$plans = $this->getStage($executionID, $productID, $type);
|
||||
|
||||
@@ -125,14 +124,12 @@ class programplanModel extends model
|
||||
{
|
||||
if(strpos($type, 'leaf') !== false and isset($parents[$plan->id])) continue;
|
||||
|
||||
$paths = array_slice(explode(',', trim($plan->path, ',')), 1);
|
||||
$paths = array_slice(explode(',', trim($plan->path, ',')), 1);
|
||||
$planName = '';
|
||||
|
||||
foreach($paths as $path)
|
||||
{
|
||||
if(isset($plans[$path])) $planName .= '/' . $plans[$path]->name;
|
||||
}
|
||||
|
||||
$pairs[$planID] = $planName;
|
||||
}
|
||||
|
||||
@@ -158,176 +155,34 @@ class programplanModel extends model
|
||||
|
||||
$plans = $this->getStage($executionID, $productID, 'all', 'order');
|
||||
|
||||
if($baselineID) $plans = $this->setBaseline($baselineID, $plans);
|
||||
|
||||
$today = helper::today();
|
||||
$datas = array();
|
||||
$planIdList = array();
|
||||
$isMilestone = "<icon class='icon icon-flag icon-sm red'></icon> ";
|
||||
$stageIndex = array();
|
||||
foreach($plans as $plan)
|
||||
if($baselineID)
|
||||
{
|
||||
$planIdList[$plan->id] = $plan->id;
|
||||
|
||||
$start = helper::isZeroDate($plan->begin) ? '' : $plan->begin;
|
||||
$end = helper::isZeroDate($plan->end) ? '' : $plan->end;
|
||||
$realBegan = helper::isZeroDate($plan->realBegan) ? '' : $plan->realBegan;
|
||||
$realEnd = helper::isZeroDate($plan->realEnd) ? '' : $plan->realEnd;
|
||||
|
||||
$data = new stdclass();
|
||||
$data->id = $plan->id;
|
||||
$data->type = 'plan';
|
||||
$data->text = empty($plan->milestone) ? $plan->name : $plan->name . $isMilestone ;
|
||||
$data->name = $plan->name;
|
||||
if(isset($this->config->setPercent) and $this->config->setPercent == 1) $data->percent = $plan->percent;
|
||||
$data->attribute = zget($this->lang->stage->typeList, $plan->attribute);
|
||||
$data->milestone = zget($this->lang->programplan->milestoneList, $plan->milestone);
|
||||
$data->owner_id = $plan->PM;
|
||||
$data->status = $this->processStatus('execution', $plan);
|
||||
$data->begin = $start;
|
||||
$data->deadline = $end;
|
||||
$data->realBegan = $realBegan ? substr($realBegan, 0, 10) : '';
|
||||
$data->realEnd = $realEnd ? substr($realEnd, 0, 10) : '';;
|
||||
$data->parent = $plan->grade == 1 ? 0 :$plan->parent;
|
||||
$data->open = true;
|
||||
$data->start_date = $realBegan ? $realBegan : $start;
|
||||
$data->endDate = $realEnd ? $realEnd : $end;
|
||||
$data->duration = 1;
|
||||
$data->color = $this->lang->execution->gantt->stage->color;
|
||||
$data->progressColor = $this->lang->execution->gantt->stage->progressColor;
|
||||
$data->textColor = $this->lang->execution->gantt->stage->textColor;
|
||||
$data->bar_height = $this->lang->execution->gantt->bar_height;
|
||||
|
||||
/* Determines if the object is delay. */
|
||||
$data->delay = $this->lang->programplan->delayList[0];
|
||||
$data->delayDays = 0;
|
||||
if($today > $end)
|
||||
{
|
||||
$data->delay = $this->lang->programplan->delayList[1];
|
||||
$data->delayDays = helper::diffDate($today, substr($end, 0, 10));
|
||||
}
|
||||
|
||||
if($data->endDate > $data->start_date) $data->duration = helper::diffDate(substr($data->endDate, 0, 10), substr($data->start_date, 0, 10)) + 1;
|
||||
if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date));
|
||||
if($data->start_date == '' or $data->endDate == '') $data->duration = 1;
|
||||
|
||||
$datas['data'][$plan->id] = $data;
|
||||
$stageIndex[$plan->id] = array('planID' => $plan->id, 'parent' => $plan->parent, 'progress' => array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalReal' => 0));
|
||||
/* Set plan baseline. */
|
||||
$baseline = $this->loadModel('cm')->getByID($baselineID);
|
||||
$oldData = json_decode($baseline->data);
|
||||
$oldPlans = $oldData->stage;
|
||||
$plans = $this->programplanTao->setPlanBaseline($oldPlans, $plans);
|
||||
}
|
||||
|
||||
$taskPri = "<span class='label-pri label-pri-%s' title='%s'>%s</span> ";
|
||||
$datas = $planIdList = $stageIndex = array();
|
||||
|
||||
/* Set plan for gantt view. */
|
||||
$this->programplanTao->setPlan($plans, $datas, $stageIndex, $planIdList);
|
||||
|
||||
/* Judge whether to display tasks under the stage. */
|
||||
$owner = $this->app->user->account;
|
||||
$module = 'programplan';
|
||||
$section = 'browse';
|
||||
$object = 'stageCustom';
|
||||
$owner = $this->app->user->account;
|
||||
if(empty($selectCustom)) $selectCustom = $this->loadModel('setting')->getItem("owner={$owner}&module=programplan§ion=browse&key=stageCustom");
|
||||
|
||||
if(empty($selectCustom)) $selectCustom = $this->loadModel('setting')->getItem("owner={$owner}&module={$module}§ion={$section}&key={$object}");
|
||||
|
||||
$tasks = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('execution')->in($planIdList)->orderBy('execution_asc, order_asc, id_desc')->fetchAll('id');
|
||||
$taskTeams = $this->dao->select('task,account')->from(TABLE_TASKTEAM)->where('task')->in(array_keys($tasks))->fetchGroup('task', 'account');
|
||||
$users = $this->loadModel('user')->getPairs('noletter');
|
||||
$tasks = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('execution')->in($planIdList)->orderBy('execution_asc, order_asc, id_desc')->fetchAll('id');
|
||||
|
||||
if($baselineID)
|
||||
{
|
||||
$oldTasks = $oldData->task;
|
||||
foreach($oldTasks as $id => $oldTask)
|
||||
{
|
||||
if(!isset($tasks[$id])) continue;
|
||||
$tasks[$id]->version = $oldTask->version;
|
||||
$tasks[$id]->name = $oldTask->name;
|
||||
$tasks[$id]->estStarted = $oldTask->estStarted;
|
||||
$tasks[$id]->deadline = $oldTask->deadline;
|
||||
}
|
||||
$this->programplanTao->setTaskBaseline($oldTasks, $tasks); // Set task baseline.
|
||||
}
|
||||
|
||||
foreach($tasks as $task)
|
||||
{
|
||||
$execution = zget($plans, $task->execution, array());
|
||||
$priIcon = sprintf($taskPri, $task->pri, $task->pri, $task->pri);
|
||||
|
||||
$estStart = helper::isZeroDate($task->estStarted) ? '' : $task->estStarted;
|
||||
$estEnd = helper::isZeroDate($task->deadline) ? '' : $task->deadline;
|
||||
$realBegan = helper::isZeroDate($task->realStarted) ? '' : $task->realStarted;
|
||||
$realEnd = (in_array($task->status, array('done', 'closed')) and !helper::isZeroDate($task->finishedDate)) ? $task->finishedDate : '';
|
||||
|
||||
$start = $realBegan ? $realBegan : $estStart;
|
||||
$end = $realEnd ? $realEnd : $estEnd;
|
||||
if(empty($start) and $execution) $start = $execution->begin;
|
||||
if(empty($end) and $execution) $end = $execution->end;
|
||||
if($start > $end) $end = $start;
|
||||
|
||||
$data = new stdclass();
|
||||
$data->id = $task->execution . '-' . $task->id;
|
||||
$data->type = 'task';
|
||||
$data->text = $priIcon . $task->name;
|
||||
$data->percent = '';
|
||||
$data->status = $this->processStatus('task', $task);
|
||||
$data->owner_id = $task->assignedTo;
|
||||
$data->attribute = '';
|
||||
$data->milestone = '';
|
||||
$data->begin = $start;
|
||||
$data->deadline = $end;
|
||||
$data->realBegan = $realBegan ? substr($realBegan, 0, 10) : '';
|
||||
$data->realEnd = $realEnd ? substr($realEnd, 0, 10) : '';
|
||||
$data->pri = $task->pri;
|
||||
$data->parent = $task->parent > 0 ? $task->execution . '-' . $task->parent : $task->execution;
|
||||
$data->open = true;
|
||||
$progress = $task->consumed ? round($task->consumed / ($task->left + $task->consumed), 3) : 0;
|
||||
$data->progress = $progress;
|
||||
$data->taskProgress = ($progress * 100) . '%';
|
||||
$data->start_date = $start;
|
||||
$data->endDate = $end;
|
||||
$data->duration = 1;
|
||||
$data->estimate = $task->estimate;
|
||||
$data->consumed = $task->consumed;
|
||||
$data->color = zget($this->lang->execution->gantt->color, $task->pri, $this->lang->execution->gantt->defaultColor);
|
||||
$data->progressColor = zget($this->lang->execution->gantt->progressColor, $task->pri, $this->lang->execution->gantt->defaultProgressColor);
|
||||
$data->textColor = zget($this->lang->execution->gantt->textColor, $task->pri, $this->lang->execution->gantt->defaultTextColor);
|
||||
$data->bar_height = $this->lang->execution->gantt->bar_height;
|
||||
|
||||
/* Determines if the object is delay. */
|
||||
$data->delay = $this->lang->programplan->delayList[0];
|
||||
$data->delayDays = 0;
|
||||
if($today > $end)
|
||||
{
|
||||
$data->delay = $this->lang->programplan->delayList[1];
|
||||
$data->delayDays = helper::diffDate($today, substr($end, 0, 10));
|
||||
}
|
||||
|
||||
/* If multi task then show the teams. */
|
||||
if($task->mode == 'multi' and !empty($taskTeams[$task->id]))
|
||||
{
|
||||
$teams = array_keys($taskTeams[$task->id]);
|
||||
$assigneds = array();
|
||||
foreach($teams as $assignedTo) $assigneds[] = zget($users, $assignedTo);
|
||||
$data->owner_id = join(',', $assigneds);
|
||||
}
|
||||
|
||||
if($data->endDate > $data->start_date) $data->duration = helper::diffDate(substr($data->endDate, 0, 10), substr($data->start_date, 0, 10)) + 1;
|
||||
if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date));
|
||||
if($data->start_date == '' or $data->endDate == '') $data->duration = 1;
|
||||
|
||||
if(strpos($selectCustom, 'task') !== false) $datas['data'][$data->id] = $data;
|
||||
foreach($stageIndex as $index => $stage)
|
||||
{
|
||||
if($stage['planID'] == $task->execution)
|
||||
{
|
||||
$stageIndex[$index]['progress']['totalEstimate'] += $task->estimate;
|
||||
$stageIndex[$index]['progress']['totalConsumed'] += $task->parent == '-1' ? 0 : $task->consumed;
|
||||
$stageIndex[$index]['progress']['totalReal'] += ($task->left + $task->consumed);
|
||||
|
||||
$parent = $stage['parent'];
|
||||
if(isset($stageIndex[$parent]))
|
||||
{
|
||||
$stageIndex[$parent]['progress']['totalEstimate'] += $task->estimate;
|
||||
$stageIndex[$parent]['progress']['totalConsumed'] += $task->parent == '-1' ? 0 : $task->consumed;
|
||||
$stageIndex[$parent]['progress']['totalReal'] += ($task->left + $task->consumed);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Set task for gantt view. */
|
||||
$this->programplanTao->setTask($tasks, $plans, $selectCustom, $datas, $stageIndex);
|
||||
|
||||
/* Calculate the progress of the phase. */
|
||||
foreach($stageIndex as $index => $stage)
|
||||
@@ -341,50 +196,12 @@ class programplanModel extends model
|
||||
$datas['data'][$index]->consumed = $stage['progress']['totalConsumed'];
|
||||
}
|
||||
|
||||
$datas['links'] = array();
|
||||
if($this->config->edition != 'open')
|
||||
{
|
||||
$relations = $this->dao->select('*')->from(TABLE_RELATIONOFTASKS)->where('execution')->in($planIdList)->orderBy('task,pretask')->fetchAll();
|
||||
foreach($relations as $relation)
|
||||
{
|
||||
$link['source'] = $relation->execution . '-' . $relation->pretask;
|
||||
$link['target'] = $relation->execution . '-' . $relation->task;
|
||||
$link['type'] = $this->config->execution->gantt->linkType[$relation->condition][$relation->action];
|
||||
$datas['links'][] = $link;
|
||||
}
|
||||
}
|
||||
$datas = $this->setRelationTask($planIdList, $datas);
|
||||
|
||||
$datas['data'] = isset($datas['data']) ? array_values($datas['data']) : array();
|
||||
return $returnJson ? json_encode($datas) : $datas;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取基线数据。
|
||||
* Get baseline data.
|
||||
*
|
||||
* @param int $baselineID
|
||||
* @param array $plans
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
private function setBaseline(int $baselineID, array $plans): array
|
||||
{
|
||||
$baseline = $this->loadModel('cm')->getByID($baselineID);
|
||||
$oldData = json_decode($baseline->data);
|
||||
$oldPlans = $oldData->stage;
|
||||
foreach($oldPlans as $id => $oldPlan)
|
||||
{
|
||||
if(!isset($plans[$id])) continue;
|
||||
$plans[$id]->version = $oldPlan->version;
|
||||
$plans[$id]->name = $oldPlan->name;
|
||||
$plans[$id]->milestone = $oldPlan->milestone;
|
||||
$plans[$id]->begin = $oldPlan->begin;
|
||||
$plans[$id]->end = $oldPlan->end;
|
||||
}
|
||||
|
||||
return $plans;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get gantt data group by assigned.
|
||||
*
|
||||
@@ -1253,6 +1070,8 @@ class programplanModel extends model
|
||||
common::printIcon('execution', 'delete', "planID=$plan->id&confirm=no", $plan, 'list', 'trash', 'hiddenwin' , $disabled, '', '', $this->lang->programplan->delete);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
echo '</td>';
|
||||
}
|
||||
@@ -1546,13 +1365,14 @@ class programplanModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否为顶级。
|
||||
* Check whether it is the top stage.
|
||||
*
|
||||
* @param int $planID
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function checkTopStage($planID)
|
||||
public function checkTopStage(int $planID): bool
|
||||
{
|
||||
$parentID = $this->dao->select('parent')->from(TABLE_EXECUTION)->where('id')->eq($planID)->fetch('parent');
|
||||
$parentType = $this->dao->select('type')->from(TABLE_EXECUTION)->where('id')->eq($parentID)->fetch('type');
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
title: zt_getpairs
|
||||
author: shenshulong
|
||||
version: '1.0'
|
||||
fields:
|
||||
- field: id
|
||||
range: 11-20
|
||||
- field: project
|
||||
range: 11-15
|
||||
- field: name
|
||||
range: 11-20
|
||||
prefix: '项目'
|
||||
- field: code
|
||||
range: 11-20
|
||||
prefix: 'project'
|
||||
- field: model
|
||||
range: 'scrum,waterfallplus'
|
||||
- field: parent
|
||||
range: 0-3
|
||||
- field: milestone
|
||||
range: 0-1
|
||||
- field: auth
|
||||
range: '[]'
|
||||
- field: type
|
||||
range: 'stage,project'
|
||||
- field: grade
|
||||
range: 1
|
||||
- field: days
|
||||
range: 1
|
||||
- field: status
|
||||
range: 'wait'
|
||||
- field: desc
|
||||
range: 11-20
|
||||
prefix: '项目描述'
|
||||
- field: budget
|
||||
range: '100000,200000'
|
||||
- field: budgetUnit
|
||||
range: 'CNY'
|
||||
- field: percent
|
||||
range: '0-0'
|
||||
@@ -1,13 +0,0 @@
|
||||
title: zt_getprojectproduct
|
||||
author: shenshulong
|
||||
version: '1.0'
|
||||
fields:
|
||||
- field: project
|
||||
range: 11-15
|
||||
- field: product
|
||||
range: 11-15
|
||||
- field: branch
|
||||
range: 31-49
|
||||
- field: plan
|
||||
range: 11-15
|
||||
prefix: '计划'
|
||||
Reference in New Issue
Block a user