归档、删除 任务

This commit is contained in:
kuaifan 2021-06-09 11:15:58 +08:00
parent a6ab9a797d
commit e6794bce8c
5 changed files with 179 additions and 50 deletions

View File

@ -605,7 +605,6 @@ class ProjectController extends AbstractController
/** /**
* 删除任务列表 * 删除任务列表
* *
* @apiParam {Number} project_id 项目ID
* @apiParam {Number} column_id 列表ID留空为添加列表 * @apiParam {Number} column_id 列表ID留空为添加列表
*/ */
public function column__delete() public function column__delete()
@ -617,22 +616,22 @@ class ProjectController extends AbstractController
$user = User::IDE($user['data']); $user = User::IDE($user['data']);
} }
// //
$project_id = intval(Request::input('project_id'));
$column_id = intval(Request::input('column_id')); $column_id = intval(Request::input('column_id'));
// 列表
$column = ProjectColumn::whereId($column_id)->first();
if (empty($column)) {
return Base::retError('列表不存在');
}
// 项目 // 项目
$project = Project::select($this->projectSelect) $project = Project::select($this->projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->join('project_users', 'projects.id', '=', 'project_users.project_id')
->where('projects.id', $project_id) ->where('projects.id', $column->project_id)
->where('project_users.userid', $user->userid) ->where('project_users.userid', $user->userid)
->first(); ->first();
if (empty($project)) { if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内'); return Base::retError('项目不存在或不在成员列表内');
} }
// //
$column = ProjectColumn::whereId($column_id)->whereProjectId($project_id)->first();
if (empty($column)) {
return Base::retError('列表不存在');
}
if ($column->deleteColumn()) { if ($column->deleteColumn()) {
return Base::retSuccess('删除成功'); return Base::retSuccess('删除成功');
} }
@ -763,4 +762,70 @@ class ProjectController extends AbstractController
} }
return $result; return $result;
} }
/**
* 归档任务
*
* @apiParam {Number} task_id 任务ID
*/
public function task__archived()
{
$user = User::authE();
if (Base::isError($user)) {
return $user;
} else {
$user = User::IDE($user['data']);
}
//
$task_id = intval(Request::input('task_id'));
// 任务
$task = ProjectTask::whereId($task_id)->first();
if (empty($task)) {
return Base::retError('任务不存在');
}
// 项目
$project = Project::select($this->projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id')
->where('projects.id', $task->project_id)
->where('project_users.userid', $user->userid)
->first();
if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内');
}
//
return $task->archivedTask(Carbon::now());
}
/**
* 删除任务
*
* @apiParam {Number} task_id 任务ID
*/
public function task__delete()
{
$user = User::authE();
if (Base::isError($user)) {
return $user;
} else {
$user = User::IDE($user['data']);
}
//
$task_id = intval(Request::input('task_id'));
// 任务
$task = ProjectTask::whereId($task_id)->first();
if (empty($task)) {
return Base::retError('任务不存在');
}
// 项目
$project = Project::select($this->projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id')
->where('projects.id', $task->project_id)
->where('project_users.userid', $user->userid)
->first();
if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内');
}
//
return $task->deleteTask();
}
} }

View File

@ -44,7 +44,7 @@ class ProjectColumn extends AbstractModel
*/ */
public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasMany public function projectTask(): \Illuminate\Database\Eloquent\Relations\HasMany
{ {
return $this->hasMany(projectTask::class, 'column_id', 'id')->orderBy('sort')->orderBy('id'); return $this->hasMany(projectTask::class, 'column_id', 'id')->whereNull('archived_at')->orderBy('sort')->orderBy('id');
} }
/** /**

View File

@ -16,6 +16,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property int|null $project_id 项目ID * @property int|null $project_id 项目ID
* @property int|null $column_id 列表ID * @property int|null $column_id 列表ID
* @property string|null $name 标题 * @property string|null $name 标题
* @property string|null $color 颜色
* @property string|null $desc 描述 * @property string|null $desc 描述
* @property string|null $start_at 计划开始时间 * @property string|null $start_at 计划开始时间
* @property string|null $end_at 计划结束时间 * @property string|null $end_at 计划结束时间
@ -46,6 +47,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed() * @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask query() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask query()
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColor($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColumnId($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColumnId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCompleteAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCompleteAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCreatedAt($value)
@ -147,7 +149,7 @@ class ProjectTask extends AbstractModel
} }
$subTaskTotal = $this->attributes['sub_num']; $subTaskTotal = $this->attributes['sub_num'];
if ($subTaskTotal == 0) { if ($subTaskTotal == 0) {
return $this->complete_at ? 1 : 0; return $this->complete_at ? 100 : 0;
} }
$subTaskComplete = $builder->whereNotNull('complete_at')->count(); $subTaskComplete = $builder->whereNotNull('complete_at')->count();
if ($subTaskComplete == 0) { if ($subTaskComplete == 0) {
@ -336,6 +338,7 @@ class ProjectTask extends AbstractModel
if (Arr::exists($data, 'color')) { if (Arr::exists($data, 'color')) {
$this->color = $data['color']; $this->color = $data['color'];
} }
// 内容
if ($content && $this->parent_id === 0) { if ($content && $this->parent_id === 0) {
ProjectTaskContent::updateInsert([ ProjectTaskContent::updateInsert([
'project_id' => $this->parent_id, 'project_id' => $this->parent_id,
@ -343,6 +346,7 @@ class ProjectTask extends AbstractModel
], [ ], [
'content' => $content, 'content' => $content,
]); ]);
$this->desc = Base::getHtml($content);
} }
// 计划时间 // 计划时间
if ($times) { if ($times) {
@ -401,4 +405,36 @@ class ProjectTask extends AbstractModel
return Base::retSuccess('修改成功'); return Base::retSuccess('修改成功');
}); });
} }
/**
* 归档任务、取消归档
* @param Carbon|null $archived_at 归档时间
* @return array|bool
*/
public function archivedTask($archived_at)
{
return AbstractModel::transaction(function () use ($archived_at) {
if ($archived_at === null) {
// 标记未完成
$this->archived_at = null;
} else {
// 标记已完成
$this->archived_at = $archived_at;
}
$this->save();
return Base::retSuccess('修改成功');
});
}
/**
* 删除任务
* @return array|bool
*/
public function deleteTask()
{
return AbstractModel::transaction(function () {
$this->delete();
return Base::retSuccess('删除成功');
});
}
} }

