import {Store} from 'le5le-store'; export default { /** * 访问接口 * @param state * @param dispatch * @param params // {url,data,method,timeout,header,spinner,websocket, before,complete,success,error,after} * @returns {Promise} */ call({state, dispatch}, params) { if (!$A.isJson(params)) params = {url: params} if (!$A.isJson(params.header)) params.header = {} params.url = $A.apiUrl(params.url); params.data = $A.date2string(params.data); params.header['Content-Type'] = 'application/json'; params.header['language'] = $A.getLanguage(); params.header['token'] = state.userToken; params.header['fd'] = $A.getStorageString("userWsFd"); params.header['version'] = window.systemInfo.version || "0.0.1"; params.header['platform'] = $A.Platform; // const cloneParams = $A.cloneJSON(params); return new Promise(function (resolve, reject) { if (params.spinner === true) { params.before = () => { $A.spinnerShow(); }; // params.complete = () => { $A.spinnerHide(); }; } // params.success = (result, status, xhr) => { if (!$A.isJson(result)) { console.log(result, status, xhr); reject({data: {}, msg: "Return error"}) return; } const {ret, data, msg} = result; if (ret === -1 && params.checkRole !== false) { //身份丢失 $A.modalError({ content: msg, onOk: () => { dispatch("logout") } }); return; } if (ret === -2 && params.checkNick !== false) { // 需要昵称 dispatch("userNickNameInput").then(() => { dispatch("call", Object.assign(cloneParams, { checkNick: false })).then(resolve).catch(reject); }).catch(() => { reject({data, msg: $A.L('请设置昵称!')}) }); return; } if (ret === 1) { resolve({data, msg}); } else { reject({data, msg: msg || "Unknown error"}) // if (ret === -4001) { dispatch("forgetProject", data.project_id); } else if (ret === -4002) { dispatch("forgetTask", data.task_id); } else if (ret === -4003) { dispatch("forgetDialog", data.dialog_id); } } }; params.error = () => { reject({data: {}, msg: "System error"}) }; // if (params.websocket === true || params.ws === true) { const apiWebsocket = $A.randomString(16); const apiTimeout = setTimeout(() => { const WListener = state.ajaxWsListener.find((item) => item.apiWebsocket == apiWebsocket); if (WListener) { WListener.complete(); WListener.error("timeout"); WListener.after(); } state.ajaxWsListener = state.ajaxWsListener.filter((item) => item.apiWebsocket != apiWebsocket); }, params.timeout || 30000); state.ajaxWsListener.push({ apiWebsocket: apiWebsocket, complete: typeof params.complete === "function" ? params.complete : () => { }, success: typeof params.success === "function" ? params.success : () => { }, error: typeof params.error === "function" ? params.error : () => { }, after: typeof params.after === "function" ? params.after : () => { }, }); // params.complete = () => { }; params.success = () => { }; params.error = () => { }; params.after = () => { }; params.header['Api-Websocket'] = apiWebsocket; // if (state.ajaxWsReady === false) { state.ajaxWsReady = true; dispatch("websocketMsgListener", { name: "apiWebsocket", callback: (msg) => { switch (msg.type) { case 'apiWebsocket': clearTimeout(apiTimeout); const apiWebsocket = msg.apiWebsocket; const apiSuccess = msg.apiSuccess; const apiResult = msg.data; const WListener = state.ajaxWsListener.find((item) => item.apiWebsocket == apiWebsocket); if (WListener) { WListener.complete(); if (apiSuccess) { WListener.success(apiResult); } else { WListener.error(apiResult); } WListener.after(); } state.ajaxWsListener = state.ajaxWsListener.filter((item) => item.apiWebsocket != apiWebsocket); break; } } }); } } $A.ajaxc(params); }) }, /** * 切换面板变量 * @param state * @param data|{key, project_id} */ toggleProjectParameter({state}, data) { $A.execMainDispatch("toggleProjectParameter", data) // let key = data; let project_id = state.projectId; if ($A.isJson(data)) { key = data.key; project_id = data.project_id; } if (project_id) { let index = state.cacheProjectParameter.findIndex(item => item.project_id == project_id) if (index === -1) { state.cacheProjectParameter.push($A.projectParameterTemplate(project_id)); index = state.cacheProjectParameter.findIndex(item => item.project_id == project_id) } const cache = state.cacheProjectParameter[index]; if (!$A.isJson(key)) { key = {[key]: !cache[key]}; } state.cacheProjectParameter.splice(index, 1, Object.assign(cache, key)) setTimeout(() => { $A.setStorage("cacheProjectParameter", state.cacheProjectParameter); }); } }, /** * 设置主题 * @param state * @param mode */ setTheme({state}, mode) { if (mode === undefined) { return; } if (!$A.isChrome()) { $A.modalWarning("仅客户端或Chrome浏览器支持主题功能"); return; } switch (mode) { case 'dark': $A.dark.enableDarkMode() break; case 'light': $A.dark.disableDarkMode() break; default: $A.dark.autoDarkMode() break; } state.themeMode = mode; state.themeIsDark = $A.dark.isDarkEnabled(); $A.setStorage("cacheThemeMode", mode); }, /** * 获取基本数据(项目、对话、仪表盘任务) * @param dispatch */ getBasicData({dispatch}) { dispatch("getProjects").catch(() => {}); dispatch("getDialogs"); dispatch("getTaskForDashboard"); }, /** * 获取/更新会员信息 * @param dispatch * @returns {Promise} */ getUserInfo({dispatch}) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'users/info', }).then(result => { dispatch("saveUserInfo", result.data); resolve(result) }).catch(e => { console.warn(e); reject(e) }); }); }, /** * 更新会员信息 * @param state * @param dispatch * @param info * @returns {Promise} */ saveUserInfo({state, dispatch}, info) { return new Promise(function (resolve) { const userInfo = $A.cloneJSON(info); userInfo.userid = $A.runNum(userInfo.userid); userInfo.token = userInfo.userid > 0 ? (userInfo.token || state.userToken) : ''; state.userInfo = userInfo; state.userId = userInfo.userid; state.userToken = userInfo.token; state.userIsAdmin = $A.inArray('admin', userInfo.identity); $A.setStorage("userInfo", state.userInfo); dispatch("getBasicData"); dispatch("websocketConnection"); resolve() }); }, /** * 更新会员在线 * @param state * @param info {userid,online} */ saveUserOnlineStatus({state}, info) { const {userid, online} = info; if (state.userOnline[userid] !== online) { state.userOnline = Object.assign({}, state.userOnline, {[userid]: online}); } }, /** * 获取用户基础信息 * @param state * @param dispatch * @param data {userid} */ getUserBasic({state, dispatch}, data) { if (state.cacheLoading["loadUserBasic"] === true) { data && state.cacheUserWait.push(data); return; } // let time = $A.Time(); let list = $A.cloneJSON(state.cacheUserWait); if (data && data.userid) { list.push(data) } state.cacheUserWait = []; // let array = []; let timeout = 0; list.some((item) => { let temp = state.cacheUserBasic.find(({userid}) => userid == item.userid); if (temp && time - temp._time <= 30) { setTimeout(() => { state.cacheUserActive = Object.assign(temp, {__:Math.random()}); Store.set('cacheUserActive', temp); }, timeout += 5); return false; } array.push(item); }); if (array.length === 0) { return; } else if (array.length > 30) { state.cacheUserWait = array.slice(30) array = array.slice(0, 30) } // state.cacheLoading["loadUserBasic"] = true; dispatch("call", { url: 'users/basic', data: { userid: [...new Set(array.map(({userid}) => userid))] }, }).then(result => { time = $A.Time(); array.forEach(value => { let data = result.data.find(({userid}) => userid == value.userid) || Object.assign(value, {email: ""}); data._time = time; dispatch("saveUserBasic", data); }); state.cacheLoading["loadUserBasic"] = false; dispatch("getUserBasic"); }).catch(e => { console.warn(e); state.cacheLoading["loadUserBasic"] = false; dispatch("getUserBasic"); }); }, /** * 保存用户基础信息 * @param state * @param data */ saveUserBasic({state}, data) { $A.execMainDispatch("saveUserBasic", data) // let index = state.cacheUserBasic.findIndex(({userid}) => userid == data.userid); if (index > -1) { data = Object.assign({}, state.cacheUserBasic[index], data) state.cacheUserBasic.splice(index, 1, data); } else { state.cacheUserBasic.push(data) } state.cacheUserActive = Object.assign(data, {__:Math.random()}); Store.set('cacheUserActive', data); setTimeout(() => { $A.setStorage("cacheUserBasic", state.cacheUserBasic); }) }, /** * 设置用户昵称 * @param dispatch * @returns {Promise} */ userNickNameInput({dispatch}) { return new Promise(function (resolve, reject) { let callback = (cb, success) => { if (typeof cb === "function") { cb(); } if (success === true) { setTimeout(resolve, 301) } else { setTimeout(reject, 301) } } $A.modalInput({ title: "设置昵称", placeholder: "请输入昵称", okText: "保存", onOk: (value, cb) => { if (value) { dispatch("call", { url: 'users/editdata', data: { nickname: value, }, checkNick: false, }).then(() => { dispatch('getUserInfo').then(() => { callback(cb, true); }).catch(() => { callback(cb, false); }); }).catch(({msg}) => { $A.modalError(msg, 301); callback(cb, false); }); } else { callback(cb, false); } }, onCancel: () => { callback(null, false); } }); }); }, /** * 登出(打开登录页面) * @param state * @param dispatch * @param appendFrom */ logout({state, dispatch}, appendFrom = true) { dispatch("handleClearCache", {}).then(() => { let from = ["/", "/login"].includes(window.location.pathname) ? "" : encodeURIComponent(window.location.href); if (appendFrom === false) { from = null; } $A.goForward({name: 'login', query: from ? {from: from} : {}}, true); }); }, /** * 清除缓存 * @param state * @param dispatch * @param userInfo * @returns {Promise} */ handleClearCache({state, dispatch}, userInfo) { return new Promise(function (resolve) { try { const cacheLoginEmail = $A.getStorageString("cacheLoginEmail"); const cacheThemeMode = $A.getStorageString("cacheThemeMode"); // window.localStorage.clear(); // state.cacheUserBasic = []; state.cacheDialogs = []; state.cacheProjects = []; state.cacheColumns = []; state.cacheTasks = []; // $A.setStorage("cacheProjectParameter", state.cacheProjectParameter); $A.setStorage("cacheServerUrl", state.cacheServerUrl); $A.setStorage("cacheLoginEmail", cacheLoginEmail); $A.setStorage("cacheThemeMode", cacheThemeMode); dispatch("saveUserInfo", $A.isJson(userInfo) ? userInfo : state.userInfo); // resolve() } catch (e) { resolve() } }); }, /** *****************************************************************************************/ /** ************************************** 文件 **********************************************/ /** *****************************************************************************************/ /** * 保存文件数据 * @param state * @param dispatch * @param data */ saveFile({state, dispatch}, data) { $A.execMainDispatch("saveFile", data) // if ($A.isArray(data)) { data.forEach((file) => { dispatch("saveFile", file); }); } else if ($A.isJson(data)) { let base = {_load: false, _edit: false}; let index = state.files.findIndex(({id}) => id == data.id); if (index > -1) { state.files.splice(index, 1, Object.assign(base, state.files[index], data)); } else { state.files.push(Object.assign(base, data)) } } }, /** * 忘记文件数据 * @param state * @param dispatch * @param file_id */ forgetFile({state, dispatch}, file_id) { $A.execMainDispatch("forgetFile", file_id) // let ids = $A.isArray(file_id) ? file_id : [file_id]; ids.some(id => { state.files = state.files.filter(file => file.id != id); state.files.some(file => { if (file.pid == id) { dispatch("forgetFile", file.id); } }); }) }, /** * 获取文件 * @param state * @param dispatch * @param pid * @returns {Promise} */ getFiles({state, dispatch}, pid) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'file/lists', data: { pid }, }).then((result) => { const ids = result.data.map(({id}) => id) state.files = state.files.filter((item) => item.pid != pid || ids.includes(item.id)); // dispatch("saveFile", result.data); resolve(result) }).catch(e => { console.warn(e); reject(e) }); }); }, /** * 搜索文件 * @param state * @param dispatch * @param key * @returns {Promise} */ searchFiles({state, dispatch}, key) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'file/search', data: { key, }, }).then((result) => { dispatch("saveFile", result.data); resolve(result) }).catch(e => { console.warn(e); reject(e) }); }); }, /** *****************************************************************************************/ /** ************************************** 项目 **********************************************/ /** *****************************************************************************************/ /** * 保存项目数据 * @param state * @param dispatch * @param data */ saveProject({state, dispatch}, data) { $A.execMainDispatch("saveProject", data) // if ($A.isArray(data)) { data.forEach((project) => { dispatch("saveProject", project) }); } else if ($A.isJson(data)) { if (typeof data.project_column !== "undefined") { dispatch("saveColumn", data.project_column) delete data.project_column; } let index = state.cacheProjects.findIndex(({id}) => id == data.id); if (index > -1) { state.cacheProjects.splice(index, 1, Object.assign({}, state.cacheProjects[index], data)); } else { if (typeof data.project_user === "undefined") { data.project_user = [] } state.cacheProjects.push(data); } // state.cacheDialogs.some(dialog => { if (dialog.type == 'group' && dialog.group_type == 'project' && dialog.group_info.id == data.id) { if (data.name !== undefined) { dialog.name = data.name } for (let key in dialog.group_info) { if (!dialog.group_info.hasOwnProperty(key) || data[key] === undefined) continue; dialog.group_info[key] = data[key]; } } }) // setTimeout(() => { $A.setStorage("cacheProjects", state.cacheProjects); }) } }, /** * 忘记项目数据 * @param state * @param project_id */ forgetProject({state}, project_id) { $A.execMainDispatch("forgetProject", project_id) // let ids = $A.isArray(project_id) ? project_id : [project_id]; ids.some(id => { let index = state.cacheProjects.findIndex(project => project.id == id); if (index > -1) { state.cacheProjects.splice(index, 1); } }) if (ids.includes(state.projectId)) { const project = state.cacheProjects.find(({id}) => id && id != project_id); if (project) { $A.goForward({path: '/manage/project/' + project.id}); } else { $A.goForward({path: '/manage/dashboard'}); } } setTimeout(() => { $A.setStorage("cacheProjects", state.cacheProjects); }) }, /** * 获取项目 * @param state * @param dispatch * @param data * @returns {Promise} */ getProjects({state, dispatch}, data) { return new Promise(function (resolve, reject) { if (state.userId === 0) { state.cacheProjects = []; reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/lists', data: data || {} }).then(({data}) => { state.projectTotal = data.total_all; dispatch("saveProject", data.data); resolve(data) }).catch(e => { console.warn(e); reject(e) }); }); }, /** * 获取单个项目 * @param state * @param dispatch * @param project_id * @returns {Promise} */ getProjectOne({state, dispatch}, project_id) { return new Promise(function (resolve, reject) { if ($A.runNum(project_id) === 0) { reject({msg: 'Parameter error'}); return; } state.projectLoad++; dispatch("call", { url: 'project/one', data: { project_id, }, }).then(result => { state.projectLoad--; dispatch("saveProject", result.data); resolve(result) }).catch(e => { console.warn(e); state.projectLoad--; reject(e) }); }); }, /** * 归档项目 * @param state * @param dispatch * @param project_id */ archivedProject({state, dispatch}, project_id) { return new Promise(function (resolve, reject) { if ($A.runNum(project_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/archived', data: { project_id, }, }).then(result => { dispatch("forgetProject", project_id) resolve(result) }).catch(e => { console.warn(e); dispatch("getProjectOne", project_id).catch(() => {}) reject(e) }); }); }, /** * 删除项目 * @param state * @param dispatch * @param project_id */ removeProject({state, dispatch}, project_id) { return new Promise(function (resolve, reject) { if ($A.runNum(project_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/remove', data: { project_id, }, }).then(result => { dispatch("forgetProject", project_id) resolve(result) }).catch(e => { console.warn(e); dispatch("getProjectOne", project_id).catch(() => {}) reject(e) }); }); }, /** * 退出项目 * @param state * @param dispatch * @param project_id */ exitProject({state, dispatch}, project_id) { return new Promise(function (resolve, reject) { if ($A.runNum(project_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/exit', data: { project_id, }, }).then(result => { dispatch("forgetProject", project_id) resolve(result) }).catch(e => { console.warn(e); dispatch("getProjectOne", project_id).catch(() => {}) reject(e) }); }); }, /** *****************************************************************************************/ /** ************************************** 列表 **********************************************/ /** *****************************************************************************************/ /** * 保存列表数据 * @param state * @param dispatch * @param data */ saveColumn({state, dispatch}, data) { $A.execMainDispatch("saveColumn", data) // if ($A.isArray(data)) { data.forEach((column) => { dispatch("saveColumn", column) }); } else if ($A.isJson(data)) { let index = state.cacheColumns.findIndex(({id}) => id == data.id); if (index > -1) { state.cacheColumns.splice(index, 1, Object.assign({}, state.cacheColumns[index], data)); } else { state.cacheColumns.push(data); } setTimeout(() => { $A.setStorage("cacheColumns", state.cacheColumns); }) } }, /** * 忘记列表数据 * @param state * @param dispatch * @param column_id */ forgetColumn({state, dispatch}, column_id) { $A.execMainDispatch("forgetColumn", column_id) // let ids = $A.isArray(column_id) ? column_id : [column_id]; let project_ids = []; ids.some(id => { let index = state.cacheColumns.findIndex(column => column.id == id); if (index > -1) { project_ids.push(state.cacheColumns[index].project_id) dispatch('getProjectOne', state.cacheColumns[index].project_id).catch(() => {}) state.cacheColumns.splice(index, 1); } }) Array.from(new Set(project_ids)).some(id => dispatch("getProjectOne", id).catch(() => {})) // setTimeout(() => { $A.setStorage("cacheColumns", state.cacheColumns); }) }, /** * 获取列表 * @param state * @param dispatch * @param project_id * @returns {Promise} */ getColumns({state, dispatch}, project_id) { return new Promise(function (resolve, reject) { if (state.userId === 0) { state.cacheColumns = []; reject({msg: 'Parameter error'}) return; } state.projectLoad++; dispatch("call", { url: 'project/column/lists', data: { project_id } }).then(({data}) => { state.projectLoad--; // const ids = data.data.map(({id}) => id) state.cacheColumns = state.cacheColumns.filter((item) => item.project_id != project_id || ids.includes(item.id)); // dispatch("saveColumn", data.data); resolve(data.data) // 判断只有1列的时候默认版面为表格模式 if (state.cacheColumns.filter(item => item.project_id == project_id).length === 1) { const cache = state.cacheProjectParameter.find(item => item.project_id == project_id) || {}; if (typeof cache.cardInit === "undefined" || cache.cardInit === false) { dispatch("toggleProjectParameter", { project_id, key: { card: false, cardInit: true, } }); } } }).catch(e => { console.warn(e); state.projectLoad--; reject(e); }); }) }, /** * 删除列表 * @param state * @param dispatch * @param column_id */ removeColumn({state, dispatch}, column_id) { return new Promise(function (resolve, reject) { if ($A.runNum(column_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/column/remove', data: { column_id, }, }).then(result => { dispatch("forgetColumn", column_id) resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** *****************************************************************************************/ /** ************************************** 任务 **********************************************/ /** *****************************************************************************************/ /** * 保存任务数据 * @param state * @param dispatch * @param data */ saveTask({state, dispatch}, data) { $A.execMainDispatch("saveTask", data) // if ($A.isArray(data)) { data.forEach((task) => { dispatch("saveTask", task) }); } else if ($A.isJson(data)) { data._time = $A.Time(); if (data.flow_item_name && data.flow_item_name.indexOf("|") !== -1) { [data.flow_item_status, data.flow_item_name] = data.flow_item_name.split("|") } // if (typeof data.archived_at !== "undefined") { state.cacheTasks.filter(task => task.parent_id == data.id).some(task => { dispatch("saveTask", Object.assign(task, { archived_at: data.archived_at, archived_userid: data.archived_userid })) }) } // let updateMarking = {}; if (typeof data.update_marking !== "undefined") { updateMarking = $A.isJson(data.update_marking) ? data.update_marking : {}; delete data.update_marking; } // let index = state.cacheTasks.findIndex(({id}) => id == data.id); if (index > -1) { state.cacheTasks.splice(index, 1, Object.assign({}, state.cacheTasks[index], data)); } else { state.cacheTasks.push(data); } // if (updateMarking.is_update_maintask === true || (data.parent_id > 0 && state.cacheTasks.findIndex(({id}) => id == data.parent_id) === -1)) { dispatch("getTaskOne", data.parent_id).catch(() => {}) } if (updateMarking.is_update_project === true) { dispatch("getProjectOne", data.project_id).catch(() => {}) } if (updateMarking.is_update_content === true) { dispatch("getTaskContent", data.id); } if (updateMarking.is_update_subtask === true) { dispatch("getTaskForParent", data.id).catch(() => {}) } // state.cacheDialogs.some(dialog => { if (dialog.type == 'group' && dialog.group_type == 'task' && dialog.group_info.id == data.id) { if (data.name !== undefined) { dialog.name = data.name } for (let key in dialog.group_info) { if (!dialog.group_info.hasOwnProperty(key) || data[key] === undefined) continue; dialog.group_info[key] = data[key]; } } }) // setTimeout(() => { $A.setStorage("cacheTasks", state.cacheTasks); }) } }, /** * 忘记任务数据 * @param state * @param dispatch * @param task_id */ 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 = []; ids.some(id => { let index = state.cacheTasks.findIndex(task => task.id == id); if (index > -1) { if (state.cacheTasks[index].parent_id) { parent_ids.push(state.cacheTasks[index].parent_id) } project_ids.push(state.cacheTasks[index].project_id) state.cacheTasks.splice(index, 1); } }) Array.from(new Set(parent_ids)).some(id => dispatch("getTaskOne", id).catch(() => {})) Array.from(new Set(project_ids)).some(id => dispatch("getProjectOne", id).catch(() => {})) // if (ids.includes(state.taskId)) { state.taskId = 0; } setTimeout(() => { $A.setStorage("cacheTasks", state.cacheTasks); }) }, /** * 增加任务消息数量 * @param state * @param dialog_id */ increaseTaskMsgNum({state}, dialog_id) { $A.execMainDispatch("increaseTaskMsgNum", dialog_id) // const task = state.cacheTasks.find(task => task.dialog_id === dialog_id); if (task) task.msg_num++; }, /** * 获取任务 * @param state * @param dispatch * @param data * @returns {Promise} */ getTasks({state, dispatch}, data) { return new Promise(function (resolve, reject) { if (state.userId === 0) { state.cacheTasks = []; reject({msg: 'Parameter error'}); return; } if (data.project_id) { state.projectLoad++; } // dispatch("call", { url: 'project/task/lists', data: data }).then(result => { if (data.project_id) { state.projectLoad--; } // const resData = result.data; dispatch("saveTask", resData.data); // if (resData.next_page_url) { const nextData = Object.assign(data, { page: resData.current_page + 1, }); if (resData.current_page % 5 === 0) { $A.modalWarning({ content: "数据已超过" + resData.to + "条,是否继续加载?", onOk: () => { dispatch("getTasks", nextData).then(resolve).catch(reject) }, onCancel: () => { resolve() } }); } else { dispatch("getTasks", nextData).then(resolve).catch(reject) } } else { resolve() } }).catch(e => { console.warn(e); reject(e) if (data.project_id) { state.projectLoad--; } }); }); }, /** * 获取单个任务 * @param state * @param dispatch * @param data Number|JSONObject{task_id, ?archived_at} * @returns {Promise} */ getTaskOne({state, dispatch}, data) { return new Promise(function (resolve, reject) { if (/^\d+$/.test(data)) { data = {task_id: data} } if ($A.runNum(data.task_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'project/task/one', data, }).then(result => { dispatch("saveTask", result.data); resolve(result) }).catch(e => { console.warn(e); reject(e) }); }); }, /** * 获取Dashboard相关任务 * @param state * @param dispatch * @param getters */ getTaskForDashboard({state, dispatch, getters}) { if (state.cacheLoading["loadDashboardTasks"] === true) { return; } state.cacheLoading["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)) // let loadIng = 3; let call = () => { if (loadIng <= 0) { state.cacheLoading["loadDashboardTasks"] = false; // 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)) dispatch("forgetTask", currentIds.filter(v => newIds.indexOf(v) == -1)) return; } loadIng--; if (loadIng == 2) { // 获取今日任务 dispatch("getTasks", { complete: "no", time: [ $A.formatDate("Y-m-d 00:00:00"), $A.formatDate("Y-m-d 23:59:59") ], }).then(call).catch(call) } else if (loadIng == 1) { // 获取过期任务 dispatch("getTasks", { complete: "no", time_before: $A.formatDate("Y-m-d H:i:s"), }).then(call).catch(call) } else if((loadIng == 0)) { // 获取待处理任务 dispatch("getTasks", { complete: "no", }).then(call).catch(call) } } call(); }, /** * 获取项目任务 * @param state * @param dispatch * @param project_id * @returns {Promise} */ 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() }) }) }, /** * 获取子任务 * @param state * @param dispatch * @param parent_id * @returns {Promise} */ 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() }) }) }, /** * 删除任务 * @param state * @param dispatch * @param task_id * @returns {Promise} */ removeTask({state, dispatch}, task_id) { return new Promise(function (resolve, reject) { if ($A.runNum(task_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("taskLoadStart", task_id) dispatch("call", { url: 'project/task/remove', data: { task_id: task_id, }, }).then(result => { dispatch("forgetTask", task_id) dispatch("taskLoadEnd", task_id) resolve(result) }).catch(e => { console.warn(e); dispatch("getTaskOne", task_id).catch(() => {}) dispatch("taskLoadEnd", task_id) reject(e) }); }); }, /** * 归档(还原)任务 * @param state * @param dispatch * @param data Number|JSONObject{task_id, ?archived_at} * @returns {Promise} */ archivedTask({state, dispatch}, data) { return new Promise(function (resolve, reject) { if (/^\d+$/.test(data)) { data = {task_id: data} } if ($A.runNum(data.task_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("taskLoadStart", data.task_id) dispatch("call", { url: 'project/task/archived', data, }).then(result => { dispatch("saveTask", result.data) dispatch("taskLoadEnd", data.task_id) resolve(result) }).catch(e => { console.warn(e); dispatch("getTaskOne", data.task_id).catch(() => {}) dispatch("taskLoadEnd", data.task_id) reject(e) }); }); }, /** * 获取任务详细描述 * @param state * @param dispatch * @param task_id */ getTaskContent({state, dispatch}, task_id) { if ($A.runNum(task_id) === 0) { return; } dispatch("call", { url: 'project/task/content', data: { task_id, }, }).then(result => { let index = state.taskContents.findIndex(({id}) => id == result.data.id) if (index > -1) { state.taskContents.splice(index, 1, result.data) } else { state.taskContents.push(result.data) } }).catch(e => { console.warn(e); }); }, /** * 获取任务文件 * @param state * @param dispatch * @param task_id */ getTaskFiles({state, dispatch}, task_id) { if ($A.runNum(task_id) === 0) { return; } dispatch("call", { url: 'project/task/files', data: { task_id, }, }).then(result => { result.data.forEach((data) => { let index = state.taskFiles.findIndex(({id}) => id == data.id) if (index > -1) { state.taskFiles.splice(index, 1, data) } else { state.taskFiles.push(data) } }) dispatch("saveTask", { id: task_id, file_num: result.data.length }); }).catch(e => { console.warn(e); }); }, /** * 忘记任务文件 * @param state * @param dispatch * @param file_id */ forgetTaskFile({state, dispatch}, file_id) { let ids = $A.isArray(file_id) ? file_id : [file_id]; ids.some(id => { let index = state.taskFiles.findIndex(file => file.id == id) if (index > -1) { state.taskFiles.splice(index, 1) } }) }, /** * 打开任务详情页 * @param state * @param dispatch * @param task */ openTask({state, dispatch}, task) { let task_id = task; if ($A.isJson(task)) { if (task.parent_id > 0) { task_id = task.parent_id; } else { task_id = task.id; } } state.taskId = task_id; if (task_id > 0) { dispatch("getTaskOne", { task_id, archived: 'all' }).then(() => { dispatch("getTaskContent", task_id); dispatch("getTaskFiles", task_id); dispatch("getTaskForParent", task_id).catch(() => {}) }).catch(({msg}) => { $A.modalWarning({ content: msg, onOk: () => { state.taskId = 0; } }); }); } }, /** * 添加任务 * @param state * @param commit * @param data * @returns {Promise} */ taskAdd({state, dispatch}, data) { return new Promise(function (resolve, reject) { const post = $A.cloneJSON($A.date2string(data)); if ($A.isArray(post.column_id)) post.column_id = post.column_id.find((val) => val) // dispatch("call", { url: 'project/task/add', data: post, method: 'post', }).then(result => { dispatch("addTaskSuccess", result.data) resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 添加子任务 * @param dispatch * @param data {task_id, name} * @returns {Promise} */ taskAddSub({dispatch}, data) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'project/task/addsub', data: data, }).then(result => { dispatch("addTaskSuccess", result.data) resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 添加任务成功 * @param dispatch * @param task */ addTaskSuccess({dispatch}, task) { if (typeof task.new_column !== "undefined") { dispatch("saveColumn", task.new_column) delete task.new_column } dispatch("saveTask", task) dispatch("getProjectOne", task.project_id).catch(() => {}) }, /** * 更新任务 * @param state * @param dispatch * @param data {task_id, ?} * @returns {Promise} */ taskUpdate({state, dispatch}, data) { return new Promise(function (resolve, reject) { dispatch("taskBeforeUpdate", data).then(post => { dispatch("taskLoadStart", post.task_id) dispatch("call", { url: 'project/task/update', data: post, method: 'post', }).then(result => { dispatch("taskLoadEnd", post.task_id) dispatch("saveTask", result.data) resolve(result) }).catch(e => { console.warn(e); dispatch("taskLoadEnd", post.task_id) dispatch("getTaskOne", post.task_id).catch(() => {}) reject(e) }); }).catch(reject) }); }, /** * 更新任务之前判断 * @param state * @param dispatch * @param data * @returns {Promise} */ taskBeforeUpdate({state, dispatch}, data) { return new Promise(function (resolve, reject) { let post = $A.cloneJSON($A.date2string(data)); let title = "温馨提示"; let content = null; // 修改时间前置判断 if (typeof post.times !== "undefined") { if (data.times[0] === false) { content = "你确定要取消任务时间吗?" } const currentTask = state.cacheTasks.find(({id}) => id == post.task_id); title = currentTask.parent_id > 0 ? "更新子任务" : "更新主任务" if (currentTask) { if (currentTask.parent_id > 0) { // 修改子任务,判断主任务 if (post.times[0]) { state.cacheTasks.some(parentTask => { if (parentTask.id != currentTask.parent_id) { return false; } if (!parentTask.end_at) { content = "主任务没有设置时间,设置子任务将同步设置主任务" return true; } let n1 = $A.Date(post.times[0], true), n2 = $A.Date(post.times[1], true), o1 = $A.Date(parentTask.start_at, true), o2 = $A.Date(parentTask.end_at, true); if (n1 < o1) { content = "新设置的子任务开始时间在主任务时间之外,修改后将同步修改主任务" // 子任务开始时间 < 主任务开始时间 return true; } if (n2 > o2) { content = "新设置的子任务结束时间在主任务时间之外,修改后将同步修改主任务" // 子任务结束时间 > 主任务结束时间 return true; } }) } } else { // 修改主任务,判断子任务 state.cacheTasks.some(subTask => { if (subTask.parent_id != currentTask.id) { return false; } if (!subTask.end_at) { return false; } let n1 = $A.Date(post.times[0], true), n2 = $A.Date(post.times[1], true), c1 = $A.Date(currentTask.start_at, true), c2 = $A.Date(currentTask.end_at, true), o1 = $A.Date(subTask.start_at, true), o2 = $A.Date(subTask.end_at, true); if (c1 == o1 && c2 == o2) { return false; } if (!post.times[0]) { content = `子任务(${subTask.name})已设置时间,清除主任务时间后将同步清除子任务的时间` return true; } if (n1 > o1) { content = `新设置的开始时间在子任务(${subTask.name})时间之内,修改后将同步修改子任务` // 主任务开始时间 > 子任务开始时间 return true; } if (n2 < o2) { content = `新设置的结束时间在子任务(${subTask.name})时间之内,修改后将同步修改子任务` // 主任务结束时间 < 子任务结束时间 return true; } }) } } } // if (content === null) { resolve(post); return } $A.modalConfirm({ title, content, onOk: () => { resolve(post); }, onCancel: () => { reject({msg: false}) } }); }); }, /** * 任务增加等待 * @param state * @param task_id */ taskLoadStart({state}, task_id) { setTimeout(() => { const load = state.taskLoading.find(({id}) => id == task_id) if (!load) { state.taskLoading.push({ id: task_id, num: 1 }) } else { load.num++; } }, 300) }, /** * 任务减少等待 * @param state * @param task_id */ taskLoadEnd({state}, task_id) { const load = state.taskLoading.find(({id}) => id == task_id) if (!load) { state.taskLoading.push({ id: task_id, num: -1 }) } else { load.num--; } }, /** * 获取任务流程信息 * @param state * @param dispatch * @param task_id * @returns {Promise} */ getTaskFlow({state, dispatch}, task_id) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'project/task/flow', data: { task_id: task_id }, }).then(result => { let task = state.cacheTasks.find(({id}) => id == task_id) let {data} = result data.turns.some(item => { let index = state.taskFlowItems.findIndex(({id}) => id == item.id); if (index > -1) { state.taskFlowItems.splice(index, 1, item); } else { state.taskFlowItems.push(item); } if (task && task.flow_item_id == item.id && task.flow_item_name != item.name) { state.cacheTasks.filter(({flow_item_id})=> flow_item_id == item.id).some(task => { dispatch("saveTask", { id: task.id, flow_item_name: `${item.status}|${item.name}`, }) }) } }) // delete data.turns; let index = state.taskFlows.findIndex(({task_id}) => task_id == data.task_id); if (index > -1) { state.taskFlows.splice(index, 1, data); } else { state.taskFlows.push(data); } resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 获取任务优先级预设数据 * @param state * @param dispatch * @returns {Promise} */ getTaskPriority({state, dispatch}) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'system/priority', }).then(result => { state.taskPriority = result.data; resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 获取添加项目列表预设数据 * @param state * @param dispatch * @returns {Promise} */ getColumnTemplate({state, dispatch}) { return new Promise(function (resolve, reject) { dispatch("call", { url: 'system/column/template', }).then(result => { state.columnTemplate = result.data; resolve(result) }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 保存完成任务临时表 * @param state * @param data */ saveTaskCompleteTemp({state}, data) { if ($A.isJson(data)) { let index = state.taskCompleteTemps.findIndex(({id}) => id == data.id); if (index > -1) { state.taskCompleteTemps.splice(index, 1, data); } else { state.taskCompleteTemps.push(data); } } }, /** * 忘记完成任务临时表 * @param state * @param task_id 任务ID 或 true标识忘记全部 */ forgetTaskCompleteTemp({state}, task_id) { if (task_id === true) { state.taskCompleteTemps = []; return; } let index = state.taskCompleteTemps.findIndex(({id}) => id == task_id); if (index > -1) { state.taskCompleteTemps.splice(index, 1); } }, /** *****************************************************************************************/ /** ************************************** 会话 **********************************************/ /** *****************************************************************************************/ /** * 更新会话数据 * @param state * @param dispatch * @param data */ saveDialog({state, dispatch}, data) { $A.execMainDispatch("saveDialog", data) // if ($A.isArray(data)) { data.forEach((dialog) => { dispatch("saveDialog", dialog) }); } else if ($A.isJson(data)) { let index = state.cacheDialogs.findIndex(({id}) => id == data.id); if (index > -1) { state.cacheDialogs.splice(index, 1, Object.assign({}, state.cacheDialogs[index], data)); } else { state.cacheDialogs.push(data); } setTimeout(() => { $A.setStorage("cacheDialogs", state.cacheDialogs); }) } }, /** * 更新会话最后消息 * @param state * @param dispatch * @param data */ updateDialogLastMsg({state, dispatch}, data) { $A.execMainDispatch("updateDialogLastMsg", data) // let dialog = state.cacheDialogs.find(({id}) => id == data.dialog_id); if (dialog) { dispatch("saveDialog", { id: data.dialog_id, last_msg: data, last_at: $A.formatDate("Y-m-d H:i:s") }); } else { dispatch("getDialogOne", data.dialog_id).catch(() => {}) } }, /** * 获取会话列表 * @param state * @param dispatch */ getDialogs({state, dispatch}) { if (state.userId === 0) { state.cacheDialogs = []; return; } dispatch("call", { url: 'dialog/lists', }).then(result => { dispatch("saveDialog", result.data.data); }).catch(e => { console.warn(e); }); }, /** * 获取单个会话信息 * @param state * @param dispatch * @param dialog_id * @returns {Promise} */ getDialogOne({state, dispatch}, dialog_id) { return new Promise(function (resolve, reject) { if ($A.runNum(dialog_id) === 0) { reject({msg: 'Parameter error'}); return; } dispatch("call", { url: 'dialog/one', data: { dialog_id, }, }).then(result => { dispatch("saveDialog", result.data); resolve(result); }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 打开个人会话 * @param state * @param dispatch * @param userid */ openDialogUserid({state, dispatch}, userid) { return new Promise(function (resolve, reject) { if (userid === state.userId) { reject({msg: 'Parameter error'}); return; } state.dialogOpenId = 0; // 先重置dialogOpenId,否者无法重复打开相同对话 dispatch("call", { url: 'dialog/open/user', data: { userid, }, }).then(result => { dispatch("saveDialog", result.data); $A.setStorage("messenger::dialogId", result.data.id); state.dialogOpenId = result.data.id; resolve(result); }).catch(e => { console.warn(e); reject(e); }); }); }, /** * 忘记对话数据 * @param state * @param dialog_id */ forgetDialog({state}, dialog_id) { $A.execMainDispatch("forgetDialog", dialog_id) // let ids = $A.isArray(dialog_id) ? dialog_id : [dialog_id]; ids.some(id => { let index = state.cacheDialogs.findIndex(dialog => dialog.id == id); if (index > -1) { state.cacheDialogs.splice(index, 1); } }) if (ids.includes($A.getStorageInt("messenger::dialogId"))) { $A.setStorage("messenger::dialogId", 0) } // setTimeout(() => { $A.setStorage("cacheDialogs", state.cacheDialogs); }) }, /** *****************************************************************************************/ /** ************************************** 消息 **********************************************/ /** *****************************************************************************************/ /** * 更新消息数据 * @param state * @param dispatch * @param data */ saveDialogMsg({state, dispatch}, data) { $A.execMainDispatch("saveDialogMsg", data) // if ($A.isArray(data)) { data.forEach((msg) => { dispatch("saveDialogMsg", msg) }); } else if ($A.isJson(data)) { let index = state.dialogMsgs.findIndex(({id}) => id == data.id); if (index > -1) { state.dialogMsgs.splice(index, 1, Object.assign({}, state.dialogMsgs[index], data)); } else { state.dialogMsgs.push(data); } } }, /** * 忘记消息数据 * @param state * @param msg_id */ forgetDialogMsg({state}, msg_id) { $A.execMainDispatch("forgetDialogMsg", msg_id) // let ids = $A.isArray(msg_id) ? msg_id : [msg_id]; ids.some(id => { let index = state.dialogMsgs.findIndex(item => item.id == id); if (index > -1) { state.dialogMsgs.splice(index, 1); } }) }, /** * 获取会话消息 * @param state * @param dispatch * @param dialog_id */ getDialogMsgs({state, dispatch}, dialog_id) { let dialog = state.cacheDialogs.find(({id}) => id == dialog_id); if (!dialog) { dialog = { id: dialog_id, }; state.cacheDialogs.push(dialog); } if (dialog.loading) { return; } dialog.loading = true; dialog.currentPage = 1; dialog.hasMorePages = false; // dispatch("call", { url: 'dialog/msg/lists', data: { dialog_id: dialog_id, page: dialog.currentPage }, }).then(result => { dialog.loading = false; dialog.currentPage = result.data.current_page; dialog.hasMorePages = !!result.data.next_page_url; dispatch("saveDialog", dialog); // const ids = result.data.data.map(({id}) => id) state.dialogMsgs = state.dialogMsgs.filter((item) => item.dialog_id != dialog_id || ids.includes(item.id)); // dispatch("saveDialog", result.data.dialog); dispatch("saveDialogMsg", result.data.data); }).catch(e => { console.warn(e); dialog.loading = false; }); }, /** * 获取更多(下一页)会话消息 * @param state * @param dispatch * @param dialog_id */ getDialogMoreMsgs({state, dispatch}, dialog_id) { return new Promise(function (resolve, reject) { const dialog = state.cacheDialogs.find(({id}) => id == dialog_id); if (!dialog) { reject({msg: 'Parameter error'}); return; } if (!dialog.hasMorePages) { reject({msg: 'No more page'}); return; } if (dialog.loading) { reject({msg: 'Loading'}); return; } dialog.loading = true; dialog.currentPage++; // dispatch("call", { url: 'dialog/msg/lists', data: { dialog_id: dialog_id, page: dialog.currentPage }, }).then(result => { dialog.loading = false; dialog.currentPage = result.data.current_page; dialog.hasMorePages = !!result.data.next_page_url; dispatch("saveDialogMsg", result.data.data); resolve(result) }).catch(e => { console.warn(e); dialog.loading = false; reject(e) }); }); }, /** * 发送已阅消息 * @param state * @param dispatch * @param data */ dialogMsgRead({state, dispatch}, data) { if (data.userid == state.userId) return; if (data.is_read === true) return; data.is_read = true; // let dialog = state.cacheDialogs.find(({id}) => id == data.dialog_id); if (dialog && dialog.unread > 0) { dialog.unread-- } // state.wsReadWaitList.push(data.id); clearTimeout(state.wsReadTimeout); state.wsReadTimeout = setTimeout(() => { dispatch("websocketSend", { type: 'readMsg', data: { id: $A.cloneJSON(state.wsReadWaitList) } }); state.wsReadWaitList = []; }, 50); }, /** * 初始化 websocket * @param state * @param dispatch * @param commit */ websocketConnection({state, dispatch, commit}) { clearTimeout(state.wsTimeout); if (state.userId === 0) { if (state.ws) { state.ws.close(); state.ws = null; } return; } // let url = $A.apiUrl('../ws'); url = url.replace("https://", "wss://"); url = url.replace("http://", "ws://"); url += "?action=web&token=" + state.userToken; // state.ws = new WebSocket(url); state.ws.onopen = (e) => { // console.log("[WS] Open", $A.formatDate()) state.wsOpenNum++; }; state.ws.onclose = (e) => { // console.log("[WS] Close", $A.formatDate()) state.ws = null; // clearTimeout(state.wsTimeout); state.wsTimeout = setTimeout(() => { dispatch('websocketConnection'); }, 3000); }; state.ws.onerror = (e) => { // console.log("[WS] Error", $A.formatDate()) state.ws = null; // clearTimeout(state.wsTimeout); state.wsTimeout = setTimeout(() => { dispatch('websocketConnection'); }, 3000); }; state.ws.onmessage = (e) => { // console.log("[WS] Message", e); const msgDetail = $A.formatWebsocketMessageDetail($A.jsonParse(e.data)); const {type, msgId} = msgDetail; switch (type) { case "open": $A.setStorage("userWsFd", msgDetail.data.fd) break case "receipt": typeof state.wsCall[msgId] === "function" && state.wsCall[msgId](msgDetail.body, true); delete state.wsCall[msgId]; break case "line": dispatch("saveUserOnlineStatus", msgDetail.data); break default: msgId && dispatch("websocketSend", {type: 'receipt', msgId}); state.wsMsg = msgDetail; Object.values(state.wsListener).forEach((call) => { if (typeof call === "function") { try { call(msgDetail); } catch (err) { // console.log("[WS] Callerr", err); } } }); switch (type) { /** * 聊天会话消息 */ case "dialog": // 更新会话 (function (msg) { const {mode, data} = msg; const {dialog_id} = data; switch (mode) { case 'delete': // 删除消息 dispatch("forgetDialogMsg", data.id) // let dialog = state.cacheDialogs.find(({id}) => id == data.dialog_id); if (dialog) { // 更新最后消息 dialog.last_at = data.last_msg && data.last_msg.created_at; dialog.last_msg = data.last_msg; if (data.update_read) { // 更新未读数量 dispatch("call", { url: 'dialog/msg/unread', dialog_id: data.dialog_id }).then(result => { dialog.unread = result.data.unread }).catch(() => {}); } } break; case 'add': case 'chat': if (!state.dialogMsgs.find(({id}) => id == data.id)) { // 新增任务消息数量 dispatch("increaseTaskMsgNum", dialog_id); if (mode === "chat") { return; } let dialog = state.cacheDialogs.find(({id}) => id == data.dialog_id); // 更新对话列表 if (dialog && state.cacheUnreads[data.id] === undefined) { // 新增未读数 state.cacheUnreads[data.id] = true; dialog.unread++; } Store.set('dialogMsgPush', data); } // 更新消息列表 dispatch("saveDialogMsg", data) // 更新最后消息 dispatch("updateDialogLastMsg", data); break; case 'readed': // 已读回执 if (state.dialogMsgs.find(({id}) => id == data.id)) { dispatch("saveDialogMsg", data) } break; } })(msgDetail); break; /** * 项目消息 */ case "project": (function (msg) { const {action, data} = msg; switch (action) { case 'add': case 'update': dispatch("saveProject", data) break; case 'detail': dispatch("getProjectOne", data.id).catch(() => {}) dispatch("getTaskForProject", data.id).catch(() => {}) break; case 'archived': case 'delete': dispatch("forgetProject", data.id); break; case 'sort': dispatch("getTaskForProject", data.id).catch(() => {}) break; } })(msgDetail); break; /** * 任务列表消息 */ case "projectColumn": (function (msg) { const {action, data} = msg; switch (action) { case 'add': case 'update': dispatch("saveColumn", data) break; case 'delete': dispatch("forgetColumn", data.id) break; } })(msgDetail); break; /** * 任务消息 */ case "projectTask": (function (msg) { const {action, data} = msg; switch (action) { case 'add': dispatch("addTaskSuccess", data) break; case 'update': dispatch("saveTask", data) break; case 'dialog': dispatch("saveTask", data) dispatch("getDialogOne", data.dialog_id).catch(() => {}) break; case 'upload': dispatch("getTaskFiles", data.task_id) break; case 'filedelete': dispatch("forgetTaskFile", data.id) break; case 'delete': dispatch("forgetTask", data.id) break; } })(msgDetail); break; /** * 文件消息 */ case "file": (function (msg) { const {action, data} = msg; switch (action) { case 'add': case 'update': dispatch("saveFile", data); break; case 'delete': dispatch("forgetFile", data.id); break; } })(msgDetail); break; } break } } }, /** * 发送 websocket 消息 * @param state * @param params {type, data, callback} */ websocketSend({state}, params) { if (!$A.isJson(params)) { typeof callback === "function" && callback(null, false) return; } const {type, data, callback} = params; let msgId = undefined; if (!state.ws) { typeof callback === "function" && callback(null, false) return; } if (typeof callback === "function") { msgId = $A.randomString(16) state.wsCall[msgId] = callback; } try { state.ws.send(JSON.stringify({ type, msgId, data })); } catch (e) { typeof callback === "function" && callback(null, false) } }, /** * 记录 websocket 访问状态 * @param state * @param dispatch * @param path */ websocketPath({state, dispatch}, path) { clearTimeout(state.wsPathTimeout); state.wsPathValue = path; state.wsPathTimeout = setTimeout(() => { if (state.wsPathValue == path) { dispatch("websocketSend", {type: 'path', data: {path}}); } }, 1000); }, /** * 监听消息 * @param state * @param params {name, callback} */ websocketMsgListener({state}, params) { const {name, callback} = params; if (typeof callback === "function") { state.wsListener[name] = callback; } else { state.wsListener[name] && delete state.wsListener[name]; } }, /** * 关闭 websocket * @param state */ websocketClose({state}) { state.ws && state.ws.close(); }, }