work/application/common/Model/ProjectVersion.php
2024-01-03 09:54:57 +08:00

198 lines
6.1 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\common\Model;
use PDOStatement;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\Exception;
use think\exception\DbException;
use think\exception\PDOException;
use think\facade\Hook;
/**
* 版本
* Class ProjectFeatures
* @package app\common\Model
*/
class ProjectVersion extends CommonModel
{
protected $append = ['statusText'];
/**
* 创建版本
* @param $featuresCode
* @param $name
* @param $description
* @param $projectCode
* @param $organizationCode
* @param $startTime
* @param string $planPublishTime
* @return array
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function createData($featuresCode, $name, $description, $organizationCode, $startTime, $planPublishTime = '')
{
if (!$name) {
return error(1, '请填写版本名称');
}
$projectFeatures = ProjectFeatures::where(['code' => $featuresCode])->field('id')->find();
if (!$projectFeatures) {
return error(3, '该版本库已失效');
}
$version = self::where(['name' => $name, 'features_code' => $featuresCode])->find();
if ($version) {
return error(2, '该版本已名称存在');
}
$data = [
'create_time' => nowTime(),
'code' => createUniqueCode('ProjectVersion'),
'features_code' => $featuresCode,
'start_time' => $startTime,
'plan_publish_time' => $planPublishTime,
'description' => $description,
'organization_code' => $organizationCode,
'name' => trim($name),
];
$result = self::create($data)->toArray();
return $result;
}
/**
* 删除版本
* @param $featuresCode
* @return array|bool
* @throws Exception
* @throws PDOException
*/
public function deleteProjectVersion($versionCode)
{
if (!$versionCode) {
return error(1, '请选择一个版本');
}
ProjectVersion::versionHook(getCurrentMember()['code'], $versionCode, 'delete');
self::where(['code' => $versionCode])->delete();
Task::update(['features_code' => '', 'version_code' => ''], ['version_code' => $versionCode]);
return true;
}
public function changeStatus($versionCode, $status, $publishTime = '')
{
if (!$versionCode) {
return error(1, '请选择一个版本');
}
$updateData = ['status' => $status];
$logType = 'status';
if ($status == 3) {
$updateData['publish_time'] = $publishTime;
$logType = 'publish';
}
self::update($updateData, ['code' => $versionCode]);
ProjectVersion::versionHook(getCurrentMember()['code'], $versionCode, $logType);
return true;
}
public function addVersionTask($taskCode, $versionCode)
{
$task = Task::where(['code' => $taskCode])->field('id,version_code,name')->find();
if (!$task) {
return error(1, '该任务已被失效');
}
if ($task['version_code']) {
return error(1, '该任务已被关联');
}
$version = ProjectVersion::where(['code' => $versionCode])->find();
if (!$version) {
return error(1, '该版本已被失效');
}
$task->version_code = $versionCode;
$task->features_code = $version['features_code'];
$task->save();
self::updateSchedule($versionCode);
return $task;
}
/**
* 移除发布内容
* @param $taskCode
* @return array|PDOStatement|string|\think\Model|null
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function removeVersionTask($taskCode)
{
$task = Task::where(['code' => $taskCode])->field('id,version_code,name')->find();
if (!$task) {
return error(1, '该任务已被失效');
}
$versionCode = $task['version_code'];
if ($versionCode) {
$task->version_code = '';
$task->features_code = '';
$task->save();
ProjectVersion::versionHook(getCurrentMember()['code'], $versionCode, 'removeVersionTask', '', '', $task['name']);
self::updateSchedule($versionCode);
}
return $task;
}
public static function updateSchedule($versionCode)
{
$version = ProjectVersion::where(['code' => $versionCode])->find();
$taskList = Task::where(['version_code' => $versionCode, 'deleted' => 0])->field('id', true)->select();
$doneTotal = 0;
if ($taskList) {
foreach ($taskList as $task) {
if ($task['done']) {
$doneTotal++;
}
}
$schedule = intval($doneTotal / count($taskList) * 100);
$version->schedule = $schedule;
$version->save();
}
}
public function getStatusTextAttr($value, $data)
{
//状态。0未开始1进行中2延期发布3已发布
if (!isset($data['status'])) {
return '-';
}
switch ($data['status']) {
case 0:
return '未开始';
case 1:
return '进行中';
case 2:
return '延期发布';
case 3:
return '已发布';
}
}
/**
* 版本变动钩子
* @param $memberCode
* @param $versionCode
* @param string $type
* @param string $remark
* @param string $content
* @param array $data
* @param string $tag
*/
public static function versionHook($memberCode, $versionCode, $type = 'create', $remark = '', $content = '', $data = [], $tag = 'version')
{
$data = ['memberCode' => $memberCode, 'versionCode' => $versionCode, 'remark' => $remark, 'type' => $type, 'content' => $content, 'data' => $data, 'tag' => $tag];
Hook::listen($tag, $data);
}
}