优化日志
This commit is contained in:
parent
a3e0d89eb0
commit
75a12fc6f5
@ -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);
|
||||
|
@ -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');
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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'),
|
||||
),
|
||||
|
@ -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;
|
||||
});
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user