import { listProject, getProjectDashboard } from '@/api/oa/project' function sleep (ms) { return new Promise(resolve => setTimeout(resolve, ms)) } async function retry (fn, times, delayMs) { let lastErr for (let i = 0; i < times; i++) { try { return await fn() } catch (e) { lastErr = e if (i < times - 1) { await sleep(delayMs) } } } throw lastErr } const state = { currentProjectId: '', projectQuery: { pageNum: 1, pageSize: 15, keyword: '' }, projectList: [], projectTotal: 0, projectDetail: null, taskList: [], scheduleList: [], stepList: [], taskQuery: { pageNum: 1, pageSize: 10, projectCode: '', taskKeyword: '' }, loading: false } const mutations = { SET_LOADING (state, val) { state.loading = !!val }, SET_CURRENT_PROJECT (state, projectId) { state.currentProjectId = projectId || '' }, SET_PROJECT_QUERY (state, payload) { state.projectQuery = { ...state.projectQuery, ...(payload || {}) } }, SET_PROJECT_LIST (state, payload) { state.projectList = payload.rows || [] state.projectTotal = payload.total || 0 }, SET_DASHBOARD (state, payload) { const p = payload || {} state.projectDetail = p.project || null state.taskList = p.tasks || [] state.scheduleList = p.schedules || [] state.stepList = p.steps || [] }, CLEAR_RIGHT (state) { state.projectDetail = null state.taskList = [] state.scheduleList = [] state.stepList = [] }, SET_TASK_QUERY (state, payload) { state.taskQuery = { ...state.taskQuery, ...(payload || {}) } } } const actions = { async fetchProjectList ({ commit, state }, payload) { const merged = { ...state.projectQuery, ...(payload || {}) } const query = { pageNum: merged.pageNum, pageSize: merged.pageSize, keyword: (merged.keyword != null ? String(merged.keyword) : '').trim(), scheduleStats: true } commit('SET_PROJECT_QUERY', query) commit('SET_LOADING', true) try { const res = await retry(() => listProject(query), 2, 600) commit('SET_PROJECT_LIST', { rows: res.rows || [], total: res.total || 0 }) return res } finally { commit('SET_LOADING', false) } }, async selectProject ({ commit }, projectId) { commit('SET_CURRENT_PROJECT', projectId) if (!projectId) { commit('CLEAR_RIGHT') return } const res = await retry(() => getProjectDashboard(projectId), 2, 600) const data = res.data || {} commit('SET_DASHBOARD', data) return res } } export default { namespaced: true, state, mutations, actions }