diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php
index e0d1b181..cee42db7 100755
--- a/app/Http/Controllers/Api/ProjectController.php
+++ b/app/Http/Controllers/Api/ProjectController.php
@@ -16,6 +16,7 @@ use App\Module\Base;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Request;
+use function Swoole\Coroutine\Http\get;
/**
* @apiDefine project
@@ -440,87 +441,6 @@ class ProjectController extends AbstractController
return Base::retError('删除失败');
}
- /**
- * 消息列表
- *
- * @apiParam {Number} project_id 项目ID
- * @apiParam {Number} [task_id] 任务ID
- *
- * @apiParam {Number} [page] 当前页,默认:1
- * @apiParam {Number} [pagesize] 每页显示数量,默认:30,最大:100
- */
- public function msg__lists()
- {
- $user = User::authE();
- if (Base::isError($user)) {
- return $user;
- } else {
- $user = User::IDE($user['data']);
- }
- //
- $project_id = intval(Request::input('project_id'));
- $task_id = intval(Request::input('task_id'));
- //
- $project = Project::select($this->projectSelect)
- ->join('project_users', 'projects.id', '=', 'project_users.project_id')
- ->where('projects.id', $project_id)
- ->where('project_users.userid', $user->userid)
- ->first();
- if (empty($project)) {
- return Base::retError('项目不存在或不在成员列表内');
- }
- //
- $builder = WebSocketDialogMsg::whereDialogId($project->dialog_id);
- if ($task_id > 0) {
- $builder->whereExtraInt($task_id);
- }
- $list = $builder->orderByDesc('id')->paginate(Base::getPaginate(100, 30));
- //
- return Base::retSuccess('success', $list);
- }
-
- /**
- * 发送消息
- *
- * @apiParam {Number} project_id 项目ID
- * @apiParam {Number} [task_id] 任务ID
- * @apiParam {String} text 消息内容
- */
- public function msg__sendtext()
- {
- $user = User::authE();
- if (Base::isError($user)) {
- return $user;
- } else {
- $user = User::IDE($user['data']);
- }
- //
- $project_id = intval(Request::input('project_id'));
- $task_id = intval(Request::input('task_id'));
- $text = trim(Request::input('text'));
- //
- if (mb_strlen($text) < 1) {
- return Base::retError('消息内容不能为空');
- } elseif (mb_strlen($text) > 20000) {
- return Base::retError('消息内容最大不能超过20000字');
- }
- //
- $project = Project::select($this->projectSelect)
- ->join('project_users', 'projects.id', '=', 'project_users.project_id')
- ->where('projects.id', $project_id)
- ->where('project_users.userid', $user->userid)
- ->first();
- if (empty($project)) {
- return Base::retError('项目不存在或不在成员列表内');
- }
- //
- $msg = [
- 'text' => $text
- ];
- //
- return WebSocketDialogMsg::addGroupMsg($project->dialog_id, 'text', $msg, $user->userid, $task_id);
- }
-
/**
* 添加任务列表
*
@@ -638,6 +558,73 @@ class ProjectController extends AbstractController
return Base::retError('删除失败');
}
+ /**
+ * 获取任务
+ *
+ * @apiParam {Number} task_id 任务ID
+ */
+ public function task__one()
+ {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ //
+ $task_id = intval(Request::input('task_id'));
+ // 任务
+ $task = ProjectTask::with(['taskUser', 'taskTag'])->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 Base::retSuccess('success', $task);
+ }
+
+ /**
+ * 获取子任务
+ *
+ * @apiParam {Number} task_id 任务ID
+ */
+ public function task__sublist()
+ {
+ $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('项目不存在或不在成员列表内');
+ }
+ //
+ $data = ProjectTask::with(['taskUser', 'taskTag'])->where('parent_id', $task->id)->get();
+ return Base::retSuccess('success', $data);
+ }
+
/**
* {post} 添加任务
*
diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php
index 8213d0f7..f9ad4a32 100644
--- a/app/Models/ProjectTask.php
+++ b/app/Models/ProjectTask.php
@@ -35,6 +35,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property-read int $msg_num
* @property-read bool $overdue
* @property-read int $percent
+ * @property-read int $sub_complete
* @property-read int $sub_num
* @property-read bool $today
* @property-read \App\Models\Project|null $project
@@ -77,10 +78,11 @@ class ProjectTask extends AbstractModel
'file_num',
'msg_num',
'sub_num',
- 'dialog_id',
+ 'sub_complete',
'percent',
'today',
'overdue',
+ 'dialog_id',
];
/**
@@ -107,31 +109,50 @@ class ProjectTask extends AbstractModel
return $this->attributes['msg_num'];
}
+ /**
+ * 生成子任务数据
+ */
+ private function generateSubTaskData()
+ {
+ if ($this->parent_id > 0) {
+ $this->attributes['sub_num'] = 0;
+ $this->attributes['sub_complete'] = 0;
+ $this->attributes['percent'] = 0;
+ return;
+ }
+ if (!isset($this->attributes['sub_num'])) {
+ $builder = self::whereParentId($this->id);
+ $this->attributes['sub_num'] = $builder->count();
+ $this->attributes['sub_complete'] = $builder->whereNotNull('complete_at')->count();
+ //
+ if ($this->complete_at) {
+ $this->attributes['percent'] = 100;
+ } elseif ($this->attributes['sub_complete'] == 0) {
+ $this->attributes['percent'] = 0;
+ } else {
+ $this->attributes['percent'] = intval($this->attributes['sub_complete'] / $this->attributes['sub_num'] * 100);
+ }
+ }
+ }
+
/**
* 子任务数量
* @return int
*/
public function getSubNumAttribute()
{
- if ($this->parent_id > 0) {
- return 0;
- }
- if (!isset($this->attributes['sub_num'])) {
- $this->attributes['sub_num'] = self::whereParentId($this->id)->count();
- }
+ $this->generateSubTaskData();
return $this->attributes['sub_num'];
}
/**
- * 对话ID
+ * 子任务已完成数量
* @return int
*/
- public function getDialogIdAttribute()
+ public function getSubCompleteAttribute()
{
- if (!isset($this->attributes['dialog_id'])) {
- $this->attributes['dialog_id'] = intval(Project::whereId($this->project_id)->value('dialog_id'));
- }
- return $this->attributes['dialog_id'];
+ $this->generateSubTaskData();
+ return $this->attributes['sub_complete'];
}
/**
@@ -140,22 +161,8 @@ class ProjectTask extends AbstractModel
*/
public function getPercentAttribute()
{
- if ($this->parent_id > 0) {
- return 0;
- }
- $builder = self::whereParentId($this->id);
- if (!isset($this->attributes['sub_num'])) {
- $this->attributes['sub_num'] = $builder->count();
- }
- $subTaskTotal = $this->attributes['sub_num'];
- if ($subTaskTotal == 0) {
- return $this->complete_at ? 100 : 0;
- }
- $subTaskComplete = $builder->whereNotNull('complete_at')->count();
- if ($subTaskComplete == 0) {
- return 0;
- }
- return intval($subTaskComplete / $subTaskTotal * 100);
+ $this->generateSubTaskData();
+ return $this->attributes['percent'];
}
/**
@@ -187,6 +194,18 @@ 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/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue
index 8f0d5fc3..16037cce 100644
--- a/resources/assets/js/pages/manage/components/ProjectList.vue
+++ b/resources/assets/js/pages/manage/components/ProjectList.vue
@@ -43,7 +43,6 @@
{{item.name}}