Files
EasySoft-ZenTaoPMS/module/execution/zen.php
T
2023-08-29 09:18:39 +08:00

336 lines
12 KiB
PHP

<?php
declare(strict_types=1);
/**
* The zen file of execution module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Shujie Tian<tianshujie@easycorp.ltd>
* @package xxx
* @link https://www.zentao.net
*/
class executionZen extends execution
{
/**
* 处理版本列表展示数据。
* Process build list display data.
*
* @param array $buildList
* @param string $executionID
* @access protected
* @return object[]
*/
protected function processBuildListData(array $buildList, int $executionID = 0): array
{
$this->loadModel('build');
$productIdList = array();
foreach($buildList as $build) $productIdList[$build->product] = $build->product;
/* Get branch name. */
$showBranch = false;
$branchGroups = $this->loadModel('branch')->getByProducts($productIdList);
$builds = array();
foreach($buildList as $build)
{
$build->branchName = '';
if(isset($branchGroups[$build->product]))
{
$showBranch = true;
$branchPairs = $branchGroups[$build->product];
foreach(explode(',', trim($build->branch, ',')) as $branchID)
{
if(isset($branchPairs[$branchID])) $build->branchName .= "{$branchPairs[$branchID]},";
}
$build->branchName = trim($build->branchName, ',');
}
$build->actions = $this->build->buildActionList($build, $executionID, 'execution');
if($build->scmPath && $build->filePath)
{
$build->rowspan = 2;
$buildInfo = clone $build;
$buildInfo->pathType = 'scmPath';
$buildInfo->path = $build->scmPath;
$builds[] = $buildInfo;
$buildInfo = clone $build;
$buildInfo->pathType = 'filePath';
$buildInfo->path = $build->filePath;
$builds[] = $buildInfo;
}
else
{
$build->pathType = empty($build->scmPath) ? 'filePath' : 'scmPath';
$build->path = empty($build->scmPath) ? $build->filePath : $build->scmPath;
$builds[] = $build;
}
}
if(!$showBranch) unset($this->config->build->dtable->fieldList['branch']);
unset($this->config->build->dtable->fieldList['execution']);
return $builds;
}
/**
* 构建产品下拉选择数据。
* Build product drop-down select data.
*
* @param int $executionID
* @param int $productID
* @param object[] $products
* @access protected
* @return array
*/
protected function buildProductSwitcher(int $executionID, int $productID, array $products)
{
$productOption = array();
$branchOption = array();
$programIdList = array();
if(count($products) > 1) $productOption[0] = $this->lang->product->all;
foreach($products as $productData) $programIdList[$productData->program] = $productData->program;
$programPairs = $this->loadModel('program')->getPairsByList($programIdList);
$linePairs = $this->loadModel('product')->getLinePairs($programIdList);
foreach($products as $productData)
{
$programName = isset($programPairs[$productData->program]) ? $programPairs[$productData->program] . ' / ' : '';
$lineName = isset($linePairs[$productData->line]) ? $linePairs[$productData->line] . ' / ' : '';
$productOption[$productData->id] = $programName . $lineName . $productData->name;
}
$product = $this->product->getById((int)$productID);
if($product and $product->type != 'normal')
{
/* Display status of branch. */
$branches = $this->branch->getList($productID, $executionID, 'all');
foreach($branches as $branchInfo)
{
$branchOption[$branchInfo->id] = $branchInfo->name . ($branchInfo->status == 'closed' ? ' (' . $this->lang->branch->statusList['closed'] . ')' : '');
}
}
return array($productOption, $branchOption);
}
/**
* 构建执行团队成员信息。
* Build execution team member information.
*
* @param array $currentMembers
* @param array $members2Import
* @param array $deptUsers
* @param int $days
* @access public
* @return array
*/
public function buildMembers(array $currentMembers, array $members2Import, array $deptUsers, int $days): array
{
$teamMembers = array();
foreach($currentMembers as $account => $member)
{
$member->memberType = 'default';
$teamMembers[$account] = $member;
}
foreach($members2Import as $account => $member2Import)
{
$member2Import->memberType = 'import';
$member2Import->days = $days;
$member2Import->limited = 'no';
$teamMembers[$account] = $member2Import;
}
$roles = $this->loadModel('user')->getUserRoles(array_keys($deptUsers));
foreach($deptUsers as $deptAccount => $userName)
{
if(isset($currentMembers[$deptAccount]) || isset($members2Import[$deptAccount])) continue;
$deptMember = new stdclass();
$deptMember->memberType = 'dept';
$deptMember->account = $deptAccount;
$deptMember->role = zget($roles, $deptAccount, '');
$deptMember->days = $days;
$deptMember->hours = $this->config->execution->defaultWorkhours;
$deptMember->limited = 'no';
$teamMembers[$deptAccount] = $deptMember;
}
for($j = 0; $j < 5; $j ++)
{
$newMember = new stdclass();
$newMember->memberType = 'add';
$newMember->account = '';
$newMember->role = '';
$newMember->days = $days;
$newMember->hours = $this->config->execution->defaultWorkhours;
$newMember->limited = 'no';
$teamMembers[] = $newMember;
}
return $teamMembers;
}
/**
* 设置最近五次执行。
* Set the recent five executions.
*
* @param int $executionID
* @access protected
* @return void
*/
protected function setRecentExecutions(int $executionID)
{
if($this->session->multiple)
{
$recentExecutions = isset($this->config->execution->recentExecutions) ? explode(',', $this->config->execution->recentExecutions) : array();
array_unshift($recentExecutions, $executionID);
$recentExecutions = array_slice(array_unique($recentExecutions), 0, 5);
$recentExecutions = implode(',', $recentExecutions);
$this->loadModel('setting');
if(empty($this->config->execution->recentExecutions) || $this->config->execution->recentExecutions != $recentExecutions) $this->setting->updateItem($this->app->user->account . 'common.execution.recentExecutions', $recentExecutions);
if(empty($this->config->execution->lastExecution) || $this->config->execution->lastExecution != $executionID) $this->setting->updateItem($this->app->user->account . 'common.execution.lastExecution', $executionID);
}
}
/**
* 设置任务页面的Cookie和Session。
* Set task page storage.
*
* @access protected
* @return void
*/
protected function setTaskPageStorage(int $executionID, string $orderBy, string $browseType, int $param = 0)
{
helper::setcookie('preExecutionID', (string)$executionID);
helper::setcookie('executionTaskOrder', $orderBy);
if($this->cookie->preExecutionID != $executionID)
{
helper::setcookie('moduleBrowseParam', '0');
helper::setcookie('productBrowseParam', '0');
}
if($browseType == 'bymodule')
{
helper::setcookie('moduleBrowseParam', (string)$param);
helper::setcookie('productBrowseParam', '0');
}
elseif($browseType == 'byproduct')
{
helper::setcookie('moduleBrowseParam', '0');
helper::setcookie('productBrowseParam', (string)$param);
}
else
{
$this->session->set('taskBrowseType', $browseType);
}
if($browseType == 'bymodule' && $this->session->taskBrowseType == 'bysearch') $this->session->set('taskBrowseType', 'unclosed');
}
/**
* 获取打印看板的数据。
* Get printed kanban data.
*
* @param int $executionID
* @param array $stories
* @access protected
* @return array
*/
protected function getPrintKanbanData(int $executionID, array $stories): array
{
$kanbanTasks = $this->execution->getKanbanTasks($executionID, "id");
$kanbanBugs = $this->loadModel('bug')->getExecutionBugs($executionID);
$users = array();
$taskAndBugs = array();
foreach($kanbanTasks as $task)
{
$status = $task->status;
$users[] = $task->assignedTo;
$taskAndBugs[$status]["task{$task->id}"] = $task;
}
foreach($kanbanBugs as $bug)
{
$status = $bug->status;
$status = $status == 'active' ? 'wait' : ($status == 'resolved' ? ($bug->resolution == 'postponed' ? 'cancel' : 'done') : $status);
$users[] = $bug->assignedTo;
$taskAndBugs[$status]["bug{$bug->id}"] = $bug;
}
$dataList = array();
$contents = array('story', 'wait', 'doing', 'done', 'cancel');
foreach($contents as $content)
{
if($content != 'story' and !isset($taskAndBugs[$content])) continue;
$dataList[$content] = $content == 'story' ? $stories : $taskAndBugs[$content];
}
return array($dataList, $users);
}
/**
* 处理打印的看板数据。
* Process printed Kanban data.
*
* @param int $executionID
* @param array $dataList
* @access protected
* @return array
*/
protected function processPrintKanbanData(int $executionID, array $dataList): array
{
$prevKanbans = $this->execution->getPrevKanban($executionID);
foreach($dataList as $type => $data)
{
if(isset($prevKanbans[$type]))
{
$prevData = $prevKanbans[$type];
foreach($prevData as $id)
{
if(isset($data[$id])) unset($dataList[$type][$id]);
}
}
}
return $dataList;
}
/**
* Check if the product has multiple branch and check if the execution has a product with multiple branch.
*
* @param int $productID
* @param int $executionID
* @return bool
*/
protected function hasMultipleBranch(int $productID, int $executionID): bool
{
/* Check if the product is multiple branch. */
$multiBranchProduct = false;
if($productID)
{
$product = $this->loadModel('product')->getByID($productID);
if($product->type != 'normal') $multiBranchProduct = true;
}
else
{
$executionProductList = $this->loadModel('product')->getProducts($executionID);
foreach($executionProductList as $executionProduct)
{
if($executionProduct->type != 'normal')
{
$multiBranchProduct = true;
break;
}
}
}
return $multiBranchProduct;
}
}