View File

@ -54,7 +54,7 @@
</div> </div>
</div> </div>
</div> </div>
<div v-if="projectListPanel" class="project-column"> <div v-if="projectListPanel" class="project-column overlay-x">
<Draggable <Draggable
:list="projectDetail.project_column" :list="projectDetail.project_column"
:animation="150" :animation="150"
@ -143,6 +143,11 @@
<Icon type="md-radio-button-off" />{{$L('完成')}} <Icon type="md-radio-button-off" />{{$L('完成')}}
</div> </div>
</EDropdownItem> </EDropdownItem>
<EDropdownItem command="archived">
<div class="item">
<Icon type="ios-filing" />{{$L('归档')}}
</div>
</EDropdownItem>
<EDropdownItem command="delete"> <EDropdownItem command="delete">
<div class="item"> <div class="item">
<Icon type="md-trash" />{{$L('删除')}} <Icon type="md-trash" />{{$L('删除')}}
@ -861,7 +866,6 @@ export default {
$A.apiAjax({ $A.apiAjax({
url: 'project/column/delete', url: 'project/column/delete',
data: { data: {
project_id: this.projectDetail.id,
column_id: column.id, column_id: column.id,
}, },
complete: () => { complete: () => {
@ -902,8 +906,25 @@ export default {
complete_at: false complete_at: false
}) })
} }
else if (command === 'archived') {
$A.modalConfirm({
title: '归档任务',
content: '你确定要归档任务【' + task.name + '】吗?',
loading: true,
onOk: () => {
this.archivedOrRemoveTask(task, 'archived');
}
});
}
else if (command === 'delete') { else if (command === 'delete') {
this.removeTask(task); $A.modalConfirm({
title: '删除任务',
content: '你确定要删除任务【' + task.name + '】吗?',
loading: true,
onOk: () => {
this.archivedOrRemoveTask(task, 'delete');
}
});
} }
else if (command.name) { else if (command.name) {
this.updateTask(task, { this.updateTask(task, {
@ -951,46 +972,38 @@ export default {
}); });
}, },
removeTask(task) { archivedOrRemoveTask(task, type) {
$A.modalConfirm({ if (task.loading === true) {
title: '删除任务', return;
content: '你确定要删除任务【' + task.name + '】吗?', }
loading: true, this.$set(task, 'loading', true);
onOk: () => { $A.apiAjax({
if (task.loading === true) { url: 'project/task/' + type,
return; data: {
} task_id: task.id,
this.$set(task, 'loading', true); },
// complete: () => {
$A.apiAjax({ this.$set(task, 'loading', false);
url: 'project/task/delete', },
data: { error: () => {
task_id: task.id, this.$Modal.remove();
}, $A.modalAlert('网络繁忙,请稍后再试!');
complete: () => { },
this.$set(task, 'loading', false); success: ({ret, data, msg}) => {
}, this.$Modal.remove();
error: () => { if (ret === 1) {
this.$Modal.remove(); $A.messageSuccess(msg);
$A.modalAlert('网络繁忙,请稍后再试!'); let column = this.projectDetail.project_column.find(({id}) => id === task.column_id);
}, if (column) {
success: ({ret, data, msg}) => { let index = column.project_task.findIndex(({id}) => id === task.id);
this.$Modal.remove(); if (index > -1) {
if (ret === 1) { column.project_task.splice(index, 1);
$A.messageSuccess(msg);
let column = this.projectDetail.project_column.find(({id}) => id === column.id);
if (column) {
let index = column.project_task.findIndex(({id}) => id === task.id);
if (index > -1) {
column.project_task.splice(index, 1);
}
}
this.$store.commit('getProjectDetail', this.projectDetail.id);
}else{
$A.modalError(msg, 301);
} }
} }
}); this.$store.commit('getProjectDetail', this.projectDetail.id);
}else{
$A.modalError(msg, 301);
}
} }
}); });
}, },

View File

@ -610,6 +610,9 @@
display: flex; display: flex;
align-items: center; align-items: center;
> i { > i {
width: 18px;
height: 18px;
line-height: 18px;
font-size: 18px; font-size: 18px;
margin-right: 8px; margin-right: 8px;
padding: 0; padding: 0;
@ -624,6 +627,18 @@
color: #f00; color: #f00;
} }
} }
&:hover {
> i {
&.ivu-icon {
color: #66b1ff;
}
}
&.red {
> i {
color: #f00;
}
}
}
} }
} }
&.column-more { &.column-more {