优化日志

This commit is contained in:
kuaifan 2022-01-13 09:00:39 +08:00
parent a3e0d89eb0
commit 75a12fc6f5
6 changed files with 127 additions and 54 deletions

View File

@ -1749,7 +1749,7 @@ class ProjectController extends AbstractController
$project_id = intval(Request::input('project_id'));
$task_id = intval(Request::input('task_id'));
//
$builder = ProjectLog::with(['user']);
$builder = ProjectLog::with(['projectTask:id,name']);
if ($task_id > 0) {
$task = ProjectTask::userTask($task_id);
$builder->whereTaskId($task->id);

View File

@ -13,9 +13,10 @@ use App\Module\Base;
* @property int|null $task_id 项目ID
* @property int|null $userid 会员ID
* @property string|null $detail 详细信息
* @property string|null $record 记录数据
* @property array $record 记录数据
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\Models\ProjectTask|null $projectTask
* @property-read \App\Models\User|null $user
* @method static \Illuminate\Database\Eloquent\Builder|ProjectLog newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ProjectLog newQuery()
@ -54,4 +55,12 @@ class ProjectLog extends AbstractModel
return $this->hasOne(User::class, 'userid', 'userid');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(ProjectTask::class, 'id', 'task_id');
}
}

View File

@ -897,7 +897,7 @@ class ProjectTask extends AbstractModel
if ($complete_at === null) {
// 标记未完成
$this->complete_at = null;
$this->addLog("{任务}标记未完成");
$this->addLog("标记{任务}未完成");
} else {
// 标记已完成
if ($this->parent_id == 0) {
@ -909,7 +909,7 @@ class ProjectTask extends AbstractModel
throw new ApiException('请先领取任务');
}
$this->complete_at = $complete_at;
$this->addLog("{任务}标记已完成");
$this->addLog("标记{任务}已完成");
}
$this->save();
});

View File

@ -296,7 +296,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 6,
'task_id' => 8,
'userid' => 1,
'detail' => '任务标记已完成:官网项目一期',
'detail' => '标记任务已完成:官网项目一期',
'created_at' => seeders_at('2021-07-01 10:53:47'),
'updated_at' => seeders_at('2021-07-01 10:53:47'),
),
@ -2998,7 +2998,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 27,
'task_id' => 77,
'userid' => 1,
'detail' => '任务标记已完成:🚴 里程碑 1 需求评审完成,资源准备到位',
'detail' => '标记任务已完成:🚴 里程碑 1 需求评审完成,资源准备到位',
'created_at' => seeders_at('2021-07-01 15:39:46'),
'updated_at' => seeders_at('2021-07-01 15:39:46'),
),
@ -3229,7 +3229,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:首页',
'detail' => '子标记任务已完成:首页',
'created_at' => seeders_at('2021-07-01 16:17:30'),
'updated_at' => seeders_at('2021-07-01 16:17:30'),
),
@ -3240,7 +3240,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:公司介绍',
'detail' => '子标记任务已完成:公司介绍',
'created_at' => seeders_at('2021-07-01 16:17:31'),
'updated_at' => seeders_at('2021-07-01 16:17:31'),
),
@ -3251,7 +3251,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:新闻动态',
'detail' => '子标记任务已完成:新闻动态',
'created_at' => seeders_at('2021-07-01 16:17:32'),
'updated_at' => seeders_at('2021-07-01 16:17:32'),
),
@ -3262,7 +3262,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:产品介绍',
'detail' => '子标记任务已完成:产品介绍',
'created_at' => seeders_at('2021-07-01 16:17:34'),
'updated_at' => seeders_at('2021-07-01 16:17:34'),
),
@ -3273,7 +3273,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:案例展示',
'detail' => '子标记任务已完成:案例展示',
'created_at' => seeders_at('2021-07-01 16:17:35'),
'updated_at' => seeders_at('2021-07-01 16:17:35'),
),
@ -3284,7 +3284,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记已完成:联系我们',
'detail' => '子标记任务已完成:联系我们',
'created_at' => seeders_at('2021-07-01 16:17:36'),
'updated_at' => seeders_at('2021-07-01 16:17:36'),
),
@ -3295,7 +3295,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '任务标记已完成:产品官网设计',
'detail' => '标记任务已完成:产品官网设计',
'created_at' => seeders_at('2021-07-01 16:17:37'),
'updated_at' => seeders_at('2021-07-01 16:17:37'),
),
@ -3306,7 +3306,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '子任务标记未完成:联系我们',
'detail' => '标记子任务未完成:联系我们',
'created_at' => seeders_at('2021-07-01 16:17:41'),
'updated_at' => seeders_at('2021-07-01 16:17:41'),
),
@ -3317,7 +3317,7 @@ class ProjectLogsTableSeeder extends Seeder
'column_id' => 32,
'task_id' => 85,
'userid' => 1,
'detail' => '任务标记未完成:产品官网设计',
'detail' => '标记任务未完成:产品官网设计',
'created_at' => seeders_at('2021-07-01 16:17:44'),
'updated_at' => seeders_at('2021-07-01 16:17:44'),
),

