diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index a54f53c4..4abdd4c4 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -5,7 +5,6 @@ namespace App\Http\Controllers\Api; use App\Models\AbstractModel; use App\Models\Project; use App\Models\ProjectColumn; -use App\Models\ProjectLog; use App\Models\ProjectTask; use App\Models\ProjectTaskFile; use App\Models\ProjectUser; @@ -177,11 +176,6 @@ class ProjectController extends AbstractController 'userid' => $project->userid, 'owner' => 1, ])->save(); - ProjectLog::createInstance([ - 'project_id' => $project->id, - 'userid' => $project->userid, - 'detail' => '创建项目', - ])->save(); foreach ($insertColumns AS $column) { $column['project_id'] = $project->id; ProjectColumn::createInstance($column)->save(); @@ -332,17 +326,13 @@ class ProjectController extends AbstractController // return AbstractModel::transaction(function() use ($project, $userid) { $array = []; - foreach ($userid as $value) { - if ($value > 0 && $project->joinProject($value)) { - $array[] = $value; - } - } - $delUser = ProjectUser::whereProjectId($project->id)->whereNotIn('userid', $array)->get(); - if ($delUser->isNotEmpty()) { - foreach ($delUser as $value) { - $value->exitProject(); + foreach ($userid as $uid) { + if ($project->joinProject($uid)) { + $array[] = $uid; } } + ProjectUser::whereProjectId($project->id)->whereNotIn('userid', $array)->delete(); + $project->syncDialogUser(); return Base::retSuccess('修改成功'); }); } @@ -389,6 +379,7 @@ class ProjectController extends AbstractController ], [ 'owner' => 1, ]); + $project->syncDialogUser(); // return Base::retSuccess('移交成功'); }); @@ -423,11 +414,11 @@ class ProjectController extends AbstractController return Base::retError('项目负责人无法退出项目'); } // - $projectUser = ProjectUser::whereProjectId($project->id)->whereUserid($user->userid)->first(); - if ($projectUser->exitProject()) { + return AbstractModel::transaction(function() use ($user, $project) { + ProjectUser::whereProjectId($project->id)->whereUserid($user->userid)->delete(); + $project->syncDialogUser(); return Base::retSuccess('退出成功'); - } - return Base::retError('退出失败'); + }); } /** @@ -1011,13 +1002,7 @@ class ProjectController extends AbstractController return AbstractModel::transaction(function() use ($task) { if (empty($task->dialog_id)) { $task->lockForUpdate(); - $userids = $task->taskUser->pluck('userid')->toArray(); - $items = ProjectTask::with(['taskUser'])->where('parent_id', $task->id)->whereNull('archived_at')->get(); - foreach ($items as $item) { - $userids = array_merge($userids, $item->taskUser->pluck('userid')->toArray()); - } - $userids = array_values(array_filter(array_unique($userids))); - $dialog = WebSocketDialog::createGroup('', $userids, 'task'); + $dialog = WebSocketDialog::createGroup(null, $task->relationUserids(), 'task'); if ($dialog) { $task->dialog_id = $dialog->id; $task->save(); diff --git a/app/Models/Project.php b/app/Models/Project.php index 286bac86..3d724ddb 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -143,11 +143,17 @@ class Project extends AbstractModel public function getDialogIdAttribute($value) { if ($value === 0) { - $userid = $this->projectUser->pluck('userid')->toArray(); - $dialog = WebSocketDialog::createGroup('', $userid, 'project'); - if ($dialog) { - $this->dialog_id = $value = $dialog->id; - $this->save(); + $result = AbstractModel::transaction(function() { + $this->lockForUpdate(); + $dialog = WebSocketDialog::createGroup(null, $this->relationUserids(), 'project'); + if ($dialog) { + $this->dialog_id = $dialog->id; + $this->save(); + } + return Base::retSuccess('success', $dialog->id); + }); + if (Base::isSuccess($result)) { + $value = $result['data']; } } return $value; @@ -182,18 +188,48 @@ class Project extends AbstractModel * @param int $userid 加入的会员ID * @return bool */ - public function joinProject($userid) { - $result = AbstractModel::transaction(function () use ($userid) { - ProjectUser::updateInsert([ - 'project_id' => $this->id, - 'userid' => $userid, - ]); - WebSocketDialogUser::updateInsert([ - 'dialog_id' => $this->dialog_id, - 'userid' => $userid, - ]); + public function joinProject($userid) + { + if (empty($userid)) { + return false; + } + if (!User::whereUserid($userid)->exists()) { + return false; + } + ProjectUser::updateInsert([ + 'project_id' => $this->id, + 'userid' => $userid, + ]); + return true; + } + + /** + * 同步项目成员至聊天室 + */ + public function syncDialogUser() + { + if (empty($this->dialog_id)) { + return; + } + AbstractModel::transaction(function() { + $userids = $this->relationUserids(); + foreach ($userids as $userid) { + WebSocketDialogUser::updateInsert([ + 'dialog_id' => $this->dialog_id, + 'userid' => $userid, + ]); + } + WebSocketDialogUser::whereDialogId($this->dialog_id)->whereNotIn('userid', $userids)->delete(); }); - return Base::isSuccess($result); + } + + /** + * 获取相关所有人员(项目负责人、项目成员) + * @return array + */ + public function relationUserids() + { + return $this->projectUser->pluck('userid')->toArray(); } /** @@ -203,13 +239,15 @@ class Project extends AbstractModel public function deleteProject() { $result = AbstractModel::transaction(function () { - ProjectTask::whereProjectId($this->id)->delete(); - ProjectColumn::whereProjectId($this->id)->delete(); WebSocketDialog::whereId($this->dialog_id)->delete(); + $columns = ProjectColumn::whereProjectId($this->id)->get(); + foreach ($columns as $column) { + $column->deleteColumn(); + } if ($this->delete()) { - return Base::retSuccess('success'); + return Base::retSuccess('删除成功', $this->toArray()); } else { - return Base::retError('error'); + return Base::retError('删除失败', $this->toArray()); } }); return Base::isSuccess($result); diff --git a/app/Models/ProjectColumn.php b/app/Models/ProjectColumn.php index 2d240993..a51c9790 100644 --- a/app/Models/ProjectColumn.php +++ b/app/Models/ProjectColumn.php @@ -54,11 +54,14 @@ class ProjectColumn extends AbstractModel public function deleteColumn() { $result = AbstractModel::transaction(function () { - ProjectTask::whereColumnId($this->id)->delete(); + $tasks = ProjectTask::whereColumnId($this->id)->get(); + foreach ($tasks as $task) { + $task->deleteTask(); + } if ($this->delete()) { - return Base::retSuccess('success'); + return Base::retSuccess('删除成功', $this->toArray()); } else { - return Base::retError('error'); + return Base::retError('删除失败', $this->toArray()); } }); return Base::isSuccess($result); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 4c766f54..9052a323 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -367,6 +367,7 @@ class ProjectTask extends AbstractModel ], [ 'owner' => 1, ]); + $this->syncDialogUser(); } } // 计划时间 @@ -403,6 +404,7 @@ class ProjectTask extends AbstractModel $array[] = $uid; } ProjectTaskUser::whereTaskId($this->id)->where('owner', '!=', 1)->whereNotIn('userid', $array)->delete(); + $this->syncDialogUser(); } // 背景色 if (Arr::exists($data, 'color')) { @@ -436,6 +438,47 @@ class ProjectTask extends AbstractModel }); } + /** + * 同步项目成员至聊天室 + */ + public function syncDialogUser() + { + if ($this->parent_id > 0) { + $task = self::find($this->parent_id); + if ($task) { + $task->syncDialogUser(); + } + return; + } + if (empty($this->dialog_id)) { + return; + } + AbstractModel::transaction(function() { + $userids = $this->relationUserids(); + foreach ($userids as $userid) { + WebSocketDialogUser::updateInsert([ + 'dialog_id' => $this->dialog_id, + 'userid' => $userid, + ]); + } + WebSocketDialogUser::whereDialogId($this->dialog_id)->whereNotIn('userid', $userids)->delete(); + }); + } + + /** + * 获取任务所有人员(负责人、协助人员、子任务负责人) + * @return array + */ + public function relationUserids() + { + $userids = $this->taskUser->pluck('userid')->toArray(); + $items = ProjectTask::with(['taskUser'])->where('parent_id', $this->id)->whereNull('archived_at')->get(); + foreach ($items as $item) { + $userids = array_merge($userids, $item->taskUser->pluck('userid')->toArray()); + } + return array_values(array_filter(array_unique($userids))); + } + /** * 标记已完成、未完成 * @param Carbon|null $complete_at 完成时间 @@ -488,8 +531,14 @@ class ProjectTask extends AbstractModel public function deleteTask() { return AbstractModel::transaction(function () { - $this->delete(); - return Base::retSuccess('删除成功', $this->toArray()); + if ($this->dialog_id) { + WebSocketDialog::whereId($this->dialog_id)->delete(); + } + if ($this->delete()) { + return Base::retSuccess('删除成功', $this->toArray()); + } else { + return Base::retError('删除失败', $this->toArray()); + } }); } } diff --git a/app/Models/ProjectUser.php b/app/Models/ProjectUser.php index fd7d1536..1bc0d966 100644 --- a/app/Models/ProjectUser.php +++ b/app/Models/ProjectUser.php @@ -36,21 +36,4 @@ class ProjectUser extends AbstractModel { return $this->hasOne(Project::class, 'id', 'project_id'); } - - /** - * 退出项目 - * @return bool - */ - public function exitProject() { - $result = AbstractModel::transaction(function () { - WebSocketDialogUser::whereDialogId($this->project->dialog_id)->whereUserid($this->userid)->delete(); - if ($this->delete()) { - return Base::retSuccess('success'); - } else { - return Base::retError('error'); - } - }); - return Base::isSuccess($result); - } - } diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 01abb7ec..aea99089 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -84,7 +84,7 @@ class WebSocketDialog extends AbstractModel $result = AbstractModel::transaction(function () use ($userid, $group_type, $name) { $dialog = self::createInstance([ 'type' => 'group', - 'name' => $name, + 'name' => $name ?: '', 'group_type' => $group_type, ]); $dialog->save(); diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 7803c6e7..1a8d4b1d 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -222,7 +222,7 @@ export default { classNameRoute(path, openMenu) { return { - "active": $A.leftExists(this.curPath, '/manage/' + path), + "active": this.curPath == '/manage/' + path, "open-menu": openMenu === true, }; }, diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index 8502ab71..43fc4b1f 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -253,7 +253,7 @@ -