mirror of
https://github.com/kuaifan/dootask.git
synced 2026-03-17 19:23:26 +00:00
perf: 重写项目和会话接口数据
This commit is contained in:
parent
05b169c172
commit
cb33b9fc51
@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\Api;
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
use App\Models\AbstractModel;
|
use App\Models\AbstractModel;
|
||||||
|
use App\Models\Deleted;
|
||||||
use App\Models\File;
|
use App\Models\File;
|
||||||
use App\Models\FileContent;
|
use App\Models\FileContent;
|
||||||
use App\Models\ProjectTask;
|
use App\Models\ProjectTask;
|
||||||
@ -14,6 +15,7 @@ use App\Models\WebSocketDialogMsgRead;
|
|||||||
use App\Models\WebSocketDialogMsgTodo;
|
use App\Models\WebSocketDialogMsgTodo;
|
||||||
use App\Models\WebSocketDialogUser;
|
use App\Models\WebSocketDialogUser;
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
|
use App\Module\TimeRange;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use DB;
|
use DB;
|
||||||
use Redirect;
|
use Redirect;
|
||||||
@ -34,8 +36,10 @@ class DialogController extends AbstractController
|
|||||||
* @apiGroup dialog
|
* @apiGroup dialog
|
||||||
* @apiName lists
|
* @apiName lists
|
||||||
*
|
*
|
||||||
* @apiParam {String} [updated_at] 只读取在这个时间之后更新的对话
|
* @apiParam {String} [timerange] 时间范围(如:1678248944,1678248944)
|
||||||
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的对话ID,返回数据: deleted_data(此参数仅第1页有效)
|
* - 第一个时间: 读取在这个时间之后更新的数据
|
||||||
|
* - 第二个时间: 读取在这个时间之后删除的数据ID(第1页附加返回数据: deleted_id)
|
||||||
|
*
|
||||||
* @apiParam {Number} [page] 当前页,默认:1
|
* @apiParam {Number} [page] 当前页,默认:1
|
||||||
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
|
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
|
||||||
*
|
*
|
||||||
@ -47,11 +51,13 @@ class DialogController extends AbstractController
|
|||||||
{
|
{
|
||||||
$user = User::auth();
|
$user = User::auth();
|
||||||
//
|
//
|
||||||
|
$timerange = TimeRange::parse(Request::input());
|
||||||
|
//
|
||||||
$builder = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'u.silence', 'u.updated_at as user_at'])
|
$builder = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'u.silence', 'u.updated_at as user_at'])
|
||||||
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
|
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
|
||||||
->where('u.userid', $user->userid);
|
->where('u.userid', $user->userid);
|
||||||
if (Request::input('updated_at') || Request::input('at_after')) {
|
if ($timerange->updated) {
|
||||||
$builder->where('u.updated_at', '>', Carbon::parse(Request::input('updated_at') ?: Request::input('at_after')));
|
$builder->where('u.updated_at', '>', $timerange->updated);
|
||||||
}
|
}
|
||||||
$list = $builder
|
$list = $builder
|
||||||
->orderByDesc('u.top_at')
|
->orderByDesc('u.top_at')
|
||||||
@ -60,18 +66,10 @@ class DialogController extends AbstractController
|
|||||||
$list->transform(function (WebSocketDialog $item) use ($user) {
|
$list->transform(function (WebSocketDialog $item) use ($user) {
|
||||||
return $item->formatData($user->userid);
|
return $item->formatData($user->userid);
|
||||||
});
|
});
|
||||||
$data = $list->toArray();
|
|
||||||
//
|
//
|
||||||
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
|
$data = $list->toArray();
|
||||||
$data['deleted_at'] = date("Y-m-d H:i:s");
|
if ($list->currentPage() === 1) {
|
||||||
$data['deleted_data'] = WebSocketDialog::select(['web_socket_dialogs.id'])
|
$data['deleted_id'] = Deleted::ids('dialog', $user->userid, $timerange->deleted);
|
||||||
->withTrashed()
|
|
||||||
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
|
|
||||||
->where('u.userid', $user->userid)
|
|
||||||
->where('web_socket_dialogs.deleted_at', '>=', Carbon::parse(Request::input('deleted_at')))
|
|
||||||
->orderByDesc('web_socket_dialogs.deleted_at')
|
|
||||||
->take(100)
|
|
||||||
->pluck('id');
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
return Base::retSuccess('success', $data);
|
return Base::retSuccess('success', $data);
|
||||||
|
|||||||
@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api;
|
|||||||
|
|
||||||
use App\Exceptions\ApiException;
|
use App\Exceptions\ApiException;
|
||||||
use App\Models\AbstractModel;
|
use App\Models\AbstractModel;
|
||||||
|
use App\Models\Deleted;
|
||||||
use App\Models\File;
|
use App\Models\File;
|
||||||
use App\Models\FileContent;
|
use App\Models\FileContent;
|
||||||
use App\Models\Project;
|
use App\Models\Project;
|
||||||
@ -21,6 +22,7 @@ use App\Models\WebSocketDialog;
|
|||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
use App\Module\BillExport;
|
use App\Module\BillExport;
|
||||||
use App\Module\BillMultipleExport;
|
use App\Module\BillMultipleExport;
|
||||||
|
use App\Module\TimeRange;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Madzipper;
|
use Madzipper;
|
||||||
@ -58,7 +60,9 @@ class ProjectController extends AbstractController
|
|||||||
* - yes:取列表
|
* - yes:取列表
|
||||||
* @apiParam {Object} [keys] 搜索条件
|
* @apiParam {Object} [keys] 搜索条件
|
||||||
* - keys.name: 项目名称
|
* - keys.name: 项目名称
|
||||||
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的项目ID,返回数据: deleted_data(此参数仅第1页有效)
|
* @apiParam {String} [timerange] 时间范围(如:1678248944,1678248944)
|
||||||
|
* - 第一个时间: 读取在这个时间之后更新的数据
|
||||||
|
* - 第二个时间: 读取在这个时间之后删除的数据ID(第1页附加返回数据: deleted_id)
|
||||||
*
|
*
|
||||||
* @apiParam {Number} [page] 当前页,默认:1
|
* @apiParam {Number} [page] 当前页,默认:1
|
||||||
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
|
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
|
||||||
@ -137,6 +141,11 @@ class ProjectController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
$timerange = TimeRange::parse(Request::input('timerange'));
|
||||||
|
if ($timerange->updated) {
|
||||||
|
$builder->where('projects.updated_at', '>', $timerange->updated);
|
||||||
|
}
|
||||||
|
//
|
||||||
$list = $builder->orderByDesc('projects.id')->paginate(Base::getPaginate(100, 50));
|
$list = $builder->orderByDesc('projects.id')->paginate(Base::getPaginate(100, 50));
|
||||||
$list->transform(function (Project $project) use ($user) {
|
$list->transform(function (Project $project) use ($user) {
|
||||||
return array_merge($project->toArray(), $project->getTaskStatistics($user->userid));
|
return array_merge($project->toArray(), $project->getTaskStatistics($user->userid));
|
||||||
@ -144,15 +153,8 @@ class ProjectController extends AbstractController
|
|||||||
//
|
//
|
||||||
$data = $list->toArray();
|
$data = $list->toArray();
|
||||||
$data['total_all'] = $totalAll ?? $data['total'];
|
$data['total_all'] = $totalAll ?? $data['total'];
|
||||||
//
|
if ($list->currentPage() === 1) {
|
||||||
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
|
$data['deleted_id'] = Deleted::ids('project', $user->userid, $timerange->deleted);
|
||||||
$data['deleted_at'] = date("Y-m-d H:i:s");
|
|
||||||
$data['deleted_data'] = Project::authData()
|
|
||||||
->withTrashed()
|
|
||||||
->where('projects.deleted_at', '>=', Carbon::parse(Request::input('deleted_at')))
|
|
||||||
->orderByDesc('projects.deleted_at')
|
|
||||||
->take(100)
|
|
||||||
->pluck('id');
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
return Base::retSuccess('success', $data);
|
return Base::retSuccess('success', $data);
|
||||||
@ -842,13 +844,17 @@ class ProjectController extends AbstractController
|
|||||||
*
|
*
|
||||||
* @apiParam {Object} [keys] 搜索条件
|
* @apiParam {Object} [keys] 搜索条件
|
||||||
* - keys.name: 任务名称
|
* - keys.name: 任务名称
|
||||||
|
*
|
||||||
* @apiParam {Number} [project_id] 项目ID
|
* @apiParam {Number} [project_id] 项目ID
|
||||||
* @apiParam {Number} [parent_id] 主任务ID(project_id && parent_id ≤ 0 时 仅查询自己参与的任务)
|
* @apiParam {Number} [parent_id] 主任务ID(project_id && parent_id ≤ 0 时 仅查询自己参与的任务)
|
||||||
* - 大于0:指定主任务下的子任务
|
* - 大于0:指定主任务下的子任务
|
||||||
* - 等于-1:表示仅主任务
|
* - 等于-1:表示仅主任务
|
||||||
* @apiParam {String} [name] 任务描述关键词
|
*
|
||||||
* @apiParam {Array} [time] 指定时间范围,如:['2020-12-12', '2020-12-30']
|
* @apiParam {Array} [time] 指定时间范围,如:['2020-12-12', '2020-12-30']
|
||||||
* @apiParam {String} [time_before] 指定时间之前,如:2020-12-30 00:00:00(填写此项时 time 参数无效)
|
* @apiParam {String} [timerange] 时间范围(如:1678248944,1678248944)
|
||||||
|
* - 第一个时间: 读取在这个时间之后更新的数据
|
||||||
|
* - 第二个时间: 读取在这个时间之后删除的数据ID(第1页附加返回数据: deleted_id)
|
||||||
|
*
|
||||||
* @apiParam {String} [complete] 完成状态
|
* @apiParam {String} [complete] 完成状态
|
||||||
* - all:所有(默认)
|
* - all:所有(默认)
|
||||||
* - yes:已完成
|
* - yes:已完成
|
||||||
@ -861,7 +867,8 @@ class ProjectController extends AbstractController
|
|||||||
* - all:所有
|
* - all:所有
|
||||||
* - yes:已删除
|
* - yes:已删除
|
||||||
* - no:未删除(默认)
|
* - no:未删除(默认)
|
||||||
* @apiParam {Object} sorts 排序方式
|
*
|
||||||
|
* @apiParam {Object} [sorts] 排序方式
|
||||||
* - sorts.complete_at 完成时间:asc|desc
|
* - sorts.complete_at 完成时间:asc|desc
|
||||||
* - sorts.archived_at 归档时间:asc|desc
|
* - sorts.archived_at 归档时间:asc|desc
|
||||||
* - sorts.end_at 到期时间:asc|desc
|
* - sorts.end_at 到期时间:asc|desc
|
||||||
@ -872,7 +879,7 @@ class ProjectController extends AbstractController
|
|||||||
*/
|
*/
|
||||||
public function task__lists()
|
public function task__lists()
|
||||||
{
|
{
|
||||||
User::auth();
|
$user = User::auth();
|
||||||
//
|
//
|
||||||
$builder = ProjectTask::with(['taskUser', 'taskTag']);
|
$builder = ProjectTask::with(['taskUser', 'taskTag']);
|
||||||
//
|
//
|
||||||
@ -880,7 +887,7 @@ class ProjectController extends AbstractController
|
|||||||
$project_id = intval(Request::input('project_id'));
|
$project_id = intval(Request::input('project_id'));
|
||||||
$name = Request::input('name');
|
$name = Request::input('name');
|
||||||
$time = Request::input('time');
|
$time = Request::input('time');
|
||||||
$time_before = Request::input('time_before');
|
$timerange = TimeRange::parse(Request::input('timerange'));
|
||||||
$complete = Request::input('complete', 'all');
|
$complete = Request::input('complete', 'all');
|
||||||
$archived = Request::input('archived', 'no');
|
$archived = Request::input('archived', 'no');
|
||||||
$deleted = Request::input('deleted', 'no');
|
$deleted = Request::input('deleted', 'no');
|
||||||
@ -920,13 +927,14 @@ class ProjectController extends AbstractController
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if (Base::isDateOrTime($time_before)) {
|
if (is_array($time)) {
|
||||||
$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])) {
|
if (Base::isDateOrTime($time[0]) && Base::isDateOrTime($time[1])) {
|
||||||
$builder->betweenTime(Carbon::parse($time[0])->startOfDay(), Carbon::parse($time[1])->endOfDay());
|
$builder->betweenTime(Carbon::parse($time[0])->startOfDay(), Carbon::parse($time[1])->endOfDay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($timerange->updated) {
|
||||||
|
$builder->where('project_tasks.updated_at', '>', $timerange->updated);
|
||||||
|
}
|
||||||
//
|
//
|
||||||
if ($complete === 'yes') {
|
if ($complete === 'yes') {
|
||||||
$builder->whereNotNull('project_tasks.complete_at');
|
$builder->whereNotNull('project_tasks.complete_at');
|
||||||
@ -954,7 +962,12 @@ class ProjectController extends AbstractController
|
|||||||
//
|
//
|
||||||
$list = $builder->orderByDesc('project_tasks.id')->paginate(Base::getPaginate(200, 100));
|
$list = $builder->orderByDesc('project_tasks.id')->paginate(Base::getPaginate(200, 100));
|
||||||
//
|
//
|
||||||
return Base::retSuccess('success', $list);
|
$data = $list->toArray();
|
||||||
|
if ($list->currentPage() === 1) {
|
||||||
|
$data['deleted_id'] = Deleted::ids('projectTask', $user->userid, $timerange->deleted);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return Base::retSuccess('success', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* App\Models\Deleted
|
* App\Models\Deleted
|
||||||
*
|
*
|
||||||
@ -23,6 +26,24 @@ class Deleted extends AbstractModel
|
|||||||
{
|
{
|
||||||
const UPDATED_AT = null;
|
const UPDATED_AT = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取删除的ID
|
||||||
|
* @param $type
|
||||||
|
* @param $userid
|
||||||
|
* @param $time
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function ids($type, $userid, $time): array
|
||||||
|
{
|
||||||
|
if (empty($time)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return self::where([
|
||||||
|
'type' => $type,
|
||||||
|
'userid' => $userid
|
||||||
|
])->where('created_at', '>=', Carbon::parse($time))->pluck('did')->toArray();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 忘记(恢复或添加数据时删除记录)
|
* 忘记(恢复或添加数据时删除记录)
|
||||||
* @param $type
|
* @param $type
|
||||||
|
|||||||
41
app/Module/TimeRange.php
Normal file
41
app/Module/TimeRange.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Module;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
|
||||||
|
class TimeRange
|
||||||
|
{
|
||||||
|
public ?Carbon $updated;
|
||||||
|
public ?Carbon $deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $data
|
||||||
|
*/
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
if (is_array($data)) {
|
||||||
|
$range = Base::explodeInt($data['timerange']);
|
||||||
|
if ($data['updated_at'] || $data['at_after']) {
|
||||||
|
$range[0] = $data['updated_at'] ?: $data['at_after'];
|
||||||
|
}
|
||||||
|
if ($data['deleted_at']) {
|
||||||
|
$range[1] = $data['deleted_at'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$range = Base::explodeInt($data);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
$this->updated = $range[0] ? Carbon::parse($range[0]) : null;
|
||||||
|
$this->deleted = $range[1] ? Carbon::parse($range[1]) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $data
|
||||||
|
* @return TimeRange
|
||||||
|
*/
|
||||||
|
public static function parse($data): TimeRange
|
||||||
|
{
|
||||||
|
return new self($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
15
resources/assets/js/functions/common.js
vendored
15
resources/assets/js/functions/common.js
vendored
@ -1232,6 +1232,21 @@ const localforage = require("localforage");
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 1);
|
}, 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序JSON对象
|
||||||
|
* @param obj
|
||||||
|
* @param ignore
|
||||||
|
* @returns {{}}
|
||||||
|
*/
|
||||||
|
sortObject(obj, ignore = []) {
|
||||||
|
return Object.keys(obj).sort().reduce(function (result, key) {
|
||||||
|
if (!ignore.includes(key)) {
|
||||||
|
result[key] = obj[key];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}, {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -248,33 +248,12 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
const timeStart = $A.Date($A.formatDate(time[0] + " 00:00:00")),
|
|
||||||
timeEnd = $A.Date($A.formatDate(time[1] + " 23:59:59")),
|
|
||||||
now = $A.Time();
|
|
||||||
const find = (item, n) => {
|
|
||||||
if (n === true && item._time < now) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
const start = $A.Date(item.start_at),
|
|
||||||
end = $A.Date(item.end_at);
|
|
||||||
return (start <= timeStart && timeStart <= end) || (start <= timeEnd && timeEnd <= end) || (start > timeStart && timeEnd > end);
|
|
||||||
}
|
|
||||||
const currentIds = this.list.filter(item => find(item)).map(({id}) => id);
|
|
||||||
const call = () => {
|
|
||||||
const newIds = this.list.filter(item => find(item, true)).map(({id}) => id);
|
|
||||||
this.$store.dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
|
|
||||||
}
|
|
||||||
//
|
|
||||||
this.loadIng++;
|
this.loadIng++;
|
||||||
this.$store.dispatch("getTasks", {
|
this.$store.dispatch("getTasks", {
|
||||||
time,
|
time,
|
||||||
complete: "no"
|
complete: "no"
|
||||||
}).then(() => {
|
}).finally(_ => {
|
||||||
this.loadIng--;
|
this.loadIng--;
|
||||||
call()
|
|
||||||
}).catch(() => {
|
|
||||||
this.loadIng--;
|
|
||||||
call()
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -141,7 +141,7 @@ export default {
|
|||||||
keys: {
|
keys: {
|
||||||
name: this.projectKeyValue
|
name: this.projectKeyValue
|
||||||
},
|
},
|
||||||
hideLoad: true,
|
hideload: true,
|
||||||
}).finally(_ => {
|
}).finally(_ => {
|
||||||
this.projectKeyLoading--;
|
this.projectKeyLoading--;
|
||||||
});
|
});
|
||||||
|
|||||||
@ -865,7 +865,7 @@ export default {
|
|||||||
if (timeout > -1) {
|
if (timeout > -1) {
|
||||||
this.__updateDialogs = setTimeout(_ => {
|
this.__updateDialogs = setTimeout(_ => {
|
||||||
if (this.tabActive === 'dialog') {
|
if (this.tabActive === 'dialog') {
|
||||||
this.$store.dispatch("getDialogs", {hideLoad: true}).catch(() => {});
|
this.$store.dispatch("getDialogs", {hideload: true}).catch(() => {});
|
||||||
}
|
}
|
||||||
}, timeout)
|
}, timeout)
|
||||||
}
|
}
|
||||||
|
|||||||
158
resources/assets/js/store/actions.js
vendored
158
resources/assets/js/store/actions.js
vendored
@ -1,5 +1,6 @@
|
|||||||
import {Store} from 'le5le-store';
|
import {Store} from 'le5le-store';
|
||||||
import {languageType} from "../language";
|
import {languageType} from "../language";
|
||||||
|
import {$callData} from './utils'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
/**
|
/**
|
||||||
@ -35,9 +36,7 @@ export default {
|
|||||||
state.dialogInputCache = await $A.IDBArray("dialogInputCache")
|
state.dialogInputCache = await $A.IDBArray("dialogInputCache")
|
||||||
state.fileLists = await $A.IDBArray("fileLists")
|
state.fileLists = await $A.IDBArray("fileLists")
|
||||||
state.userInfo = await $A.IDBJson("userInfo")
|
state.userInfo = await $A.IDBJson("userInfo")
|
||||||
state.dialogUpdatedAt = await $A.IDBString("dialogUpdatedAt")
|
state.callAt = await $A.IDBArray("callAt")
|
||||||
state.dialogDeletedAt = await $A.IDBString("dialogDeletedAt")
|
|
||||||
state.projectDeletedAt = await $A.IDBString("projectDeletedAt")
|
|
||||||
|
|
||||||
// 会员信息
|
// 会员信息
|
||||||
if (state.userInfo.userid) {
|
if (state.userInfo.userid) {
|
||||||
@ -637,9 +636,7 @@ export default {
|
|||||||
state.cacheProjects = [];
|
state.cacheProjects = [];
|
||||||
state.cacheColumns = [];
|
state.cacheColumns = [];
|
||||||
state.cacheTasks = [];
|
state.cacheTasks = [];
|
||||||
state.dialogUpdatedAt = null;
|
state.callAt = [];
|
||||||
state.dialogDeletedAt = null;
|
|
||||||
state.projectDeletedAt = null;
|
|
||||||
|
|
||||||
// localStorage
|
// localStorage
|
||||||
const languageType = window.localStorage.getItem("__language:type__");
|
const languageType = window.localStorage.getItem("__language:type__");
|
||||||
@ -706,7 +703,7 @@ export default {
|
|||||||
forgetFile({state, dispatch}, file_id) {
|
forgetFile({state, dispatch}, file_id) {
|
||||||
$A.execMainDispatch("forgetFile", file_id)
|
$A.execMainDispatch("forgetFile", file_id)
|
||||||
//
|
//
|
||||||
let ids = $A.isArray(file_id) ? file_id : [file_id];
|
const ids = $A.isArray(file_id) ? file_id : [file_id];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
state.fileLists = state.fileLists.filter(file => file.id != id);
|
state.fileLists = state.fileLists.filter(file => file.id != id);
|
||||||
state.fileLists.some(file => {
|
state.fileLists.some(file => {
|
||||||
@ -827,7 +824,7 @@ export default {
|
|||||||
forgetProject({state}, project_id) {
|
forgetProject({state}, project_id) {
|
||||||
$A.execMainDispatch("forgetProject", project_id)
|
$A.execMainDispatch("forgetProject", project_id)
|
||||||
//
|
//
|
||||||
let ids = $A.isArray(project_id) ? project_id : [project_id];
|
const ids = $A.isArray(project_id) ? project_id : [project_id];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
const index = state.cacheProjects.findIndex(project => project.id == id);
|
const index = state.cacheProjects.findIndex(project => project.id == id);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@ -867,34 +864,23 @@ export default {
|
|||||||
reject({msg: 'Parameter error'});
|
reject({msg: 'Parameter error'});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!$A.isJson(requestData)) {
|
const callData = $callData('projects', requestData, state)
|
||||||
requestData = {}
|
|
||||||
}
|
|
||||||
if (typeof requestData.deleted_at === "undefined") {
|
|
||||||
requestData.deleted_at = state.projectDeletedAt || getters.getProjectLastAt
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
!requestData.hideLoad && state.loadProjects++;
|
callData.showLoad() && state.loadProjects++;
|
||||||
dispatch("call", {
|
dispatch("call", {
|
||||||
url: 'project/lists',
|
url: 'project/lists',
|
||||||
data: requestData
|
data: callData.get()
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
state.projectTotal = data.total_all;
|
state.projectTotal = data.total_all;
|
||||||
dispatch("saveProject", data.data);
|
dispatch("saveProject", data.data);
|
||||||
//
|
callData.save(data).then(ids => dispatch("forgetProject", ids))
|
||||||
if (data.current_page === 1) {
|
|
||||||
data.deleted_at && $A.IDBSet("projectDeletedAt", data.deleted_at).then(_ => {
|
|
||||||
state.projectDeletedAt = data.deleted_at
|
|
||||||
data.deleted_data.some(id => dispatch("forgetProject", id))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
resolve(data)
|
resolve(data)
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
console.warn(e);
|
console.warn(e);
|
||||||
reject(e)
|
reject(e)
|
||||||
}).finally(_ => {
|
}).finally(_ => {
|
||||||
!requestData.hideLoad && state.loadProjects--;
|
callData.showLoad() && state.loadProjects--;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -1054,8 +1040,8 @@ export default {
|
|||||||
forgetColumn({state, dispatch}, column_id) {
|
forgetColumn({state, dispatch}, column_id) {
|
||||||
$A.execMainDispatch("forgetColumn", column_id)
|
$A.execMainDispatch("forgetColumn", column_id)
|
||||||
//
|
//
|
||||||
let ids = $A.isArray(column_id) ? column_id : [column_id];
|
const ids = $A.isArray(column_id) ? column_id : [column_id];
|
||||||
let project_ids = [];
|
const project_ids = [];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
const index = state.cacheColumns.findIndex(column => column.id == id);
|
const index = state.cacheColumns.findIndex(column => column.id == id);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@ -1228,9 +1214,9 @@ export default {
|
|||||||
forgetTask({state, dispatch}, task_id) {
|
forgetTask({state, dispatch}, task_id) {
|
||||||
$A.execMainDispatch("forgetTask", task_id)
|
$A.execMainDispatch("forgetTask", task_id)
|
||||||
//
|
//
|
||||||
let ids = $A.isArray(task_id) ? task_id : [task_id];
|
const ids = $A.isArray(task_id) ? task_id : [task_id];
|
||||||
let parent_ids = [];
|
const parent_ids = [];
|
||||||
let project_ids = [];
|
const project_ids = [];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
const index = state.cacheTasks.findIndex(task => task.id == id);
|
const index = state.cacheTasks.findIndex(task => task.id == id);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@ -1318,15 +1304,16 @@ export default {
|
|||||||
* 获取任务
|
* 获取任务
|
||||||
* @param state
|
* @param state
|
||||||
* @param dispatch
|
* @param dispatch
|
||||||
* @param data
|
* @param requestData
|
||||||
* @returns {Promise<unknown>}
|
* @returns {Promise<unknown>}
|
||||||
*/
|
*/
|
||||||
getTasks({state, dispatch}, data) {
|
getTasks({state, dispatch}, requestData) {
|
||||||
let taskData = [];
|
const taskData = [];
|
||||||
if ($A.isArray(data.taskData)) {
|
if ($A.isArray(requestData.taskData)) {
|
||||||
taskData = data.taskData;
|
taskData.push(...requestData.taskData)
|
||||||
delete data.taskData;
|
delete requestData.taskData;
|
||||||
}
|
}
|
||||||
|
const callData = $callData('tasks', requestData, state)
|
||||||
//
|
//
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
if (state.userId === 0) {
|
if (state.userId === 0) {
|
||||||
@ -1334,31 +1321,28 @@ export default {
|
|||||||
reject({msg: 'Parameter error'});
|
reject({msg: 'Parameter error'});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (data.project_id) {
|
if (requestData.project_id) {
|
||||||
state.projectLoad++;
|
state.projectLoad++;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
dispatch("call", {
|
dispatch("call", {
|
||||||
url: 'project/task/lists',
|
url: 'project/task/lists',
|
||||||
data
|
data: callData.get()
|
||||||
}).then(result => {
|
}).then(({data}) => {
|
||||||
if (data.project_id) {
|
if (requestData.project_id) {
|
||||||
state.projectLoad--;
|
state.projectLoad--;
|
||||||
}
|
}
|
||||||
|
taskData.push(...data.data);
|
||||||
|
callData.save(data).then(ids => dispatch("forgetTask", ids))
|
||||||
//
|
//
|
||||||
const resData = result.data;
|
if (data.next_page_url) {
|
||||||
taskData.push(...resData.data);
|
requestData.page = data.current_page + 1
|
||||||
//
|
requestData.taskData = taskData
|
||||||
if (resData.next_page_url) {
|
if (data.current_page % 10 === 0) {
|
||||||
const nextData = Object.assign(data, {
|
|
||||||
page: resData.current_page + 1,
|
|
||||||
taskData,
|
|
||||||
});
|
|
||||||
if (resData.current_page % 5 === 0) {
|
|
||||||
$A.modalWarning({
|
$A.modalWarning({
|
||||||
content: "数据已超过" + resData.to + "条,是否继续加载?",
|
content: "数据已超过" + data.to + "条,是否继续加载?",
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
dispatch("getTasks", nextData).then(resolve).catch(reject)
|
dispatch("getTasks", requestData).then(resolve).catch(reject)
|
||||||
},
|
},
|
||||||
onCancel: () => {
|
onCancel: () => {
|
||||||
dispatch("saveTask", taskData);
|
dispatch("saveTask", taskData);
|
||||||
@ -1366,7 +1350,7 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
dispatch("getTasks", nextData).then(resolve).catch(reject)
|
dispatch("getTasks", requestData).then(resolve).catch(reject)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dispatch("saveTask", taskData);
|
dispatch("saveTask", taskData);
|
||||||
@ -1375,7 +1359,7 @@ export default {
|
|||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
console.warn(e);
|
console.warn(e);
|
||||||
reject(e)
|
reject(e)
|
||||||
if (data.project_id) {
|
if (requestData.project_id) {
|
||||||
state.projectLoad--;
|
state.projectLoad--;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1447,22 +1431,8 @@ export default {
|
|||||||
}
|
}
|
||||||
state.loadDashboardTasks = true;
|
state.loadDashboardTasks = true;
|
||||||
//
|
//
|
||||||
const time = $A.Time()
|
|
||||||
const {today, overdue, all} = getters.dashboardTask;
|
|
||||||
const currentIds = today.map(({id}) => id)
|
|
||||||
currentIds.push(...overdue.map(({id}) => id))
|
|
||||||
currentIds.push(...all.map(({id}) => id))
|
|
||||||
currentIds.push(...getters.assistTask.map(({id}) => id))
|
|
||||||
//
|
|
||||||
dispatch("getTasks", {
|
dispatch("getTasks", {
|
||||||
complete: "no",
|
complete: "no",
|
||||||
}).then(_ => {
|
|
||||||
const {today, overdue, all} = getters.dashboardTask;
|
|
||||||
const newIds = today.filter(task => task._time >= time).map(({id}) => id)
|
|
||||||
newIds.push(...overdue.filter(task => task._time >= time).map(({id}) => id))
|
|
||||||
newIds.push(...all.filter(task => task._time >= time).map(({id}) => id))
|
|
||||||
newIds.push(...getters.assistTask.filter(task => task._time >= time).map(({id}) => id))
|
|
||||||
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
|
|
||||||
}).finally(_ => {
|
}).finally(_ => {
|
||||||
state.loadDashboardTasks = false;
|
state.loadDashboardTasks = false;
|
||||||
})
|
})
|
||||||
@ -1477,20 +1447,7 @@ export default {
|
|||||||
*/
|
*/
|
||||||
getTaskForProject({state, dispatch}, project_id) {
|
getTaskForProject({state, dispatch}, project_id) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
const time = $A.Time()
|
dispatch("getTasks", {project_id}).then(resolve).catch(reject)
|
||||||
const currentIds = state.cacheTasks.filter(task => task.project_id == project_id).map(({id}) => id)
|
|
||||||
//
|
|
||||||
const call = () => {
|
|
||||||
const newIds = state.cacheTasks.filter(task => task.project_id == project_id && task._time >= time).map(({id}) => id)
|
|
||||||
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
|
|
||||||
}
|
|
||||||
dispatch("getTasks", {project_id}).then(() => {
|
|
||||||
call()
|
|
||||||
resolve()
|
|
||||||
}).catch(() => {
|
|
||||||
call()
|
|
||||||
reject()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1503,23 +1460,10 @@ export default {
|
|||||||
*/
|
*/
|
||||||
getTaskForParent({state, dispatch}, parent_id) {
|
getTaskForParent({state, dispatch}, parent_id) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
const time = $A.Time()
|
|
||||||
const currentIds = state.cacheTasks.filter(task => task.parent_id == parent_id).map(({id}) => id)
|
|
||||||
//
|
|
||||||
let call = () => {
|
|
||||||
const newIds = state.cacheTasks.filter(task => task.parent_id == parent_id && task._time >= time).map(({id}) => id)
|
|
||||||
dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1))
|
|
||||||
}
|
|
||||||
dispatch("getTasks", {
|
dispatch("getTasks", {
|
||||||
parent_id,
|
parent_id,
|
||||||
archived: 'all'
|
archived: 'all'
|
||||||
}).then(() => {
|
}).then(resolve).catch(reject)
|
||||||
call()
|
|
||||||
resolve()
|
|
||||||
}).catch(() => {
|
|
||||||
call()
|
|
||||||
reject()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1677,7 +1621,7 @@ export default {
|
|||||||
* @param file_id
|
* @param file_id
|
||||||
*/
|
*/
|
||||||
forgetTaskFile({state, dispatch}, file_id) {
|
forgetTaskFile({state, dispatch}, file_id) {
|
||||||
let ids = $A.isArray(file_id) ? file_id : [file_id];
|
const ids = $A.isArray(file_id) ? file_id : [file_id];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
const index = state.taskFiles.findIndex(file => file.id == id)
|
const index = state.taskFiles.findIndex(file => file.id == id)
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
@ -2155,27 +2099,15 @@ export default {
|
|||||||
if (typeof requestData.pagesize === "undefined") {
|
if (typeof requestData.pagesize === "undefined") {
|
||||||
requestData.pagesize = 20
|
requestData.pagesize = 20
|
||||||
}
|
}
|
||||||
if (typeof requestData.updated_at === "undefined") {
|
const callData = $callData('dialogs', requestData, state)
|
||||||
requestData.updated_at = state.dialogUpdatedAt
|
|
||||||
}
|
|
||||||
if (typeof requestData.deleted_at === "undefined") {
|
|
||||||
requestData.deleted_at = state.dialogDeletedAt || getters.getDialogLastAt
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
!requestData.hideLoad && state.loadDialogs++;
|
callData.showLoad() && state.loadDialogs++;
|
||||||
dispatch("call", {
|
dispatch("call", {
|
||||||
url: 'dialog/lists',
|
url: 'dialog/lists',
|
||||||
data: requestData,
|
data: callData.get()
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
dispatch("saveDialog", data.data);
|
dispatch("saveDialog", data.data);
|
||||||
//
|
callData.save(data).then(ids => dispatch("forgetDialog", ids))
|
||||||
if (data.current_page === 1) {
|
|
||||||
data.deleted_at && $A.IDBSet("dialogDeletedAt", data.deleted_at).then(_ => {
|
|
||||||
state.dialogDeletedAt = data.deleted_at
|
|
||||||
data.deleted_data.some(id => dispatch("forgetDialog", id))
|
|
||||||
});
|
|
||||||
$A.IDBSet("dialogUpdatedAt", state.dialogUpdatedAt = $A.formatDate()).then(_ => {})
|
|
||||||
}
|
|
||||||
//
|
//
|
||||||
if (data.next_page_url && data.current_page < 5) {
|
if (data.next_page_url && data.current_page < 5) {
|
||||||
requestData.page++
|
requestData.page++
|
||||||
@ -2187,7 +2119,7 @@ export default {
|
|||||||
console.warn(e);
|
console.warn(e);
|
||||||
reject(e)
|
reject(e)
|
||||||
}).finally(_ => {
|
}).finally(_ => {
|
||||||
!requestData.hideLoad && state.loadDialogs--;
|
callData.showLoad() && state.loadDialogs--;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -2317,7 +2249,7 @@ export default {
|
|||||||
forgetDialog({state}, dialog_id) {
|
forgetDialog({state}, dialog_id) {
|
||||||
$A.execMainDispatch("forgetDialog", dialog_id)
|
$A.execMainDispatch("forgetDialog", dialog_id)
|
||||||
//
|
//
|
||||||
let ids = $A.isArray(dialog_id) ? dialog_id : [dialog_id];
|
const ids = $A.isArray(dialog_id) ? dialog_id : [dialog_id];
|
||||||
ids.some(id => {
|
ids.some(id => {
|
||||||
const index = state.cacheDialogs.findIndex(dialog => dialog.id == id);
|
const index = state.cacheDialogs.findIndex(dialog => dialog.id == id);
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
|
|||||||
30
resources/assets/js/store/getters.js
vendored
30
resources/assets/js/store/getters.js
vendored
@ -186,34 +186,4 @@ export default {
|
|||||||
}
|
}
|
||||||
return array
|
return array
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取项目最后更新时间
|
|
||||||
* @param state
|
|
||||||
* @returns {*}
|
|
||||||
*/
|
|
||||||
getProjectLastAt(state) {
|
|
||||||
if (state.cacheProjects.length > 0) {
|
|
||||||
const tmpList = state.cacheProjects.sort((a, b) => {
|
|
||||||
return $A.Date(b.updated_at) - $A.Date(a.updated_at);
|
|
||||||
})
|
|
||||||
return tmpList[0].updated_at;
|
|
||||||
}
|
|
||||||
return $A.formatDate("Y-m-d H:i:s", $A.Time() - 86400 * 30)
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取会话最后更新时间
|
|
||||||
* @param state
|
|
||||||
* @returns {*}
|
|
||||||
*/
|
|
||||||
getDialogLastAt(state) {
|
|
||||||
if (state.cacheDialogs.length > 0) {
|
|
||||||
const tmpList = state.cacheDialogs.sort((a, b) => {
|
|
||||||
return $A.Date(b.last_at) - $A.Date(a.last_at);
|
|
||||||
})
|
|
||||||
return tmpList[0].last_at;
|
|
||||||
}
|
|
||||||
return $A.formatDate("Y-m-d H:i:s", $A.Time() - 86400 * 30)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
6
resources/assets/js/store/state.js
vendored
6
resources/assets/js/store/state.js
vendored
@ -21,6 +21,9 @@ export default {
|
|||||||
routeHistorys: [],
|
routeHistorys: [],
|
||||||
routeHistoryLast: {},
|
routeHistoryLast: {},
|
||||||
|
|
||||||
|
// 请求时间
|
||||||
|
callAt: [],
|
||||||
|
|
||||||
// 加载状态
|
// 加载状态
|
||||||
loads: [],
|
loads: [],
|
||||||
loadDashboardTasks: false,
|
loadDashboardTasks: false,
|
||||||
@ -82,8 +85,6 @@ export default {
|
|||||||
dialogHistory: [],
|
dialogHistory: [],
|
||||||
dialogInputCache: [],
|
dialogInputCache: [],
|
||||||
dialogMsgTransfer: {time: 0},
|
dialogMsgTransfer: {time: 0},
|
||||||
dialogUpdatedAt: null,
|
|
||||||
dialogDeletedAt: null,
|
|
||||||
|
|
||||||
// 文件
|
// 文件
|
||||||
fileLists: [],
|
fileLists: [],
|
||||||
@ -92,7 +93,6 @@ export default {
|
|||||||
projectId: 0,
|
projectId: 0,
|
||||||
projectTotal: 0,
|
projectTotal: 0,
|
||||||
projectLoad: 0,
|
projectLoad: 0,
|
||||||
projectDeletedAt: null,
|
|
||||||
taskId: 0,
|
taskId: 0,
|
||||||
taskCompleteTemps: [],
|
taskCompleteTemps: [],
|
||||||
taskContents: [],
|
taskContents: [],
|
||||||
|
|||||||
65
resources/assets/js/store/utils.js
vendored
Normal file
65
resources/assets/js/store/utils.js
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* @param key
|
||||||
|
* @param requestData
|
||||||
|
* @param state
|
||||||
|
* @returns {$callData}
|
||||||
|
*/
|
||||||
|
function __callData(key, requestData, state) {
|
||||||
|
if (!$A.isJson(requestData)) {
|
||||||
|
requestData = {}
|
||||||
|
}
|
||||||
|
const callKey = key + "::" + encodeURIComponent(new URLSearchParams($.sortObject(requestData, [
|
||||||
|
'page',
|
||||||
|
'pagesize',
|
||||||
|
'hideload',
|
||||||
|
'timerange',
|
||||||
|
])).toString())
|
||||||
|
const callData = state.callAt.find(item => item.key === callKey) || {}
|
||||||
|
if (typeof callData.key === "undefined") {
|
||||||
|
callData.key = callKey
|
||||||
|
callData.updated = 0
|
||||||
|
callData.deleted = 0
|
||||||
|
state.callAt.push(callData)
|
||||||
|
$A.IDBSet("callAt", state.callAt).then(_ => {})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {*}
|
||||||
|
*/
|
||||||
|
this.get = () => {
|
||||||
|
requestData.timerange = requestData.timerange || `${callData.updated},${callData.deleted}`
|
||||||
|
return requestData
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param current_page
|
||||||
|
* @param deleted_id
|
||||||
|
* @returns {Promise<unknown>}
|
||||||
|
*/
|
||||||
|
this.save = ({current_page, deleted_id}) => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
if (current_page === 1) {
|
||||||
|
callData.updated = $A.Time()
|
||||||
|
if ($A.isArray(deleted_id)) {
|
||||||
|
callData.deleted = callData.updated
|
||||||
|
} else {
|
||||||
|
deleted_id = []
|
||||||
|
}
|
||||||
|
$A.IDBSet("callAt", state.callAt).then(_ => resolve(deleted_id))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
this.showLoad = () => {
|
||||||
|
return !requestData.hideload
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
export function $callData(key, requestData, state) {
|
||||||
|
return new __callData(key, requestData, state)
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user