Merge branch dev/task-146330 of zentao/zentaopms (#10370)
This commit is contained in:
@@ -1437,18 +1437,41 @@ class projectModel extends model
|
||||
* Update product stage by project.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param string $stageBy
|
||||
* @param object $postProductData
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function updateProductStage(int $projectID, string $stageBy, object $postProductData): bool
|
||||
public function updateProductStage(int $projectID, ?object $postProductData = null): bool
|
||||
{
|
||||
/* 如果项目的阶段为由按产品创建,则更新此项目下每个产品。*/
|
||||
if($stageBy == 'project') return true;
|
||||
if(empty($postProductData)) return false;
|
||||
|
||||
$executions = $this->loadModel('execution')->getPairs($projectID);
|
||||
foreach(array_keys($executions) as $executionID) $this->execution->updateProducts($executionID, $postProductData); // 更新项目下所有产品的阶段。
|
||||
$stageParis = $this->loadModel('execution')->getPairs($projectID);
|
||||
$stageProducts = $this->dao->select('project, product')->from(TABLE_PROJECTPRODUCT)
|
||||
->where('project')->in(array_keys($stageParis))
|
||||
->fetchPairs('project', 'product');
|
||||
|
||||
$products = zget($postProductData, 'products', array());
|
||||
$branches = zget($postProductData, 'branch', array(0));
|
||||
$plans = zget($postProductData, 'plans', array());
|
||||
|
||||
$productBranches = array();
|
||||
foreach($products as $i => $productID) $productBranches[$productID] = zget($branches, $i, array(0));
|
||||
|
||||
foreach($stageProducts as $stageID => $productID)
|
||||
{
|
||||
foreach($productBranches[$productID] as $branchID)
|
||||
{
|
||||
$data = new stdclass();
|
||||
$data->project = (int)$stageID;
|
||||
$data->product = (int)$productID;
|
||||
$data->branch = (int)$branchID;
|
||||
$data->plan = isset($plans[$productID]) ? implode(',', $plans[$productID]) : '';
|
||||
$data->plan = trim($data->plan, ',');
|
||||
$data->plan = empty($data->plan) ? 0 : ",$data->plan,";
|
||||
|
||||
$this->dao->replace(TABLE_PROJECTPRODUCT)->data($data)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
@@ -1492,7 +1515,7 @@ class projectModel extends model
|
||||
$this->updatePlans($projectID, (array)$this->post->plans); // 更新关联的计划列表。
|
||||
if($oldProject->hasProduct > 0) $this->updateProducts($projectID, (array)$this->post->products, $postProductData); // 更新关联的产品列表。
|
||||
$this->updateTeamMembers($project, $oldProject, zget($_POST, 'teamMembers', array())); // 更新关联的用户信息。
|
||||
if(!empty((array)$postProductData) && in_array($oldProject->model, array('waterfall', 'waterfallplus'))) $this->updateProductStage($projectID, (string)$oldProject->stageBy, $postProductData); // 更新关联的所有产品的阶段。
|
||||
if($oldProject->stageBy == 'product' && in_array($oldProject->model, array('waterfall', 'waterfallplus'))) $this->updateProductStage($projectID, $postProductData); // 更新多套阶段
|
||||
|
||||
$this->file->updateObjectID((string)$this->post->uid, $projectID, 'project'); // 通过uid更新文件id。
|
||||
|
||||
|
||||
@@ -705,4 +705,35 @@ class Project
|
||||
|
||||
return $this->project->getDisabledProducts($project, $linkedProducts);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新项目下的所有产品的阶段。
|
||||
* Update product stage by project.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param object $postProductData
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function updateProductStageTest(int $projectID, object $postProductData): array
|
||||
{
|
||||
$this->project->updateProductStage($projectID, $postProductData);
|
||||
$linkInfo = $this->project->dao->select('*')->from(TABLE_PROJECTPRODUCT)->fetchAll();
|
||||
|
||||
$result = array();
|
||||
foreach($linkInfo as $data)
|
||||
{
|
||||
if(!isset($result[$data->project])) $result[$data->project] = array();
|
||||
if(!isset($result[$data->project]['product'])) $result[$data->project]['product'] = array();
|
||||
if(!isset($result[$data->project]['branch'])) $result[$data->project]['branch'] = array();
|
||||
if(!isset($result[$data->project]['plan'])) $result[$data->project]['plan'] = array();
|
||||
$result[$data->project]['product'][$data->product] = $data->product;
|
||||
$result[$data->project]['branch'][$data->branch] = $data->branch;
|
||||
if(!empty(trim($data->plan, ',')))
|
||||
{
|
||||
foreach(explode(',', $data->plan) as $planID) $result[$data->project]['plan'][$planID] = $planID;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/lib/project.unittest.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试 projectModel->updateProductStage();
|
||||
timeout=0
|
||||
cid=1
|
||||
|
||||
- 检查阶段一关联产品一第product条的1属性 @1
|
||||
- 检查阶段一关联分支第branch条的0属性 @0
|
||||
- 检查阶段一关联计划第plan条的1属性 @1
|
||||
- 检查阶段二关联产品二第product条的2属性 @2
|
||||
- 检查阶段二关联分支
|
||||
- 第branch条的0属性 @0
|
||||
- 第branch条的1属性 @1
|
||||
- 第branch条的2属性 @2
|
||||
- 检查阶段二关联计划第plan条的2属性 @2
|
||||
- 检查阶段三关联产品三第product条的3属性 @3
|
||||
- 检查阶段三关联分支
|
||||
- 第branch条的0属性 @0
|
||||
- 第branch条的3属性 @3
|
||||
- 第branch条的4属性 @4
|
||||
- 检查阶段三关联计划第plan条的3属性 @3
|
||||
- 检查阶段四关联产品四第product条的4属性 @4
|
||||
- 检查阶段四关联分支
|
||||
- 第branch条的0属性 @0
|
||||
- 第branch条的5属性 @5
|
||||
- 检查阶段四关联计划第plan条的4属性 @4
|
||||
|
||||
*/
|
||||
|
||||
zenData('projectproduct')->gen(0);
|
||||
|
||||
$project = zenData('project');
|
||||
$project->id->range('1-5');
|
||||
$project->project->range('0,1{4}');
|
||||
$project->model->range("waterfall,[]{4}");
|
||||
$project->type->range('project,stage{4}');
|
||||
$project->parent->range('0,1{4}');
|
||||
$project->path->range('`,1,`,`,1,2,`,`,1,3,`,`,1,4,`,`,1,5,`');
|
||||
$project->grade->range('1,2{4}');
|
||||
$project->name->range('瀑布项目,阶段一,阶段二,阶段三,阶段四,阶段五');
|
||||
$project->code->range('waterfall,stage1,stage2,stage3,stage4,stage5');
|
||||
$project->hasProduct->range(1);
|
||||
$project->status->range('wait');
|
||||
$project->stageBy->range('product');
|
||||
$project->linkType->range('plan');
|
||||
$project->gen(5);
|
||||
|
||||
$projectProduct = zenData('projectproduct');
|
||||
$projectProduct->project->range('2,3,4,5');
|
||||
$projectProduct->product->range('1,2,3,4');
|
||||
$projectProduct->branch->range('0');
|
||||
$projectProduct->plan->range('');
|
||||
$projectProduct->gen(4);
|
||||
|
||||
$postData = new stdClass();
|
||||
$postData->products = array(1, 2, 3, 4);
|
||||
$postData->branch = array(array(0), array(1, 2), array(3, 4), array(5));
|
||||
$postData->plans = array(1 => array(1), 2 => array(2), 3 => array(3), 4 => array(4));
|
||||
|
||||
$projectTester = new Project();
|
||||
r($projectTester->updateProductStageTest(1, $postData)[2]) && p('product:1') && e('1'); //检查阶段一关联产品一
|
||||
r($projectTester->updateProductStageTest(1, $postData)[2]) && p('branch:0') && e('0'); //检查阶段一关联分支
|
||||
r($projectTester->updateProductStageTest(1, $postData)[2]) && p('plan:1') && e('1'); //检查阶段一关联计划
|
||||
r($projectTester->updateProductStageTest(1, $postData)[3]) && p('product:2') && e('2'); //检查阶段二关联产品二
|
||||
r($projectTester->updateProductStageTest(1, $postData)[3]) && p('branch:0,1,2') && e('0,1,2'); //检查阶段二关联分支
|
||||
r($projectTester->updateProductStageTest(1, $postData)[3]) && p('plan:2') && e('2'); //检查阶段二关联计划
|
||||
r($projectTester->updateProductStageTest(1, $postData)[4]) && p('product:3') && e('3'); //检查阶段三关联产品三
|
||||
r($projectTester->updateProductStageTest(1, $postData)[4]) && p('branch:0,3,4') && e('0,3,4'); //检查阶段三关联分支
|
||||
r($projectTester->updateProductStageTest(1, $postData)[4]) && p('plan:3') && e('3'); //检查阶段三关联计划
|
||||
r($projectTester->updateProductStageTest(1, $postData)[5]) && p('product:4') && e('4'); //检查阶段四关联产品四
|
||||
r($projectTester->updateProductStageTest(1, $postData)[5]) && p('branch:0,5') && e('0,5'); //检查阶段四关联分支
|
||||
r($projectTester->updateProductStageTest(1, $postData)[5]) && p('plan:4') && e('4'); //检查阶段四关联计划
|
||||
Reference in New Issue
Block a user