import React, {Component} from 'react'
|
import { fromJS } from 'immutable'
|
import { Spin, notification, Button, Modal } from 'antd'
|
import moment from 'moment'
|
import { SwapOutlined } from '@ant-design/icons'
|
|
import Api from '@/api'
|
import Utils from '@/utils/utils.js'
|
import asyncComponent from '@/utils/asyncComponent'
|
import { getAllSqls } from '@/utils/utils-custom.js'
|
import './index.scss'
|
|
const Header = asyncComponent(() => import('./header'))
|
const { confirm } = Modal
|
|
class SysCheck extends Component {
|
state = {
|
stop: false,
|
loading: false,
|
menulist: [],
|
activeMenu: null,
|
remain: 0,
|
lackmenus: [],
|
outmenus: [],
|
backmenus: [],
|
appbackmenus: [],
|
unablemenus: [],
|
}
|
|
sqlmap = null
|
|
// delete _val.controlField 删除按钮控制字段
|
|
UNSAFE_componentWillMount() {
|
document.body.className = ''
|
window.GLOB.syscheck = true
|
}
|
|
componentDidMount() {
|
if (!sessionStorage.getItem('UserID')) {
|
this.props.history.replace('/login')
|
return
|
}
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
getMenus = () => {
|
this.setState({
|
stop: false,
|
activeMenu: null,
|
remain: 0,
|
menulist: [],
|
lackmenus: [],
|
outmenus: [],
|
backmenus: [],
|
appbackmenus: [],
|
unablemenus: [],
|
loading: true
|
})
|
Api.getCloudConfig({func: 's_get_pc_menus', systemType: window.GLOB.sysType, debug: 'Y'}).then(result => {
|
if (result.status) {
|
let menulist = []
|
result.fst_menu.forEach(fst => {
|
if (fst.snd_menu) {
|
fst.snd_menu.forEach(snd => {
|
if (snd.trd_menu) {
|
snd.trd_menu.forEach(trd => {
|
if (trd.PageParam) {
|
let pass = false
|
try {
|
let PageParam = JSON.parse(trd.PageParam)
|
if (PageParam && PageParam.Template === 'RolePermission') {
|
pass = true
|
}
|
} catch (e) {
|
|
}
|
if (pass) return
|
}
|
|
menulist.push({
|
MenuID: trd.MenuID,
|
MenuName: trd.MenuName,
|
MenuNo: trd.MenuNo,
|
pName: fst.MenuName + '-' + snd.MenuName,
|
})
|
})
|
}
|
})
|
}
|
})
|
|
if (menulist.length === 0) {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: '未查询到菜单信息!',
|
duration: 5
|
})
|
} else {
|
this.sqlmap = new Map()
|
|
let errlist = sessionStorage.getItem('syscheck_main')
|
errlist = errlist ? JSON.parse(errlist) : null
|
|
if (!errlist) {
|
this.setState({
|
menulist
|
})
|
this.getMenuParam(fromJS(menulist).toJS())
|
} else {
|
const that = this
|
confirm({
|
title: '是否跳过检查合格菜单?',
|
content: '',
|
okText: '跳过',
|
cancelText: '不跳过',
|
onOk() {
|
menulist = menulist.filter(item => errlist.includes(item.MenuID))
|
|
that.setState({
|
menulist
|
})
|
that.getMenuParam(fromJS(menulist).toJS())
|
},
|
onCancel() {
|
that.setState({
|
menulist
|
})
|
that.getMenuParam(fromJS(menulist).toJS())
|
}
|
})
|
}
|
}
|
} else {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
}
|
|
getAppList = () => {
|
let param = {
|
func: 's_get_kei'
|
}
|
|
this.setState({
|
stop: false,
|
activeMenu: null,
|
remain: 0,
|
menulist: [],
|
lackmenus: [],
|
outmenus: [],
|
backmenus: [],
|
appbackmenus: [],
|
unablemenus: [],
|
loading: true
|
})
|
|
Api.getCloudConfig(param).then(result => {
|
if (result.status) {
|
let applist = []
|
result.data.forEach(item => {
|
if (!item.data_detail) return
|
item.data_detail.forEach(cell => {
|
applist.push({
|
ID: cell.d_id,
|
name: item.remark,
|
typename: cell.typename,
|
kei_no: item.kei_no,
|
lang: cell.lang,
|
menus: []
|
})
|
})
|
})
|
|
if (applist.length === 0) {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: '未查询到菜单信息!',
|
duration: 5
|
})
|
} else {
|
let deffers = applist.map((app, i) =>
|
new Promise(resolve => {
|
let param = {
|
func: 's_get_app_menus',
|
TypeCharOne: app.kei_no,
|
typename: app.typename,
|
LText: `select '${window.GLOB.appkey}'`,
|
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
|
lang: app.lang
|
}
|
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
setTimeout(() => {
|
Api.getCloudConfig(param).then(result => {
|
if (result.status) {
|
app.status = true
|
app.menus = []
|
|
result.menus.forEach(m => {
|
if (m.menus_rolelist) {
|
try {
|
let pageParam = JSON.parse(window.decodeURIComponent(window.atob(m.menus_rolelist)))
|
if (pageParam.type === 'navbar') {
|
m.type = pageParam.type
|
}
|
} catch(e) {
|
|
}
|
if (m.type === 'navbar') return
|
}
|
delete m.menus_rolelist
|
|
app.menus.push(m)
|
})
|
resolve(app)
|
} else {
|
resolve(result)
|
}
|
})
|
}, 200 * i)
|
})
|
)
|
|
Promise.all(deffers).then(response => {
|
let error = response.filter(cell => !cell.status)
|
if (error[0]) {
|
notification.warning({
|
top: 92,
|
message: error[0].message,
|
duration: 5
|
})
|
this.setState({
|
loading: false
|
})
|
} else {
|
let list = []
|
response.forEach(item => {
|
item.menus.forEach(cell => {
|
list.push({
|
...cell,
|
lang: item.lang,
|
kei_no: item.kei_no,
|
typename: item.typename,
|
pName: `${item.name}(${item.typename} / ${item.lang})`,
|
})
|
})
|
})
|
|
if (list.length === 0) {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: '未查询到菜单信息!',
|
duration: 5
|
})
|
} else {
|
this.sqlmap = new Map()
|
|
let errlist = sessionStorage.getItem('syscheck_app')
|
errlist = errlist ? JSON.parse(errlist) : null
|
|
if (!errlist) {
|
this.setState({
|
menulist: list
|
})
|
this.getMenuParam(fromJS(list).toJS())
|
} else {
|
const that = this
|
confirm({
|
title: '是否跳过检查合格菜单?',
|
content: '',
|
okText: '跳过',
|
cancelText: '不跳过',
|
onOk() {
|
list = list.filter(item => errlist.includes(item.MenuID))
|
|
that.setState({
|
menulist: list
|
})
|
that.getMenuParam(fromJS(list).toJS())
|
},
|
onCancel() {
|
that.setState({
|
menulist: list
|
})
|
that.getMenuParam(fromJS(list).toJS())
|
}
|
})
|
}
|
}
|
}
|
})
|
}
|
} else {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
}
|
|
getMenuParam = (menus) => {
|
const { lackmenus, outmenus, unablemenus, backmenus, appbackmenus, stop } = this.state
|
|
let menu = menus.shift()
|
|
let param = {
|
func: 'sPC_Get_LongParam',
|
MenuID: menu.MenuID
|
}
|
|
if (menu.kei_no) {
|
param.TypeCharOne = menu.kei_no
|
param.typename = menu.typename
|
param.lang = menu.lang
|
}
|
|
this.setState({
|
activeMenu: menu,
|
remain: menus.length
|
})
|
|
Api.getCloudConfig(param).then(result => {
|
if (result.status) {
|
let config = null
|
|
try {
|
config = result.LongParam ? JSON.parse(window.decodeURIComponent(window.atob(result.LongParam))) : null
|
} catch (e) {
|
console.warn('Parse Failure')
|
config = null
|
}
|
|
if (!config) {
|
this.setState({lackmenus: [...lackmenus, menu]})
|
} else if (!menu.kei_no && !['CustomPage', 'BaseTable'].includes(config.Template)) {
|
this.setState({outmenus: [...outmenus, menu]})
|
} else if (!menu.kei_no && config.Template === 'CustomPage' && config.version !== 2.0) {
|
menu.version = config.version
|
this.setState({outmenus: [...outmenus, menu]})
|
} else if (!config.enabled) {
|
this.setState({unablemenus: [...unablemenus, menu]})
|
} else {
|
let sqls = getAllSqls(config)
|
let keys = sqls.map(item => item.uuid)
|
|
if (keys.length > Array.from(new Set(keys)).length) {
|
this.setState({backmenus: [...backmenus, menu]})
|
} else {
|
let repeat = false
|
let premenu = null
|
sqls.forEach(item => {
|
if (this.sqlmap.has(item.uuid)) {
|
window.mkInfo(item)
|
if (repeat) return
|
repeat = true
|
premenu = this.sqlmap.get(item.uuid)
|
} else {
|
this.sqlmap.set(item.uuid, menu)
|
}
|
})
|
if (premenu) {
|
this.setState({appbackmenus: [...appbackmenus, [premenu, menu]]})
|
}
|
}
|
}
|
|
if (menus.length > 0 && !stop) {
|
setTimeout(() => {
|
this.getMenuParam(menus)
|
}, 200)
|
} else {
|
this.setState({
|
loading: false
|
}, () => {
|
this.record(menu.kei_no ? 'app' : '')
|
})
|
}
|
} else {
|
this.setState({
|
loading: false
|
})
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
}
|
|
record = (type) => {
|
const { lackmenus, outmenus, unablemenus, backmenus, appbackmenus } = this.state
|
|
let menus = []
|
|
lackmenus.forEach(item => {
|
menus.push(item.MenuID)
|
})
|
outmenus.forEach(item => {
|
menus.push(item.MenuID)
|
})
|
unablemenus.forEach(item => {
|
menus.push(item.MenuID)
|
})
|
backmenus.forEach(item => {
|
menus.push(item.MenuID)
|
})
|
appbackmenus.forEach(item => {
|
menus.push(item[0].MenuID)
|
menus.push(item[1].MenuID)
|
})
|
|
menus = Array.from(new Set(menus))
|
|
if (type === 'app') {
|
if (menus.length) {
|
sessionStorage.setItem('syscheck_app', JSON.stringify(menus))
|
} else {
|
sessionStorage.removeItem('syscheck_app')
|
}
|
} else {
|
if (menus.length) {
|
sessionStorage.setItem('syscheck_main', JSON.stringify(menus))
|
} else {
|
sessionStorage.removeItem('syscheck_main')
|
}
|
}
|
}
|
|
render () {
|
const { loading, activeMenu, menulist, remain, lackmenus, outmenus, unablemenus, backmenus, appbackmenus } = this.state
|
|
if (!sessionStorage.getItem('UserID')) return null
|
|
return (
|
<div className="mk-app-check">
|
<Header view="manage" />
|
{loading ? <Spin size="large" /> : null}
|
<div className="view-wrap">
|
<div className="action">
|
<Button disabled={loading} style={{marginRight: '15px'}} onClick={this.getMenus}>检查管理系统菜单</Button>
|
<Button disabled={loading} style={{marginRight: '15px'}} onClick={this.getAppList}>检查子应用菜单</Button>
|
<Button onClick={() => this.setState({stop: true})}>停止</Button>
|
</div>
|
{activeMenu ? <div className="menu-msg">当前菜单:{activeMenu.MenuName} <span></span> {activeMenu.pName} <span></span> 进度({menulist.length - remain} / {menulist.length})</div> : null}
|
{lackmenus.length ? <div className="item-wrap">
|
<div className="title">菜单配置不存在</div>
|
{lackmenus.map((item, i) => {
|
return <div key={i}>{item.MenuName} <span></span> {item.pName}</div>
|
})}
|
</div> : null}
|
{outmenus.length ? <div className="item-wrap">
|
<div className="title">菜单配置需要升级</div>
|
{outmenus.map((item, i) => {
|
return <div key={i}>{item.MenuName} <span></span> {item.pName}</div>
|
})}
|
</div> : null}
|
{unablemenus.length ? <div className="item-wrap">
|
<div className="title">菜单未启用</div>
|
{unablemenus.map((item, i) => {
|
return <div key={i}>{item.MenuName} <span></span> {item.pName}</div>
|
})}
|
</div> : null}
|
{backmenus.length ? <div className="item-wrap">
|
<div className="title">菜单后端脚本ID重复</div>
|
{backmenus.map((item, i) => {
|
return <div key={i}>{item.MenuName} <span></span> {item.pName}</div>
|
})}
|
</div> : null}
|
{appbackmenus.length ? <div className="item-wrap">
|
<div className="title">菜单后端脚本ID重复(菜单间)</div>
|
{appbackmenus.map((item, i) => {
|
return <div key={i}>{item[0].MenuName} <span></span> {item[0].pName} <SwapOutlined /> {item[1].MenuName} <span></span> {item[1].pName}</div>
|
})}
|
</div> : null}
|
</div>
|
</div>
|
)
|
}
|
}
|
|
export default SysCheck
|