2022-11-29 18:27:14 +08:00
|
|
|
|
import http from "./request";
|
|
|
|
|
|
import utils from "./utils";
|
|
|
|
|
|
import Vue from "vue"
|
|
|
|
|
|
|
|
|
|
|
|
export const sys = {
|
|
|
|
|
|
state: () => ({
|
|
|
|
|
|
info: {},
|
2023-01-11 10:20:14 +08:00
|
|
|
|
theme: {},
|
|
|
|
|
|
location: {},
|
|
|
|
|
|
areaId: "",
|
|
|
|
|
|
areaName: ""
|
2022-11-29 18:27:14 +08:00
|
|
|
|
}),
|
|
|
|
|
|
mutations: {
|
|
|
|
|
|
setSysInfo(state, info) {
|
|
|
|
|
|
state.info = info
|
|
|
|
|
|
},
|
|
|
|
|
|
setTheme(state, theme) {
|
|
|
|
|
|
state.theme = theme
|
2023-01-11 10:20:14 +08:00
|
|
|
|
},
|
|
|
|
|
|
setLocation(state, location) {
|
|
|
|
|
|
state.location = location
|
|
|
|
|
|
},
|
|
|
|
|
|
setArea(state, area) {
|
|
|
|
|
|
state.areaId = area.areaId
|
|
|
|
|
|
state.areaName = area.areaName
|
2022-11-29 18:27:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
actions: {
|
|
|
|
|
|
getSystem({commit}, info) {
|
|
|
|
|
|
return http.post("/app/appdvcpconfig/getSystemInfo", null, {withoutToken: true}).then(res => {
|
|
|
|
|
|
if (res?.data) {
|
2023-01-11 10:20:14 +08:00
|
|
|
|
let {systemInfo, colorScheme, enableGreyFilter, location, areaId, areaName} = res.data
|
2022-11-29 18:27:14 +08:00
|
|
|
|
systemInfo = JSON.parse(systemInfo || null) || {}
|
|
|
|
|
|
colorScheme = JSON.parse(colorScheme || null) || {}
|
|
|
|
|
|
commit("setSysInfo", {...info, ...systemInfo})
|
|
|
|
|
|
commit("setTheme", {colorScheme, enableGreyFilter})
|
2023-01-11 10:20:14 +08:00
|
|
|
|
commit("setLocation", location)
|
|
|
|
|
|
commit("setArea", {areaId, areaName})
|
2022-11-29 18:27:14 +08:00
|
|
|
|
return res.data
|
|
|
|
|
|
} else return Promise.reject()
|
|
|
|
|
|
}).catch(() => commit("setSysInfo", info))
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 用户信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const user = {
|
|
|
|
|
|
state: () => ({
|
|
|
|
|
|
token: "",
|
|
|
|
|
|
info: {},
|
|
|
|
|
|
routes: []
|
|
|
|
|
|
}),
|
|
|
|
|
|
mutations: {
|
|
|
|
|
|
setToken(state, token) {
|
|
|
|
|
|
state.token = token;
|
|
|
|
|
|
},
|
|
|
|
|
|
setUserInfo(state, info) {
|
|
|
|
|
|
state.info = info
|
|
|
|
|
|
},
|
|
|
|
|
|
cleanUserInfo(state) {
|
|
|
|
|
|
state.info = {}
|
|
|
|
|
|
state.token = ""
|
|
|
|
|
|
},
|
|
|
|
|
|
setUserExtra(state, extra = {}) {
|
|
|
|
|
|
Object.keys(extra).map(e => Vue.set(state, e, extra[e]))
|
|
|
|
|
|
},
|
2023-01-11 10:20:14 +08:00
|
|
|
|
setRoutes(state, routes) {
|
2022-11-29 18:27:14 +08:00
|
|
|
|
state.routes = routes
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
actions: {
|
|
|
|
|
|
getToken({commit}, params) {
|
|
|
|
|
|
let action = "/auth/oauth/token"
|
|
|
|
|
|
if (params?.action) {
|
|
|
|
|
|
action = params?.action
|
|
|
|
|
|
delete params?.action
|
|
|
|
|
|
}
|
|
|
|
|
|
const password = utils.$encryption(params)
|
|
|
|
|
|
return http.post(action, null, {
|
|
|
|
|
|
auth: {
|
|
|
|
|
|
username: 'villcloud',
|
|
|
|
|
|
password: "villcloud"
|
|
|
|
|
|
},
|
|
|
|
|
|
params: {grant_type: 'password', scope: 'server', ...params, password}
|
|
|
|
|
|
}).then(res => {
|
|
|
|
|
|
if (res?.access_token) {
|
|
|
|
|
|
const {token_type, access_token} = res, token = [token_type, access_token].join(" ")
|
|
|
|
|
|
return commit('setToken', token)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
getUserInfo({commit, dispatch}) {
|
|
|
|
|
|
return http.post("/admin/user/detail-phone").then(res => {
|
|
|
|
|
|
if (res?.data) {
|
|
|
|
|
|
commit("setUserInfo", res.data)
|
|
|
|
|
|
return Promise.all([dispatch('getWorkflowConfigs')]).then(() => res.data)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
getRouteName({state}, appName) {
|
|
|
|
|
|
return state.routes.find(e => e.component == appName)?.route || appName
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 企微jssdk功能
|
|
|
|
|
|
*/
|
|
|
|
|
|
let timer = {injectJWeixin: null, initOpenData: null}
|
|
|
|
|
|
export const wxwork = {
|
|
|
|
|
|
state: () => ({
|
|
|
|
|
|
agentSignURL: "",
|
|
|
|
|
|
apiList: [],
|
|
|
|
|
|
config: {}
|
|
|
|
|
|
}),
|
|
|
|
|
|
mutations: {
|
|
|
|
|
|
setConfig(state, config) {
|
|
|
|
|
|
state.config = config
|
|
|
|
|
|
},
|
|
|
|
|
|
setAgentSignURL(state, url) {
|
|
|
|
|
|
state.agentSignURL = url
|
|
|
|
|
|
},
|
|
|
|
|
|
setApiList(state, list) {
|
|
|
|
|
|
state.apiList = list
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
actions: {
|
|
|
|
|
|
agentSign({state, commit, rootState}, params) {
|
|
|
|
|
|
//授权jssdk在url上使用,并获取corpId
|
|
|
|
|
|
let url = window.location.href
|
|
|
|
|
|
if (state.agentSignURL == url && state.config.corpId) {
|
|
|
|
|
|
return Promise.resolve()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
commit("setAgentSignURL", url)
|
|
|
|
|
|
commit("setApiList", [])
|
|
|
|
|
|
let action = "/app/wxcptp/portal/agentSign"
|
|
|
|
|
|
if (!!params?.action) {
|
|
|
|
|
|
action = params.action
|
|
|
|
|
|
delete params.action
|
|
|
|
|
|
}
|
|
|
|
|
|
const {corpId} = rootState.user.info
|
|
|
|
|
|
return http.post(action, null, {
|
|
|
|
|
|
withoutToken: true,
|
|
|
|
|
|
params: {corpId, ...params, url}
|
|
|
|
|
|
}).then(res => {
|
|
|
|
|
|
if (res?.data) {
|
|
|
|
|
|
let config = {
|
|
|
|
|
|
...params,
|
|
|
|
|
|
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
|
|
|
|
|
|
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
|
|
|
|
|
|
corpid: res.data.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
|
|
|
|
|
|
agentid: res.data.agentId, // 必填,企业微信的应用id (e.g. 1000247)
|
|
|
|
|
|
timestamp: Number(res.data.timestamp), // 必填,生成签名的时间戳
|
|
|
|
|
|
nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
|
|
|
|
|
|
signature: res.data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
|
|
|
|
|
|
...res.data
|
|
|
|
|
|
}
|
|
|
|
|
|
commit("setConfig", config)
|
|
|
|
|
|
return config
|
|
|
|
|
|
}
|
|
|
|
|
|
}).catch(err => {
|
|
|
|
|
|
commit("setAgentSignURL", "")
|
|
|
|
|
|
console.error(err)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
injectJWeixin({state, commit}, apis) {
|
|
|
|
|
|
const inject = (jsApiList) => new Promise((resolve, reject) => {
|
|
|
|
|
|
jsApiList = jsApiList || []
|
|
|
|
|
|
if (timer.injectJWeixin) {//节流设置,50ms内的多次请求合并到一处
|
|
|
|
|
|
clearTimeout(timer.injectJWeixin)
|
|
|
|
|
|
jsApiList = [...new Set([...state.apiList, ...jsApiList])]
|
|
|
|
|
|
commit("setApiList", jsApiList)
|
|
|
|
|
|
}
|
|
|
|
|
|
timer.injectJWeixin = setTimeout(() => {
|
|
|
|
|
|
const sdk = wx?.agentConfig ? wx : jWeixin
|
|
|
|
|
|
sdk?.agentConfig({
|
|
|
|
|
|
...state.config, jsApiList,
|
|
|
|
|
|
success: res => resolve(res),
|
|
|
|
|
|
fail: err => {
|
|
|
|
|
|
console.error(err)
|
|
|
|
|
|
reject(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}, 50)
|
|
|
|
|
|
})
|
|
|
|
|
|
return inject(apis)
|
|
|
|
|
|
},
|
|
|
|
|
|
initOpenData({dispatch, commit}, params = {}) {
|
|
|
|
|
|
const initWOD = (count = 0) => {
|
|
|
|
|
|
if (!!window?.WWOpenData) {
|
|
|
|
|
|
const canvas = params?.canvas
|
|
|
|
|
|
if (canvas) delete params.canvas
|
|
|
|
|
|
if (timer.initOpenData) {
|
|
|
|
|
|
clearTimeout(timer.initOpenData)
|
|
|
|
|
|
}
|
|
|
|
|
|
const init = () => canvas ? dispatch('initCanvas') : dispatch('bindElements')
|
|
|
|
|
|
timer.initOpenData = setTimeout(() => {
|
|
|
|
|
|
window?.WWOpenData?.checkSession({
|
|
|
|
|
|
success: () => init(),
|
|
|
|
|
|
fail: () => {
|
|
|
|
|
|
dispatch('agentSign', params).then(() => dispatch("injectJWeixin")).then(() => init())
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}, 50)
|
|
|
|
|
|
} else if (count > 10) {
|
|
|
|
|
|
console.log("无法获取WWOpenData")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
initWOD(++count)
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
dispatch('agentSign', params).then(() => dispatch("injectJWeixin")).then(() => initWOD())
|
|
|
|
|
|
},
|
|
|
|
|
|
bindElements() {
|
|
|
|
|
|
const nodes = document.querySelectorAll('.AiOpenData')
|
|
|
|
|
|
window.WWOpenData?.bindAll(nodes)
|
|
|
|
|
|
},
|
|
|
|
|
|
initCanvas() {
|
|
|
|
|
|
window.WWOpenData?.initCanvas()
|
|
|
|
|
|
},
|
|
|
|
|
|
transCanvas(store, items) {
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
window.WWOpenData?.prefetch({items}, (err, data) => {
|
|
|
|
|
|
err ? reject(err) : resolve(data)
|
|
|
|
|
|
})
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 各种前端方案记录选择
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const logs = {
|
|
|
|
|
|
state: () => ({
|
2023-01-30 14:41:19 +08:00
|
|
|
|
closeIntro: [], pages: []
|
2022-11-29 18:27:14 +08:00
|
|
|
|
}),
|
|
|
|
|
|
mutations: {
|
|
|
|
|
|
addCloseIntro(state, app) {
|
|
|
|
|
|
state.closeIntro.push(app)
|
2023-01-30 14:41:19 +08:00
|
|
|
|
},
|
|
|
|
|
|
addPage(state, page) {
|
|
|
|
|
|
const id = location.href?.replace(location.origin, "")
|
|
|
|
|
|
if (!state.pages.find(e => e.id == id || e.id == page.id)) {
|
|
|
|
|
|
state.pages.push({...page, id})
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
deletePage(state, id) {
|
|
|
|
|
|
id = id || location.href?.replace(location.origin, "")
|
|
|
|
|
|
const i = state.pages.findIndex(e => e.id == id)
|
|
|
|
|
|
i > -1 && state.pages.splice(i, 1)
|
|
|
|
|
|
},
|
2023-02-02 12:00:12 +08:00
|
|
|
|
clearAllPages(state) {
|
|
|
|
|
|
state.pages = []
|
|
|
|
|
|
},
|
|
|
|
|
|
clearOtherPages(state) {
|
|
|
|
|
|
const id = location.href?.replace(location.origin, "")
|
|
|
|
|
|
state.pages = state.pages.filter(e => e.id == id) || []
|
2023-03-01 10:14:41 +08:00
|
|
|
|
},
|
|
|
|
|
|
setPageTitle(state, title) {
|
|
|
|
|
|
const id = location.href?.replace(location.origin, "")
|
|
|
|
|
|
state.pages.map(e => {
|
|
|
|
|
|
if (e.id == id) {
|
|
|
|
|
|
e.label = title
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2023-02-02 12:00:12 +08:00
|
|
|
|
}
|
2022-11-29 18:27:14 +08:00
|
|
|
|
},
|
2023-01-30 14:41:19 +08:00
|
|
|
|
actions: {
|
|
|
|
|
|
closePage({commit}, id) {
|
|
|
|
|
|
return commit("deletePage", id)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-11-29 18:27:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 流程信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
const startProcess = (form) => {
|
|
|
|
|
|
const {bid, app, flows = {}} = form
|
|
|
|
|
|
const process = flows[app]
|
|
|
|
|
|
if (!!process) {
|
|
|
|
|
|
const {id: pid, config} = process
|
|
|
|
|
|
let workflowConfig = JSON.parse(config || null), nowNodeId = [], startId
|
|
|
|
|
|
workflowConfig?.nodes?.map(e => {
|
|
|
|
|
|
if (e.type == "start") {
|
|
|
|
|
|
e.properties.isStart = true
|
|
|
|
|
|
e.properties.updateTime = utils.$moment().format("YYYY-MM-DD HH:mm:ss")
|
|
|
|
|
|
startId = e.id
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
workflowConfig?.edges?.map(e => {
|
|
|
|
|
|
if (e.sourceNodeId == startId) {
|
|
|
|
|
|
nowNodeId.push(e.targetNodeId)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
nowNodeId = nowNodeId?.toString()
|
|
|
|
|
|
return !!nowNodeId && http.post("/app/appworkflowlog/addOrUpdate", {bid, pid, nowNodeId, workflowConfig: JSON.stringify(workflowConfig)})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
export const workflow = {
|
|
|
|
|
|
state: () => ({}),
|
|
|
|
|
|
mutations: {
|
|
|
|
|
|
setWfConfigs(state, configs) {
|
|
|
|
|
|
configs.map(e => {
|
|
|
|
|
|
Vue.set(state, e.app, e)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
actions: {
|
|
|
|
|
|
getWorkflowConfigs({commit}) {
|
|
|
|
|
|
return http.post("/app/appworkflowmanage/list", null, {
|
|
|
|
|
|
params: {size: 999}
|
|
|
|
|
|
}).then(res => {
|
|
|
|
|
|
if (res?.data) {
|
|
|
|
|
|
return commit("setWfConfigs", res.data.records)
|
|
|
|
|
|
}
|
|
|
|
|
|
}).catch(() => 0)
|
|
|
|
|
|
},
|
|
|
|
|
|
startFlow(context, form) {
|
|
|
|
|
|
startProcess(form)
|
|
|
|
|
|
},
|
|
|
|
|
|
endFlow(context, form) {
|
|
|
|
|
|
let {workflowConfig = {}, nowNodeId} = form
|
|
|
|
|
|
workflowConfig?.nodes?.map(e => {
|
|
|
|
|
|
if (e.type == "end") {
|
|
|
|
|
|
e.properties.isFinished = true
|
|
|
|
|
|
e.properties.updateTime = utils.$moment().format("YYYY-MM-DD HH:mm:ss")
|
|
|
|
|
|
nowNodeId = "nowNodeId"
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
return http.post("/app/appworkflowlog/addOrUpdate", {...form, nowNodeId, workflowConfig: JSON.stringify(workflowConfig)})
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
processAdapter(config) {//流程业务拦截器
|
|
|
|
|
|
if (/addOrUpdate/.test(config.url)) {
|
|
|
|
|
|
let app = config.url.replace(/.+(app[^\\\/]+).+/g, '$1')
|
|
|
|
|
|
if (/appapplicationinfo/.test(app)) {//动态台账表单
|
|
|
|
|
|
app = config.params?.appId
|
|
|
|
|
|
} else if (/appcontentinfo/.test(app)) {//内容发布
|
|
|
|
|
|
app = config.data?.moduleId
|
|
|
|
|
|
}
|
|
|
|
|
|
config.workflow = app
|
|
|
|
|
|
}
|
|
|
|
|
|
return config
|
|
|
|
|
|
},
|
|
|
|
|
|
startProcess
|
|
|
|
|
|
}
|