diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 2b7e9168..27386789 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -50,7 +50,7 @@ class ProjectController extends AbstractController * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 - * @apiSuccessExample {json} dataDemo: + * @apiSuccessExample {json} sampleData: { "data": [ { @@ -64,7 +64,13 @@ class ProjectController extends AbstractController "created_at": "2022-01-02 06:23:15", "updated_at": "2022-01-02 07:12:33", "owner": 1, // 是否项目负责人 - "owner_userid": 1 // 项目负责人ID + "owner_userid": 1, // 项目负责人ID + "task_num": 9, + "task_complete": 0, + "task_percent": 0, + "task_my_num": 8, + "task_my_complete": 0, + "task_my_percent": 0 }, ], "current_page": 1, // 当前页数 @@ -107,8 +113,8 @@ class ProjectController extends AbstractController } // $list = $builder->orderByDesc('projects.id')->paginate(Base::getPaginate(100, 50)); - $list->transform(function (Project $project) { - return array_merge($project->toArray(), $project->getTaskStatistics()); + $list->transform(function (Project $project) use ($user) { + return array_merge($project->toArray(), $project->getTaskStatistics($user->userid)); }); // $data = $list->toArray(); @@ -134,7 +140,7 @@ class ProjectController extends AbstractController * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 - * @apiSuccessExample {json} dataDemo: + * @apiSuccessExample {json} sampleData: { "id": 7, "name": "🏢 产品官网项目", @@ -146,17 +152,23 @@ class ProjectController extends AbstractController "created_at": "2022-01-02 06:23:15", "updated_at": "2022-01-02 07:12:33", "owner": 1, // 是否项目负责人 - "owner_userid": 1 // 项目负责人ID + "owner_userid": 1, // 项目负责人ID + "task_num": 9, + "task_complete": 0, + "task_percent": 0, + "task_my_num": 8, + "task_my_complete": 0, + "task_my_percent": 0 } */ public function one() { - User::auth(); + $user = User::auth(); // $project_id = intval(Request::input('project_id')); // $project = Project::userProject($project_id); - $data = array_merge($project->toArray(), $project->getTaskStatistics()); + $data = array_merge($project->toArray(), $project->getTaskStatistics($user->userid)); // return Base::retSuccess('success', $data); } diff --git a/app/Models/Project.php b/app/Models/Project.php index 098556ac..36c178cd 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -38,8 +38,7 @@ use Request; * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectUser[] $projectUser * @property-read int|null $project_user_count * @method static \Illuminate\Database\Eloquent\Builder|Project allData($userid = null) - * @method static \Illuminate\Database\Eloquent\Builder|Project authData($userid = null) - * @method static \Illuminate\Database\Eloquent\Builder|Project ownerData($userid = null) + * @method static \Illuminate\Database\Eloquent\Builder|Project authData($userid = null, $owner = null) * @method static \Illuminate\Database\Eloquent\Builder|Project newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Project newQuery() * @method static \Illuminate\Database\Query\Builder|Project onlyTrashed() @@ -130,12 +129,13 @@ class Project extends AbstractModel } /** - * 查询自己参与的项目 + * 查询自己参与或负责的项目 * @param self $query * @param null $userid + * @param null $owner * @return self */ - public function scopeAuthData($query, $userid = null) + public function scopeAuthData($query, $userid = null, $owner = null) { $userid = $userid ?: User::userid(); $query @@ -145,41 +145,30 @@ class Project extends AbstractModel ]) ->join('project_users', 'projects.id', '=', 'project_users.project_id') ->where('project_users.userid', $userid); - return $query; - } - - /** - * 查询自己负责的项目 - * @param self $query - * @param null $userid - * @return self - */ - public function scopeOwnerData($query, $userid = null) - { - $userid = $userid ?: User::userid(); - $query - ->select([ - 'projects.*', - 'project_users.owner', - ]) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') - ->where('project_users.userid', $userid) - ->where('project_users.owner', 1); + if ($owner !== null) { + $query->where('project_users.owner', $owner); + } return $query; } /** * 获取任务统计 + * @param $userid * @return array */ - public function getTaskStatistics() + public function getTaskStatistics($userid) { $array = []; - $builder = ProjectTask::whereProjectId($this->id)->whereParentId(0)->whereNull('archived_at'); + $builder = ProjectTask::whereProjectId($this->id)->whereNull('archived_at'); $array['task_num'] = $builder->count(); $array['task_complete'] = $builder->whereNotNull('complete_at')->count(); $array['task_percent'] = $array['task_num'] ? intval($array['task_complete'] / $array['task_num'] * 100) : 0; // + $builder = ProjectTask::authData($userid, 1)->where('project_tasks.project_id', $this->id)->whereNull('project_tasks.archived_at'); + $array['task_my_num'] = $builder->count(); + $array['task_my_complete'] = $builder->whereNotNull('project_tasks.complete_at')->count(); + $array['task_my_percent'] = $array['task_my_num'] ? intval($array['task_my_complete'] / $array['task_my_num'] * 100) : 0; + // return $array; } diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index fe3426df..49cf59d1 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -55,8 +55,7 @@ use Request; * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskUser[] $taskUser * @property-read int|null $task_user_count * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask allData($userid = null) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask authData($userid = null) - * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask ownerData($userid = null) + * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask authData($userid = null, $owner = null) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask betweenTime($start, $end) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() @@ -264,65 +263,40 @@ class ProjectTask extends AbstractModel */ public function scopeAllData($query, $userid = null) { - DB::statement("SET SQL_MODE=''"); - $pre = DB::connection()->getTablePrefix(); $userid = $userid ?: User::userid(); $query ->select([ 'project_tasks.*', - DB::raw("MAX({$pre}project_task_users.owner) as owner") + 'project_task_users.owner' ]) ->leftJoin('project_task_users', function ($leftJoin) use ($userid) { $leftJoin ->on('project_task_users.userid', '=', DB::raw($userid)) ->on('project_tasks.id', '=', 'project_task_users.task_id'); - }) - ->groupBy('project_tasks.id'); + }); return $query; } /** - * 查询自己参与的任务 + * 查询自己参与或负责的任务 * @param self $query * @param null $userid + * @param null $owner * @return self */ - public function scopeAuthData($query, $userid = null) + public function scopeAuthData($query, $userid = null, $owner = null) { - DB::statement("SET SQL_MODE=''"); - $pre = DB::connection()->getTablePrefix(); $userid = $userid ?: User::userid(); $query ->select([ 'project_tasks.*', - DB::raw("MAX({$pre}project_task_users.owner) as owner") + 'project_task_users.owner' ]) ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') - ->where('project_task_users.userid', $userid) - ->groupBy('project_tasks.id'); - return $query; - } - - /** - * 查询自己负责的任务 - * @param self $query - * @param null $userid - * @return self - */ - public function scopeOwnerData($query, $userid = null) - { - DB::statement("SET SQL_MODE=''"); - $pre = DB::connection()->getTablePrefix(); - $userid = $userid ?: User::userid(); - $query - ->select([ - 'project_tasks.*', - DB::raw("MAX({$pre}project_task_users.owner) as owner") - ]) - ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_id') - ->where('project_task_users.userid', $userid) - ->where('project_task_users.owner', 1) - ->groupBy('project_tasks.id'); + ->where('project_task_users.userid', $userid); + if ($owner !== null) { + $query->where('project_task_users.owner', $owner); + } return $query; } diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 4135b755..b066f285 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -40,7 +40,7 @@
  • - +
  • @@ -294,7 +294,7 @@ export default { 'dialogMsgPush', ]), - ...mapGetters(['taskData', 'dashboardData']), + ...mapGetters(['taskData', 'dashboardTask']), msgAllUnread() { let num = 0; @@ -307,7 +307,7 @@ export default { }, dashboardTotal() { - return this.dashboardData.today.length + this.dashboardData.overdue.length + return this.dashboardTask.today.length + this.dashboardTask.overdue.length }, currentLanguage() { diff --git a/resources/assets/js/pages/manage/calendar.vue b/resources/assets/js/pages/manage/calendar.vue index 9052f885..a6615ce0 100644 --- a/resources/assets/js/pages/manage/calendar.vue +++ b/resources/assets/js/pages/manage/calendar.vue @@ -76,10 +76,10 @@ export default { computed: { ...mapState(['userId', 'projects', 'tasks']), - ...mapGetters(['ownerTask']), + ...mapGetters(['myTask']), list() { - const datas = $A.cloneJSON(this.ownerTask.filter(({end_at}) => { + const datas = $A.cloneJSON(this.myTask.filter(({end_at}) => { return end_at; })); return datas.map(data => { diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index d9db11b0..6a2c9f73 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -532,7 +532,7 @@ export default { ...mapGetters(['projectData', 'tablePanel']), - ...mapGetters(['ownerTask']), + ...mapGetters(['myTask']), userWaitRemove() { const {userids, useridbak} = this.userData; @@ -572,8 +572,8 @@ export default { }, myList() { - const {projectId, ownerTask, searchText, completeTask, sortField, sortType} = this; - const array = ownerTask.filter((task) => { + const {projectId, myTask, searchText, completeTask, sortField, sortType} = this; + const array = myTask.filter((task) => { if (task.project_id != projectId) { return false; } diff --git a/resources/assets/js/pages/manage/dashboard.vue b/resources/assets/js/pages/manage/dashboard.vue index cbf1f837..e1e3e61f 100644 --- a/resources/assets/js/pages/manage/dashboard.vue +++ b/resources/assets/js/pages/manage/dashboard.vue @@ -8,14 +8,14 @@
  • {{$L('今日待完成')}}
    -
    {{dashboardData.today.length}}
    +
    {{dashboardTask.today.length}}
  • {{$L('超期未完成')}}
    -
    {{dashboardData.overdue.length}}
    +
    {{dashboardTask.overdue.length}}
  • @@ -137,7 +137,7 @@ export default { computed: { ...mapState(['userInfo', 'projects', 'tasks', 'taskId']), - ...mapGetters(['dashboardData']), + ...mapGetters(['dashboardTask']), title() { const {dashboard} = this; @@ -156,10 +156,10 @@ export default { let data = []; switch (dashboard) { case 'today': - data = $A.cloneJSON(this.dashboardData.today); + data = $A.cloneJSON(this.dashboardTask.today); break case 'overdue': - data = $A.cloneJSON(this.dashboardData.overdue); + data = $A.cloneJSON(this.dashboardTask.overdue); break } if (completeTask.length > 0) { diff --git a/resources/assets/js/store/getters.js b/resources/assets/js/store/getters.js index 9bfe4d17..b77595f2 100644 --- a/resources/assets/js/store/getters.js +++ b/resources/assets/js/store/getters.js @@ -1,4 +1,9 @@ export default { + /** + * 当前打开的项目 + * @param state + * @returns {unknown[]|{project_user: *[], columns: *[]}} + */ projectData(state) { let projectId = state.projectId; if (projectId == 0) { @@ -35,6 +40,11 @@ export default { }; }, + /** + * 当前打开的任务 + * @param state + * @returns {{}|{readonly id?: *}} + */ taskData(state) { let taskId = state.taskId; if (taskId == 0) { @@ -50,6 +60,11 @@ export default { return {}; }, + /** + * 项目面板设置 + * @param state + * @returns {(function(*): (boolean|*))|*} + */ tablePanel(state) { return function (key) { if (!state.projectId) { @@ -74,7 +89,12 @@ export default { } }, - ownerTask(state) { + /** + * 我所有的任务(未完成) + * @param state + * @returns {unknown[]} + */ + myTask(state) { return state.tasks.filter(({complete_at, parent_id, end_at, owner}) => { if (parent_id > 0) { const index = state.tasks.findIndex(data => { @@ -113,11 +133,17 @@ export default { }) }, - dashboardData(state, getters) { + /** + * 仪表盘任务数据 + * @param state + * @param getters + * @returns {{overdue: *, today: *}} + */ + dashboardTask(state, getters) { const todayStart = $A.Date($A.formatDate("Y-m-d 00:00:00")), todayEnd = $A.Date($A.formatDate("Y-m-d 23:59:59")), todayNow = $A.Date($A.formatDate("Y-m-d H:i:s")); - const todayTasks = getters.ownerTask.filter(task => { + const todayTasks = getters.myTask.filter(task => { if (!task.end_at) { return false; } @@ -125,7 +151,7 @@ export default { end = $A.Date(task.end_at); return (start <= todayStart && todayStart <= end) || (start <= todayEnd && todayEnd <= end) || (start > todayStart && todayEnd > end); }) - const overdueTasks = getters.ownerTask.filter(task => { + const overdueTasks = getters.myTask.filter(task => { if (!task.end_at) { return false; }