no message

This commit is contained in:
kuaifan 2022-01-04 23:42:29 +08:00
parent 186290e355
commit cc1c425ecf
8 changed files with 89 additions and 88 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -40,7 +40,7 @@
<li @click="toggleRoute('dashboard')" :class="classNameRoute('dashboard')">
<i class="taskfont">&#xe6fb;</i>
<div class="menu-title">{{$L('仪表盘')}}</div>
<Badge class="menu-badge" :type="dashboardData.overdue.length > 0 ? 'error' : 'primary'" :count="dashboardTotal"></Badge>
<Badge class="menu-badge" :type="dashboardTask.overdue.length > 0 ? 'error' : 'primary'" :count="dashboardTotal"></Badge>
</li>
<li @click="toggleRoute('calendar')" :class="classNameRoute('calendar')">
<i class="taskfont">&#xe6f5;</i>
@ -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() {

View File

@ -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 => {

View File

@ -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;
}

View File

@ -8,14 +8,14 @@
<li @click="dashboard='today'">
<div class="block-title">{{$L('今日待完成')}}</div>
<div class="block-data">
<div class="block-num">{{dashboardData.today.length}}</div>
<div class="block-num">{{dashboardTask.today.length}}</div>
<i class="taskfont">&#xe6f4;</i>
</div>
</li>
<li @click="dashboard='overdue'">
<div class="block-title">{{$L('超期未完成')}}</div>
<div class="block-data">
<div class="block-num">{{dashboardData.overdue.length}}</div>
<div class="block-num">{{dashboardTask.overdue.length}}</div>
<i class="taskfont">&#xe603;</i>
</div>
</li>
@ -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) {

View File

@ -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;
}