diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php
index e78c54c6..a54f53c4 100755
--- a/app/Http/Controllers/Api/ProjectController.php
+++ b/app/Http/Controllers/Api/ProjectController.php
@@ -10,6 +10,7 @@ use App\Models\ProjectTask;
use App\Models\ProjectTaskFile;
use App\Models\ProjectUser;
use App\Models\User;
+use App\Models\WebSocketDialog;
use App\Module\Base;
use Carbon\Carbon;
use Illuminate\Support\Arr;
@@ -973,6 +974,64 @@ class ProjectController extends AbstractController
}
}
+ /**
+ * 创建/获取聊天室
+ *
+ * @apiParam {Number} task_id 任务ID
+ */
+ public function task__dialog()
+ {
+ $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('项目不存在或不在成员列表内');
+ }
+ //
+ if ($task->parent_id > 0) {
+ return Base::retError('子任务不支持此功能');
+ }
+ //
+ 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');
+ if ($dialog) {
+ $task->dialog_id = $dialog->id;
+ $task->save();
+ }
+ }
+ if (empty($task->dialog_id)) {
+ return Base::retError('创建聊天失败');
+ }
+ return Base::retSuccess('success', [
+ 'dialog_id' => $task->dialog_id,
+ ]);
+ });
+ }
+
/**
* 归档任务
*
@@ -1003,6 +1062,10 @@ class ProjectController extends AbstractController
return Base::retError('项目不存在或不在成员列表内');
}
//
+ if ($task->parent_id > 0) {
+ return Base::retError('子任务不支持此功能');
+ }
+ //
return $task->archivedTask(Carbon::now());
}
diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php
index 64a308ef..4c766f54 100644
--- a/app/Models/ProjectTask.php
+++ b/app/Models/ProjectTask.php
@@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property int|null $parent_id 父级任务ID
* @property int|null $project_id 项目ID
* @property int|null $column_id 列表ID
+ * @property int|null $dialog_id 聊天会话ID
* @property string|null $name 标题
* @property string|null $color 颜色
* @property string|null $desc 描述
@@ -31,7 +32,6 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property \Illuminate\Support\Carbon|null $updated_at
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property-read \App\Models\ProjectTaskContent|null $content
- * @property-read int $dialog_id
* @property-read int $file_num
* @property-read int $msg_num
* @property-read bool $overdue
@@ -57,6 +57,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDesc($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereDialogId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereEndAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereName($value)
@@ -85,7 +86,6 @@ class ProjectTask extends AbstractModel
'percent',
'today',
'overdue',
- 'dialog_id',
];
/**
@@ -107,7 +107,7 @@ class ProjectTask extends AbstractModel
public function getMsgNumAttribute()
{
if (!isset($this->attributes['msg_num'])) {
- $this->attributes['msg_num'] = WebSocketDialogMsg::whereDialogId($this->dialog_id)->whereExtraInt($this->id)->count();
+ $this->attributes['msg_num'] = $this->dialog_id ? WebSocketDialogMsg::whereDialogId($this->dialog_id)->count() : 0;
}
return $this->attributes['msg_num'];
}
@@ -197,18 +197,6 @@ class ProjectTask extends AbstractModel
return false;
}
- /**
- * 对话ID
- * @return int
- */
- public function getDialogIdAttribute()
- {
- if (!isset($this->attributes['dialog_id'])) {
- $this->attributes['dialog_id'] = intval(Project::whereId($this->project_id)->value('dialog_id'));
- }
- return $this->attributes['dialog_id'];
- }
-
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php
index 67689fb7..72cd19ca 100644
--- a/app/Models/WebSocketDialog.php
+++ b/app/Models/WebSocketDialog.php
@@ -61,6 +61,8 @@ class WebSocketDialog extends AbstractModel
case "group":
if ($dialog->group_type === 'project') {
$dialog->name = Project::whereDialogId($dialog->id)->value('name');
+ } elseif ($dialog->group_type === 'task') {
+ $dialog->name = ProjectTask::whereDialogId($dialog->id)->value('name');
}
break;
}
diff --git a/resources/assets/js/components/UserAvatar.vue b/resources/assets/js/components/UserAvatar.vue
index b25bcc95..2bdddce0 100755
--- a/resources/assets/js/components/UserAvatar.vue
+++ b/resources/assets/js/components/UserAvatar.vue
@@ -136,7 +136,7 @@
if (!this.userid) {
return;
}
- this.$store.dispatch('userBasic', {
+ this.$store.dispatch("getUserBasic", {
userid: this.userid,
success: (user) => {
this.user = user;
diff --git a/resources/assets/js/components/UserInput.vue b/resources/assets/js/components/UserInput.vue
index 53d8b32d..42a372cd 100755
--- a/resources/assets/js/components/UserInput.vue
+++ b/resources/assets/js/components/UserInput.vue
@@ -131,7 +131,7 @@
userids.push(value);
});
//
- this.$store.dispatch('userBasic', {
+ this.$store.dispatch("getUserBasic", {
userid: userids,
complete: () => {
this.initialized = true;
diff --git a/resources/assets/js/pages/login.vue b/resources/assets/js/pages/login.vue
index b53d586d..1888524e 100644
--- a/resources/assets/js/pages/login.vue
+++ b/resources/assets/js/pages/login.vue
@@ -80,7 +80,7 @@ export default {
},
}).then(({data}) => {
this.loadIng--;
- this.$store.dispatch('saveUserInfo', data);
+ this.$store.dispatch("saveUserInfo", data);
this.goNext();
}).catch(({data, msg}) => {
this.loadIng--;
diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue
index a15d8d0d..7803c6e7 100644
--- a/resources/assets/js/pages/manage.vue
+++ b/resources/assets/js/pages/manage.vue
@@ -161,7 +161,7 @@ export default {
},
mounted() {
- this.$store.dispatch('userInfo');
+ this.$store.dispatch("getUserInfo");
},
deactivated() {
@@ -274,16 +274,16 @@ export default {
url: 'project/add',
data: this.addData,
}).then(({data, msg}) => {
- this.loadIng--;
$A.messageSuccess(msg);
+ this.loadIng--;
this.addShow = false;
this.$refs.addProject.resetFields();
this.$set(this.addData, 'template', 0);
- this.$store.dispatch('saveProject', data);
+ this.$store.dispatch("saveProject", data);
this.toggleRoute('project/' + data.id)
}).catch(({msg}) => {
- this.loadIng--;
$A.modalError(msg);
+ this.loadIng--;
});
}
});
diff --git a/resources/assets/js/pages/manage/components/DialogView.vue b/resources/assets/js/pages/manage/components/DialogView.vue
index b922f871..be168ecf 100644
--- a/resources/assets/js/pages/manage/components/DialogView.vue
+++ b/resources/assets/js/pages/manage/components/DialogView.vue
@@ -96,7 +96,7 @@ export default {
methods: {
msgRead() {
- this.$store.dispatch('dialogMsgRead', this.msgData);
+ this.$store.dispatch("dialogMsgRead", this.msgData);
},
popperShow() {
diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue
index 41e89e79..60d2c441 100644
--- a/resources/assets/js/pages/manage/components/DialogWrapper.vue
+++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue
@@ -124,13 +124,13 @@ export default {
text: this.msgText,
},
}).then(({data}) => {
- this.$store.dispatch('dialogMsgSplice', {id: tempId, data});
+ this.$store.dispatch("dialogMsgSplice", {id: tempId, data});
}).catch(({msg}) => {
$A.modalWarning({
title: '发送失败',
content: msg
});
- this.$store.dispatch('dialogMsgSplice', {id: tempId});
+ this.$store.dispatch("dialogMsgSplice", {id: tempId});
});
//
this.msgText = '';
@@ -197,11 +197,11 @@ export default {
break;
case 'error':
- this.$store.dispatch('dialogMsgSplice', {id: file.tempId});
+ this.$store.dispatch("dialogMsgSplice", {id: file.tempId});
break;
case 'success':
- this.$store.dispatch('dialogMsgSplice', {id: file.tempId, data: file.data});
+ this.$store.dispatch("dialogMsgSplice", {id: file.tempId, data: file.data});
break;
}
},
diff --git a/resources/assets/js/pages/manage/components/ProjectDialog.vue b/resources/assets/js/pages/manage/components/ProjectDialog.vue
index f66cce1c..4cfce4b5 100644
--- a/resources/assets/js/pages/manage/components/ProjectDialog.vue
+++ b/resources/assets/js/pages/manage/components/ProjectDialog.vue
@@ -54,7 +54,7 @@ export default {
methods: {
getMsg() {
if (this.projectChatShow && this.projectDetail.dialog_id) {
- this.$store.dispatch('dialogMsgList', this.projectDetail.dialog_id);
+ this.$store.dispatch("getDialogMsgList", this.projectDetail.dialog_id);
}
}
}
diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue
index a98eabb4..8502ab71 100644
--- a/resources/assets/js/pages/manage/components/ProjectList.vue
+++ b/resources/assets/js/pages/manage/components/ProjectList.vue
@@ -576,18 +576,19 @@ export default {
only_column: only_column === true ? 1 : 0
},
}).then(({msg}) => {
- this.sortDisabled = false;
$A.messageSuccess(msg);
- }).catch(({msg}) => {
this.sortDisabled = false;
- this.$store.dispatch('projectDetail', this.projectDetail.id);
+ }).catch(({msg}) => {
$A.modalError(msg);
+ this.sortDisabled = false;
+ this.$store.dispatch("getProjectDetail", this.projectDetail.id);
});
},
onAddTask() {
this.taskLoad++;
this.$store.dispatch("taskAdd", this.addData).then(({msg}) => {
+ $A.messageSuccess(msg);
this.taskLoad--;
this.addShow = false;
this.addData = {
@@ -599,10 +600,9 @@ export default {
p_name: '',
p_color: '',
};
- $A.messageSuccess(msg);
}).catch(({msg}) => {
- this.taskLoad--;
$A.modalError(msg);
+ this.taskLoad--;
});
},
@@ -651,7 +651,7 @@ export default {
this.addColumnName = '';
this.projectDetail.project_column.push(data)
}).catch(({msg}) => {
- $A.modalError(msg, 301);
+ $A.modalError(msg);
});
},
@@ -726,18 +726,17 @@ export default {
column_id: column.id,
},
}).then(({msg}) => {
+ $A.messageSuccess(msg);
this.$set(column, 'loading', false);
this.$Modal.remove();
- $A.messageSuccess(msg);
let index = this.projectDetail.project_column.findIndex(({id}) => id === column.id);
if (index > -1) {
this.projectDetail.project_column.splice(index, 1);
}
- this.$store.dispatch('projectDetail', this.projectDetail.id);
}).catch(({msg}) => {
+ $A.modalError(msg, 301);
this.$set(column, 'loading', false);
this.$Modal.remove();
- $A.modalError(msg, 301);
});
}
});
@@ -809,11 +808,11 @@ export default {
task_id: task.id,
type: type,
}).then(({msg}) => {
- this.$Modal.remove();
$A.messageSuccess(msg);
- }).catch(({msg}) => {
this.$Modal.remove();
+ }).catch(({msg}) => {
$A.modalError(msg, 301);
+ this.$Modal.remove();
});
},
@@ -823,13 +822,13 @@ export default {
url: 'project/edit',
data: this.settingData,
}).then(({data, msg}) => {
- this.settingLoad--;
$A.messageSuccess(msg);
+ this.settingLoad--;
this.settingShow = false;
this.$store.dispatch("saveProject", data)
}).catch(({msg}) => {
- this.settingLoad--;
$A.modalError(msg);
+ this.settingLoad--;
});
},
@@ -842,13 +841,13 @@ export default {
userid: this.userData.userids,
},
}).then(({msg}) => {
- this.userLoad--;
$A.messageSuccess(msg);
- this.$store.dispatch('projectDetail', this.userData.project_id);
- this.userShow = false;
- }).catch(({msg}) => {
this.userLoad--;
+ this.userShow = false;
+ this.$store.dispatch("getProjectDetail", this.userData.project_id);
+ }).catch(({msg}) => {
$A.modalError(msg);
+ this.userLoad--;
});
},
@@ -861,13 +860,13 @@ export default {
owner_userid: this.transferData.owner_userid[0],
},
}).then(({msg}) => {
- this.transferLoad--;
$A.messageSuccess(msg);
- this.$store.dispatch('projectDetail', this.transferData.project_id);
- this.transferShow = false;
- }).catch(({msg}) => {
this.transferLoad--;
+ this.transferShow = false;
+ this.$store.dispatch("getProjectDetail", this.transferData.project_id);
+ }).catch(({msg}) => {
$A.modalError(msg);
+ this.transferLoad--;
});
},
@@ -883,9 +882,9 @@ export default {
project_id: this.projectDetail.id,
},
}).then(({msg}) => {
- this.$Modal.remove();
$A.messageSuccess(msg);
- this.$store.dispatch('removeProject', this.projectDetail.id);
+ this.$Modal.remove();
+ this.$store.dispatch("removeProject", this.projectDetail.id);
const project = this.projectList.find(({id}) => id);
if (project) {
this.goForward({path: '/manage/project/' + project.id}, true);
@@ -893,8 +892,8 @@ export default {
this.goForward({path: '/manage/dashboard'}, true);
}
}).catch(({msg}) => {
- this.$Modal.remove();
$A.modalError(msg, 301);
+ this.$Modal.remove();
});
}
});
@@ -912,9 +911,9 @@ export default {
project_id: this.projectDetail.id,
},
}).then(({msg}) => {
- this.$Modal.remove();
$A.messageSuccess(msg);
- this.$store.dispatch('removeProject', this.projectDetail.id);
+ this.$Modal.remove();
+ this.$store.dispatch("removeProject", this.projectDetail.id);
const project = this.projectList.find(({id}) => id);
if (project) {
this.goForward({path: '/manage/project/' + project.id}, true);
@@ -922,8 +921,8 @@ export default {
this.goForward({path: '/manage/dashboard'}, true);
}
}).catch(({msg}) => {
- this.$Modal.remove();
$A.modalError(msg, 301);
+ this.$Modal.remove();
});
}
});
@@ -963,14 +962,14 @@ export default {
openTask(task) {
if (task.parent_id > 0) {
- this.$store.dispatch('openTask', task.parent_id)
+ this.$store.dispatch("openTask", task.parent_id)
} else {
- this.$store.dispatch('openTask', task.id)
+ this.$store.dispatch("openTask", task.id)
}
},
toggleBoolean(type) {
- this.$store.dispatch('toggleBoolean', type);
+ this.$store.dispatch("toggleBoolean", type);
},
formatTime(date) {
diff --git a/resources/assets/js/pages/manage/components/TaskAdd.vue b/resources/assets/js/pages/manage/components/TaskAdd.vue
index e94fb0ad..62b26c22 100644
--- a/resources/assets/js/pages/manage/components/TaskAdd.vue
+++ b/resources/assets/js/pages/manage/components/TaskAdd.vue
@@ -160,7 +160,7 @@ export default {
}
},
mounted() {
- this.$store.dispatch('taskPriority').then(() => {
+ this.$store.dispatch('getTaskPriority').then(() => {
if (!this.value.p_name && this.taskPriority.length > 0) {
this.choosePriority(this.taskPriority[0])
}
diff --git a/resources/assets/js/pages/manage/components/TaskAddSimple.vue b/resources/assets/js/pages/manage/components/TaskAddSimple.vue
index 71d5df3b..538cfefc 100644
--- a/resources/assets/js/pages/manage/components/TaskAddSimple.vue
+++ b/resources/assets/js/pages/manage/components/TaskAddSimple.vue
@@ -107,7 +107,7 @@ export default {
this.active = true;
this.$nextTick(() => {
if (this.taskPriority.length === 0) {
- this.$store.dispatch('taskPriority').then(() => {
+ this.$store.dispatch('getTaskPriority').then(() => {
if (!this.addData.p_name && this.taskPriority.length > 0) {
this.choosePriority(this.taskPriority[0])
}
@@ -152,6 +152,7 @@ export default {
}
this.loadIng++;
this.$store.dispatch("taskAdd", this.getData()).then(({msg}) => {
+ $A.messageSuccess(msg);
this.loadIng--;
this.active = false;
this.addData = {
@@ -163,10 +164,9 @@ export default {
p_name: '',
p_color: '',
}
- $A.messageSuccess(msg);
}).catch(({msg}) => {
- this.loadIng--;
$A.modalError(msg);
+ this.loadIng--;
});
},
diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue
index b63e34ff..2d17c229 100644
--- a/resources/assets/js/pages/manage/components/TaskDetail.vue
+++ b/resources/assets/js/pages/manage/components/TaskDetail.vue
@@ -319,28 +319,40 @@