View File

@ -2,22 +2,25 @@
<div :class="['project-log', taskId == 0 ? 'is-drawer' : '']">
<div class="log-title">{{$L('项目动态')}}</div>
<ul class="logs-activity">
<li v-for="items in lists">
<div class="logs-date">{{logDate(items)}}</div>
<li v-for="itemA in lists">
<div class="logs-date">{{logDate(itemA)}}</div>
<div class="logs-section">
<Timeline>
<TimelineItem v-for="(item, index) in items.lists" :key="index">
<TimelineItem v-for="(itemB, index) in itemA.lists" :key="index">
<div slot="dot" class="logs-dot">
<UserAvatar v-if="item.userid" :userid="item.userid" :size="18"/>
<EAvatar v-else :size="18">A</EAvatar>
<UserAvatar v-if="itemB.userid" :userid="itemB.userid" :size="18" showName/>
<div v-else class="avatar-wrapper common-avatar">
<EAvatar :size="18">A</EAvatar>
<div class="avatar-name auto">{{$L('系统')}}</div>
</div>
</div>
<div class="log-summary">
<span class="log-creator">{{item.user ? item.user.nickname : $L('系统')}}</span>
<ProjectLogDetail class="log-text" :render="logDetail" :item="item"/>
<span v-if="operationList(item).length > 0" class="log-operation">
<Button v-for="(op, oi) in operationList(item)" :key="oi" size="small" @click="onOperation(op)">{{op.button}}</Button>
<div v-for="log in itemB.lists" class="log-summary">
<ProjectLogDetail :render="logDetail" :item="log"/>
<span v-if="operationList(log).length > 0" class="log-operation">
<Button v-for="(op, oi) in operationList(log)" :key="oi" size="small" @click="onOperation(op)">{{op.button}}</Button>
</span>
<span class="log-time">{{item.time.ymd}} {{item.time.segment}} {{item.time.hi}}</span></div>
<span class="log-time">{{log.time.ymd}} {{log.time.segment}} {{log.time.hi}}</span>
</div>
</TimelineItem>
</Timeline>
</div>
@ -30,7 +33,6 @@
</template>
<script>
import {VNode} from "vue";
import ProjectLogDetail from "./ProjectLogDetail";
export default {
@ -50,7 +52,7 @@ export default {
return {
loadIng: 0,
lists: {},
lists: [],
listPage: 1,
hasMorePages: false,
totalNum: -1,
@ -67,11 +69,11 @@ export default {
watch: {
projectId() {
this.lists = {};
this.lists = [];
this.getLists(true);
},
taskId() {
this.lists = {};
this.lists = [];
this.getLists(true);
},
loadIng(num) {
@ -80,9 +82,9 @@ export default {
},
methods: {
logDate(items) {
logDate(itemA) {
let md = $A.formatDate("m-d");
return md == items.ymd ? (items.ymd + ' ' + this.$L('今天')) : items.key;
return md == itemA.ymd ? (itemA.ymd + ' ' + this.$L('今天')) : itemA.key;
},
getLists(resetLoad) {
@ -101,25 +103,38 @@ export default {
}).then(({data}) => {
this.loadIng--;
if (resetLoad === true) {
this.lists = {};
this.lists = [];
}
data.data.forEach((item) => {
let time = item.time;
let key = time.ymd + " " + time.week;
if (typeof this.lists[key] !== "object") {
this.$set(this.lists, key, {
key: key,
ymd: time.ymd,
lists: [],
});
data.data.some(log => {
let tmpTime = log.time;
let tmpKey = tmpTime.ymd + " " + tmpTime.week;
let itemA = this.lists.find(({key}) => key == tmpKey)
if (itemA) {
let itemB = itemA.lists.find(({userid}) => userid == log.userid)
if (itemB) {
itemB.lists.push(log)
} else {
itemA.lists.push({
userid: log.userid,
lists: [log]
})
}
} else {
this.lists.push({
key: tmpKey,
ymd: log.ymd,
lists: [{
userid: log.userid,
lists: [log]
}]
})
}
this.lists[key].lists.push(item);
});
})
this.hasMorePages = data.current_page < data.last_page;
this.totalNum = data.total;
}).catch(() => {
this.loadIng--;
this.lists = {};
this.lists = [];
this.hasMorePages = false;
this.totalNum = 0;
});

View File

@ -2,6 +2,7 @@
.log-title {
display: none;
}
&.is-drawer {
position: absolute;
top: 0;
@ -10,6 +11,7 @@
bottom: 0;
padding: 20px;
overflow: auto;
.log-title {
color: #333333;
font-size: 20px;
@ -18,96 +20,143 @@
margin-bottom: 24px;
}
}
.logs-activity {
position: relative;
word-break: break-all;
padding: 12px 12px;
> li {
list-style: none;
padding-top: 0;
&.logs-loading,
&.logs-more,
&.logs-none {
height: 22px;
line-height: 22px;
}
&.logs-loading {
display: flex;
.common-loading {
margin: 0;
}
}
&.logs-more {
cursor: pointer;
&:hover {
color: #048be0;
}
}
&.logs-none {
cursor: pointer;
color: #bbbbbb;
}
.logs-date {
color: rgba(0, 0, 0, .36);
padding-bottom: 14px;
}
.logs-section {
margin: 4px;
.ivu-timeline {
> li {
padding-bottom: 8px;
&:last-child {
padding-bottom: 0;
}
.ivu-timeline-item-head-custom {
position: static;
left: auto;
margin-top: 8px;
margin-left: -13px;
margin-right: 6px;
width: auto;
min-width: 40px;
}
.ivu-timeline-item-content {
padding-left: 20px;
margin-top: -5px;
}
}
}
}
.logs-dot {
width: 18px;
width: auto;
height: 18px;
margin-left: 10px;
.avatar-box {
> em {
transform-origin: bottom right;
display: flex;
.avatar-name {
&.auto {
color: #9599a1;
}
}
}
.log-summary {
position: relative;
padding: 4px 0 4px 12px;
&:before {
content: "";
position: absolute;
top: 11px;
left: 0;
width: 5px;
height: 5px;
border-radius: 50%;
background-color: rgba(0, 0, 0, 0.4);
}
> span,
> a {
padding-right: 6px;
word-wrap: break-word;
word-break: break-word;
}
.log-creator {
color:rgba(0, 0, 0, 0.85)
}
.log-text {
display: inline-block;
color: rgba(0,0,0,.54);
color: rgba(0, 0, 0, .5);
.detail-user {
display: inline-block;
vertical-align: top;
.detail-user-wrap {
display: flex;
.common-avatar {
margin: 0 2px;
}
}
}
}
.log-operation {
> button {
font-size: 12px;
}
> button + button {
margin-left: 4px;
}
}
.log-time {
color: rgba(0,0,0,.3);
color: rgba(0, 0, 0, .3);
font-size: 12px;
}
}