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