-
-
- 模型模板对照
+
+
+
@@ -35,97 +21,109 @@
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/ScrollPane.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 00000000..e8d682bd
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/index.vue
new file mode 100644
index 00000000..487d00a1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/TagsView/index.vue
@@ -0,0 +1,333 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/index.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/index.js
new file mode 100644
index 00000000..686faf6f
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/components/index.js
@@ -0,0 +1,4 @@
+export { default as Navbar } from './Navbar'
+export { default as Sidebar } from './Sidebar'
+export { default as AppMain } from './AppMain'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/index.vue
new file mode 100644
index 00000000..f3c6584a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/index.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/mixin/ResizeHandler.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/mixin/ResizeHandler.js
new file mode 100644
index 00000000..e8d0df8c
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/layout/mixin/ResizeHandler.js
@@ -0,0 +1,45 @@
+import store from '@/store'
+
+const { body } = document
+const WIDTH = 992 // refer to Bootstrap's responsive design
+
+export default {
+ watch: {
+ $route(route) {
+ if (this.device === 'mobile' && this.sidebar.opened) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: false })
+ }
+ }
+ },
+ beforeMount() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ beforeDestroy() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ mounted() {
+ const isMobile = this.$_isMobile()
+ if (isMobile) {
+ store.dispatch('app/toggleDevice', 'mobile')
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_isMobile() {
+ const rect = body.getBoundingClientRect()
+ return rect.width - 1 < WIDTH
+ },
+ $_resizeHandler() {
+ if (!document.hidden) {
+ const isMobile = this.$_isMobile()
+ store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
+
+ if (isMobile) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ }
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/main.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/main.js
new file mode 100644
index 00000000..597415c5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/main.js
@@ -0,0 +1,130 @@
+import 'babel-polyfill'
+import Vue from 'vue'
+import 'normalize.css/normalize.css' // A modern alternative to CSS resets
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+import '@/styles/index.scss' // global css
+import App from './App'
+import store from './store'
+import router from './router'
+
+import '@/icons' // 引入icon文件夹下所有的svg
+// 全局自定义组件
+import Pagination from '@/components/pagination/index.vue'
+import tabsearch from '@/components/tab-search/index.vue'
+import eimage from '@/components/E-image/index.vue'
+import moment from 'moment'
+import Print from '@/utils/print' // 引入附件的js文件
+import request from '@/utils/request'
+import { setDefaultOrgPath, setDefaultOrgPathName, setStorage } from './utils/auth.js'
+import VueAMap from 'vue-amap'
+
+Vue.use(ElementUI)
+
+// import '@/permission' //权限控制
+
+Vue.prototype.$userInfo = null // 用户信息
+Vue.component('Pagination', Pagination)
+Vue.component('tab-search', tabsearch)
+Vue.component('eimage', eimage)
+Vue.prototype.moment = moment
+Vue.filter('dateFormat', function(dateStr, pattern = 'YYYY-MM-DD') {
+ return moment(dateStr).format(pattern)
+})
+Vue.use(Print) // 注册
+
+Vue.use(VueAMap)
+VueAMap.initAMapApiLoader({
+ key: 'ccda12d8bffc72e9f1a32c599323a876', // 此处的key,在高德开放平台申请
+ plugin: ['AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.Geocoder'], // 此处的插件按需添加
+ v: '1.4.4',
+ uiVersion: '1.0'
+})
+
+Vue.config.productionTip = false
+
+// let token = null
+// token = GetQueryString('token')
+// if (token) {
+// setStorage(token)
+// const href = window.location.href
+// // href = href.split(`token=${token}`)[0]
+// // window.location.href = href.slice(0, href.length - 1)
+// }
+
+var one = window.location.href.indexOf('&organizationData') + 18
+if (parseInt(one) > 18) {
+ const data = window.location.href.substr(one) // url解码unescape()已从web中移除,尽量不使用
+ var data1 = decodeURIComponent(data)
+ if (data1 !== undefined) {
+ const obj = JSON.parse(data1)
+ setDefaultOrgPath(obj.defaultOrgPath)
+ setDefaultOrgPathName(obj.defaultOrgPathName)
+ }
+}
+
+// // 获取登录用户信息
+function getUserInfo() {
+// return request({
+// baseURL: '/api',
+// url: '/portal/v1/sysuser/loginDetails',
+// method: 'post',
+// headers: {
+// 'Content-Type': 'application/json'
+// }
+// }).then(rep => {
+// const data = rep.data
+// const user = {
+// roleSid: data.roleSid,
+// name: data.name,
+// userName: data.userName,
+// departmentName: data.departmentName, // 部门名称
+// departmentSid: data.departmentSid, // 部门sid
+// isAdmin: data.isAdmin,
+// staffSid: data.staffSid, // 业务员sid
+// userSid: data.sid,
+// orgSid: data.organizationSid, // 单位sid
+// Orgname: data.organizationName,
+// dwjb: data.dwjb,
+// orgNamePath: data.orgNamePath, // 使用组织全路径名称
+// orgSidPath: data.orgSidPath // 使用组织全路径Sid
+// }
+// // 结果存入缓存
+// window.sessionStorage.setItem('staffSid', user.staffSid)
+// window.sessionStorage.setItem('userSid', user.userSid)
+// window.sessionStorage.setItem('Orgname', user.Orgname)
+// window.sessionStorage.setItem('orgSid', user.orgSid)
+// window.sessionStorage.setItem('departmentName', user.departmentName)
+// window.sessionStorage.setItem('name', user.name)
+// window.sessionStorage.setItem('user', user)
+// window.sessionStorage.setItem('departmentName', user.departmentName)
+// window.sessionStorage.setItem('departmentSid', user.departmentSid)
+// window.sessionStorage.setItem('orgNamePath', user.orgNamePath)
+// window.sessionStorage.setItem('orgSidPath', user.orgSidPath)
+ new Vue({
+ el: '#app',
+ router,
+ store,
+ render: h => h(App)
+ })
+ // })
+}
+
+getUserInfo()
+// function GetQueryString(name) {
+// var one = window.location.href.indexOf('?token=') + 7
+// if (one < 7) { return null }
+// var two = window.location.href.lastIndexOf('&') // + 1
+// var data = window.location.href.substr(one)
+// if (two > one) {
+// data = window.location.href.slice(one, two)
+// console.log('token', data)
+// }
+// if (data) {
+// return data
+// }
+// return null
+ // var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
+ // var r = window.location.search.substr(1).match(reg)
+ // if (r != null) return unescape(r[2]); return null
+// }
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/permission.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/permission.js
new file mode 100644
index 00000000..d9ee6a5d
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/permission.js
@@ -0,0 +1,39 @@
+import router from './router'
+import store from './store'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import getPageTitle from '@/utils/get-page-title'
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
+
+import { getRoleRouter } from '@/router/modules/components.js'
+
+const whiteList = ['/login', '/registUser', '/registOrg'] // no redirect whitelist
+
+router.beforeEach(async(to, from, next) => {
+ // start progress bar
+ NProgress.start()
+ // set page title
+ document.title = getPageTitle(to.meta.title)
+ // determine whether the user has logged in
+//const hasToken = getStorage()
+ const hasToken = window.sessionStorage.getItem('token')
+ if (hasToken) {
+ const userInfo = store.getters.userInfo
+ if (userInfo) {
+ next()
+ NProgress.done()
+ } else {
+ await store.dispatch('user/getInfo')
+ let userRoles = await getRoleRouter(store.getters.userInfo.userSid)
+ router.options.routes = userRoles
+ router.addRoutes(userRoles) // 动态添加可访问路由表
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace:
+ }
+ } else {
+ window.location.href = process.env.VUE_APP_URL
+ }
+})
+router.afterEach(() => {
+ // finish progress bar
+ NProgress.done()
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/router/index.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/router/index.js
new file mode 100644
index 00000000..6e106798
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/router/index.js
@@ -0,0 +1,171 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+/* Layout */
+import Layout from '@/layout'
+/* 所有角色可以访问/没有权限要求的基页 */
+
+import codemenu from './modules/codemenu'
+
+export const constantRoutes = [
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [{
+ path: '/redirect/:path(.*)',
+ component: () => import('@/views/redirect/index.vue')
+ }]
+ },
+ {
+ path: '/',
+ redirect: 'index'
+ }, {
+ path: '/login',
+ component: () => import('@/views/login/login.vue')
+ }, {
+ path: '/home',
+ component: () => import('@/views/Home/Home.vue'),
+ name: 'home'
+
+ }, {
+ path: '/index',
+ component: Layout,
+ redirect: '/index',
+ children: [{
+ path: '/index',
+ component: () =>
+ import('@/views/index.vue'),
+ name: 'index',
+ meta: {
+ title: '主页',
+ noCache: true,
+ affix: true
+ }
+ }]
+ },
+ {
+ path: '/inquireStatistics',
+ component: Layout,
+ redirect: '/inquireStatistics',
+ children: [{
+ path: '/inquireStatistics/index',
+ component: () => import('@/views/inquireStatistics/index.vue'),
+ name: 'index',
+ meta: {
+ title: '查询与统计',
+ noCache: true
+ }
+ }]
+ }, {
+ path: '/essentialData',
+ component: Layout,
+ redirect: '/essentialData/GroupMessage',
+ meta: {
+ title: '基础数据'
+ },
+ children: [
+ {
+ path: '/essentialData/BrandMessage',
+ component: () => import('@/views/essentialData/BrandMessage.vue'),
+ name: 'BrandMessage',
+ meta: {
+ title: '品牌信息',
+ noCache: true
+ }
+ },
+ {
+ path: '/essentialData/CuisineMessage',
+ component: () => import('@/views/essentialData/CuisineMessage.vue'),
+ name: 'CuisineMessage',
+ meta: {
+ title: '菜品信息',
+ noCache: true
+ }
+ },
+ {
+ path: '/essentialData/GroupMessage',
+ component: () => import('@/views/essentialData/GroupMessage.vue'),
+ name: 'GroupMessage',
+ meta: {
+ title: '集团信息',
+ noCache: true
+ }
+ },
+ {
+ path: '/essentialData/MaterialMessage',
+ component: () => import('@/views/essentialData/MaterialMessage.vue'),
+ name: 'MaterialMessage',
+ meta: {
+ title: '物料信息',
+ noCache: true
+ }
+ },
+ {
+ path: '/essentialData/ShopMessage',
+ component: () => import('@/views/essentialData/ShopMessage.vue'),
+ name: 'ShopMessage',
+ meta: {
+ title: '门店信息',
+ noCache: true
+ }
+ },
+ ]
+ }, {
+ path: '/parameterSet',
+ component: Layout,
+ redirect: '/parameterSet/dataSet',
+ meta: {
+ title: '参数设置'
+ },
+ children: [
+ {
+ path: '/parameterSet/dataSet',
+ component: () => import('@/views/parameterSet/dataSet.vue'),
+ name: 'dataSet',
+ meta: {
+ title: '定时采集数据设置',
+ noCache: true
+ }
+ },
+ {
+ path: '/parameterSet/footSet',
+ component: () => import('@/views/parameterSet/footSet.vue'),
+ name: 'footSet',
+ meta: {
+ title: '食材消耗比(成本占比)设置',
+ noCache: true
+ }
+ },
+ ]
+ },
+ ...codemenu,
+ {
+ path: '/404',
+ component: () =>
+ import('@/views/404'),
+ hidden: true
+ }
+ // 404 page must be placed at the end !!!
+ // { path: '*', redirect: '/404', hidden: true }
+]
+
+const createRouter = () => new Router({
+ // mode: 'history', // require service support
+ scrollBehavior: () => ({
+ y: 0
+ }),
+ routes: constantRoutes
+})
+
+const router = createRouter()
+
+// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
+export function resetRouter() {
+ const newRouter = createRouter()
+ router.matcher = newRouter.matcher // reset router
+}
+
+export default router
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/settings.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/settings.js
new file mode 100644
index 00000000..adef8a7c
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/settings.js
@@ -0,0 +1,16 @@
+module.exports = {
+
+ title: '汇融云眼贷后监管平台',
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether fix the header
+ */
+ fixedHeader: false,
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether show the logo in sidebar
+ */
+ sidebarLogo: false
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/getters.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/getters.js
new file mode 100644
index 00000000..eb3a1200
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/getters.js
@@ -0,0 +1,4 @@
+const getters = {
+ orgSid: state => state.user.orgSid
+}
+export default getters
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/index.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/index.js
new file mode 100644
index 00000000..4a2159a1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/index.js
@@ -0,0 +1,36 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+// https://webpack.js.org/guides/dependency-management/#requirecontext
+const modulesFiles = require.context('./modules', true, /\.js$/)
+
+// you do not need `import app from './modules/app'`
+// it will auto require all vuex module from modules file
+const modules = modulesFiles.keys().reduce((modules, modulePath) => {
+ // set './app.js' => 'app'
+ const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
+ const value = modulesFiles(modulePath)
+ modules[moduleName] = value.default
+ return modules
+}, {})
+
+const store = new Vuex.Store({
+ state: {
+ counter: 0,
+ distributionSid: ''
+
+ },
+ mutations: {
+
+ },
+ actions: {
+
+ },
+ modules,
+ getters,
+})
+
+export default store
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/app.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/app.js
new file mode 100644
index 00000000..45d89bb9
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/app.js
@@ -0,0 +1,56 @@
+import Cookies from 'js-cookie'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ state.sidebar.opened = !state.sidebar.opened
+ state.sidebar.withoutAnimation = false
+ if (state.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
+ Cookies.set('sidebarStatus', 0)
+ state.sidebar.opened = false
+ state.sidebar.withoutAnimation = withoutAnimation
+ },
+ TOGGLE_DEVICE: (state, device) => {
+ state.device = device
+ },
+ SET_SIZE: (state, size) => {
+ state.size = size
+ Cookies.set('size', size)
+ }
+}
+
+const actions = {
+ toggleSideBar({ commit }) {
+ commit('TOGGLE_SIDEBAR')
+ },
+ closeSideBar({ commit }, { withoutAnimation }) {
+ commit('CLOSE_SIDEBAR', withoutAnimation)
+ },
+ toggleDevice({ commit }, device) {
+ commit('TOGGLE_DEVICE', device)
+ },
+ setSize({ commit }, size) {
+ commit('SET_SIZE', size)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/errorLog.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/errorLog.js
new file mode 100644
index 00000000..6b01f957
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/errorLog.js
@@ -0,0 +1,28 @@
+const state = {
+ logs: []
+}
+
+const mutations = {
+ ADD_ERROR_LOG: (state, log) => {
+ state.logs.push(log)
+ },
+ CLEAR_ERROR_LOG: (state) => {
+ state.logs.splice(0)
+ }
+}
+
+const actions = {
+ addErrorLog({ commit }, log) {
+ commit('ADD_ERROR_LOG', log)
+ },
+ clearErrorLog({ commit }) {
+ commit('CLEAR_ERROR_LOG')
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/permission.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/permission.js
new file mode 100644
index 00000000..d56d1ba3
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/permission.js
@@ -0,0 +1,69 @@
+import { asyncRoutes, constantRoutes } from '@/router' //
+
+/**
+ * Use meta.role to determine if the current user has permission
+ * @param roles
+ * @param route
+ */
+function hasPermission(roles, route) {
+ if (route.meta && route.meta.roles) {
+ return roles.some(role => route.meta.roles.includes(role))
+ } else {
+ return true
+ }
+}
+
+/**
+ * Filter asynchronous routing tables by recursion
+ * @param routes asyncRoutes
+ * @param roles
+ */
+export function filterAsyncRoutes(routes, roles) {
+ const res = []
+
+ routes.forEach(route => {
+ const tmp = { ...route }
+ if (hasPermission(roles, tmp)) {
+ if (tmp.children) {
+ tmp.children = filterAsyncRoutes(tmp.children, roles)
+ }
+ res.push(tmp)
+ }
+ })
+
+ return res
+}
+
+const state = {
+ routes: [],
+ addRoutes: []
+}
+
+const mutations = {
+ SET_ROUTES: (state, routes) => {
+ state.addRoutes = routes
+ state.routes = constantRoutes.concat(routes)
+ }
+}
+
+const actions = {
+ generateRoutes({ commit }, roles) {
+ return new Promise(resolve => {
+ let accessedRoutes
+ if (roles.includes('admin')) {
+ accessedRoutes = asyncRoutes || []
+ } else {
+ accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
+ }
+ commit('SET_ROUTES', accessedRoutes)
+ resolve(accessedRoutes)
+ })
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/settings.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/settings.js
new file mode 100644
index 00000000..110533f7
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/settings.js
@@ -0,0 +1,35 @@
+import variables from '@/styles/element-variables.scss'
+import defaultSettings from '@/settings'
+
+const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
+
+const state = {
+ theme: variables.theme,
+ showSettings: showSettings,
+ tagsView: tagsView,
+ fixedHeader: fixedHeader,
+ sidebarLogo: sidebarLogo
+}
+
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ // eslint-disable-next-line no-prototype-builtins
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/tagsView.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/tagsView.js
new file mode 100644
index 00000000..57e72421
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/tagsView.js
@@ -0,0 +1,160 @@
+const state = {
+ visitedViews: [],
+ cachedViews: []
+}
+
+const mutations = {
+ ADD_VISITED_VIEW: (state, view) => {
+ if (state.visitedViews.some(v => v.path === view.path)) return
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ ADD_CACHED_VIEW: (state, view) => {
+ if (state.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ state.cachedViews.push(view.name)
+ }
+ },
+
+ DEL_VISITED_VIEW: (state, view) => {
+ for (const [i, v] of state.visitedViews.entries()) {
+ if (v.path === view.path) {
+ state.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ DEL_CACHED_VIEW: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ index > -1 && state.cachedViews.splice(index, 1)
+ },
+
+ DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+ state.visitedViews = state.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ },
+ DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
+ } else {
+ // if index = -1, there is no cached tags
+ state.cachedViews = []
+ }
+ },
+
+ DEL_ALL_VISITED_VIEWS: state => {
+ // keep affix tags
+ const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+ state.visitedViews = affixTags
+ },
+ DEL_ALL_CACHED_VIEWS: state => {
+ state.cachedViews = []
+ },
+
+ UPDATE_VISITED_VIEW: (state, view) => {
+ for (let v of state.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ }
+}
+
+const actions = {
+ addView({ dispatch }, view) {
+ dispatch('addVisitedView', view)
+ dispatch('addCachedView', view)
+ },
+ addVisitedView({ commit }, view) {
+ commit('ADD_VISITED_VIEW', view)
+ },
+ addCachedView({ commit }, view) {
+ commit('ADD_CACHED_VIEW', view)
+ },
+
+ delView({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delVisitedView', view)
+ dispatch('delCachedView', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delVisitedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_VISITED_VIEW', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delCachedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_CACHED_VIEW', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delOthersViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delOthersVisitedViews', view)
+ dispatch('delOthersCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_VISITED_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delOthersCachedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_CACHED_VIEWS', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delAllViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delAllVisitedViews', view)
+ dispatch('delAllCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_VISITED_VIEWS')
+ resolve([...state.visitedViews])
+ })
+ },
+ delAllCachedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_CACHED_VIEWS')
+ resolve([...state.cachedViews])
+ })
+ },
+
+ updateVisitedView({ commit }, view) {
+ commit('UPDATE_VISITED_VIEW', view)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user.js
new file mode 100644
index 00000000..265a757a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user.js
@@ -0,0 +1,17 @@
+const user = {
+ state:{
+ orgSid: ''
+ },
+ mutations: {
+ setOrgSid: (state, orgSid) => {
+ state.orgSid = orgSid
+ }
+ },
+ actions: {
+ commitOrgSid({commit}, orgSid) {
+ commit('setOrgSid', orgSid)
+ }
+ }
+}
+
+export default user
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user1.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user1.js
new file mode 100644
index 00000000..e00ca0a5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/store/modules/user1.js
@@ -0,0 +1,150 @@
+import { login, logout, getInfo } from '@/api/user'
+import { getStorage, setStorage, removeStorage } from '@/utils/auth'
+
+import router, { resetRouter } from '@/router'
+
+const state = {
+ token: getStorage(),
+ userInfo: '',
+ menus: '',
+}
+
+const mutations = {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_UESRINFO: (state, userInfo) => {
+ state.userInfo = userInfo
+ },
+ SET_MENUS: (state, menus) => {
+ state.menus = menus
+ }
+}
+
+const actions = {
+ // user login
+ login({ commit }, userInfo) {
+ return new Promise((resolve, reject) => {
+ login(userInfo).then(response => {
+ const { data } = response
+ commit('SET_TOKEN', data.token)
+ setStorage(data.token)
+ let user = {
+ roleSid: data.roleSid,
+ name: data.name,
+ userName: data.userName,
+ departmentName: data.departmentName,
+ isAdmin: data.isAdmin,
+ staffSid: data.staffSid,
+ userSid: data.sid,
+ orgSid: data.organizationSid,
+ Orgname: data.organizationName,
+ dwjb: data.dwjb
+ }
+ commit('SET_UESRINFO', user)
+ window.sessionStorage.setItem('userSid', user.userSid);
+ window.sessionStorage.setItem('Orgname', user.Orgname);
+ window.sessionStorage.setItem('departmentName', user.departmentName);
+ window.sessionStorage.setItem('name', user.name);
+ resolve(data)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // get user info
+ getInfo({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(response => {
+ const { data } = response
+ if (!data) {
+ removeStorage()
+ reject('Verification failed, please Login again.')
+ }
+ let user = {
+ roleSid: data.roleSid,
+ name: data.name,
+ userName: data.userName,
+ orgRoleName: data.orgRoleName,
+ isAdmin: data.isAdmin,
+ staffSid: data.staffSid,
+ userSid: data.sid,
+ orgSid: data.organizationSid,
+ Orgname: data.organizationName,
+ dwjb: data.dwjb
+ }
+ commit('SET_UESRINFO', user)
+ resolve(data)
+ }).catch(error => {
+ removeStorage()
+ router.push({path: '/'})
+ // reject(error)
+ })
+ })
+ },
+
+ getMenus({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(response => {
+ const { data } = response
+ commit('SET_UESRINFO', user)
+ resolve(data)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // user logout
+ logout({ commit, state, dispatch }) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then(() => {
+ commit('SET_TOKEN', '')
+ commit('SET_UESRINFO', '')
+ removeStorage()
+ resetRouter()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // remove token
+ // resetToken({ commit }) {
+ // return new Promise(resolve => {
+ // commit('SET_TOKEN', '')
+ // commit('SET_ROLES', [])
+ // removeToken()
+ // resolve()
+ // })
+ // },
+
+ // dynamically modify permissions
+ // async changeRoles({ commit, dispatch }, role) {
+ // const token = role + '-token'
+
+ // commit('SET_TOKEN', token)
+ // setToken(token)
+
+ // const { roles } = await dispatch('getInfo')
+
+ // resetRouter()
+
+ // // generate accessible routes map based on roles
+ // const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
+ // // dynamically add accessible routes
+ // router.addRoutes(accessRoutes)
+
+ // // reset visited views and cached views
+ // dispatch('tagsView/delAllViews', null, { root: true })
+ // }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-row.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-row.scss
new file mode 100644
index 00000000..899a4da6
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-row.scss
@@ -0,0 +1,291 @@
+//finginvoiceapply添加部分
+.invoiceform {
+ .topline {
+ margin-bottom: 16px;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+
+ .el-form-item {
+ margin-bottom: 0 !important;
+
+ .el-form-item__content {
+ margin-left: 0 !important;
+
+ .el-input {
+ width: 120% !important;
+ }
+ }
+ }
+
+ .el-input__inner {
+ border-style: none;
+ text-align: center;
+ }
+ }
+
+ //第一行
+ .lineone {
+ border-bottom: 2px solid #e0e3eb;
+ }
+
+ .invoiceadd {
+ margin: 22px 28px;
+ border-top: 2px solid #e0e3eb;
+
+ .el-form-item__label {
+ width: auto !important;
+ }
+
+ .el-row {
+ height: 40px;
+ border-left: 2px solid #e0e3eb;
+
+ .addlabel {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+ display: flex;
+ flex-direction: row-reverse;
+ }
+ }
+
+ .addinput {
+ height: 100%;
+ padding: 0 40px 0 10px;
+ border-right: 2px solid #e0e3eb !important;
+ border-bottom: 2px solid #e0e3eb !important;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+
+ .el-form-item__content {
+ width: 100%;
+ height: 100%;
+ line-height: 38px;
+ margin: 0 !important;
+
+ .el-input {
+ width: 100%;
+ height: 100%;
+
+ .el-input__inner {
+ height: 33px;
+ }
+ }
+
+ .el-select {
+ width: 100% !important;
+ }
+ }
+ }
+ }
+
+ .addlabelTwo {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+ display: flex;
+ flex-direction: row-reverse;
+ }
+ }
+
+ .addlabelThree {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+ text-align: center;
+ line-height: 40px;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ line-height: 40px;
+ text-align: center;
+ }
+
+ .el-form-item__label {
+ padding: 0 !important;
+ }
+ }
+
+ .addlabelFour {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+ line-height: 40px;
+ padding: 0 10px;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+
+ .el-form-item__content {
+ margin-left: 5px !important;
+ }
+ }
+ }
+
+ .addinputRadio {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+ line-height: 40px;
+ padding: 0 10px;
+ }
+
+ .lastchild {
+ border-bottom: 2px solid #e0e3eb;
+ }
+
+ }
+
+ }
+}
+
+.tabletitle {
+ height: 40px;
+ width: 100%;
+ padding: 0 10px;
+ background: #018ad2;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ color: white;
+
+ .el-button--primary {
+ background: #0476aa;
+ }
+
+}
+
+//finreceipt添加部分
+.receiptadd {
+
+ .topline {
+ margin-bottom: 16px;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+
+ .el-form-item {
+ margin-bottom: 0 !important;
+
+ .el-form-item__content {
+ margin-left: 0 !important;
+
+ .el-input {
+ width: 120% !important;
+ }
+ }
+ }
+
+ .el-input__inner {
+ border-style: none;
+ text-align: center;
+ }
+ }
+
+ //第一行
+ .lineone {
+ border-bottom: 2px solid #e0e3eb;
+ }
+
+ //中间的部分
+ .linetwo, .linethree {
+ .el-col-24 {
+ border-bottom: 2px solid #e0e3eb;
+ }
+
+ .grid-content {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: flex-start;
+ }
+ }
+
+ .linetwo {
+ .el-col {
+ padding: 0 32px;
+ }
+ }
+}
+
+.tabletitle .addbtn {
+ width: 84px;
+ background: #0476aa;
+ border: 0;
+ outline: none;
+ padding: 9px 12px;
+ color: #ffffff;
+ font-size: 14px;
+ border-radius: 3px;
+ cursor: pointer;
+}
+
+.tabletitle .addbtn:hover {
+ border-color: #0476aa;
+ background-color: #34a1db;
+}
+
+.tableTotal {
+ padding: 20px 0;
+ font-weight: bold;
+ font-size: 14px;
+}
+
+.tableinput .el-input__inner {
+ border-style: none;
+ text-align: center;
+}
+
+.inforow {
+ height: 120px !important;
+
+ .el-form-item {
+ height: 100%;
+ margin-bottom: 0;
+ display: flex;
+ flex-direction: row-reverse;
+ align-items: center;
+ }
+
+ .infocol {
+ height: 100%;
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+
+ .collineone, .collinetwo {
+ margin-left: 10px;
+ }
+
+ .collineone, .collinetwo {
+ display: flex;
+ flex-direction: row;
+ }
+ }
+}
+
+.blockone, .blocktwo, .blockfour, .blockfive {
+ min-width: 142px;
+}
+
+.blockthree, .blocksix {
+ min-width: 266px;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-table.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-table.scss
new file mode 100644
index 00000000..dcd63759
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/e-table.scss
@@ -0,0 +1,40 @@
+.e-table {
+ width: 100%;
+ padding: 0 30px;
+
+ tr:first-child th {
+ background-color: #c1f4cd;
+ }
+
+ tr {
+ td {
+ border: 1px solid #e6e9f0;
+ border-right: 0;
+ border-bottom: 0;
+ padding: 10px 20px;
+ }
+
+ td:last-child {
+ border-right: 1px solid #e6e9f0;
+ }
+ }
+
+ tr:last-child {
+ td {
+ border-bottom: 1px solid #e6e9f0;
+ }
+ }
+
+ td:nth-child(2n-1) {
+ text-align: right;
+ }
+
+ td:nth-child(2n) {
+ text-align: left;
+ }
+}
+
+.tableinput .el-input__inner {
+ border-style: none;
+ text-align: center;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-form.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-form.scss
new file mode 100644
index 00000000..73288e11
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-form.scss
@@ -0,0 +1,67 @@
+.listconadd .title {
+ text-align: center;
+ font-size: 28px;
+ //line-height: 90px;
+}
+
+.listaddtop {
+ padding: 0 212px;
+ border-bottom: 2px solid #e0e3eb;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ line-height: 34px;
+
+ span {
+ padding: 0 15px;
+ }
+}
+
+.listconadd .demo-ruleForm {
+ padding: 22px 28px;
+}
+
+.el-collapse-item__header {
+ .el-icon-arrow-right:before {
+ content: "";
+ font-size: 20px;
+ }
+}
+
+.demo-ruleForm table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 2px solid #e0e3eb;
+ border-spacing: 0;
+ //text-align: right;
+ td {
+ border-right: 2px solid #e0e3eb;
+ border-bottom: 2px solid #e0e3eb;
+ border-top: 2px solid #e0e3eb;
+ }
+
+ tr {
+ height: 40px;
+ }
+
+ .el-form-item {
+ display: inline-block;
+ }
+
+ .el-input {
+ display: inline-block;
+ }
+}
+
+.tleftb {
+ text-align: right;
+ font-size: 14px;
+ color: #606266;
+ line-height: 40px !important;
+ font-weight: 600;
+}
+
+.icon {
+ color: #e84026;
+ margin-right: 4px;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-search.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-search.scss
new file mode 100644
index 00000000..e6a18fbe
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/el-search.scss
@@ -0,0 +1,20 @@
+//finginvoiceapply页面个别按钮
+.applyseaech {
+ padding: 0 34px !important;
+ margin-right: 0 !important;
+}
+
+//finreceipt页面个别按钮
+.recpicker {
+ width: 154px !important;
+}
+
+.recselect {
+ padding: 0 34px !important;
+}
+
+//
+.iteminput {
+ padding: 0 49px !important;
+}
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-table.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-table.scss
new file mode 100644
index 00000000..e79ae751
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-table.scss
@@ -0,0 +1,38 @@
+.el-table {
+ .el-table__header {
+ tr th {
+ background: #edf1f7;
+ color: #333333;
+ padding: 8px 0;
+ font-size: 16px;
+ }
+ }
+}
+
+.el-table {
+ .el-table__row {
+ .cell {
+ line-height:15px;
+ }
+ }
+}
+
+.el-table {
+ .el-table__body {
+ tr td {
+ padding: 6px 0 !important;
+ }
+ }
+}
+
+.table-describe {
+ border: 1px solid #dfe4ed;
+ border-bottom: 0 solid #dfe4ed;
+
+ h4 {
+ float: left;
+ margin: 0;
+ line-height: 34px;
+ padding: 0 15px;
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-tabs.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-tabs.scss
new file mode 100644
index 00000000..26321fb1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-tabs.scss
@@ -0,0 +1,25 @@
+.el-tabs--card{
+ .el-tabs__header{
+ .el-tabs__nav-scroll{
+ padding-left: 3px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #018ad2;
+ .el-tabs__nav {
+ border: none;
+ }
+ .el-tabs__item {
+ border: 1px solid #dfe4ed;
+ margin-right: 12px;
+ margin-left: 2px;
+ }
+ .el-tabs__item:first-child {
+ border-left: 1px solid #dfe4ed;
+ }
+ .el-tabs__item.is-active{
+ border-bottom-color: #018ad2;
+ background-color: #018ad2;
+ color: #fff;
+ }
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-ui.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-ui.scss
new file mode 100644
index 00000000..50c4dc36
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-ui.scss
@@ -0,0 +1,62 @@
+.el-image .el-image__inner--center{
+ top: 0;
+ left: 0;
+ transform: none;
+}
+
+.tablerow-click{
+ color: #007FFF;
+ cursor: pointer;
+}
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-variables.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-variables.scss
new file mode 100644
index 00000000..ecd07288
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/element-variables.scss
@@ -0,0 +1,35 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+// $--color-primary: #018ad2;
+// $--color-success: #13ce66;
+// $--color-warning: #ffba00;
+// $--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+$--color-primary: #018ad2;
+$--color-success: #2cab69;
+$--color-warning: #ffba00;
+$--color-danger: #e84026;
+$--color-info: #cccccc;
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border: 1px solid #dfe6ec;
+
+/* icon font path, required */
+$--font-path: "~element-ui/lib/theme-chalk/fonts";
+
+@import "~element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ theme: $--color-primary;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/index.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/index.scss
new file mode 100644
index 00000000..ce380903
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/index.scss
@@ -0,0 +1,435 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './table.scss';
+@import './el-form.scss';
+@import './el-search.scss';
+@import './e-row.scss';
+@import './e-table.scss';
+@import './element-table.scss';
+@import './element-tabs.scss';
+body {
+ height: 100%;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+.bg-primary{
+ background-color: $color-primary !important;
+}
+// main-container global css
+.container{
+ min-height: 100%;
+ height: 100%;
+ background-color: #FFFFFF;
+ box-sizing: border-box;
+ padding: 10px 0;
+}
+
+.fl{
+ float: left;
+}
+.fr{
+ float: right;
+}
+.text-center{
+ text-align: center;
+}
+.color-red{
+ color: red !important;
+}
+
+.pd-b10{
+ padding-bottom: 10px;
+}
+
+.pd-y40 {
+ padding: 40px 0;
+}
+
+.pd-y20 {
+ padding: 20px 0;
+}
+
+.fs20 {
+ font-size: 20px;
+}
+
+// 页面上的button按钮
+.app-container {
+ .el-button--medium {
+ padding: 10px 14px;
+ font-size: 16px;
+ }
+
+ .el-button--small {
+ padding: 8px 12px;
+ font-size: 14px;
+ }
+
+ .el-button--mini {
+ padding: 7px 10px;
+ font-size: 12px;
+ }
+}
+// 添加样式
+.app-container {
+ margin: 5px 0 5px 0;
+ background-color: #fff;
+}
+// 设置了滚动区域
+.main-content{ overflow-x: hidden;overflow-y: auto;height: calc(100vh - 200px);padding: 0 20px;}
+.listcon{height: calc(100vh - 425px);overflow-y: auto;overflow-x: hidden;}
+.listconadd{height: calc(100vh - 200px);overflow-y: auto;overflow-x: hidden;}
+.listconadd{
+ .titwu {
+ font-size: 28px;
+ text-align: center;
+ padding: 30px 0 20px 0;
+ }
+}
+.listconsub {
+ height: calc(100vh - 310px);
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.listconsubjxs {
+ height: calc(100vh - 300px);
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+// 搜索的
+.webtop {
+ // position: fixed;top: 110px;width: calc(100% - 240px);z-index: 6000;
+ background-color: #fff;
+ display: flex !important;
+ flex-direction: row;
+ justify-content: space-between !important;
+ align-items: center;
+ margin-bottom: 0px !important;
+ font-size: 20px;
+}
+
+// 设置了页面头部的内边距和背景色
+.tab-header {
+ font-size: 20px;
+ font-weight: bold;
+}
+// 设置了搜索条件里的样式
+.search {
+ .tab-header {
+ .el-form-item {
+ margin-right: 16px;
+ .el-form-item__label {
+ font-size: 16px;
+ font-weight: 500;
+ }
+ }
+ }
+}
+.filter-item {
+ padding: 0 10px;
+ width: 220px;
+ display: inline-block;
+}
+
+// 设置列表页面内容布局
+.listtop {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 0 0 15px;
+ margin-top: 0;
+ border: 1px solid #dfe4ed;
+ height: 42px;
+ line-height: 42px;
+}
+
+.listtop .tit {
+ font-weight: bold;
+ font-size: 16px
+}
+
+.listtop .pagination {
+ margin: 0;
+ padding: 0;
+}
+
+.pages {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: flex-end;
+ padding: 0 0 15px 15px;
+}
+.pages .tit{font-weight: bold;}
+.pages .pagination{margin: 0;}
+// .formadd{padding: 20px ;}
+// .listeltable{overflow-y: auto;height: calc(100vh - 420px);}
+
+.formadd {
+ padding: 10px 40px 0 40px;
+ font-size: 16px;
+ // height: calc(100vh - 200px);overflow-y: auto;
+ .title {
+ padding: 12px;
+ font-weight: bold;
+ font-size: 16px;
+ background-color: $header-bg;
+ text-align: left;
+ color: #ffffff;
+ }
+ .first_row{
+ border-top: 1px solid $table-border-color;
+ }
+ .el-row {
+ display: flex;
+ flex-wrap: wrap;
+ border-left: 1px solid $table-border-color;
+ .el-col {
+ border-right: 1px solid $table-border-color;
+ border-bottom: 1px solid $table-border-color;
+ padding: 0 15px;
+ min-height: 42px;
+ line-height: 1;
+
+ .el-form-item {
+ margin-bottom: 0;
+ line-height: 42px;
+ // .addinputw{width: 400px;}
+ .addinputw {
+ width: 80%;
+ line-height: 42px;
+ }
+ .el-input__inner {
+ height: 36px;
+ }
+ }
+ }
+ }
+ .footer{margin: 20px;}
+}
+
+
+.formaddcopy02 {
+ padding: 10px 40px 0 40px;
+ .title {
+ padding: 12px;
+ font-weight: bold;
+ font-size: 16px;
+ background-color: #0294d7;
+ color: #ffffff;
+ text-align: left;
+ }
+
+ .el-row {
+ display: flex;
+ flex-wrap: wrap;
+ border-left: 1px solid $table-border-color;
+
+ .el-col {
+ border-right: 1px solid $table-border-color;
+ border-bottom: 1px solid $table-border-color;
+ min-height: 42px;
+ padding: 0 15px;
+ line-height: 42px;
+ position: relative;
+ .span-sty {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ line-height: 42px;
+ text-align: right;
+ font-size: 14px;
+ color: #606266;
+ font-weight: 600;
+ width: 70px;
+ padding-right: 5px;
+ border-right: 1px solid #e0e3eb;
+ }
+
+ .el-form-item {
+ margin-bottom: 0;
+ line-height: 42px;
+ .addinputw {
+ //padding: 5px 0;
+ width: 65%;
+ margin-left: 80px;
+ line-height: 42px;
+ }
+
+ .addinputInfo {
+ margin-left: 80px;
+ line-height: 42px;
+ }
+
+ .el-input__inner {
+ height: 36px;
+ }
+ }
+ }
+
+ }
+
+ .footer {
+ margin: 20px;
+ }
+}
+
+.forminfo {
+ padding: 10px 40px 0 40px;
+ font-size: 16px;
+ .title {
+ padding: 12px;
+ font-weight: bold;
+ font-size: 16px;
+ background-color: $header-bg;
+ text-align: left;
+ color: #ffffff;
+ }
+ .el-row {
+ display:flex;
+ flex-wrap: wrap;
+ border-left: 1px solid $table-border-color;
+ .trightb{ text-align: right;font-weight: bold;color: #606266; }
+ .tleft{ text-align: left; }
+ .el-col{
+ border-right: 1px solid $table-border-color;
+ border-bottom: 1px solid $table-border-color;
+ padding: 0 15px 0 15px !important;
+ min-height: 50px;
+ line-height: 50px;
+ font-size: 14px;
+ }
+
+ }
+ .footer{margin: 20px;}
+}
+
+.el-form-item__error {
+ z-index: 100;
+}
+.bluezi{color: $header-bg; cursor: pointer}
+// 经销商添加样式
+.titcon{
+ display: flex;
+ flex-direction: row;
+ justify-content: space-around;
+ background-color: #0294d7;
+ flex: 3;
+}
+
+.titcon .title {
+ padding: 10px;
+ font-weight: bold;
+ font-size: 20px;
+ text-align: center;
+ color: #ffffff;
+}
+
+.titcon .baocun {
+ text-align: right;
+ flex: 2;
+ padding: 5px 20px;
+}
+
+.addinputwda {
+ width: 600px;
+}
+
+//.searchcon{margin: 0px 0 10px 0;}
+//.searchcon .searchbtn{margin: 10px 0;border: #2cab69 1px solid;color: #2cab69;}
+// 隐藏显示按钮
+.main-content {
+ .searchcon {
+ .searchbtn {
+ margin: 5px 0;
+ border: #2cab69 1px solid;
+ color: #2cab69;
+ }
+ }
+}
+
+
+.search .btn {
+ padding: 5px 0;
+ border: 1px solid #e0e3eb;
+ text-align: center;
+ margin-bottom: 5px;
+}
+
+
+// 弹出窗口按钮
+.btnCancel{
+ background: #e84026 !important;outline: none;border: none;color: #fff !important;
+}
+.btnCancel:hover{
+ background: #ed6651 !important;
+}
+.btnFalses{
+ background: #2cab69 !important;outline: none;border: none;
+}
+.btnFalses:hover{
+ background: #3dc47e !important;
+}
+.btntopblueline{background-color: #066bc9 !important;}
+.btntopblueline:hover{background-color: #34a1db !important;}
+.btntophui{background-color: #cccccc !important;}
+.btntophui:hover{background-color: #d6d6d6 !important;}
+.bordertopline{ border-top: 1px solid $table-border-color;}
+.lookimg img{width: 250px;margin: 10px;}
+.listimg{width: 80px;}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/mixin.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/mixin.scss
new file mode 100644
index 00000000..36b74bbd
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/mixin.scss
@@ -0,0 +1,28 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/sidebar.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/sidebar.scss
new file mode 100644
index 00000000..4d304e20
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/sidebar.scss
@@ -0,0 +1,262 @@
+#app {
+ background-color: #f7f9fc;
+
+ .main-container {
+ height: 100vh;
+ transition: margin-left .28s;
+ padding-left: $sideBarWidth;
+ padding-top: 60px;
+ position: relative;
+ overflow: hidden;
+ }
+ //.TagsView{
+ // height: 50px;
+ //}
+ .home-box{
+ position: fixed;
+ top: 60px;
+ left: 0;
+ background-color: $menuBg;
+ border: 1px solid $menuHover;
+ line-height: 40px;
+ width: 210px;
+ z-index: 1000;
+ a{
+ display: inline-block;
+ line-height: 40px;
+ box-sizing: border-box;
+ width: 50%;
+ text-align: center;
+ font-size: 16px;
+ font-weight: 500;
+ color: #FFFFFF;
+ }
+ a:last-child{
+ border:0;
+ background-color: $menuHover;
+ }
+ }
+ .sidebar-container {
+ transition: width 0.28s;
+ width: $sideBarWidth !important;
+ background-color: $menuBg;
+ height: calc(100% - 60px) ;
+ position: absolute;
+ font-size: 0px;
+ top: 60px;
+ bottom: 0;
+ left: 0;
+ z-index: 8;
+ overflow: hidden;
+ padding-top: 40px;
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ height: calc(100% - 40px) ; //此高度是100%减去页面底部的栏高
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0px;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: $menuHover !important;
+ }
+ }
+ .el-submenu__title i{
+ color: #FFFFFF;
+ }
+ .is-active>.el-submenu__title {
+ color: $subMenuActiveText !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $sideBarWidth !important;
+ background-color: $subMenuBg !important;
+
+ &:hover {
+ background-color: $subMenuHover !important;
+ }
+ }
+ & .el-menu-item.is-active {
+ background-color: $subMenuHover !important;
+ }
+ }
+
+ // .hideSidebar {
+ // .sidebar-container {
+ // width: 54px !important;
+ // }
+
+ // .main-container {
+ // margin-left: 54px;
+ // }
+
+ // .submenu-title-noDropdown {
+ // padding: 0 !important;
+ // position: relative;
+
+ // .el-tooltip {
+ // padding: 0 !important;
+
+ // .svg-icon {
+ // margin-left: 20px;
+ // }
+
+ // .sub-el-icon {
+ // margin-left: 19px;
+ // }
+ // }
+ // }
+
+ // .el-submenu {
+ // overflow: hidden;
+
+ // &>.el-submenu__title {
+ // padding: 0 !important;
+
+ // .svg-icon {
+ // margin-left: 20px;
+ // }
+
+ // .sub-el-icon {
+ // margin-left: 19px;
+ // }
+
+ // .el-submenu__icon-arrow {
+ // display: none;
+ // }
+ // }
+ // }
+
+ // .el-menu--collapse {
+ // .el-submenu {
+ // &>.el-submenu__title {
+ // &>span {
+ // height: 0;
+ // width: 0;
+ // overflow: hidden;
+ // visibility: hidden;
+ // display: inline-block;
+ // }
+ // }
+ // }
+ // }
+ // }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ min-width: $sideBarWidth !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $sideBarWidth !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$sideBarWidth, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: $menuHover !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/table.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/table.scss
new file mode 100644
index 00000000..08e9142d
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/table.scss
@@ -0,0 +1,48 @@
+.container{
+ /* 头 */
+ .el-table thead{
+ color: $text-color;
+ }
+ .el-table .cell{
+ a{
+ display: block;
+ color: $table-a-color;
+ }
+ .el-button--text{
+ color: $table-a-color;
+ }
+ }
+ .el-table td, .el-table th{
+ padding: 8px 0;
+ }
+ .el-table.is-group th{
+ background-color: $table-bg-color;
+ }
+ .el-table--enable-row-hover .el-table__body tr:hover>td {
+ background-color: $table-bg-color !important;
+ }
+ .el-table--border td, .el-table--border th, .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed {
+ border-right: 1px solid $table-border-color;
+ }
+ .el-table td, .el-table th.is-leaf{
+ border-bottom: 1px solid $table-border-color;
+ }
+ .table-fixed {
+ .el-table__fixed-right {
+ height: 100% !important; //设置高优先,以覆盖内联样式
+ }
+ }
+}
+
+.children-box {
+ padding: 10px;
+ .table-header {
+ padding: 0 20px 5px 20px;
+ border-bottom: 2px solid $border-color;
+ .el-page-header {
+ line-height: 40px;
+ font-weight: 500;
+
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/transition.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/transition.scss
new file mode 100644
index 00000000..4cb27cc8
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/variables.scss b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/variables.scss
new file mode 100644
index 00000000..9ff78c52
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/styles/variables.scss
@@ -0,0 +1,52 @@
+// 行为色
+$color-primary: #018ad2;
+$color-success: #4cd964;
+$color-warning: #f0ad4e;
+$color-error: #dd524d;
+// header
+$header-bg:#0294d7;
+// sidebar
+$menuText: rgba($color: #FFFFFF, $alpha: 0.9);
+$menuActiveText:#ffffff;
+$subMenuActiveText:#ffffff; //https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#0294d7;
+$menuHover:#087dba;
+
+$subMenuBg:#0294d7;
+$subMenuHover:#087dba;
+
+$sideBarWidth: 210px;
+
+/* 表格的相关样式 */
+$search-bg:#edf1f7; // 表格搜索景色
+$table-bg-color:#edf1f7; // 表格背景
+$table-border-color:#e0e3eb; // 表格边框色
+// 文字
+$table-a-color:#018ad2;
+/* 表格的相关样式 */
+
+/* 边框颜色 */
+$border-color:#018ad2;
+/* 文字基本颜色 */
+$text-color:#333;//基本色
+$text-color-inverse:#fff;//反色
+$text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$text-color-placeholder: #808080;
+$text-color-disable:#c0c0c0;
+$text-red: #d00000;
+
+$a-color:#018ad2;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuText: $menuText;
+ menuActiveText: $menuActiveText;
+ subMenuActiveText: $subMenuActiveText;
+ menuBg: $menuBg;
+ menuHover: $menuHover;
+ subMenuBg: $subMenuBg;
+ subMenuHover: $subMenuHover;
+ sideBarWidth: $sideBarWidth;
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/auth.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/auth.js
new file mode 100644
index 00000000..33795948
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/auth.js
@@ -0,0 +1,37 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'token'
+const sessionKey = 'token'
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+ return Cookies.set(TokenKey, token, { expires: 7, path: '/' })
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
+
+export function getStorage() {
+ return sessionStorage.getItem('token')
+ // return 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI0MjdhMmZiMC02MGM1LTQwOWYtYmVhNC00ZWI0NDEwNDFhZTYiLCJpc3MiOiJXQksiLCJleHAiOjE2NzQ2NzU5Mzl9.1P6VgCk3sXxWkl1364y7xhfc4ifdg6uGkzkF6uEmhIo'
+}
+
+export function setStorage(session) {
+ return sessionStorage.setItem('token', session)
+}
+
+export function setDefaultOrgPathName(data) {
+ return sessionStorage.setItem('defaultOrgPathName', data)
+}
+
+export function setDefaultOrgPath(data) {
+ return sessionStorage.setItem('defaultOrgPath', data)
+}
+
+export function removeStorage() {
+ return sessionStorage.removeItem('token')
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/axios.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/axios.js
new file mode 100644
index 00000000..53578374
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/axios.js
@@ -0,0 +1,248 @@
+import axios from 'axios'
+import router from '@/router'
+import { Message } from 'element-ui'
+import { removeToken, getToken } from '@/utils/auth'
+// 统一请求路径前缀
+const base = process.env.VUE_APP_BASE_API
+// 超时设定
+axios.defaults.timeout = 120000
+
+axios.interceptors.request.use(
+ config => {
+ // console.log('请求拦截器数据', config)
+ return config
+ },
+ err => {
+ Message.error('请求超时')
+ return Promise.resolve(err)
+ }
+)
+
+// http response 拦截器
+axios.interceptors.response.use(
+ response => {
+ const data = response.data
+ // console.log('响应拦截器数据', response)
+ // console.log('data.code:' + data.code)
+ // 根据返回的code值来做不同的处理(和后端约定)
+ switch (data.code) {
+ case 401:
+ // Message.error('登录失效,请重新登录!')
+ console.log('登录失效,请重新登录!')
+ // 未登录
+ // removeToken().then(() => { // 清除已登录状态
+ // router.push('/login')
+ // })
+ // if (router.history.current.name !== 'login') {
+ // console.log(router.history.current.name)
+ // if (data.msg !== null) {
+ // Message.error(data.msg)
+ // } else {
+ // Message.error('未知错误,请重新登录')
+ // }
+ // }
+ break
+ case 403:
+ // 没有权限
+ if (data.msg !== null) {
+ Message.error(data.msg)
+ } else {
+ Message.error('未知错误')
+ }
+ break
+ case 500:
+ // 错误
+ if (data.msg !== null) {
+ Message.error(data.msg)
+ } else {
+ Message.error('未知错误')
+ }
+ break
+ case 99:
+ if (data.msg !== null) {
+ if (data.msg == '登录状态已过期') {
+ // 未登录
+ // removeToken().then(() => { // 清除已登录状态
+ // router.push('/login')
+ // })
+ } else {
+ // Message.error(data.msg)
+ return data
+ }
+ } else {
+ Message.error('未知错误')
+ }
+ break
+ default:
+ return data
+ }
+ return Promise.reject(new Error(response.msg || 'Error'))
+ },
+ error => {
+ // 返回状态码不为200时候的错误处理
+ Message.error(error.toString())
+ if (error.request.responseURL.indexOf('/sys/security/needLogin')) {
+ // removeToken().then(() => { // 清除已登录状态
+ // router.push('/login')
+ // })
+ }
+ // return err
+ return Promise.reject(error)
+ }
+)
+
+export const getRequest = (url, params) => {
+ const accessToken = getToken()
+ console.log(`-------------------${base}${url}`)
+ return axios({
+ method: 'get',
+ url: `${base}${url}`,
+ params: params,
+ headers: {
+ accessToken: accessToken
+ }
+ })
+}
+
+export const postRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ data: params,
+ transformRequest: [
+ function(data) {
+ let ret = ''
+ for (const it in data) {
+ ret +=
+ encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
+ }
+ return ret
+ }
+ ],
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ accessToken: accessToken
+ }
+ })
+}
+
+export const post = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ data: params,
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8',
+ // 'Content-Type': 'multipart/form-data',
+ accessToken: accessToken
+ }
+ })
+}
+
+// export const postExport = (url, params) => {
+// const accessToken = getToken()
+// return axios({
+// method: 'post',
+// url: `${base}${url}`,
+// data: params,
+// headers: {
+// 'Content-Type': 'application/json;charset=utf-8',
+// // 'Content-Type': 'multipart/form-data',
+// accessToken: accessToken
+// },
+// responseType: 'blob' // 表明返回服务器返回的数据类型
+// })
+// }
+
+export const putRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'put',
+ url: `${base}${url}`,
+ data: params,
+ transformRequest: [
+ function(data) {
+ let ret = ''
+ for (const it in data) {
+ ret +=
+ encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
+ }
+ return ret
+ }
+ ],
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ accessToken: accessToken
+ }
+ })
+}
+
+export const deleteRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'delete',
+ url: `${base}${url}`,
+ params: params,
+ headers: {
+ accessToken: accessToken
+ }
+ })
+}
+
+export const importRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ data: params,
+ headers: {
+ accessToken: accessToken
+ }
+ })
+}
+
+export const uploadFileRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ params: params,
+ headers: {
+ accessToken: accessToken
+ }
+ })
+}
+
+export const getDownLoadUrl = (url) => {
+ const accessToken = getToken()
+ return base + url + '?accessToken=' + accessToken
+}
+
+export const uploadFileRequestJianCai = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ data: params,
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ contentType: false,
+ processData: false,
+ accessToken: accessToken
+ }
+ })
+}
+
+export const postBodyRequest = (url, params) => {
+ const accessToken = getToken()
+ return axios({
+ method: 'post',
+ url: `${base}${url}`,
+ data: params,
+ headers: {
+ accessToken: accessToken
+ }
+ })
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/baocun.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/baocun.js
new file mode 100644
index 00000000..3103840f
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/baocun.js
@@ -0,0 +1,66 @@
+const TokenKey = 'AdminWuJingToken'
+const userInfo = 'wj_user'
+
+// 保存基础信息
+export function getuser() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setuser(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 保存修改基础信息
+export function getXiu() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setXiu(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 保存查看基础信息
+export function getLook() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setLook(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 信息
+export function getChe() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setChe(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 经销商保存
+export function getJing() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setJing(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 车辆
+// 车型名称保存
+export function getCHeap() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setCHeap(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
+
+// 车型sid保存
+export function getMIng() {
+ return JSON.parse(localStorage.getItem(userInfo))
+}
+
+export function setMIng(obj) {
+ return localStorage.setItem(userInfo, JSON.stringify(obj))
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/get-page-title.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/get-page-title.js
new file mode 100644
index 00000000..a6de99dd
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/get-page-title.js
@@ -0,0 +1,10 @@
+import defaultSettings from '@/settings'
+
+const title = defaultSettings.title || 'Vue Admin Template'
+
+export default function getPageTitle(pageTitle) {
+ if (pageTitle) {
+ return `${pageTitle} - ${title}`
+ }
+ return `${title}`
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/index.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/index.js
new file mode 100644
index 00000000..4830c048
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/index.js
@@ -0,0 +1,117 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string')) {
+ if ((/^[0-9]+$/.test(time))) {
+ // support "1548221490638"
+ time = parseInt(time)
+ } else {
+ // support safari
+ // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+ time = time.replace(new RegExp(/-/gm), '/')
+ }
+ }
+
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+ const value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
+ return value.toString().padStart(2, '0')
+ })
+ return time_str
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/print.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/print.js
new file mode 100644
index 00000000..799a3337
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/print.js
@@ -0,0 +1,123 @@
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print =function(dom, options) {
+ if (!(this instanceof Print)) return new Print(dom, options);
+
+ this.options = this.extend({
+ 'noPrint': '.no-print'
+ }, options);
+
+ if ((typeof dom) === "string") {
+ this.dom = document.querySelector(dom);
+ } else {
+ this.dom = dom;
+ }
+
+ this.init();
+};
+Print.prototype = {
+ init: function () {
+ var content = this.getStyle() + this.getHtml();
+ this.writeIframe(content);
+ },
+ extend: function (obj, obj2) {
+ for (var k in obj2) {
+ obj[k] = obj2[k];
+ }
+ return obj;
+ },
+
+ getStyle: function () {
+ var str = "",
+ styles = document.querySelectorAll('style,link');
+ for (var i = 0; i < styles.length; i++) {
+ str += styles[i].outerHTML;
+ }
+ str += "";
+
+ return str;
+ },
+
+ getHtml: function () {
+ var inputs = document.querySelectorAll('input');
+ var textareas = document.querySelectorAll('textarea');
+ var selects = document.querySelectorAll('select');
+
+ for (var k in inputs) {
+ if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+ if (inputs[k].checked == true) {
+ inputs[k].setAttribute('checked', "checked")
+ } else {
+ inputs[k].removeAttribute('checked')
+ }
+ } else if (inputs[k].type == "text") {
+ inputs[k].setAttribute('value', inputs[k].value)
+ }
+ }
+
+ for (var k2 in textareas) {
+ if (textareas[k2].type == 'textarea') {
+ textareas[k2].innerHTML = textareas[k2].value
+ }
+ }
+
+ for (var k3 in selects) {
+ if (selects[k3].type == 'select-one') {
+ var child = selects[k3].children;
+ for (var i in child) {
+ if (child[i].tagName == 'OPTION') {
+ if (child[i].selected == true) {
+ child[i].setAttribute('selected', "selected")
+ } else {
+ child[i].removeAttribute('selected')
+ }
+ }
+ }
+ }
+ }
+
+ return this.dom.outerHTML;
+ },
+
+ writeIframe: function (content) {
+ var w, doc, iframe = document.createElement('iframe'),
+ f = document.body.appendChild(iframe);
+ iframe.id = "myIframe";
+ iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+
+ w = f.contentWindow || f.contentDocument;
+ doc = f.contentDocument || f.contentWindow.document;
+ doc.open();
+ doc.write(content);
+ doc.close();
+ this.toPrint(w);
+
+ setTimeout(function () {
+ document.body.removeChild(iframe)
+ }, 100)
+ },
+
+ toPrint: function (frameWindow) {
+ try {
+ setTimeout(function () {
+ frameWindow.focus();
+ try {
+ if (!frameWindow.document.execCommand('print', false, null)) {
+ frameWindow.print();
+ }
+ } catch (e) {
+ frameWindow.print();
+ }
+ frameWindow.close();
+ }, 10);
+ } catch (err) {
+ console.log('err', err);
+ }
+ }
+};
+const MyPlugin = {}
+MyPlugin.install = function (Vue, options) {
+ // 4. 添加实例方法
+ Vue.prototype.$print = Print
+}
+export default MyPlugin
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/request.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/request.js
new file mode 100644
index 00000000..c2eb5f91
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/request.js
@@ -0,0 +1,113 @@
+import axios from 'axios'
+import {
+ MessageBox,
+ Message
+} from 'element-ui'
+import store from '@/store'
+import {
+ getToken,
+ getStorage
+} from '@/utils/auth'
+
+// create an axios instance
+const service = axios.create({
+ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
+ // withCredentials: true, // send cookies when cross-domain requests
+ timeout: 30000 // request timeout
+})
+
+// request interceptor
+service.interceptors.request.use(
+ config => {
+ // do something before request is sent
+
+ // if (store.getters.token) {
+ // // let each request carry token
+ // // ['X-Token'] is a custom headers key
+ // // please modify it according to the actual situation
+ // config.headers['X-Token'] = getToken()
+ // }
+ if (process.env.NODE_ENV === 'development') {
+ config.headers['apifoxToken'] = 'tTu6IfnGzQ4H841HRiJpDAWEvBDpttkS'
+ }
+
+ if (getStorage()) {
+ // let each request carry token
+ // ['X-Token'] is a custom headers key
+ // please modify it according to the actual situation
+ config.headers['token'] = getStorage()
+ }
+ return config
+ },
+ error => {
+ // do something with request error
+ console.log(error) // for debug
+ return Promise.reject(error)
+ }
+)
+
+// response interceptor
+service.interceptors.response.use(
+ /**
+ * If you want to get http information such as headers or status
+ * Please return response => response
+ */
+
+ /**
+ * Determine the request status by custom code
+ * Here is just an example
+ * You can also judge the status by HTTP Status Code
+ */
+ response => {
+ const res = response.data
+ const statusCode = response.status
+
+ // if the custom code is not 20000, it is judged as an error.
+ if (statusCode !== 200) {
+ Message({
+ message: res.msg || response.message || 'Error',
+ type: 'error',
+ showClose: true,
+ duration: 5 * 1000
+ })
+
+ // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
+ if (statusCode === 401 || res.code === '5000' || res.code === 5000 || res.code === 50012 || res.code === 50014) {
+ // to re-login
+ MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+ confirmButtonText: '重新登录',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ store.dispatch('logout').then(() => {
+ location.href = 'http://120.46.131.15/#/login'
+ // location.reload()
+ })
+ })
+ }
+ return Promise.reject(new Error(res.message || 'Error'))
+ } else {
+ if (!res.success) {
+ Message({
+ message: res.msg || 'Error',
+ type: 'error',
+ showClose: true,
+ duration: 5 * 1000
+ })
+ }
+ return res
+ }
+ },
+ error => {
+ console.log('err' + error) // for debug
+ Message({
+ message: error.message,
+ type: 'error',
+ showClose: true,
+ duration: 5 * 1000
+ })
+ return Promise.reject(error)
+ }
+)
+
+export default service
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/roles.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/roles.js
new file mode 100644
index 00000000..07a65574
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/roles.js
@@ -0,0 +1,98 @@
+/**
+ * 表单校验规则
+ * 不符合规则时,返回错误文案
+ * 符合规则时,返回false
+ */
+
+var rules = {}
+
+// 是否必填
+rules.required = function (value) {
+ return (!!value || value === 0) ? false : "请输入内容"
+};
+
+// 最大字符长度
+rules.maxLength = function (value, size) {
+ var size = size || 256;
+ return String(value).length <= size ? false : ("最大不超过" + size + "个字符")
+}
+
+// 只允许字母和数字
+rules.onlyAlphabetic = function (value) {
+ var reg = /^[0-9a-zA-Z]+$/;
+ return reg.test(value) ? false : "只能输入字母和数字"
+}
+
+// 只允许字母数字和下划线
+rules.onlyAlphabeticUnderline = function (value) {
+ var reg = /^[0-9a-zA-Z_]+$/;
+ return reg.test(value) ? false : "只能输入字母、数字或下划线"
+}
+
+// 只允许数字
+rules.onlyNumber = function (value) {
+ var reg = /^[0-9]+$/;
+ return reg.test(value) ? false : "只能输入数字"
+}
+
+// 只允许字母
+rules.onlyLetter = function (value) {
+ var reg = /^[a-zA-Z]+$/;
+ return reg.test(value) ? false : "只能输入字母"
+}
+
+// 特殊字符
+rules.noSpecial = function (value) {
+ var regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,
+ regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
+ return regEn.test(value) || regCn.test(value) ? false : "不能输入特殊字符"
+}
+
+// 邮箱
+rules.email = function (value) {
+ var reg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/;
+ return reg.test(value) ? false : "邮箱格式错误"
+}
+
+// 手机号(以1开头的11位数字)
+rules.phone = function (value) {
+ var reg = /^[1][3,4,5,7,8][0-9]{9}$/;
+ return reg.test(value) ? false : "手机格式错误"
+}
+
+// 只允许汉字
+rules.chinese = function (value) {
+ var reg = /^[\u4e00-\u9fa5]+$/;
+ return reg.test(value) ? false : "只能输入汉字"
+}
+
+// 密码格式校验
+rules.password = function (value) {
+ if (String(value).length < 6) {
+ return "密码长度不小于6位"
+ }
+ if (String(value).length > 18) {
+ return "密码长度不超过18位"
+ }
+ var level = 0;
+ if (value.search(/[a-z]/) > -1) {
+ level++; //密码中包含小写字母
+ }
+ if (value.search(/[A-Z]/) > -1) {
+ level++; //密码中包含大写字母
+ }
+ if (value.search(/[0-9]/) > -1) {
+ level++; //密码中包含数组
+ }
+ if (value.search(/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im) > -1) {
+ level++; //密码中包含特殊符号
+ }
+ if(level<2){
+ return "密码至少包含大写字母、小写字母、数字、标点符号中的两种"
+ }else{
+ return level; // 当前密码强度为level(2/3/4)
+ }
+}
+
+
+export default rules;
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/validate.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/validate.js
new file mode 100644
index 00000000..8d962ad4
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/utils/validate.js
@@ -0,0 +1,20 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/404.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/404.vue
new file mode 100644
index 00000000..1791f55a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/404.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
OOPS!
+
+
{{ message }}
+
Please check that the URL you entered is correct, or click the button below to return to the homepage.
+
Back to home
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Home/Home.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Home/Home.vue
new file mode 100644
index 00000000..d1c0b2f0
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Home/Home.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/BpmData.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/BpmData.js
new file mode 100644
index 00000000..672ca449
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/BpmData.js
@@ -0,0 +1,68 @@
+/**
+ * 存储流程设计相关参数
+ */
+export default class BpmData {
+ constructor() {
+ this.controls = [] // 设计器控件
+ this.init()
+ }
+
+ init() {
+ this.controls = [
+ {
+ action: 'create.start-event',
+ title: '开始'
+ },
+ {
+ action: 'create.intermediate-event',
+ title: '中间'
+ },
+ {
+ action: 'create.end-event',
+ title: '结束'
+ },
+ {
+ action: 'create.exclusive-gateway',
+ title: '网关'
+ },
+ {
+ action: 'create.task',
+ title: '任务'
+ },
+ {
+ action: 'create.user-task',
+ title: '用户任务'
+ },
+ {
+ action: 'create.user-sign-task',
+ title: '会签任务'
+ },
+ {
+ action: 'create.subprocess-expanded',
+ title: '子流程'
+ },
+ {
+ action: 'create.data-object',
+ title: '数据对象'
+ },
+ {
+ action: 'create.data-store',
+ title: '数据存储'
+ },
+ {
+ action: 'create.participant-expanded',
+ title: '扩展流程'
+ },
+ {
+ action: 'create.group',
+ title: '分组'
+ }
+ ]
+ }
+
+ // 获取控件配置信息
+ getControl(action) {
+ const result = this.controls.filter(item => item.action === action)
+ return result[0] || {}
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/PropertyPanel.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/PropertyPanel.vue
new file mode 100644
index 00000000..970bd0f8
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/PropertyPanel.vue
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/customTranslate.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/customTranslate.js
new file mode 100644
index 00000000..fa05f9d6
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/customTranslate.js
@@ -0,0 +1,20 @@
+import translations from '../lang/zh'
+
+export default function customTranslate(template, replacements) {
+ replacements = replacements || {}
+
+ // Translate
+ template = translations[template] || template
+
+ // Replace
+ return template.replace(/{([^}]+)}/g, function(_, key) {
+ var str = replacements[key]
+ if (
+ translations[replacements[key]] !== null &&
+ translations[replacements[key]] !== 'undefined'
+ ) {
+ str = translations[replacements[key]]
+ }
+ return str || '{' + key + '}'
+ })
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinExecutionListener.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinExecutionListener.js
new file mode 100644
index 00000000..23295b00
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinExecutionListener.js
@@ -0,0 +1,24 @@
+
+import executionListenerDialog from '../components/nodePanel/property/executionListener'
+export default {
+ components: {
+ executionListenerDialog
+ },
+ data() {
+ return {
+ executionListenerLength: 0,
+ dialogName: null
+ }
+ },
+ methods: {
+ computedExecutionListenerLength() {
+ this.executionListenerLength = this.element.businessObject.extensionElements?.values?.length ?? 0
+ },
+ finishExecutionListener() {
+ if (this.dialogName === 'executionListenerDialog') {
+ this.computedExecutionListenerLength()
+ }
+ this.dialogName = ''
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinPanel.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinPanel.js
new file mode 100644
index 00000000..8686b983
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinPanel.js
@@ -0,0 +1,70 @@
+import xcrud from 'xcrud'
+import golbalConfig from 'xcrud/package/common/config'
+import showConfig from '../flowable/showConfig'
+golbalConfig.set({
+ input: {
+ // size: 'mini'
+ },
+ select: {
+ // size: 'mini'
+ },
+ colorPicker: {
+ showAlpha: true
+ },
+ xform: {
+ form: {
+ labelWidth: 'auto'
+ // size: 'mini'
+ }
+ }
+})
+export default {
+ components: { xForm: xcrud.xForm },
+ props: {
+ modeler: {
+ type: Object,
+ required: true
+ },
+ element: {
+ type: Object,
+ required: true
+ },
+ categorys: {
+ type: Array,
+ default: () => []
+ }
+ },
+ watch: {
+ 'formData.id': function(val) {
+ this.updateProperties({ id: val })
+ },
+ 'formData.name': function(val) {
+ this.updateProperties({ name: val })
+ },
+ 'formData.documentation': function(val) {
+ if (!val) {
+ this.updateProperties({ documentation: [] })
+ return
+ }
+ const documentationElement = this.modeler.get('moddle').create('bpmn:Documentation', { text: val })
+ this.updateProperties({ documentation: [documentationElement] })
+ }
+ },
+ methods: {
+ updateProperties(properties) {
+ const modeling = this.modeler.get('modeling')
+ modeling.updateProperties(this.element, properties)
+ }
+ },
+ computed: {
+ elementType() {
+ const bizObj = this.element.businessObject
+ return bizObj.eventDefinitions
+ ? bizObj.eventDefinitions[0].$type
+ : bizObj.$type
+ },
+ showConfig() {
+ return showConfig[this.elementType] || {}
+ }
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinXcrud.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinXcrud.js
new file mode 100644
index 00000000..1f7ee5b5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/mixinXcrud.js
@@ -0,0 +1,22 @@
+import xcrud from 'xcrud'
+import golbalConfig from 'xcrud/package/common/config'
+golbalConfig.set({
+ input: {
+ // size: 'mini'
+ },
+ select: {
+ // size: 'mini'
+ },
+ colorPicker: {
+ showAlpha: true
+ },
+ xform: {
+ form: {
+ labelWidth: 'auto'
+ // size: 'mini'
+ }
+ }
+})
+export default {
+ components: { xForm: xcrud.xForm }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/parseElement.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/parseElement.js
new file mode 100644
index 00000000..63cf336e
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/common/parseElement.js
@@ -0,0 +1,53 @@
+export function commonParse(element) {
+ const result = {
+ ...element.businessObject,
+ ...element.businessObject.$attrs
+ }
+ return formatJsonKeyValue(result)
+}
+
+export function formatJsonKeyValue(result) {
+ // 移除flowable前缀,格式化数组
+ for (const key in result) {
+ if (key.indexOf('flowable:') === 0) {
+ const newKey = key.replace('flowable:', '')
+ result[newKey] = result[key]
+ delete result[key]
+ }
+ }
+ result = documentationParse(result)
+ return result
+}
+
+export function documentationParse(obj) {
+ if ('documentation' in obj) {
+ let str = ''
+ obj.documentation.forEach(item => {
+ str += item.text
+ })
+ obj.documentation = str
+ }
+ return obj
+}
+
+export function conditionExpressionParse(obj) {
+ if ('conditionExpression' in obj) {
+ obj.conditionExpression = obj.conditionExpression.body
+ }
+ return obj
+}
+
+export function userTaskParse(obj) {
+ for (const key in obj) {
+ if (key === 'candidateUsers') {
+ obj.userType = 'candidateUsers'
+ obj[key] = obj[key]?.split(',') || []
+ } else if (key === 'candidateGroups') {
+ obj.userType = 'candidateGroups'
+ obj[key] = obj[key]?.split(',') || []
+ } else if (key === 'assignee') {
+ obj.userType = 'assignee'
+ }
+ }
+ return obj
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/custom/customContextPad.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/custom/customContextPad.vue
new file mode 100644
index 00000000..89c2f684
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/custom/customContextPad.vue
@@ -0,0 +1,24 @@
+export default class CustomContextPad {
+ constructor(config, contextPad, create, elementFactory, injector, translate) {
+ this.create = create;
+ this.elementFactory = elementFactory;
+ this.translate = translate;
+
+ if (config.autoPlace !== false) {
+ this.autoPlace = injector.get('autoPlace', false);
+ }
+
+ contextPad.registerProvider(this); // 定义这是一个contextPad
+ }
+
+ getContextPadEntries(element) {}
+}
+
+CustomContextPad.$inject = [
+ 'config',
+ 'contextPad',
+ 'create',
+ 'elementFactory',
+ 'injector',
+ 'translate'
+];
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/gateway.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/gateway.vue
new file mode 100644
index 00000000..db181531
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/gateway.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/process.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/process.vue
new file mode 100644
index 00000000..6946f1e3
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/process.vue
@@ -0,0 +1,113 @@
+
+
+
+
+
+ 编辑
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/executionListener.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/executionListener.vue
new file mode 100644
index 00000000..1a15b8a1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/executionListener.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+ 配置
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/listenerParam.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/listenerParam.vue
new file mode 100644
index 00000000..dd8ace18
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/listenerParam.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/multiInstance.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/multiInstance.vue
new file mode 100644
index 00000000..357b7167
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/multiInstance.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ 按照BPMN2.0规范的要求,用于为每个实例创建执行的父执行,会提供下列变量:
+ nrOfInstances:实例总数。
+ nrOfActiveInstances:当前活动的(即未完成的),实例数量。对于顺序多实例,这个值总为1。
+ nrOfCompletedInstances:已完成的实例数量。
+ loopCounter:给定实例在for-each循环中的index。
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/signal.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/signal.vue
new file mode 100644
index 00000000..2c29d734
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/signal.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/taskListener.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/taskListener.vue
new file mode 100644
index 00000000..0f72a89a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/property/taskListener.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+ 配置
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/sequenceFlow.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/sequenceFlow.vue
new file mode 100644
index 00000000..178cd7d4
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/sequenceFlow.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/startEnd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/startEnd.vue
new file mode 100644
index 00000000..2740bf6a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/startEnd.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/task.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/task.vue
new file mode 100644
index 00000000..61a00d10
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/components/nodePanel/task.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+ 编辑
+
+
+
+
+ 编辑
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/flowable.json b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/flowable.json
new file mode 100644
index 00000000..73ac3088
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/flowable.json
@@ -0,0 +1,1194 @@
+{
+ "name": "Flowable",
+ "uri": "http://flowable.org/bpmn",
+ "prefix": "flowable",
+ "xml": {
+ "tagAlias": "lowerCase"
+ },
+ "associations": [],
+ "types": [
+ {
+ "name": "InOutBinding",
+ "superClass": ["Element"],
+ "isAbstract": true,
+ "properties": [
+ {
+ "name": "source",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "sourceExpression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "target",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "businessKey",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "local",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": false
+ },
+ {
+ "name": "variables",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "In",
+ "superClass": ["InOutBinding"],
+ "meta": {
+ "allowedIn": ["bpmn:CallActivity"]
+ }
+ },
+ {
+ "name": "Out",
+ "superClass": ["InOutBinding"],
+ "meta": {
+ "allowedIn": ["bpmn:CallActivity"]
+ }
+ },
+ {
+ "name": "AsyncCapable",
+ "isAbstract": true,
+ "extends": ["bpmn:Activity", "bpmn:Gateway", "bpmn:Event"],
+ "properties": [
+ {
+ "name": "async",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": false
+ },
+ {
+ "name": "asyncBefore",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": false
+ },
+ {
+ "name": "asyncAfter",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": false
+ },
+ {
+ "name": "exclusive",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": true
+ }
+ ]
+ },
+ {
+ "name": "flowable:in",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "source",
+ "type": "string",
+ "isAttr": true
+ },
+ {
+ "name": "target",
+ "type": "string",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "flowable:out",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "source",
+ "type": "string",
+ "isAttr": true
+ },
+ {
+ "name": "target",
+ "type": "string",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "BoundaryEvent",
+ "superClass": ["CatchEvent"],
+ "properties": [
+ {
+ "name": "cancelActivity",
+ "default": true,
+ "isAttr": true,
+ "type": "Boolean"
+ },
+ {
+ "name": "attachedToRef",
+ "type": "Activity",
+ "isAttr": true,
+ "isReference": true
+ }
+ ]
+ },
+ {
+ "name": "JobPriorized",
+ "isAbstract": true,
+ "extends": ["bpmn:Process", "flowable:AsyncCapable"],
+ "properties": [
+ {
+ "name": "jobPriority",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "SignalEventDefinition",
+ "isAbstract": true,
+ "extends": ["bpmn:SignalEventDefinition"],
+ "properties": [
+ {
+ "name": "async",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": false
+ }
+ ]
+ },
+ {
+ "name": "ErrorEventDefinition",
+ "isAbstract": true,
+ "extends": ["bpmn:ErrorEventDefinition"],
+ "properties": [
+ {
+ "name": "errorCodeVariable",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "errorMessageVariable",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Error",
+ "isAbstract": true,
+ "extends": ["bpmn:Error"],
+ "properties": [
+ {
+ "name": "flowable:errorMessage",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "PotentialStarter",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "resourceAssignmentExpression",
+ "type": "bpmn:ResourceAssignmentExpression"
+ }
+ ]
+ },
+ {
+ "name": "UserTask",
+ "isAbstract": true,
+ "extends": ["bpmn:UserTask"],
+ "properties": [
+ {
+ "name": "timerEventDefinition",
+ "type": "Expression"
+ },
+ {
+ "name": "multiInstanceLoopCharacteristics",
+ "type": "MultiInstanceLoopCharacteristics"
+ }
+ ]
+ },
+ {
+ "name": "StartEvent",
+ "isAbstract": true,
+ "extends": ["bpmn:StartEvent"],
+ "properties": [
+ {
+ "name": "timerEventDefinition",
+ "type": "Expression"
+ }
+ ]
+ },
+ {
+ "name": "FormSupported",
+ "isAbstract": true,
+ "extends": ["bpmn:StartEvent", "bpmn:UserTask"],
+ "properties": [
+ {
+ "name": "formHandlerClass",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "formKey",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "TemplateSupported",
+ "isAbstract": true,
+ "extends": ["bpmn:Process", "bpmn:FlowElement"],
+ "properties": [
+ {
+ "name": "modelerTemplate",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Initiator",
+ "isAbstract": true,
+ "extends": ["bpmn:StartEvent"],
+ "properties": [
+ {
+ "name": "initiator",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "ScriptTask",
+ "isAbstract": true,
+ "extends": ["bpmn:ScriptTask"],
+ "properties": [
+ {
+ "name": "resultVariable",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "resource",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Process",
+ "isAbstract": true,
+ "extends": ["bpmn:Process"],
+ "properties": [
+ {
+ "name": "candidateStarterGroups",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "candidateStarterUsers",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "versionTag",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "historyTimeToLive",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "isStartableInTasklist",
+ "isAttr": true,
+ "type": "Boolean",
+ "default": true
+ }
+ ]
+ },
+ {
+ "name": "EscalationEventDefinition",
+ "isAbstract": true,
+ "extends": ["bpmn:EscalationEventDefinition"],
+ "properties": [
+ {
+ "name": "escalationCodeVariable",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "FormalExpression",
+ "isAbstract": true,
+ "extends": ["bpmn:FormalExpression"],
+ "properties": [
+ {
+ "name": "resource",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Assignable",
+ "extends": ["bpmn:UserTask"],
+ "properties": [
+ {
+ "name": "candidateGroups",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "dueDate",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "followUpDate",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "priority",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "CallActivity",
+ "extends": ["bpmn:CallActivity"],
+ "properties": [
+ {
+ "name": "calledElementBinding",
+ "isAttr": true,
+ "type": "String",
+ "default": "latest"
+ },
+ {
+ "name": "calledElementVersion",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "calledElementVersionTag",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "calledElementTenantId",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "caseRef",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "caseBinding",
+ "isAttr": true,
+ "type": "String",
+ "default": "latest"
+ },
+ {
+ "name": "caseVersion",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "caseTenantId",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "variableMappingClass",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "variableMappingDelegateExpression",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "ServiceTaskLike",
+ "extends": [
+ "bpmn:ServiceTask",
+ "bpmn:BusinessRuleTask",
+ "bpmn:SendTask",
+ "bpmn:MessageEventDefinition"
+ ],
+ "properties": [
+ {
+ "name": "expression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "class",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "delegateExpression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "resultVariable",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "ExclusiveGateway",
+ "isAbstract": true,
+ "extends": ["bpmn:ExclusiveGateway"],
+ "properties": [
+ {
+ "name": "serviceClass",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "DmnCapable",
+ "extends": ["bpmn:BusinessRuleTask"],
+ "properties": [
+ {
+ "name": "decisionRef",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "decisionRefBinding",
+ "isAttr": true,
+ "type": "String",
+ "default": "latest"
+ },
+ {
+ "name": "decisionRefVersion",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "mapDecisionResult",
+ "isAttr": true,
+ "type": "String",
+ "default": "resultList"
+ },
+ {
+ "name": "decisionRefTenantId",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "ExternalCapable",
+ "extends": ["flowable:ServiceTaskLike"],
+ "properties": [
+ {
+ "name": "type",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "topic",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "TaskPriorized",
+ "extends": ["bpmn:Process", "flowable:ExternalCapable"],
+ "properties": [
+ {
+ "name": "taskPriority",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Properties",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["*"]
+ },
+ "properties": [
+ {
+ "name": "values",
+ "type": "Property",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "Property",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "id",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "name",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "value",
+ "type": "String",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "Connector",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["flowable:ServiceTaskLike"]
+ },
+ "properties": [
+ {
+ "name": "inputOutput",
+ "type": "InputOutput"
+ },
+ {
+ "name": "connectorId",
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "InputOutput",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["bpmn:FlowNode", "flowable:Connector"]
+ },
+ "properties": [
+ {
+ "name": "inputOutput",
+ "type": "InputOutput"
+ },
+ {
+ "name": "connectorId",
+ "type": "String"
+ },
+ {
+ "name": "inputParameters",
+ "isMany": true,
+ "type": "InputParameter"
+ },
+ {
+ "name": "outputParameters",
+ "isMany": true,
+ "type": "OutputParameter"
+ }
+ ]
+ },
+ {
+ "name": "InputOutputParameter",
+ "properties": [
+ {
+ "name": "name",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "value",
+ "isBody": true,
+ "type": "String"
+ },
+ {
+ "name": "definition",
+ "type": "InputOutputParameterDefinition"
+ }
+ ]
+ },
+ {
+ "name": "InputOutputParameterDefinition",
+ "isAbstract": true
+ },
+ {
+ "name": "List",
+ "superClass": ["InputOutputParameterDefinition"],
+ "properties": [
+ {
+ "name": "items",
+ "isMany": true,
+ "type": "InputOutputParameterDefinition"
+ }
+ ]
+ },
+ {
+ "name": "Map",
+ "superClass": ["InputOutputParameterDefinition"],
+ "properties": [
+ {
+ "name": "entries",
+ "isMany": true,
+ "type": "Entry"
+ }
+ ]
+ },
+ {
+ "name": "Entry",
+ "properties": [
+ {
+ "name": "key",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "value",
+ "isBody": true,
+ "type": "String"
+ },
+ {
+ "name": "definition",
+ "type": "InputOutputParameterDefinition"
+ }
+ ]
+ },
+ {
+ "name": "Value",
+ "superClass": ["InputOutputParameterDefinition"],
+ "properties": [
+ {
+ "name": "id",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "name",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "value",
+ "isBody": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Script",
+ "superClass": ["InputOutputParameterDefinition"],
+ "properties": [
+ {
+ "name": "scriptFormat",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "resource",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "value",
+ "isBody": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "Field",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": [
+ "flowable:ServiceTaskLike",
+ "flowable:ExecutionListener",
+ "flowable:TaskListener"
+ ]
+ },
+ "properties": [
+ {
+ "name": "name",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "expression",
+ "isAttr": true,
+ "type": "expression"
+ },
+ {
+ "name": "string",
+ "type": "string"
+ },
+ {
+ "name": "stringValue",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "string",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": [
+ "flowable:Field"
+ ]
+ },
+ "properties": [
+ {
+ "name": "body",
+ "isBody": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "expression",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": [
+ "flowable:Field"
+ ]
+ },
+ "properties": [
+ {
+ "name": "body",
+ "isBody": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "InputParameter",
+ "superClass": ["InputOutputParameter"]
+ },
+ {
+ "name": "OutputParameter",
+ "superClass": ["InputOutputParameter"]
+ },
+ {
+ "name": "Collectable",
+ "isAbstract": true,
+ "extends": ["bpmn:MultiInstanceLoopCharacteristics"],
+ "superClass": ["flowable:AsyncCapable"],
+ "properties": [
+ {
+ "name": "collection",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "elementVariable",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "SequenceFlow",
+ "superClass": ["FlowElement"],
+ "properties": [
+ {
+ "name": "isImmediate",
+ "isAttr": true,
+ "type": "Boolean"
+ },
+ {
+ "name": "conditionExpression",
+ "type": "Expression"
+ },
+ {
+ "name": "sourceRef",
+ "type": "FlowNode",
+ "isAttr": true,
+ "isReference": true
+ },
+ {
+ "name": "targetRef",
+ "type": "FlowNode",
+ "isAttr": true,
+ "isReference": true
+ }
+ ]
+ },
+ {
+ "name": "MultiInstanceLoopCharacteristics",
+ "superClass": ["LoopCharacteristics"],
+ "properties": [
+ {
+ "name": "isSequential",
+ "default": false,
+ "isAttr": true,
+ "type": "Boolean"
+ },
+ {
+ "name": "behavior",
+ "type": "MultiInstanceBehavior",
+ "default": "All",
+ "isAttr": true
+ },
+ {
+ "name": "loopCardinality",
+ "type": "Expression",
+ "xml": {
+ "serialize": "xsi:type"
+ }
+ },
+ {
+ "name": "loopDataInputRef",
+ "type": "ItemAwareElement",
+ "isReference": true
+ },
+ {
+ "name": "loopDataOutputRef",
+ "type": "ItemAwareElement",
+ "isReference": true
+ },
+ {
+ "name": "inputDataItem",
+ "type": "DataInput",
+ "xml": {
+ "serialize": "property"
+ }
+ },
+ {
+ "name": "outputDataItem",
+ "type": "DataOutput",
+ "xml": {
+ "serialize": "property"
+ }
+ },
+ {
+ "name": "complexBehaviorDefinition",
+ "type": "ComplexBehaviorDefinition",
+ "isMany": true
+ },
+ {
+ "name": "completionCondition",
+ "type": "Expression",
+ "xml": {
+ "serialize": "xsi:type"
+ }
+ },
+ {
+ "name": "oneBehaviorEventRef",
+ "type": "EventDefinition",
+ "isAttr": true,
+ "isReference": true
+ },
+ {
+ "name": "noneBehaviorEventRef",
+ "type": "EventDefinition",
+ "isAttr": true,
+ "isReference": true
+ }
+ ]
+ },
+ {
+ "name": "FailedJobRetryTimeCycle",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["flowable:AsyncCapable", "bpmn:MultiInstanceLoopCharacteristics"]
+ },
+ "properties": [
+ {
+ "name": "body",
+ "isBody": true,
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "name": "ExecutionListener",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": [
+ "bpmn:Task",
+ "bpmn:ServiceTask",
+ "bpmn:UserTask",
+ "bpmn:BusinessRuleTask",
+ "bpmn:ScriptTask",
+ "bpmn:ReceiveTask",
+ "bpmn:ManualTask",
+ "bpmn:ExclusiveGateway",
+ "bpmn:SequenceFlow",
+ "bpmn:ParallelGateway",
+ "bpmn:InclusiveGateway",
+ "bpmn:EventBasedGateway",
+ "bpmn:StartEvent",
+ "bpmn:IntermediateCatchEvent",
+ "bpmn:IntermediateThrowEvent",
+ "bpmn:EndEvent",
+ "bpmn:BoundaryEvent",
+ "bpmn:CallActivity",
+ "bpmn:SubProcess",
+ "bpmn:Process"
+ ]
+ },
+ "properties": [
+ {
+ "name": "expression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "class",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "delegateExpression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "event",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "script",
+ "type": "Script"
+ },
+ {
+ "name": "fields",
+ "type": "Field",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "TaskListener",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["bpmn:UserTask"]
+ },
+ "properties": [
+ {
+ "name": "expression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "class",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "delegateExpression",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "event",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "script",
+ "type": "Script"
+ },
+ {
+ "name": "fields",
+ "type": "Field",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "FormProperty",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"]
+ },
+ "properties": [
+ {
+ "name": "id",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "name",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "type",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "required",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "readable",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "writable",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "variable",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "expression",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "datePattern",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "default",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "values",
+ "type": "Value",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "FormData",
+ "superClass": ["Element"],
+ "meta": {
+ "allowedIn": ["bpmn:StartEvent", "bpmn:UserTask"]
+ },
+ "properties": [
+ {
+ "name": "fields",
+ "type": "FormField",
+ "isMany": true
+ },
+ {
+ "name": "businessKey",
+ "type": "String",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "FormField",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "id",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "label",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "type",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "datePattern",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "defaultValue",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "properties",
+ "type": "Properties"
+ },
+ {
+ "name": "validation",
+ "type": "Validation"
+ },
+ {
+ "name": "values",
+ "type": "Value",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "Validation",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "constraints",
+ "type": "Constraint",
+ "isMany": true
+ }
+ ]
+ },
+ {
+ "name": "Constraint",
+ "superClass": ["Element"],
+ "properties": [
+ {
+ "name": "name",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "config",
+ "type": "String",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "ConditionalEventDefinition",
+ "isAbstract": true,
+ "extends": ["bpmn:ConditionalEventDefinition"],
+ "properties": [
+ {
+ "name": "variableName",
+ "isAttr": true,
+ "type": "String"
+ },
+ {
+ "name": "variableEvent",
+ "isAttr": true,
+ "type": "String"
+ }
+ ]
+ }
+ ],
+ "emumerations": []
+ }
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/init.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/init.js
new file mode 100644
index 00000000..ec9e282d
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/init.js
@@ -0,0 +1,24 @@
+
+function randomStr() {
+ return Math.random().toString(36).slice(-8)
+}
+
+export default function() {
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/showConfig.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/showConfig.js
new file mode 100644
index 00000000..69ba83e5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/flowable/showConfig.js
@@ -0,0 +1,55 @@
+export default {
+ 'bpmn:EndEvent': {},
+ 'bpmn:StartEvent': {
+ initiator: true,
+ formKey: true
+ },
+ 'bpmn:UserTask': {
+ userType: true,
+ dataType: true,
+ assignee: true,
+ candidateUsers: true,
+ candidateGroups: true,
+ // assigneeFixed: true,
+ // candidateUsersFixed: true,
+ // candidateGroupsFixed: true,
+ async: true,
+ priority: true,
+ formKey: true,
+ skipExpression: true,
+ dueDate: true,
+ taskListener: true
+ },
+ 'bpmn:ServiceTask': {
+ async: true,
+ skipExpression: true,
+ isForCompensation: true,
+ triggerable: true,
+ class: true
+ },
+ 'bpmn:ScriptTask': {
+ async: true,
+ isForCompensation: true,
+ autoStoreVariables: true
+ },
+ 'bpmn:ManualTask': {
+ async: true,
+ isForCompensation: true
+ },
+ 'bpmn:ReceiveTask': {
+ async: true,
+ isForCompensation: true
+ },
+ 'bpmn:SendTask': {
+ async: true,
+ isForCompensation: true
+ },
+ 'bpmn:BusinessRuleTask': {
+ async: true,
+ isForCompensation: true,
+ ruleVariablesInput: true,
+ rules: true,
+ resultVariable: true,
+ exclude: true
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.js
new file mode 100644
index 00000000..f78489d2
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.js
@@ -0,0 +1,5 @@
+import workflowBpmnModeler from './index.vue'
+
+workflowBpmnModeler.install = Vue => Vue.component(workflowBpmnModeler.name, workflowBpmnModeler) // 给组件配置install方法
+
+export default workflowBpmnModeler
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.vue
new file mode 100644
index 00000000..fd40e365
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/index.vue
@@ -0,0 +1,467 @@
+
+
+
+
+
+ {{xml}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看xml
+ 下载xml
+ 下载svg
+ 保存模型
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/lang/zh.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/lang/zh.js
new file mode 100644
index 00000000..003c0cc5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/Process/lang/zh.js
@@ -0,0 +1,227 @@
+export default {
+ // Labels
+ 'Activate the global connect tool': '激活全局连接工具',
+ 'Append {type}': '添加 {type}',
+ 'Add Lane above': '在上面添加道',
+ 'Divide into two Lanes': '分割成两个道',
+ 'Divide into three Lanes': '分割成三个道',
+ 'Add Lane below': '在下面添加道',
+ 'Append compensation activity': '追加补偿活动',
+ 'Change type': '修改类型',
+ 'Connect using Association': '使用关联连接',
+ 'Connect using Sequence/MessageFlow or Association': '使用顺序/消息流或者关联连接',
+ 'Connect using DataInputAssociation': '使用数据输入关联连接',
+ 'Remove': '移除',
+ 'Activate the hand tool': '激活抓手工具',
+ 'Activate the lasso tool': '激活套索工具',
+ 'Activate the create/remove space tool': '激活创建/删除空间工具',
+ 'Create expanded SubProcess': '创建扩展子过程',
+ 'Create IntermediateThrowEvent/BoundaryEvent': '创建中间抛出事件/边界事件',
+ 'Create Pool/Participant': '创建池/参与者',
+ 'Parallel Multi Instance': '并行多重事件',
+ 'Sequential Multi Instance': '时序多重事件',
+ 'DataObjectReference': '数据对象参考',
+ 'DataStoreReference': '数据存储参考',
+ 'Loop': '循环',
+ 'Ad-hoc': '即席',
+ 'Create {type}': '创建 {type}',
+ 'Task': '任务',
+ 'Send Task': '发送任务',
+ 'Receive Task': '接收任务',
+ 'User Task': '用户任务',
+ 'Manual Task': '手工任务',
+ 'Business Rule Task': '业务规则任务',
+ 'Service Task': '服务任务',
+ 'Script Task': '脚本任务',
+ 'Call Activity': '调用活动',
+ 'Sub Process (collapsed)': '子流程(折叠的)',
+ 'Sub Process (expanded)': '子流程(展开的)',
+ 'Start Event': '开始事件',
+ 'StartEvent': '开始事件',
+ 'Intermediate Throw Event': '中间事件',
+ 'End Event': '结束事件',
+ 'EndEvent': '结束事件',
+ 'Create Gateway': '创建网关',
+ 'Create Intermediate/Boundary Event': '创建中间/边界事件',
+ 'Message Start Event': '消息开始事件',
+ 'Timer Start Event': '定时开始事件',
+ 'Conditional Start Event': '条件开始事件',
+ 'Signal Start Event': '信号开始事件',
+ 'Error Start Event': '错误开始事件',
+ 'Escalation Start Event': '升级开始事件',
+ 'Compensation Start Event': '补偿开始事件',
+ 'Message Start Event (non-interrupting)': '消息开始事件(非中断)',
+ 'Timer Start Event (non-interrupting)': '定时开始事件(非中断)',
+ 'Conditional Start Event (non-interrupting)': '条件开始事件(非中断)',
+ 'Signal Start Event (non-interrupting)': '信号开始事件(非中断)',
+ 'Escalation Start Event (non-interrupting)': '升级开始事件(非中断)',
+ 'Message Intermediate Catch Event': '消息中间捕获事件',
+ 'Message Intermediate Throw Event': '消息中间抛出事件',
+ 'Timer Intermediate Catch Event': '定时中间捕获事件',
+ 'Escalation Intermediate Throw Event': '升级中间抛出事件',
+ 'Conditional Intermediate Catch Event': '条件中间捕获事件',
+ 'Link Intermediate Catch Event': '链接中间捕获事件',
+ 'Link Intermediate Throw Event': '链接中间抛出事件',
+ 'Compensation Intermediate Throw Event': '补偿中间抛出事件',
+ 'Signal Intermediate Catch Event': '信号中间捕获事件',
+ 'Signal Intermediate Throw Event': '信号中间抛出事件',
+ 'Message End Event': '消息结束事件',
+ 'Escalation End Event': '定时结束事件',
+ 'Error End Event': '错误结束事件',
+ 'Cancel End Event': '取消结束事件',
+ 'Compensation End Event': '补偿结束事件',
+ 'Signal End Event': '信号结束事件',
+ 'Terminate End Event': '终止结束事件',
+ 'Message Boundary Event': '消息边界事件',
+ 'Message Boundary Event (non-interrupting)': '消息边界事件(非中断)',
+ 'Timer Boundary Event': '定时边界事件',
+ 'Timer Boundary Event (non-interrupting)': '定时边界事件(非中断)',
+ 'Escalation Boundary Event': '升级边界事件',
+ 'Escalation Boundary Event (non-interrupting)': '升级边界事件(非中断)',
+ 'Conditional Boundary Event': '条件边界事件',
+ 'Conditional Boundary Event (non-interrupting)': '条件边界事件(非中断)',
+ 'Error Boundary Event': '错误边界事件',
+ 'Cancel Boundary Event': '取消边界事件',
+ 'Signal Boundary Event': '信号边界事件',
+ 'Signal Boundary Event (non-interrupting)': '信号边界事件(非中断)',
+ 'Compensation Boundary Event': '补偿边界事件',
+ 'Exclusive Gateway': '互斥网关',
+ 'Parallel Gateway': '并行网关',
+ 'Inclusive Gateway': '相容网关',
+ 'Complex Gateway': '复杂网关',
+ 'Event based Gateway': '事件网关',
+ 'Transaction': '转运',
+ 'Sub Process': '子流程',
+ 'Event Sub Process': '事件子流程',
+ 'Collapsed Pool': '折叠池',
+ 'Expanded Pool': '展开池',
+ // Errors
+ 'no parent for {element} in {parent}': '在{parent}里,{element}没有父类',
+ 'no shape type specified': '没有指定的形状类型',
+ 'flow elements must be children of pools/participants': '流元素必须是池/参与者的子类',
+ 'out of bounds release': 'out of bounds release',
+ 'more than {count} child lanes': '子道大于{count} ',
+ 'element required': '元素不能为空',
+ 'diagram not part of bpmn:Definitions': '流程图不符合bpmn规范',
+ 'no diagram to display': '没有可展示的流程图',
+ 'no process or collaboration to display': '没有可展示的流程/协作',
+ 'element {element} referenced by {referenced}#{property} not yet drawn': '由{referenced}#{property}引用的{element}元素仍未绘制',
+ 'already rendered {element}': '{element} 已被渲染',
+ 'failed to import {element}': '导入{element}失败',
+ // 属性面板的参数
+ 'Id': '标识',
+ 'Name': '名称',
+ 'General': '常规',
+ 'Details': '详情',
+ 'Message Name': '消息名称',
+ 'Message': '消息',
+ 'Initiator': '创建者',
+ 'Asynchronous Continuations': '持续异步',
+ 'Asynchronous Before': '异步前',
+ 'Asynchronous After': '异步后',
+ 'Job Configuration': '工作配置',
+ 'Exclusive': '排除',
+ 'Job Priority': '工作优先级',
+ 'Retry Time Cycle': '重试时间周期',
+ 'Documentation': '文档',
+ 'Element Documentation': '元素文档',
+ 'History Configuration': '历史配置',
+ 'History Time To Live': '历史的生存时间',
+ 'Forms': '表单',
+ 'Form Key': '表单key',
+ 'Form Fields': '表单字段',
+ 'Business Key': '业务key',
+ 'Form Field': '表单字段',
+ 'ID': '编号',
+ 'Type': '类型',
+ 'Label': '名称',
+ 'Default Value': '默认值',
+ 'Validation': '校验',
+ 'Add Constraint': '添加约束',
+ 'Config': '配置',
+ 'Properties': '属性',
+ 'Add Property': '添加属性',
+ 'Value': '值',
+ 'Listeners': '监听器',
+ 'Execution Listener': '执行监听',
+ 'Event Type': '事件类型',
+ 'Listener Type': '监听器类型',
+ 'Java Class': 'Java类',
+ 'Expression': '表达式',
+ 'Must provide a value': '必须提供一个值',
+ 'Delegate Expression': '代理表达式',
+ 'Script': '脚本',
+ 'Script Format': '脚本格式',
+ 'Script Type': '脚本类型',
+ 'Inline Script': '内联脚本',
+ 'External Script': '外部脚本',
+ 'Resource': '资源',
+ 'Field Injection': '字段注入',
+ 'Extensions': '扩展',
+ 'Input/Output': '输入/输出',
+ 'Input Parameters': '输入参数',
+ 'Output Parameters': '输出参数',
+ 'Parameters': '参数',
+ 'Output Parameter': '输出参数',
+ 'Timer Definition Type': '定时器定义类型',
+ 'Timer Definition': '定时器定义',
+ 'Date': '日期',
+ 'Duration': '持续',
+ 'Cycle': '循环',
+ 'Signal': '信号',
+ 'Signal Name': '信号名称',
+ 'Escalation': '升级',
+ 'Error': '错误',
+ 'Link Name': '链接名称',
+ 'Condition': '条件名称',
+ 'Variable Name': '变量名称',
+ 'Variable Event': '变量事件',
+ 'Specify more than one variable change event as a comma separated list.': '多个变量事件以逗号隔开',
+ 'Wait for Completion': '等待完成',
+ 'Activity Ref': '活动参考',
+ 'Version Tag': '版本标签',
+ 'Executable': '可执行文件',
+ 'External Task Configuration': '扩展任务配置',
+ 'Task Priority': '任务优先级',
+ 'External': '外部',
+ 'Connector': '连接器',
+ 'Must configure Connector': '必须配置连接器',
+ 'Connector Id': '连接器编号',
+ 'Implementation': '实现方式',
+ 'Field Injections': '字段注入',
+ 'Fields': '字段',
+ 'Result Variable': '结果变量',
+ 'Topic': '主题',
+ 'Configure Connector': '配置连接器',
+ 'Input Parameter': '输入参数',
+ 'Assignee': '代理人',
+ 'Candidate Users': '候选用户',
+ 'Candidate Groups': '候选组',
+ 'Due Date': '到期时间',
+ 'Follow Up Date': '跟踪日期',
+ 'Priority': '优先级',
+ 'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': '跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
+ 'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': '跟踪日期必须符合EL表达式,如: ${someDate} ,或者一个ISO标准日期,如:2015-06-26T09:54:00',
+ 'Variables': '变量'
+}
+
+export const NodeName = {
+ 'bpmn:Process': '流程',
+ 'bpmn:StartEvent': '开始事件',
+ 'bpmn:IntermediateThrowEvent': '中间事件',
+ 'bpmn:Task': '任务',
+ 'bpmn:SendTask': '发送任务',
+ 'bpmn:ReceiveTask': '接收任务',
+ 'bpmn:UserTask': '用户任务',
+ 'bpmn:ManualTask': '手工任务',
+ 'bpmn:BusinessRuleTask': '业务规则任务',
+ 'bpmn:ServiceTask': '服务任务',
+ 'bpmn:ScriptTask': '脚本任务',
+ 'bpmn:EndEvent': '结束事件',
+ 'bpmn:SequenceFlow': '流程线',
+ 'bpmn:ExclusiveGateway': '互斥网关',
+ 'bpmn:ParallelGateway': '并行网关',
+ 'bpmn:InclusiveGateway': '相容网关',
+ 'bpmn:ComplexGateway': '复杂网关',
+ 'bpmn:EventBasedGateway': '事件网关'
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagement.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagement.vue
new file mode 100644
index 00000000..37192a54
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagement.vue
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.dictValue }}
+
+
+
+
+
+
+
+
+
{{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.customerNo }}
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+ {{ scope.row.customerType }}
+
+
+
+
+ {{ scope.row.mobile }}
+
+
+
+
+ {{ scope.row.weixin }}
+
+
+
+
+ {{ scope.row.level }}
+
+
+
+
+ {{ scope.row.remind_day }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementAdd.vue
new file mode 100644
index 00000000..4e2cc796
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementAdd.vue
@@ -0,0 +1,660 @@
+
+
+
+
+
+
客户信息
+
+
+
+
+
+ 客户名称
+
+
+
+
+
+
+
+
+
+ 客户类型
+
+
+
+
+ {{ temp.customerType }}
+
+
+
+
+
+
+ 联系电话
+
+
+
+
+
+
+
+
+
+ 微信号
+
+
+
+
+
+
+
+
+
+
+
+ 公司名称
+
+
+
+
+
+
+
+
+
+
+
+ 客户地址
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 客户级别
+
+
+
+
+
+
+
+
+
+
+
+ 是否开启提醒
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+ 提醒日期
+
+
+
+
+
+
+
+
+
+
+ 提醒备注
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 客户生日
+
+
+
+
+
+
+
+
+
+ 性别
+
+
+
+
+ 男
+ 女
+
+
+
+
+
+
+ 证件类型
+
+
+
+
+
+
+
+
+
+ 证件号码
+
+
+
+
+
+
+
+
+
+
+
+ 证件有效期
+
+
+
+
+
+
+
+
+
+ 电子邮箱
+
+
+
+
+
+
+
+
+
+
+
+ 紧急联系人
+
+
+
+
+
+
+
+
+
+ 紧急联系电话
+
+
+
+
+
+
+
+
+
+
+
+ 客户来源
+
+
+
+
+
+
+
+
+
+
+
+ 客户分类
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否更新用户
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementInfo.vue
new file mode 100644
index 00000000..7d5274ce
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/customermanagement/customermanagementInfo.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+ 客户信息
+
+
+
+
+ 客户名称
+
+
+
+
+
+
+
+
+
+ 客户类型
+
+
+
+
+
+
+
+
+
+
+
+ 联系电话
+
+
+
+
+
+
+
+
+
+ 微信号
+
+
+
+
+
+
+
+
+
+
+
+ 公司名称
+
+
+
+
+
+
+
+
+
+
+
+ 客户地址
+
+
+
+
+
+ {{ temp.province }} {{ temp.city }} {{ temp.county }} {{ temp.address }}
+
+
+
+
+
+
+ 客户级别
+
+
+
+
+
+
+
+
+
+ 是否开启提醒
+
+
+
+
+
+
+
+
+
+
+
+ 提醒日期
+
+
+
+
+
+
+
+
+
+ 提醒备注
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 客户生日
+
+
+
+
+
+
+
+
+
+ 性别
+
+
+
+
+
+
+
+
+
+
+
+ 证件类型
+
+
+
+
+
+
+
+
+
+ 证件号码
+
+
+
+
+
+
+
+
+
+
+
+ 证件有效期
+
+
+
+
+
+
+
+
+
+ 电子邮箱
+
+
+
+
+
+
+
+
+
+
+
+ 紧急联系人
+
+
+
+
+
+
+
+
+
+ 紧急联系电话
+
+
+
+
+
+
+
+
+
+
+
+ 客户来源
+
+
+
+
+
+
+
+
+
+ 客户分类
+
+
+
+
+
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseAdd.vue
new file mode 100644
index 00000000..0f685613
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseAdd.vue
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+
+
+ 企业名称:
+
+
+
+ 企业简称:
+
+
+
+ 营业执照:
+
+
+
+ 企业法人:
+
+
+
+ 联系人员:
+
+
+
+ 联系电话:
+
+
+
+ 银行账户:
+
+
+
+ 银行卡号:
+
+
+
+ 开户行名称:
+
+
+
+
+
省-市-县:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 企业地址:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseInfo.vue
new file mode 100644
index 00000000..f0f6e3c0
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/enterpriseInfo.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+ 企业信息
+
+
+
+
+ 企业名称
+
+
+
+
+ {{temp.enterpriseName}}
+
+
+
+
+ 企业简称
+
+
+
+
+ {{temp.enterpriseAbbreviation}}
+
+
+
+
+
+
+ 企业法人
+
+
+
+
+ {{temp.juridicalPerson}}
+
+
+
+
+ 营业执照
+
+
+
+
+ {{temp.businessLicenseNumber}}
+
+
+
+
+
+
+ 联系人
+
+
+
+
+ {{temp.contacts}}
+
+
+
+
+ 联系电话
+
+
+
+
+ {{temp.telephone}}
+
+
+
+
+
+
+ 银行账户
+
+
+
+
+ {{temp.bankAccount}}
+
+
+
+
+ 银行卡号
+
+
+
+
+ {{temp.accountNumber}}
+
+
+
+
+
+
+ 开户银行
+
+
+
+
+ {{temp.openingBankName}}
+
+
+
+
+
+
+
+ 省-市-县
+
+
+
+
+ {{temp.province}} - {{temp.city}} - {{temp.county}}
+
+
+
+
+ 企业地址
+
+
+
+
+ {{temp.address}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/index.vue
new file mode 100644
index 00000000..41e6035c
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/enterprise/index.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
{{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+ 查看
+ 编辑
+ 删除
+
+
+
+
+
+
+ {{ scope.row.province }}
+ -{{ scope.row.city }}-
+ {{ scope.row.county }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/BrandMessage.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/BrandMessage.vue
new file mode 100644
index 00000000..e4e77fe1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/BrandMessage.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/CuisineMessage.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/CuisineMessage.vue
new file mode 100644
index 00000000..7145befe
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/CuisineMessage.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/GroupMessage.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/GroupMessage.vue
new file mode 100644
index 00000000..72ad35de
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/GroupMessage.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/MaterialMessage.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/MaterialMessage.vue
new file mode 100644
index 00000000..63042c9d
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/MaterialMessage.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/ShopMessage.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/ShopMessage.vue
new file mode 100644
index 00000000..1212ed92
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/essentialData/ShopMessage.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/inBoundAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/inBoundAdd.vue
new file mode 100644
index 00000000..af3b15a1
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/inBoundAdd.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+ 合同编号:
+
+
+
+ 合同日期:
+
+
+
+ 入库日期:
+
+
+
+ 油罐编号:
+
+
+
+
+
+
+ 原油种类:
+
+
+
+
+ 净重:
+
+
+
+ 价值:
+
+
+
+ 供货商:
+
+
+
+ 发货车牌号:
+
+
+
+ 备注:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/index.vue
new file mode 100644
index 00000000..abe8db52
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/index.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+ {{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/outBoundAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/outBoundAdd.vue
new file mode 100644
index 00000000..877556bd
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inAndOutBound/outBoundAdd.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+ 合同编号:
+
+
+
+ 合同日期:
+
+
+
+ 出库日期:
+
+
+
+ 油罐编号:
+
+
+
+
+
+
+ 原油种类:
+
+
+
+
+ 净重:
+
+
+
+ 价值:
+
+
+
+ 备注:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/index.vue
new file mode 100644
index 00000000..32f742ca
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/index.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryAdd.vue
new file mode 100644
index 00000000..924468f5
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryAdd.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+ 项目行业名称:
+
+
+
+ 项目行业说明:
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryInfo.vue
new file mode 100644
index 00000000..2476fe74
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/industry/industryInfo.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+ {{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inquireStatistics/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inquireStatistics/index.vue
new file mode 100644
index 00000000..baffb336
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/inquireStatistics/index.vue
@@ -0,0 +1,476 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 采购
+
+
+ 销售
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 立即抓取
+ 重置
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/login/login.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/login/login.vue
new file mode 100644
index 00000000..985a79b2
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/login/login.vue
@@ -0,0 +1,232 @@
+
+
+
+
贷后监管
+
贷后监管体系
+
+
+
+
+ 用户登录
+
+
+
+
+
+
+
+ 忘记密码 ?
+
+
+ 提示:用户名或密码错误,请重试!
+
+
+
+
+ 登 录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/index.vue
new file mode 100644
index 00000000..126ec736
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/index.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
{{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+ 记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/oilTankAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/oilTankAdd.vue
new file mode 100644
index 00000000..75914d8b
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilTank/oilTankAdd.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+ 油罐编号:
+
+
+
+ 原油类型:
+
+
+
+
+
+
+ 原油编号:
+
+
+
+
+ 油罐容量:
+
+
+
+ 油罐管道:
+
+
+
+ 油罐库存:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/index.vue
new file mode 100644
index 00000000..4007248d
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/index.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
{{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeAdd.vue
new file mode 100644
index 00000000..96d19d2a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeAdd.vue
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+
+ 原油名称:
+
+
+
+ 原油编码:
+
+
+
+ 原油Code:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeInfo.vue
new file mode 100644
index 00000000..1a19a24b
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/oilType/oilTypeInfo.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+ 项目信息表
+
+
+
+
+ 项目名称
+
+
+
+
+ {{temp.entryName}}
+
+
+
+
+ 所属行业
+
+
+
+
+ {{temp.industryName}}
+
+
+
+
+
+
+ 项目类型
+
+
+
+
+ {{temp.typeName}}
+
+
+
+
+ 授信额度
+
+
+
+
+ {{temp.creditLimit}}
+
+
+
+
+
+
+ 贷款行
+
+
+
+
+ {{temp.bankName}}
+
+
+
+
+ 客户经理
+
+
+
+
+ {{temp.bmanagerName}}
+
+
+
+
+
+
+ 接洽日期
+
+
+
+
+ {{temp.engaDate}}
+
+
+
+
+ 签约日期
+
+
+
+
+ {{temp.signingDate}}
+
+
+
+
+
+
+
+ 项目单位
+
+
+
+
+ {{temp.enterpriseName}}
+
+
+
+
+ 项目联系人
+
+
+
+
+ {{temp.econtacts}}
+
+
+
+
+
+
+ 项目说明
+
+
+
+
+ {{temp.remarks}}
+
+
+
+
+
+
+ 监管负责人
+
+
+
+
+ {{temp.regulatoryLeader}}
+
+
+
+
+ 事业部经理
+
+
+
+
+ {{temp.generalManager}}
+
+
+
+
+
+
+ 结束日期
+
+
+
+
+ {{temp.endDate}}
+
+
+
+
+ 填表日期
+
+
+
+
+ {{temp.fillInDate}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/dataSet.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/dataSet.vue
new file mode 100644
index 00000000..1bb05e43
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/dataSet.vue
@@ -0,0 +1,17 @@
+.
+
+
+ 定时采集数据设置
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/footSet.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/footSet.vue
new file mode 100644
index 00000000..d9dd7c47
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/parameterSet/footSet.vue
@@ -0,0 +1,273 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+
+ 添加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+
+ 删除
+
+
+
+
+
+
+
+
+ 品牌名称 |
+
+
+ |
+
+
+ 占比名称 |
+
+
+ |
+
+
+ 占比百分比 |
+
+
+ |
+
+
+
+ 添加
+
+
+
+
+
+
+ 品牌名称 |
+
+
+ |
+
+
+ 占比名称 |
+
+
+ |
+
+
+ 占比百分比 |
+
+
+ |
+
+
+
+ 修改
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeAdd.vue
new file mode 100644
index 00000000..c2e7d81c
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeAdd.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+ 项目类型名称:
+
+
+
+ 项目类型说明:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeInfo.vue
new file mode 100644
index 00000000..8a4bf5b8
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/projectType/projectTypeInfo.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+ {{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/redirect/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/redirect/index.vue
new file mode 100644
index 00000000..db4c1d66
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/redirect/index.vue
@@ -0,0 +1,12 @@
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/index.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/index.vue
new file mode 100644
index 00000000..4c296086
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/index.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
{{ searchxianshitit }}
+
+
+
+
+
+
+
+
+
+ 查看
+ 编辑
+ 删除
+
+
+
+
+
+ {{ scope.row.province }}
+ -{{ scope.row.city }}-
+ {{ scope.row.county }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseAdd.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseAdd.vue
new file mode 100644
index 00000000..eae2cc18
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseAdd.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+ 库房位置:
+
+
+
+
省-市-县:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 库房面积:
+
+
+
+ 库房层高:
+
+
+
+ 库房价格:
+
+
+
+ 库房性质:
+
+
+
+ 房源:
+
+
+
+
+ 联系人:
+
+
+
+ 联系电话:
+
+
+
+ 备注:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseInfo.vue b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseInfo.vue
new file mode 100644
index 00000000..f3601c11
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/src/views/storehouse/storehouseInfo.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+ 库房信息
+
+
+
+
+ 库房位置
+
+
+
+
+ {{temp.address}}
+
+
+
+
+ 省-市-县
+
+
+
+
+ {{temp.province}} - {{temp.city}} - {{temp.county}}
+
+
+
+
+
+
+ 库房面积
+
+
+
+
+ {{temp.squareMeasure}}
+
+
+
+
+ 库房层高
+
+
+
+
+ {{temp.floorHeight}}
+
+
+
+
+
+
+ 库房价格
+
+
+
+
+ {{temp.price}}
+
+
+
+
+ 库房性质
+
+
+
+
+ {{temp.properties}}
+
+
+
+
+
+
+ 房源
+
+
+
+
+ {{temp.housingResources}}
+
+
+
+
+ 备注
+
+
+
+
+ {{temp.remarks}}
+
+
+
+
+
+
+ 联系人
+
+
+
+
+ {{temp.contacts}}
+
+
+
+
+ 联系电话
+
+
+
+
+ {{temp.telephone}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/.eslintrc.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/.eslintrc.js
new file mode 100644
index 00000000..958d51ba
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/.eslintrc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ env: {
+ jest: true
+ }
+}
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Breadcrumb.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Breadcrumb.spec.js
new file mode 100644
index 00000000..1d94c8fc
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Breadcrumb.spec.js
@@ -0,0 +1,98 @@
+import { mount, createLocalVue } from '@vue/test-utils'
+import VueRouter from 'vue-router'
+import ElementUI from 'element-ui'
+import Breadcrumb from '@/components/Breadcrumb/index.vue'
+
+const localVue = createLocalVue()
+localVue.use(VueRouter)
+localVue.use(ElementUI)
+
+const routes = [
+ {
+ path: '/',
+ name: 'home',
+ children: [{
+ path: 'dashboard',
+ name: 'dashboard'
+ }]
+ },
+ {
+ path: '/menu',
+ name: 'menu',
+ children: [{
+ path: 'menu1',
+ name: 'menu1',
+ meta: { title: 'menu1' },
+ children: [{
+ path: 'menu1-1',
+ name: 'menu1-1',
+ meta: { title: 'menu1-1' }
+ },
+ {
+ path: 'menu1-2',
+ name: 'menu1-2',
+ redirect: 'noredirect',
+ meta: { title: 'menu1-2' },
+ children: [{
+ path: 'menu1-2-1',
+ name: 'menu1-2-1',
+ meta: { title: 'menu1-2-1' }
+ },
+ {
+ path: 'menu1-2-2',
+ name: 'menu1-2-2'
+ }]
+ }]
+ }]
+ }]
+
+const router = new VueRouter({
+ routes
+})
+
+describe('Breadcrumb.vue', () => {
+ const wrapper = mount(Breadcrumb, {
+ localVue,
+ router
+ })
+ it('dashboard', () => {
+ router.push('/dashboard')
+ const len = wrapper.findAll('.el-breadcrumb__inner').length
+ expect(len).toBe(1)
+ })
+ it('normal route', () => {
+ router.push('/menu/menu1')
+ const len = wrapper.findAll('.el-breadcrumb__inner').length
+ expect(len).toBe(2)
+ })
+ it('nested route', () => {
+ router.push('/menu/menu1/menu1-2/menu1-2-1')
+ const len = wrapper.findAll('.el-breadcrumb__inner').length
+ expect(len).toBe(4)
+ })
+ it('no meta.title', () => {
+ router.push('/menu/menu1/menu1-2/menu1-2-2')
+ const len = wrapper.findAll('.el-breadcrumb__inner').length
+ expect(len).toBe(3)
+ })
+ // it('click link', () => {
+ // router.push('/menu/menu1/menu1-2/menu1-2-2')
+ // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+ // const second = breadcrumbArray.at(1)
+ // console.log(breadcrumbArray)
+ // const href = second.find('a').attributes().href
+ // expect(href).toBe('#/menu/menu1')
+ // })
+ // it('noRedirect', () => {
+ // router.push('/menu/menu1/menu1-2/menu1-2-1')
+ // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+ // const redirectBreadcrumb = breadcrumbArray.at(2)
+ // expect(redirectBreadcrumb.contains('a')).toBe(false)
+ // })
+ it('last breadcrumb', () => {
+ router.push('/menu/menu1/menu1-2/menu1-2-1')
+ const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner')
+ const redirectBreadcrumb = breadcrumbArray.at(3)
+ expect(redirectBreadcrumb.contains('a')).toBe(false)
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Hamburger.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Hamburger.spec.js
new file mode 100644
index 00000000..01ea303a
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/Hamburger.spec.js
@@ -0,0 +1,18 @@
+import { shallowMount } from '@vue/test-utils'
+import Hamburger from '@/components/Hamburger/index.vue'
+describe('Hamburger.vue', () => {
+ it('toggle click', () => {
+ const wrapper = shallowMount(Hamburger)
+ const mockFn = jest.fn()
+ wrapper.vm.$on('toggleClick', mockFn)
+ wrapper.find('.hamburger').trigger('click')
+ expect(mockFn).toBeCalled()
+ })
+ it('prop isActive', () => {
+ const wrapper = shallowMount(Hamburger)
+ wrapper.setProps({ isActive: true })
+ expect(wrapper.contains('.is-active')).toBe(true)
+ wrapper.setProps({ isActive: false })
+ expect(wrapper.contains('.is-active')).toBe(false)
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/SvgIcon.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/SvgIcon.spec.js
new file mode 100644
index 00000000..31467a9f
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/components/SvgIcon.spec.js
@@ -0,0 +1,22 @@
+import { shallowMount } from '@vue/test-utils'
+import SvgIcon from '@/components/SvgIcon/index.vue'
+describe('SvgIcon.vue', () => {
+ it('iconClass', () => {
+ const wrapper = shallowMount(SvgIcon, {
+ propsData: {
+ iconClass: 'test'
+ }
+ })
+ expect(wrapper.find('use').attributes().href).toBe('#icon-test')
+ })
+ it('className', () => {
+ const wrapper = shallowMount(SvgIcon, {
+ propsData: {
+ iconClass: 'test'
+ }
+ })
+ expect(wrapper.classes().length).toBe(1)
+ wrapper.setProps({ className: 'test' })
+ expect(wrapper.classes().includes('test')).toBe(true)
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/formatTime.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/formatTime.spec.js
new file mode 100644
index 00000000..24e165b4
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/formatTime.spec.js
@@ -0,0 +1,30 @@
+import { formatTime } from '@/utils/index.js'
+
+describe('Utils:formatTime', () => {
+ const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01"
+ const retrofit = 5 * 1000
+
+ it('ten digits timestamp', () => {
+ expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分')
+ })
+ it('test now', () => {
+ expect(formatTime(+new Date() - 1)).toBe('刚刚')
+ })
+ it('less two minute', () => {
+ expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前')
+ })
+ it('less two hour', () => {
+ expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前')
+ })
+ it('less one day', () => {
+ expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前')
+ })
+ it('more than one day', () => {
+ expect(formatTime(d)).toBe('7月13日17时54分')
+ })
+ it('format', () => {
+ expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')
+ expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')
+ expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/param2Obj.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/param2Obj.spec.js
new file mode 100644
index 00000000..e106ed88
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/param2Obj.spec.js
@@ -0,0 +1,14 @@
+import { param2Obj } from '@/utils/index.js'
+describe('Utils:param2Obj', () => {
+ const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95'
+
+ it('param2Obj test', () => {
+ expect(param2Obj(url)).toEqual({
+ name: 'bill',
+ age: '29',
+ sex: '1',
+ field: window.btoa('test'),
+ key: '测试'
+ })
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/parseTime.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/parseTime.spec.js
new file mode 100644
index 00000000..56045af4
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/parseTime.spec.js
@@ -0,0 +1,35 @@
+import { parseTime } from '@/utils/index.js'
+
+describe('Utils:parseTime', () => {
+ const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01"
+ it('timestamp', () => {
+ expect(parseTime(d)).toBe('2018-07-13 17:54:01')
+ })
+ it('timestamp string', () => {
+ expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01')
+ })
+ it('ten digits timestamp', () => {
+ expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01')
+ })
+ it('new Date', () => {
+ expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01')
+ })
+ it('format', () => {
+ expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54')
+ expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13')
+ expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54')
+ })
+ it('get the day of the week', () => {
+ expect(parseTime(d, '{a}')).toBe('五') // 星期五
+ })
+ it('get the day of the week', () => {
+ expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日
+ })
+ it('empty argument', () => {
+ expect(parseTime()).toBeNull()
+ })
+
+ it('null', () => {
+ expect(parseTime(null)).toBeNull()
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/validate.spec.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/validate.spec.js
new file mode 100644
index 00000000..f774905b
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/tests/unit/utils/validate.spec.js
@@ -0,0 +1,17 @@
+import { validUsername, isExternal } from '@/utils/validate.js'
+
+describe('Utils:validate', () => {
+ it('validUsername', () => {
+ expect(validUsername('admin')).toBe(true)
+ expect(validUsername('editor')).toBe(true)
+ expect(validUsername('xxxx')).toBe(false)
+ })
+ it('isExternal', () => {
+ expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true)
+ expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true)
+ expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false)
+ expect(isExternal('/dashboard')).toBe(false)
+ expect(isExternal('./dashboard')).toBe(false)
+ expect(isExternal('dashboard')).toBe(false)
+ })
+})
diff --git a/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/vue.config.js b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/vue.config.js
new file mode 100644
index 00000000..b25edde3
--- /dev/null
+++ b/yxt_supervise/supervise-dispatchcenter/supervise-dispatchcenter-ui/vue.config.js
@@ -0,0 +1,142 @@
+'use strict'
+const path = require('path')
+const defaultSettings = require('./src/settings.js')
+
+function resolve(dir) {
+ return path.join(__dirname, dir)
+}
+
+const name = defaultSettings.title || '汇融云眼贷后监管平台' // page title
+
+// 如果端口设置为80,
+// 使用管理员权限执行命令行。
+// 例如,Mac:sudo npm run
+// 可以通过以下方法更改端口:
+// port=9528 npm run dev或npm run dev--port=9528
+const port = process.env.port || process.env.npm_config_port || 9531 // dev port
+
+// 所有配置项说明都可以在中找到https://cli.vuejs.org/config/
+module.exports = {
+ /**
+ *如果计划在子路径下部署站点,则需要设置publicPath,
+ *例如GitHub页面。如果您计划将站点部署到https://foo.github.io/bar/,
+ *然后publicPath应设置为“/bar/”。
+ *在大多数情况下,请使用“/”!!!
+ *详细信息:https://cli.vuejs.org/config/#publicpath
+ */
+ publicPath: '/', //process.env.NODE_ENV === 'production' ? '/dispatchcenter/' : '/',
+ outputDir: 'dispatchcenter-ui',
+ assetsDir: 'static',
+ lintOnSave: process.env.NODE_ENV === 'development',
+ productionSourceMap: false,
+ devServer: {
+ hot: true, // 自动保存
+ host: '0.0.0.0',
+ port: port,
+ open: true,
+ overlay: {
+ warnings: false,
+ errors: true
+ },
+ proxy: {
+ '/api/yxtdispatchcenter': { // 匹配所有以 '/api'开头的请求路径
+ // target: 'http://192.168.1.109:8111',
+ target: process.env.VUE_APP_URL, // 代理目标的基础路径
+ changeOrigin: true, // 支持跨域
+ pathRewrite: { // 重写路径: 去掉路径中开头的'/api'
+ '^/api/yxtdispatchcenter': ''
+ }
+ },
+ '/upload': { // 匹配所有以 '/api'开头的请求路径
+ // target: 'http://120.46.131.15:8111',
+ target: process.env.VUE_APP_URL, // 代理目标的基础路径
+ changeOrigin: true, // 支持跨域
+ pathRewrite: { // 重写路径: 去掉路径中开头的'/api'
+ '^/upload': ''
+ }
+ }
+ },
+ disableHostCheck: true
+ },
+ configureWebpack: {
+ // 在webpack的name字段中提供应用程序的标题,以便
+ // 它可以在索引.html插入正确的标题。
+ name: name,
+ resolve: {
+ alias: {
+ '@': resolve('src'),
+ '@C': resolve('src/components')
+ }
+ }
+ },
+ chainWebpack(config) {
+ // 它可以提高第一屏的速度,建议打开预加载
+ config.plugin('preload').tap(() => [{
+ rel: 'preload',
+ // 忽略 runtime.js
+ // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
+ fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
+ include: 'initial'
+ }])
+
+ // 当有很多页面时,会导致太多无意义的请求
+ config.plugins.delete('prefetch')
+
+ // set svg-sprite-loader 设置 svg精灵加载程序
+ config.module
+ .rule('svg')
+ .exclude.add(resolve('src/icons'))
+ .end()
+ config.module
+ .rule('icons')
+ .test(/\.svg$/)
+ .include.add(resolve('src/icons'))
+ .end()
+ .use('svg-sprite-loader')
+ .loader('svg-sprite-loader')
+ .options({
+ symbolId: 'icon-[name]'
+ })
+ .end()
+
+ config
+ .when(process.env.NODE_ENV !== 'development',
+ config => {
+ config
+ .plugin('ScriptExtHtmlWebpackPlugin')
+ .after('html')
+ .use('script-ext-html-webpack-plugin', [{
+ // `runtime` must same as runtimeChunk name. default is `runtime`
+ inline: /runtime\..*\.js$/
+ }])
+ .end()
+ config
+ .optimization.splitChunks({
+ chunks: 'all',
+ cacheGroups: {
+ libs: {
+ name: 'chunk-libs',
+ test: /[\\/]node_modules[\\/]/,
+ priority: 10,
+ chunks: 'initial' // only package third parties that are initially dependent
+ },
+ elementUI: {
+ name: 'chunk-elementUI', // split elementUI into a single package
+ priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+ test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+ },
+ commons: {
+ name: 'chunk-commons',
+ test: resolve('src/components'), // can customize your rules
+ minChunks: 3, // minimum common number
+ priority: 5,
+ reuseExistingChunk: true
+ }
+ }
+ })
+ // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
+ config.optimization.runtimeChunk('single')
+ }
+ )
+ }
+}