diff --git a/src/api/work/process.js b/src/api/work/process.js new file mode 100644 index 0000000..20c70d8 --- /dev/null +++ b/src/api/work/process.js @@ -0,0 +1,34 @@ +import request from '@/router/axios'; + +// =====================参数=========================== + +export const historyFlowList = (current, size, params) => { + return request({ + url: '/api/blade-flow/process/history-flow-list', + method: 'get', + params: { + ...params, + current, + size, + } + }) +} + + +// =====================请假流程=========================== + +export const leaveProcess = (data) => { + return request({ + url: '/api/blade-desk/process/leave/start-process', + method: 'post', + data + }) +} + +export const leaveDetail = (params) => { + return request({ + url: '/api/blade-desk/process/leave/detail', + method: 'get', + params + }) +} diff --git a/src/page/index/index.vue b/src/page/index/index.vue index 0711bb2..a60b107 100644 --- a/src/page/index/index.vue +++ b/src/page/index/index.vue @@ -74,7 +74,7 @@ showCollapse() { this.$store.commit("SET_COLLAPSE"); }, - // 屏幕检测 + // 初始化 init() { this.$store.commit("SET_SCREEN", admin.getScreen()); window.onresize = () => { @@ -82,6 +82,8 @@ this.$store.commit("SET_SCREEN", admin.getScreen()); }, 0); }; + this.$store.dispatch("FlowRoutes").then(() => { + }); }, // 刷新token refreshToken() { diff --git a/src/router/views/index.js b/src/router/views/index.js index 6d7326b..cb76d90 100644 --- a/src/router/views/index.js +++ b/src/router/views/index.js @@ -44,7 +44,7 @@ export default [{ component: Layout, redirect: '/work/process/leave/form', children: [{ - path: 'form', + path: 'form/:processDefinitionId', name: '请假流程', meta: { i18n: 'work' @@ -52,7 +52,7 @@ export default [{ component: () => import( /* webpackChunkName: "views" */ '@/views/work/process/leave/form') }, { - path: 'handle', + path: 'handle/:taskId/:processInstanceId/:businessId', name: '处理请假流程', meta: { i18n: 'work' @@ -60,7 +60,7 @@ export default [{ component: () => import( /* webpackChunkName: "views" */ '@/views/work/process/leave/handle') }, { - path: 'detail', + path: 'detail/:processInstanceId/:businessId', name: '请假流程详情', meta: { i18n: 'work' diff --git a/src/store/getters.js b/src/store/getters.js index ff0187c..0afabd2 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -1,26 +1,27 @@ const getters = { - tag: state => state.tags.tag, - language: state => state.common.language, - website: state => state.common.website, - userInfo: state => state.user.userInfo, - colorName: state => state.common.colorName, - themeName: state => state.common.themeName, - isShade: state => state.common.isShade, - isCollapse: state => state.common.isCollapse, - keyCollapse: (state, getters) => getters.screen > 1 ? getters.isCollapse : false, - screen: state => state.common.screen, - isLock: state => state.common.isLock, - isFullScren: state => state.common.isFullScren, - lockPasswd: state => state.common.lockPasswd, - tagList: state => state.tags.tagList, - tagWel: state => state.tags.tagWel, - token: state => state.user.token, - roles: state => state.user.roles, - permission: state => state.user.permission, - menu: state => state.user.menu, - menuAll: state => state.user.menuAll, - logsList: state => state.logs.logsList, - logsLen: state => state.logs.logsList.length || 0, - logsFlag: (state, getters) => getters.logsLen === 0 + tag: state => state.tags.tag, + language: state => state.common.language, + website: state => state.common.website, + userInfo: state => state.user.userInfo, + colorName: state => state.common.colorName, + themeName: state => state.common.themeName, + isShade: state => state.common.isShade, + isCollapse: state => state.common.isCollapse, + keyCollapse: (state, getters) => getters.screen > 1 ? getters.isCollapse : false, + screen: state => state.common.screen, + isLock: state => state.common.isLock, + isFullScren: state => state.common.isFullScren, + lockPasswd: state => state.common.lockPasswd, + tagList: state => state.tags.tagList, + tagWel: state => state.tags.tagWel, + token: state => state.user.token, + roles: state => state.user.roles, + permission: state => state.user.permission, + menu: state => state.user.menu, + menuAll: state => state.user.menuAll, + logsList: state => state.logs.logsList, + logsLen: state => state.logs.logsList.length || 0, + logsFlag: (state, getters) => getters.logsLen === 0, + flowRoutes: state => state.dict.flowRoutes, } -export default getters \ No newline at end of file +export default getters diff --git a/src/store/index.js b/src/store/index.js index 1178ef7..805b864 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,17 +4,19 @@ import user from './modules/user' import common from './modules/common' import tags from './modules/tags' import logs from './modules/logs' +import dict from './modules/dict' import getters from './getters' Vue.use(Vuex) const store = new Vuex.Store({ - modules: { - user, - common, - logs, - tags - }, - getters, + modules: { + user, + common, + logs, + tags, + dict + }, + getters, }) -export default store \ No newline at end of file +export default store diff --git a/src/store/modules/common.js b/src/store/modules/common.js index 4b7c69f..d7f93ac 100644 --- a/src/store/modules/common.js +++ b/src/store/modules/common.js @@ -1,94 +1,95 @@ import { - setStore, - getStore, - removeStore + setStore, + getStore, + removeStore } from '@/util/store' import website from '@/config/website' + const common = { - state: { - language: getStore({ name: 'language' }) || 'zh', - isCollapse: false, - isFullScren: false, - isShade: false, - screen: -1, - isLock: getStore({ name: 'isLock' }) || false, - showTag: true, - showDebug: true, - showCollapse: true, - showSearch: true, - showLock: true, - showFullScren: true, - showTheme: true, - showMenu: true, - showColor: true, - colorName: getStore({ name: 'colorName' }) || '#409EFF', - themeName: getStore({ name: 'themeName' }) || 'theme-default', - lockPasswd: getStore({ name: 'lockPasswd' }) || '', - website: website, + state: { + language: getStore({name: 'language'}) || 'zh', + isCollapse: false, + isFullScren: false, + isShade: false, + screen: -1, + isLock: getStore({name: 'isLock'}) || false, + showTag: true, + showDebug: true, + showCollapse: true, + showSearch: true, + showLock: true, + showFullScren: true, + showTheme: true, + showMenu: true, + showColor: true, + colorName: getStore({name: 'colorName'}) || '#409EFF', + themeName: getStore({name: 'themeName'}) || 'theme-default', + lockPasswd: getStore({name: 'lockPasswd'}) || '', + website: website, + }, + mutations: { + SET_LANGUAGE: (state, language) => { + state.language = language + setStore({ + name: 'language', + content: state.language + }) + }, + SET_SHADE: (state, active) => { + state.isShade = active; + }, + SET_COLLAPSE: (state) => { + state.isCollapse = !state.isCollapse; + }, + SET_FULLSCREN: (state) => { + state.isFullScren = !state.isFullScren; + }, + SET_LOCK: (state) => { + state.isLock = true; + setStore({ + name: 'isLock', + content: state.isLock, + type: 'session' + }) + }, + SET_SCREEN: (state, screen) => { + state.screen = screen; + }, + SET_COLOR_NAME: (state, colorName) => { + state.colorName = colorName; + setStore({ + name: 'colorName', + content: state.colorName, + }) + }, + SET_THEME_NAME: (state, themeName) => { + state.themeName = themeName; + setStore({ + name: 'themeName', + content: state.themeName, + }) + }, + SET_LOCK_PASSWD: (state, lockPasswd) => { + state.lockPasswd = lockPasswd; + setStore({ + name: 'lockPasswd', + content: state.lockPasswd, + type: 'session' + }) + }, + CLEAR_LOCK: (state) => { + state.isLock = false; + state.lockPasswd = ''; + removeStore({ + name: 'lockPasswd', + type: 'session' + }); + removeStore({ + name: 'isLock', + type: 'session' + }); }, - mutations: { - SET_LANGUAGE: (state, language) => { - state.language = language - setStore({ - name: 'language', - content: state.language - }) - }, - SET_SHADE: (state, active) => { - state.isShade = active; - }, - SET_COLLAPSE: (state) => { - state.isCollapse = !state.isCollapse; - }, - SET_FULLSCREN: (state) => { - state.isFullScren = !state.isFullScren; - }, - SET_LOCK: (state) => { - state.isLock = true; - setStore({ - name: 'isLock', - content: state.isLock, - type: 'session' - }) - }, - SET_SCREEN: (state, screen) => { - state.screen = screen; - }, - SET_COLOR_NAME: (state, colorName) => { - state.colorName = colorName; - setStore({ - name: 'colorName', - content: state.colorName, - }) - }, - SET_THEME_NAME: (state, themeName) => { - state.themeName = themeName; - setStore({ - name: 'themeName', - content: state.themeName, - }) - }, - SET_LOCK_PASSWD: (state, lockPasswd) => { - state.lockPasswd = lockPasswd; - setStore({ - name: 'lockPasswd', - content: state.lockPasswd, - type: 'session' - }) - }, - CLEAR_LOCK: (state) => { - state.isLock = false; - state.lockPasswd = ''; - removeStore({ - name: 'lockPasswd', - type: 'session' - }); - removeStore({ - name: 'isLock', - type: 'session' - }); - }, - } + } } -export default common \ No newline at end of file +export default common diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js new file mode 100644 index 0000000..7359a04 --- /dev/null +++ b/src/store/modules/dict.js @@ -0,0 +1,36 @@ +import {getStore, setStore} from '@/util/store' + +import {getDictionary} from '@/api/system/dict' + +const dict = { + state: { + flowRoutes: getStore({name: 'flowRoutes'}) || {}, + }, + actions: { + //发送错误日志 + FlowRoutes({commit}) { + return new Promise((resolve, reject) => { + getDictionary({code: 'flow'}).then(res => { + commit('SET_FLOW_ROUTES', res.data.data); + resolve(); + }).catch(error => { + reject(error) + }) + }) + }, + }, + mutations: { + SET_FLOW_ROUTES: (state, data) => { + state.flowRoutes = data.map(item => { + return { + routeKey: `${item.code}_${item.dictKey}`, + routeValue: item.remark, + }; + }); + setStore({name: 'flowRoutes', content: state.flowRoutes, type: 'session'}) + }, + } + +}; + +export default dict; diff --git a/src/store/modules/logs.js b/src/store/modules/logs.js index 6d10ea9..be8a96c 100644 --- a/src/store/modules/logs.js +++ b/src/store/modules/logs.js @@ -1,42 +1,42 @@ -import { setStore, getStore } from '@/util/store' -import { dateFormat } from '@/util/date' -import { sendLogs } from '@/api/user' +import {setStore, getStore} from '@/util/store' +import {dateFormat} from '@/util/date' +import {sendLogs} from '@/api/user' + const logs = { - state: { - logsList: getStore({ name: 'logsList' }) || [], + state: { + logsList: getStore({name: 'logsList'}) || [], + }, + actions: { + SendLogs({state, commit}) { + return new Promise((resolve, reject) => { + sendLogs(state.logsList).then(() => { + commit('CLEAR_LOGS'); + resolve(); + }).catch(error => { + reject(error) + }) + }) }, - actions: { - //发送错误日志 - SendLogs({ state, commit }) { - return new Promise((resolve, reject) => { - sendLogs(state.logsList).then(() => { - commit('CLEAR_LOGS'); - resolve(); - }).catch(error => { - reject(error) - }) - }) - }, + }, + mutations: { + ADD_LOGS: (state, {type, message, stack, info}) => { + state.logsList.push(Object.assign({ + url: window.location.href, + time: dateFormat(new Date()) + }, { + type, + message, + stack, + info: info.toString() + })) + setStore({name: 'logsList', content: state.logsList}) }, - mutations: { - ADD_LOGS: (state, { type, message, stack, info }) => { - state.logsList.push(Object.assign({ - url: window.location.href, - time: dateFormat(new Date()) - }, { - type, - message, - stack, - info: info.toString() - })) - setStore({ name: 'logsList', content: state.logsList }) - }, - CLEAR_LOGS: (state) => { - state.logsList = []; - setStore({ name: 'logsList', content: state.logsList }) - } + CLEAR_LOGS: (state) => { + state.logsList = []; + setStore({name: 'logsList', content: state.logsList}) } + } }; -export default logs; \ No newline at end of file +export default logs; diff --git a/src/store/modules/tags.js b/src/store/modules/tags.js index 3abe034..2c076a5 100644 --- a/src/store/modules/tags.js +++ b/src/store/modules/tags.js @@ -1,72 +1,72 @@ -import { setStore, getStore } from '@/util/store' -import { diff } from '@/util/util' +import {setStore, getStore} from '@/util/store' +import {diff} from '@/util/util' import website from '@/config/website' + const isFirstPage = website.isFirstPage; const tagWel = website.fistPage; const tagObj = { - label: '', //标题名称 - value: '', //标题的路径 - params: '', //标题的路径参数 - query: '', //标题的参数 - meta: {},//额外参数 - group: [], //分组 + label: '', //标题名称 + value: '', //标题的路径 + params: '', //标题的路径参数 + query: '', //标题的参数 + meta: {},//额外参数 + group: [], //分组 } + //处理首个标签 function setFistTag(list) { - if (list.length == 1) { - list[0].close = false; - } else { - list.forEach(ele => { - if (ele.value === tagWel.value && isFirstPage === false) { - ele.close = false - } else { - ele.close = true - } - }) - } + if (list.length == 1) { + list[0].close = false; + } else { + list.forEach(ele => { + if (ele.value === tagWel.value && isFirstPage === false) { + ele.close = false + } else { + ele.close = true + } + }) + } } const navs = { - state: { - tagList: getStore({ name: 'tagList' }) || [], - tag: getStore({ name: 'tag' }) || tagObj, - tagWel: tagWel + state: { + tagList: getStore({name: 'tagList'}) || [], + tag: getStore({name: 'tag'}) || tagObj, + tagWel: tagWel + }, + actions: {}, + mutations: { + ADD_TAG: (state, action) => { + state.tag = action; + setStore({name: 'tag', content: state.tag, type: 'session'}) + if (state.tagList.some(ele => diff(ele, action))) return + state.tagList.push(action) + setFistTag(state.tagList); + setStore({name: 'tagList', content: state.tagList, type: 'session'}) }, - actions: { - + DEL_TAG: (state, action) => { + state.tagList = state.tagList.filter(item => { + return !diff(item, action); + }) + setFistTag(state.tagList); + setStore({name: 'tagList', content: state.tagList, type: 'session'}) + }, + DEL_ALL_TAG: (state) => { + state.tagList = [state.tagWel]; + setStore({name: 'tagList', content: state.tagList, type: 'session'}) + }, + DEL_TAG_OTHER: (state) => { + state.tagList = state.tagList.filter(item => { + if (item.value === state.tag.value) { + return true; + } else if (!website.isFirstPage && item.value === website.fistPage.value) { + return true; + } + }) + setFistTag(state.tagList); + setStore({name: 'tagList', content: state.tagList, type: 'session'}) }, - mutations: { - ADD_TAG: (state, action) => { - state.tag = action; - setStore({ name: 'tag', content: state.tag, type: 'session' }) - if (state.tagList.some(ele => diff(ele, action))) return - state.tagList.push(action) - setFistTag(state.tagList); - setStore({ name: 'tagList', content: state.tagList, type: 'session' }) - }, - DEL_TAG: (state, action) => { - state.tagList = state.tagList.filter(item => { - return !diff(item, action); - }) - setFistTag(state.tagList); - setStore({ name: 'tagList', content: state.tagList, type: 'session' }) - }, - DEL_ALL_TAG: (state) => { - state.tagList = [state.tagWel]; - setStore({ name: 'tagList', content: state.tagList, type: 'session' }) - }, - DEL_TAG_OTHER: (state) => { - state.tagList = state.tagList.filter(item => { - if (item.value === state.tag.value) { - return true; - } else if (!website.isFirstPage && item.value === website.fistPage.value) { - return true; - } - }) - setFistTag(state.tagList); - setStore({ name: 'tagList', content: state.tagList, type: 'session' }) - }, - } + } } -export default navs \ No newline at end of file +export default navs diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 1b596c6..17e5719 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -46,7 +46,7 @@ const user = { return new Promise((resolve) => { loginByUsername(userInfo.tenantCode, userInfo.username, userInfo.password, userInfo.type).then(res => { const data = res.data; - if(data.error_description) { + if (data.error_description) { Message({ message: data.error_description, type: 'error' diff --git a/src/util/func.js b/src/util/func.js new file mode 100644 index 0000000..f6eb486 --- /dev/null +++ b/src/util/func.js @@ -0,0 +1,92 @@ +/** + * 不为空 + * @param val + * @returns {boolean} + */ +export function notEmpty(val) { + return !this.isEmpty(val); +} + +/** + * 为空 + * @param val + * @returns {boolean} + */ +export function isEmpty(val) { + if ( + val === null || + typeof val === 'undefined' || + (typeof val === 'string' && val === '' && val !== 'undefined') + ) { + return true; + } + return false; +} + +/** + * 强转int型 + * @param val + * @param defaultValue + * @returns {number} + */ +export function toInt(val, defaultValue) { + if (this.isEmpty(val)) { + return defaultValue === undefined ? -1 : defaultValue; + } + const num = parseInt(val, 0); + return Number.isNaN(num) ? (defaultValue === undefined ? -1 : defaultValue) : num; +} + +/** + * Json强转为Form类型 + * @param obj + * @returns {FormData} + */ +export function toFormData(obj) { + const data = new FormData(); + Object.keys(obj).forEach(key => { + data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key]); + }); + return data; +} + +/** + * date类转为字符串格式 + * @param date + * @param format + * @returns {null} + */ +export function format(date, format = 'YYYY-MM-DD HH:mm:ss') { + return date ? date.format(format) : null; +} + +/** + * 根据逗号联合 + * @param arr + * @returns {string} + */ +export function join(arr) { + return arr ? arr.join(',') : ''; +} + +/** + * 根据逗号分隔 + * @param str + * @returns {string} + */ +export function split(str) { + return str ? String(str).split(',') : ''; +} + +/** + * 根据key获取流程路由 + * @param routes + * @param key + */ +export function getFlowRoute(routes, key) { + const data = routes.filter(d => { + return d.routeKey === key; + }); + return data.length === 0 ? [] : data[0].routeValue; +} + diff --git a/src/views/work/claim.vue b/src/views/work/claim.vue index ef0af4d..fa16808 100644 --- a/src/views/work/claim.vue +++ b/src/views/work/claim.vue @@ -61,8 +61,9 @@