perf: 导出报表调整

This commit is contained in:
韦荣超 2022-03-02 15:19:48 +08:00
parent 54d215b8d1
commit 827bc97e8e
5 changed files with 130 additions and 1 deletions

View File

@ -13,6 +13,7 @@ use App\Models\ProjectInvite;
use App\Models\ProjectLog;
use App\Models\ProjectTask;
use App\Models\ProjectTaskFile;
use App\Models\ProjectTaskFlowChange;
use App\Models\ProjectUser;
use App\Models\User;
use App\Models\WebSocketDialog;
@ -1028,6 +1029,11 @@ class ProjectController extends AbstractController
$headings[] = '结束剩余';
$headings[] = '所属项目';
$headings[] = '父级任务ID';
$headings[] = '任务计划用时';
$headings[] = '开发用时';
$headings[] = '验收/测试用时';
$headings[] = '任务实际总用时';
$headings[] = '超时时间';
$datas = [];
//
$builder = ProjectTask::select(['project_tasks.*', 'project_task_users.userid as ownerid'])
@ -1049,6 +1055,57 @@ class ProjectController extends AbstractController
} else {
$endSurplus = '-';
}
$developFlowChanges = ProjectTaskFlowChange::whereTaskId($task->id)->get();
$developTime = 0;//开发时间
$testTime = 0;//验收/测试时间
foreach ($developFlowChanges as $change) {
if (strpos($change->before_flow_item_name, 'end') === false) {
$upOne = ProjectTaskFlowChange::where('id', '<', $change->id)->whereTaskId($task->id)->orderByDesc('id')->first();
if ($upOne) {
if (strpos($change->before_flow_item_name, 'progress') !== false && strpos($change->before_flow_item_name, '进行') !== false) {
$devCtime = Carbon::parse($change->created_at)->timestamp;
$oCtime = Carbon::parse($upOne->created_at)->timestamp;
$minusNum = $devCtime - $oCtime;
$developTime += $minusNum;
}
if (strpos($change->before_flow_item_name, 'test') !== false || strpos($change->before_flow_item_name, '测试') !== false || strpos($change->before_flow_item_name, '验收') !== false) {
$testCtime = Carbon::parse($change->created_at)->timestamp;
$tTime = Carbon::parse($upOne->created_at)->timestamp;
$tMinusNum = $testCtime - $tTime;
$testTime += $tMinusNum;
}
}
}
}
if (!$task->complete_at) {
$lastChange = ProjectTaskFlowChange::whereTaskId($task->id)->orderByDesc('id')->first();
$nowTime = time();
$unFinishTime = $nowTime - Carbon::parse($lastChange->created_at)->timestamp;
if (strpos($lastChange->after_flow_item_name, 'progress') !== false || strpos($lastChange->after_flow_item_name, '进行') !== false) {
$developTime += $unFinishTime;
} elseif (strpos($lastChange->after_flow_item_name, 'test') !== false || strpos($lastChange->after_flow_item_name, '测试') !== false || strpos($lastChange->after_flow_item_name, '验收') !== false) {
$testTime += $unFinishTime;
}
}
$firstChange = ProjectTaskFlowChange::whereTaskId($task->id)->orderBy('id')->first();
if (strpos($firstChange->after_flow_item_name, 'end') !== false) {
$firstDevTime = Carbon::parse($firstChange->created_at)->timestamp - Carbon::parse($task->created_at)->timestamp;
$developTime += $firstDevTime;
}
$totalTime = $developTime + $testTime; //任务总用时
$planTime = '-';//任务计划用时
$overTime = '-';//超时时间
if ($task->end_at) {
$startTime = Carbon::parse($task->start_at)->timestamp;
$endTime = Carbon::parse($task->end_at)->timestamp;
$planTotalTime = $endTime - $startTime;
$residueTime = $planTotalTime - $totalTime;
if ($residueTime < 0) {
$overTime = Base::timeFormat(abs($residueTime));
}
$planTime = Base::timeDiff($startTime, $endTime);
}
$datas[] = [
$task->id,
Base::filterEmoji($task->name),
@ -1063,6 +1120,11 @@ class ProjectController extends AbstractController
$endSurplus,
Base::filterEmoji($task->project?->name) ?: '-',
$task->parent_id ?: '-',
$planTime,
$developTime > 0 ? Base::timeFormat($developTime) : '-',
$testTime > 0 ? Base::timeFormat($testTime) : '-',
$totalTime > 0 ? Base::timeFormat($totalTime) : '-',
$overTime,
];
}
});

