This commit is contained in:
lanzongjun
2023-04-28 16:04:38 +08:00
5 changed files with 153 additions and 55 deletions
+11 -29
View File
@@ -1867,61 +1867,43 @@ class project extends control
}
/**
* Delete a project.
* 删除一个项目,并弹窗确认
* Delete a project and confirm.
*
* @param int $projectID
* @param string $projectID
* @param string $confirm
* @param string $from browse|view
*
* @access public
* @return void
*/
public function delete($projectID, $confirm = 'no', $from = 'browse')
public function delete(string $projectID, string $confirm = 'no', string $from = 'browse'): void
{
$projectID = (int)$projectID;
$project = $this->getByID($projectID);
if($confirm == 'no')
{
$project = $this->project->getByID($projectID);
return print(js::confirm(sprintf($this->lang->project->confirmDelete, $project->name), $this->createLink('project', 'delete', "projectID=$projectID&confirm=yes&from=$from")));
}
else
{
$this->loadModel('user');
$this->loadModel('action');
$this->project->delete(TABLE_PROJECT, $projectID);
$this->dao->update(TABLE_DOCLIB)->set('deleted')->eq(1)->where('execution')->eq($projectID)->exec();
$this->user->updateUserView($projectID, 'project');
/* Delete the execution under the project. */
$executionIdList = $this->loadModel('execution')->getPairs($projectID);
/* Delete shadow product.*/
$project = $this->project->getByID($projectID);
if(!$project->hasProduct)
{
$productID = $this->loadModel('product')->getProductIDByProject($projectID);
$this->dao->update(TABLE_PRODUCT)->set('deleted')->eq(1)->where('id')->eq($productID)->exec();
}
$this->loadModel('user')->updateUserView($projectID, 'project');
$message = $this->executeHooks($projectID);
if($message) $this->lang->saveSuccess = $message;
if(empty($executionIdList))
{
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
if($from == 'view') return print(js::locate($this->createLink('project', 'browse'), 'parent'));
return print(js::reload('parent'));
}
$this->dao->update(TABLE_EXECUTION)->set('deleted')->eq(1)->where('id')->in(array_keys($executionIdList))->exec();
foreach($executionIdList as $executionID => $execution) $this->action->create('execution', $executionID, 'deleted', '', ACTIONMODEL::CAN_UNDELETED);
$this->user->updateUserView($executionIdList, 'sprint');
$this->projectZen->removeAssociatedProducts($project);
$this->projectZen->removeAssociatedExecutions($projectID);
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
$this->session->set('project', '');
if($from == 'view') return print(js::locate($this->createLink('project', 'browse'), 'parent'));
return print(js::reload('parent'));
}
}
+19 -3
View File
@@ -1767,12 +1767,28 @@ class projectModel extends model
return !dao::isError();
}
/**
* 删除项目并同步执行与产品等状态为删除
* Deletes a project and updates related items: product|execution
*
* @param string $table product|execution
* @param int|array $idList
*
* @access public
* @return void
*/
public function deleteProductAndExcution(string $table, int|array $idList):void
{
$this->dao->update($table)->set('deleted')->eq(1)->where('id')->in($idList)->exec();
}
/**
* Update the program of the product.
*
* @param int $oldProgram
* @param int $newProgram
* @param array $products
*
* @access public
* @return void
*/
@@ -1806,16 +1822,16 @@ class projectModel extends model
* @access public
* @return void
*/
public function unlinkMember($projectID, $account, $removeExecution = 'no')
public function unlinkMember(int $projectID, string $account, string $removeExecution = 'no'): void
{
$this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq('project')->andWhere('account')->eq($account)->exec();
$this->projectTao->unlinkTeamMember($projectID, 'project', $account);
$this->loadModel('user')->updateUserView($projectID, 'project', array($account));
if($removeExecution == 'yes')
{
$executions = $this->loadModel('execution')->getByProject($projectID, 'undone', 0, true);
$this->dao->delete()->from(TABLE_TEAM)->where('root')->in(array_keys($executions))->andWhere('type')->eq('execution')->andWhere('account')->eq($account)->exec();
$this->projectTao->unlinkTeamMember(array_keys($executions), 'execution', $account);
$this->user->updateUserView(array_keys($executions), 'sprint', array($account));
}
+24 -4
View File
@@ -220,7 +220,7 @@ class projectTao extends projectModel
* @param object $postData
* @param object $program
* @access protected
* @return bool
* @return bool
*/
protected function createDocLib(int $projectID, object $project, object $postData, object $program): bool
{
@@ -269,7 +269,7 @@ class projectTao extends projectModel
* @param object $postData
* @param object $program
* @access protected
* @return bool
* @return bool
*/
protected function createProduct(int $projectID, object $project, object $postData, object $program): bool
{
@@ -333,7 +333,7 @@ class projectTao extends projectModel
* @param object $rawdata
* @param object $program
* @access protected
* @return bool
* @return bool
*/
protected function getLinkedProductsCount(object $project, object $rawdata): int
{
@@ -355,7 +355,7 @@ class projectTao extends projectModel
*
* @param int $projectID
* @access protected
* @return bool
* @return bool
*/
protected function addProjectAdmin(int $projectID): bool
{
@@ -383,4 +383,24 @@ class projectTao extends projectModel
return !dao::isError();
}
/**
* 删除项目团队成员。
* Delete project team member.
*
* @param array|int $projectIdList
* @param string $type
* @param string $account
* @access protected
* @return bool
*/
protected function unlinkTeamMember(int|array $projectIdList, string $type, string $account): bool
{
$this->dao->delete()->from(TABLE_TEAM)
->where('root')->in($projectIdList)
->andWhere('type')->eq($type)
->andWhere('account')->eq($account)
->exec();
return !dao::isError();
}
}
+49 -13
View File
@@ -1,29 +1,65 @@
#!/usr/bin/env php
<?php
include dirname(__FILE__, 5) . "/test/lib/init.php";
su('admin');
su('admin');
function initData()
{
$team = zdTable('team');
$team->id->range('2-9');
$team->root->range('2,7-9{3}');
$team->type->range('project,execution{7}');
$team->account->range('admin,user1,user2,admin');
$team->limited->range('no');
$team->join->range('2023-04-02');
$team->days->range('7');
$team->hours->range('7');
$team->gen(8);
$execution = zdTable('project');
$execution->id->range('2,6,8,9');
$execution->project->range('2,3');
$execution->name->prefix('项目')->range('8,9');
$execution->code->prefix('project')->range('8,9');
$execution->type->range('project{2},sprint,kanban');
$execution->status->range('doing,suspended,closed');
$execution->gen(4);
}
/**
title=测试 projectModel->unlinkMember();
title=测试 projectModel::getByID;
timeout=0
cid=1
pid=1
查看移除团队成员之前的ID为11的项目团队成员数量 >> 3
查看移除团队成员之后的ID为11的项目团队成员数量 >> 2
查看项目ID为11的团队成员的真实姓名 >> 产品经理92
查看项目ID为11的团队成员的真实姓名 >> 产品经理92
- 执行$diffMembers @1 >> 1
>> admin
- 执行$beforeMembers['admin'] @admin >> 0
>> 1
- 执行$afterMembers['admin'] @0 >> admin
>> 0
*/
global $tester;
$tester->loadModel('project');
$beforeMembers = $tester->project->getTeamMemberPairs(11);
$tester->project->unlinkMember(11, 'admin', false);
$afterMembers = $tester->project->getTeamMemberPairs(11);
initData();
r(count($beforeMembers)) && p('') && e('3'); // 查看移除团队成员之前的ID为11的项目团队成员数量
r(count($afterMembers)) && p('') && e('2'); // 查看移除团队成员之后的ID为11的项目团队成员数量
r($beforeMembers) && p('pm92') && e('产品经理92'); // 查看项目ID为11的团队成员的真实姓名
r($afterMembers) && p('pm92') && e('产品经理92'); // 查看项目ID为11的团队成员的真实姓名
$beforeMembers = $tester->project->getTeamMemberPairs(2);
$beforeExecutionMembers = $tester->project->getTeamMemberPairs(8);
$tester->project->unlinkMember(2, 'admin', 'yes');
$afterMembers = $tester->project->getTeamMemberPairs(2);
$afterExecutionMembers = $tester->project->getTeamMemberPairs(6);
$diffMembers = count($beforeMembers) - count($afterMembers);
$diffExecutionMembers = count($beforeExecutionMembers) - count($afterExecutionMembers);
r($diffMembers) && p() && e('1');
r($beforeMembers['admin']) && p() && e('admin');
r($afterMembers['admin']) && p() && e('0');
r($diffExecutionMembers) && p() && e('1');
r($beforeExecutionMembers['admin']) && p() && e('admin');
r($afterExecutionMembers['admin']) && p() && e('0');
+50 -6
View File
@@ -56,9 +56,9 @@ class projectZen extends project
* @param object $project
* @param object $rawdata
* @access protected
* @return bool
* @return bool
*/
private function checkProductAndBranch(object $project, object $rawdata): bool
private function checkProductAndBranch(object $project, object $rawdata): bool
{
$linkedProductsCount = $this->project->getLinkedProductsCount($project, $rawdata);
@@ -98,9 +98,9 @@ class projectZen extends project
* @param object $project
* @param object $rawdata
* @access protected
* @return bool
* @return bool
*/
private function checkDaysAndBudget(object $project, object $rawdata): bool
private function checkDaysAndBudget(object $project, object $rawdata): bool
{
/* Judge workdays is legitimate. */
$workdays = helper::diffDate($project->end, $project->begin) + 1;
@@ -137,9 +137,9 @@ class projectZen extends project
* @param object $project
* @param object $rawdata
* @access protected
* @return bool
* @return bool
*/
private function checkProductNameUnqiue(object $project, object $rawdata): bool
private function checkProductNameUnqiue(object $project, object $rawdata): bool
{
/* When select create new product, product name cannot be empty and duplicate. */
if($project->hasProduct && isset($rawdata->newProduct))
@@ -542,4 +542,48 @@ class projectZen extends project
->remove('comment,readjustTime,readjustTask')
->get();
}
/**
* 从项目中删除所有关联的执行。
* removes all associated executions from the be deleted project
*
* @param int $projectID
*
* @access protected
* @return void
*/
protected function removeAssociatedExecutions(int $projectID): void
{
/* Delete the execution under the project. */
$executionIdList = $this->loadModel('execution')->getPairs($projectID);
if(empty($executionIdList))
{
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
if($from == 'view') return print(js::locate($this->createLink('project', 'browse'), 'parent'));
return print(js::reload('parent'));
}
$this->updateRelatedItemByDelete('zt_execution', array_keys($executionIdList));
foreach($executionIdList as $executionID => $execution) $this->action->create('execution', $executionID, 'deleted', '', ACTIONMODEL::CAN_UNDELETED);
$this->user->updateUserView($executionIdList, 'sprint');
}
/**
* 从项目中删除所有关联的产品。
* removes all associated products from the be deleted project
*
* @param object $projectID
*
* @access protected
* @return void
*/
protected function removeAssociatedProducts(object $project): void
{
/* Delete shadow product.*/
if(!$project->hasProduct)
{
$productID = $this->loadModel('product')->getProductIDByProject($project->id);
$this->updateRelatedItemByDelete('zt_product', $productID);
}
}
}