diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index e2d554d1..1c52be66 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -483,7 +483,7 @@ class ProjectController extends AbstractController $data = []; - // 今日待任务 + // 今日待完成 $between = [ Carbon::today()->startOfDay(), Carbon::today()->endOfDay() @@ -501,8 +501,9 @@ class ProjectController extends AbstractController /** * 任务列表 * - * @apiParam {String} name 任务名称(包含) - * @apiParam {Array} time 时间范围,格式:数组,如:[2020-12-12,2020-20-12] + * @apiParam {String} name 任务名称(包含) + * @apiParam {Array} time 时间范围,如:['2020-12-12', '2020-12-30'] + * @apiParam {String} time_before 指定时间之前,如:2020-12-30 00:00:00(填写此项时time参数无效) */ public function task__lists() { @@ -512,18 +513,21 @@ class ProjectController extends AbstractController // $name = Request::input('name'); $time = Request::input('time'); + $time_before = Request::input('time_before'); if ($name) { $builder->where(function($query) use ($name) { $query->where('project_tasks.name', 'like', '%,' . $name . ',%'); }); } - if (is_array($time)) { + if (Base::isDateOrTime($time_before)) { + $builder->whereNotNull('project_tasks.end_at')->where('project_tasks.end_at', '<', Carbon::parse($time_before)); + } elseif (is_array($time)) { if (Base::isDateOrTime($time[0]) && Base::isDateOrTime($time[1])) { $between = [ Carbon::parse($time[0])->startOfDay(), Carbon::parse($time[1])->endOfDay() ]; - $builder->where(function($query) use ($between) { + $builder->where(function ($query) use ($between) { $query->whereBetween('project_tasks.start_at', $between)->orWhereBetween('project_tasks.end_at', $between); }); } diff --git a/app/Models/Project.php b/app/Models/Project.php index 3f09310a..43487334 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -191,9 +191,9 @@ class Project extends AbstractModel /** * 查询自己的项目 - * @param $query + * @param self $query * @param null $user - * @return mixed + * @return self */ public function scopeAuthData($query, $user = null) { diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 6dafd4d0..d4ddfe43 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -7,6 +7,7 @@ use App\Module\Base; use App\Tasks\PushTask; use Arr; use Carbon\Carbon; +use DB; use Hhxsv5\LaravelS\Swoole\Task\Task; use Illuminate\Database\Eloquent\SoftDeletes; use Request; @@ -249,14 +250,21 @@ class ProjectTask extends AbstractModel /** * 查询自己的任务 - * @param $query + * @param self $query * @param null $user - * @return mixed + * @return self */ public function scopeAuthData($query, $user = null) { + $pre = DB::getTablePrefix(); $user = $user ?: User::auth(); $query->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_pid') + ->whereExists(function ($der) use ($pre) { + $der->select(DB::raw(1)) + ->from('project_task_users as B') + ->whereColumn('project_task_users.task_pid', '=', 'B.task_pid') + ->havingRaw("max({$pre}B.id) = {$pre}project_task_users.id"); + }) ->whereNull('project_tasks.archived_at') ->where('project_tasks.parent_id', 0) ->where('project_task_users.userid', $user->userid); diff --git a/resources/assets/js/pages/manage/dashboard.vue b/resources/assets/js/pages/manage/dashboard.vue index 23f50e36..9c3e4766 100644 --- a/resources/assets/js/pages/manage/dashboard.vue +++ b/resources/assets/js/pages/manage/dashboard.vue @@ -5,17 +5,17 @@
{{$L('欢迎您,' + userInfo.nickname)}}
{{$L('以下是你当前的任务统计数据')}}
-
{{$L('今日任务')}}
+
{{getTitle}}
@@ -64,13 +44,87 @@ import {mapState} from "vuex"; export default { data() { - return {} - }, - mounted() { + return { + loadIng: 0, + active: 'today', + } }, + + activated() { + this.$store.dispatch("getTaskStatistics"); + this.getDashboardTask(); + }, + computed: { - ...mapState(['userInfo', 'projectList']), + ...mapState(['userInfo', 'projectList', 'projectTaskStatistics', 'calendarTask']), + + getTitle() { + const {active} = this; + switch (active) { + case 'today': + return this.$L('今日任务'); + case 'overdue': + return this.$L('超期任务'); + default: + return ''; + } + }, + + taskList() { + const {calendarTask, active} = this; + const todayStart = new Date($A.formatDate("Y-m-d 00:00:00")), + todayEnd = new Date($A.formatDate("Y-m-d 23:59:59")); + return calendarTask.filter((item) => { + const start = new Date(item.start); + const end = new Date(item.end); + switch (active) { + case 'today': + return (start >= todayStart && start <= todayEnd) || (end >= todayStart && end <= todayEnd); + case 'overdue': + return end < todayStart; + default: + return false; + } + }); + } + }, + + watch: { + active() { + this.getDashboardTask(); + } + }, + + methods: { + getDashboardTask() { + let payload = {}; + switch (this.active) { + case 'today': + payload = { + time: [ + $A.formatDate("Y-m-d 00:00:00"), + $A.formatDate("Y-m-d 23:59:59") + ], + } + break; + case 'overdue': + payload = { + time_before: $A.formatDate("Y-m-d 00:00:00") + } + break; + default: + return; + } + // + this.loadIng++; + this.$store.dispatch("getTaskList", payload).then(({data}) => { + this.loadIng--; + this.$store.dispatch("saveCalendarTask", data.data) + }).catch(() => { + this.loadIng--; + }) + } } } diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 92957416..79794997 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -466,6 +466,19 @@ export default { } }, + /** + * 获取任务统计 + * @param state + * @param dispatch + */ + getTaskStatistics({state, dispatch}) { + dispatch("call", { + url: 'project/task/statistics', + }).then(({data}) => { + state.projectTaskStatistics = data; + }); + }, + /** * 获取任务列表 * @param state diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js index baf516cc..7dbff07e 100644 --- a/resources/assets/js/store/state.js +++ b/resources/assets/js/store/state.js @@ -272,6 +272,7 @@ state.projectLoad = 0; state.projectList = state.cacheProjectList; state.projectDetail = {id: 0, project_column: [], project_user: []}; state.projectOpenTask = {_show: false, id: 0, task_user: [], task_tag: []}; +state.projectTaskStatistics = {}; state.projectTaskContent = {}; state.projectTaskFiles = {}; state.projectSubTask = {}; diff --git a/resources/assets/sass/pages/page-dashboard.scss b/resources/assets/sass/pages/page-dashboard.scss index b853d8a6..312d6214 100644 --- a/resources/assets/sass/pages/page-dashboard.scss +++ b/resources/assets/sass/pages/page-dashboard.scss @@ -8,7 +8,7 @@ .dashboard-wrapper { width: 664px; max-width: 80%; - max-height: 90%; + max-height: 80%; display: flex; flex-direction: column; .dashboard-hello {