View File

@ -376,6 +376,7 @@ class Project extends AbstractModel
$idc = [];
$hasStart = false;
$hasEnd = false;
$testNum = 0;
$upTaskList = [];
foreach ($flows as $item) {
$id = intval($item['id']);
@ -416,6 +417,9 @@ class Project extends AbstractModel
if ($flow->status == 'end') {
$hasEnd = true;
}
if ($flow->status == 'test') {
$testNum++;
}
if (!$isInsert) {
$upTaskList[$flow->id] = $flow->status . "|" . $flow->name;
}
@ -424,6 +428,9 @@ class Project extends AbstractModel
if (!$hasStart) {
throw new ApiException('至少需要1个开始状态');
}
if($testNum > 1){
throw new ApiException('验收/测试状态只能有1个');
}
if (!$hasEnd) {
throw new ApiException('至少需要1个结束状态');
}

View File

@ -1732,6 +1732,33 @@ class Base
}
}
/**
* 时间秒数格式化
* @param int $time 时间秒数
* @return string
*/
public static function timeFormat($time)
{
if ($time > 86400) {
$day = floor($time / 86400);
$hour = ceil(($time - ($day * 86400)) / 3600);
if ($hour > 0) {
return $day . '天' . $hour . '小时';
} else {
return $day . '天';
}
} elseif ($time > 3600) {
return ceil($time / 3600) . '小时';
} elseif ($time > 60) {
return ceil($time / 60) . '分钟';
} elseif ($time > 1) {
return '1分钟内';
} else {
return '0秒';
}
}
/**
* 取ip前3段
* @param $ip

View File

@ -42,6 +42,12 @@
<div class="subtitle">{{$L('可设置多个状态为进行中')}}</div>
</div>
</div>
<div class="taskflow-config-table-block-item">
<div>
<div class="title">{{$L('验收/测试')}}</div>
<div class="subtitle">{{$L('只能设置单个状态为验收/测试')}}</div>
</div>
</div>
<div class="taskflow-config-table-block-item">
<div>
<div class="title">{{$L('结束状态')}}</div>
@ -113,6 +119,7 @@
<RadioGroup v-model="item.status">
<Radio label="start"><span></span></Radio>
<Radio label="progress"><span></span></Radio>
<Radio label="test"><span></span></Radio>
<Radio label="end"><span></span></Radio>
</RadioGroup>
</div>
@ -295,6 +302,15 @@ export default {
},
{
"id": -12,
"name": "待测试",
"status": "test",
"turns": [-10, -11, -12, -13],
"userids": [],
"usertype": 'add',
"userlimit": 0,
},
{
"id": -13,
"name": "已完成",
"status": "end",
"turns": [-10, -11, -12, -13],
@ -303,7 +319,7 @@ export default {
"userlimit": 0,
},
{
"id": -13,
"id": -14,
"name": "已取消",
"status": "end",
"turns": [-10, -11, -12, -13],

View File

@ -70,6 +70,11 @@
border-color: rgba(27, 154, 238, 0.1);
color: #0171c2;
}
&.test {
background-color: rgba(27, 154, 238, 0.1);
border-color: rgba(27, 154, 238, 0.1);
color: #0171c2;
}
&.end {
background-color: rgba(21, 173, 49, 0.1);
border-color: rgba(21, 173, 49, 0.1);
@ -329,6 +334,13 @@
}
}
&.test {
border-color: #ccecff;
&:hover {
border-color: #87d2ff
}
}
&.end {
border-color: #cafac8;
&:hover {
@ -377,6 +389,11 @@
color: #0171c2
}
&.test {
background: rgba(27,154,238,0.1);
color: #0171c2
}
&.end {
background: rgba(21,173,49,0.1);
color: #038a24