新增事务功能

pull/59/head
smallchill 7 years ago
parent c7e48d2706
commit b10d0e148a
  1. 34
      src/api/work/process.js
  2. 4
      src/page/index/index.vue
  3. 6
      src/router/views/index.js
  4. 49
      src/store/getters.js
  5. 18
      src/store/index.js
  6. 175
      src/store/modules/common.js
  7. 36
      src/store/modules/dict.js
  8. 70
      src/store/modules/logs.js
  9. 116
      src/store/modules/tags.js
  10. 2
      src/store/modules/user.js
  11. 92
      src/util/func.js
  12. 7
      src/views/work/claim.vue
  13. 7
      src/views/work/done.vue
  14. 31
      src/views/work/process/leave/form.vue
  15. 7
      src/views/work/send.vue
  16. 12
      src/views/work/start.vue
  17. 7
      src/views/work/todo.vue

@ -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
})
}

@ -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() {

@ -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'

@ -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
export default getters

@ -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
export default store

@ -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
export default common

@ -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;

@ -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;
export default logs;

@ -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
export default navs

@ -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'

@ -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;
}

@ -61,8 +61,9 @@
</template>
<script>
import {claimList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {claimList} from "@/api/work/work";
import {getFlowRoute} from "@/util/func";
export default {
data() {
@ -127,7 +128,7 @@
};
},
computed: {
...mapGetters(["permission"]),
...mapGetters(["permission", "flowRoutes"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
@ -150,7 +151,7 @@
},
handleDetail(row) {
this.$router.push({path: `/work/process/${this.routes[row.category]}/detail?processInstanceId=${row.processInstanceId}&businessId=${row.businessId}`});
this.$router.push({ path: `/work/process/${getFlowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}` });
},
handleImage(row) {
this.flowUrl = `/api/blade-flow/process/diagram-view?processInstanceId=${row.processInstanceId}`;

@ -54,8 +54,9 @@
</template>
<script>
import {doneList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {doneList} from "@/api/work/work";
import {getFlowRoute} from "@/util/func";
export default {
data() {
@ -120,7 +121,7 @@
};
},
computed: {
...mapGetters(["permission"]),
...mapGetters(["permission", "flowRoutes"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
@ -140,7 +141,7 @@
this.selectionList = list;
},
handleDetail(row) {
this.$router.push({path: `/work/process/${this.routes[row.category]}/detail?processInstanceId=${row.processInstanceId}&businessId=${row.businessId}`});
this.$router.push({ path: `/work/process/${getFlowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}` });
},
handleImage(row) {
this.flowUrl = `/api/blade-flow/process/diagram-view?processInstanceId=${row.processInstanceId}`;

@ -5,16 +5,16 @@
</template>
<script>
import {leaveProcess} from "@/api/work/process";
export default {
data() {
return {
form: {
},
form: {},
option: {
group:[
group: [
{
icon:'el-icon-info',
icon: 'el-icon-info',
label: '请假基础信息',
prop: 'group1',
column: [
@ -27,7 +27,7 @@
label: "account",
value: "id"
},
span:24,
span: 24,
rules: [
{
required: true,
@ -40,6 +40,7 @@
label: '开始时间',
prop: 'startTime',
type: 'datetime',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rules: [
{
required: true,
@ -52,6 +53,7 @@
label: '结束时间',
prop: 'endTime',
type: 'datetime',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rules: [
{
required: true,
@ -64,7 +66,7 @@
label: '请假理由',
prop: 'reason',
type: 'textarea',
span:24,
span: 24,
rules: [
{
required: true,
@ -81,7 +83,20 @@
},
methods: {
handleSubmit() {
this.$message.success('当前数据' + JSON.stringify(this.form))
const params = {
processDefinitionId: this.$route.params.processDefinitionId,
...this.form,
};
leaveProcess(params).then(resp => {
const data = resp.data;
if (data.success) {
this.$message.success(data.msg);
this.$router.$avueRouter.closeTag();
this.$router.push({path: `/work/start`});
} else {
this.$message.error(data.msg || '提交失败');
}
});
}
}
}

@ -58,8 +58,9 @@
</template>
<script>
import {sendList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {sendList} from "@/api/work/work";
import {getFlowRoute} from "@/util/func";
export default {
data() {
@ -129,7 +130,7 @@
};
},
computed: {
...mapGetters(["permission"]),
...mapGetters(["permission", "flowRoutes"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
@ -149,7 +150,7 @@
this.selectionList = list;
},
handleDetail(row) {
this.$router.push({path: `/work/process/${this.routes[row.category]}/detail?processInstanceId=${row.processInstanceId}&businessId=${row.businessId}`});
this.$router.push({ path: `/work/process/${getFlowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}` });
},
handleImage(row) {
this.flowUrl = `/api/blade-flow/process/diagram-view?processInstanceId=${row.processInstanceId}`;

@ -62,16 +62,13 @@
</template>
<script>
import {startList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {startList} from "@/api/work/work";
import {getFlowRoute} from "@/util/func";
export default {
data() {
return {
routes: {
flow_1: 'leave',
flow_2: 'expense',
},
form: {},
selectionId: '',
selectionList: [],
@ -136,7 +133,7 @@
};
},
computed: {
...mapGetters(["permission"]),
...mapGetters(["permission", "flowRoutes"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
@ -156,7 +153,8 @@
this.selectionList = list;
},
handleStart(row) {
this.$router.push({ path: `/work/process/${this.routes[row.category]}/form?id=${row.id}` });
console.log(this.flowRoutes)
this.$router.push({path: `/work/process/${getFlowRoute(this.flowRoutes, row.category)}/form/${row.id}`});
},
handleImage(row) {
this.flowUrl = `/api/blade-flow/process/resource-view?processDefinitionId=${row.id}`;

@ -61,8 +61,9 @@
</template>
<script>
import {todoList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {todoList} from "@/api/work/work";
import {getFlowRoute} from "@/util/func";
export default {
data() {
@ -127,7 +128,7 @@
};
},
computed: {
...mapGetters(["permission"]),
...mapGetters(["permission", "flowRoutes"]),
ids() {
let ids = [];
this.selectionList.forEach(ele => {
@ -150,7 +151,7 @@
},
handleDetail(row) {
this.$router.push({ path: `/work/process/${this.routes[row.category]}/detail?processInstanceId=${row.processInstanceId}&businessId=${row.businessId}` });
this.$router.push({ path: `/work/process/${getFlowRoute(this.flowRoutes, row.category)}/detail/${row.processInstanceId}/${row.businessId}` });
},
handleImage(row) {
this.flowUrl = `/api/blade-flow/process/diagram-view?processInstanceId=${row.processInstanceId}`;

Loading…
Cancel
Save