Files
dvcp_v2_webapp/ui/lib/js/modules.js
2023-02-02 12:00:12 +08:00

341 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import http from "./request";
import utils from "./utils";
import Vue from "vue"
export const sys = {
state: () => ({
info: {},
theme: {},
location: {},
areaId: "",
areaName: ""
}),
mutations: {
setSysInfo(state, info) {
state.info = info
},
setTheme(state, theme) {
state.theme = theme
},
setLocation(state, location) {
state.location = location
},
setArea(state, area) {
state.areaId = area.areaId
state.areaName = area.areaName
}
},
actions: {
getSystem({commit}, info) {
return http.post("/app/appdvcpconfig/getSystemInfo", null, {withoutToken: true}).then(res => {
if (res?.data) {
let {systemInfo, colorScheme, enableGreyFilter, location, areaId, areaName} = res.data
systemInfo = JSON.parse(systemInfo || null) || {}
colorScheme = JSON.parse(colorScheme || null) || {}
commit("setSysInfo", {...info, ...systemInfo})
commit("setTheme", {colorScheme, enableGreyFilter})
commit("setLocation", location)
commit("setArea", {areaId, areaName})
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]))
},
setRoutes(state, routes) {
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: () => ({
closeIntro: [], pages: []
}),
mutations: {
addCloseIntro(state, app) {
state.closeIntro.push(app)
},
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)
},
clearAllPages(state) {
state.pages = []
},
clearOtherPages(state) {
const id = location.href?.replace(location.origin, "")
state.pages = state.pages.filter(e => e.id == id) || []
}
},
actions: {
closePage({commit}, id) {
return commit("deletePage", id)
}
}
}
/**
* 流程信息
*/
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
}