mh_jy_safe_web/src/layout/Header.js

525 lines
17 KiB
JavaScript
Raw Normal View History

2025-11-18 17:08:35 +08:00
import React, { useState, useMemo, useEffect } from 'react';
import { connect } from 'dva';
import { withRouter } from 'dva/router';
import { Dropdown, Icon, Menu, message, Button, Modal } from 'antd';
import { HeaderSearch as OPTSearch, PictureThumb } from '@woowalker/feui';
import ModifyPassword from '../components/MainPage/ModifyPassword';
import FoUserInfoShow from '../components/MainPage/FoUserInfoShow';
import FeedbackQuestion from '../components/MainPage/FeedbackQuestion';
import GuideCanvas from '../components/MainPage/GuideCanvas';
import IconFont from '../utils/iconFont';
import { initFilter, requestFullScreenMethod, exitFullScreen, isFullscreenElement } from '../utils/common';
import config from '../config';
import './header.less';
import Option from './Option';
import FullScreenPage from './FullScreen';
2025-08-25 10:08:30 +08:00
// 投屏
const DataV = (props) => {
const navTo = () => {
const { OrgId, Tenant, baseConfig } = props.login;
const preUrl = baseConfig.SCREEN_URL || config.dataVUrl;
const queryStr = `OrgId=${OrgId}&Tenant=${Tenant}`;
2025-11-18 17:08:35 +08:00
const url = `${preUrl.indexOf('?') !== -1 ? preUrl : preUrl + '?'}${queryStr}`;
window.open(url, '_blank');
2025-08-25 10:08:30 +08:00
};
return (
<span title="投屏" onClick={navTo} className="header__right-datav">
{/* <EnergyIcon type='icon-touping' className='header__right-icon' /> */}
</span>
);
};
const HeaderDataV = connect(({ login }) => ({ login }))(DataV);
// 搜索
const Search = (props) => {
const [autoCompleteData, setAutoCompleteData] = useState([]);
const leafMenus = useMemo(() => {
const menuForms = [];
const menuDatas = [];
function traverseChild(item) {
if (!item.Menu.Nav_MenuForm || item.ChildMenus?.length) {
item.ChildMenus.forEach((x) => {
traverseChild(x);
});
} else if (item.Menu.Nav_MenuForm) {
menuForms.push({
MenuName: item.Menu.NAME,
...item.Menu.Nav_MenuForm,
});
menuDatas.push(item);
}
}
const menus = props.login.loginInfo.Menus || [];
menus.forEach((item) => {
traverseChild(item);
});
return { menuForms, menuDatas };
}, [props.login.loginInfo?.Menus]);
/**
* 搜索菜单
* @param {*} e
*/
const handleSearchMenu = (e) => {
2025-11-18 17:08:35 +08:00
if (!e || e === '') {
2025-08-25 10:08:30 +08:00
setAutoCompleteData([]);
return;
}
const validResult = [];
leafMenus.menuForms.forEach((item) => {
if (
item.CODE.toLowerCase().indexOf(e.toLowerCase()) >= 0 ||
item.NAME.toLowerCase().indexOf(e.toLowerCase()) >= 0 ||
item.MenuName.toLowerCase().indexOf(e.toLowerCase()) >= 0
) {
validResult.push(item);
}
});
setAutoCompleteData(validResult);
};
/**
* 选中菜单
* @param {*} e
*/
const handleSelectMenu = (e) => {
2025-11-18 17:08:35 +08:00
const menu = leafMenus.menuDatas.find((item) => item.Menu.Nav_MenuForm.ID === e);
2025-08-25 10:08:30 +08:00
props.dispatch({
2025-11-18 17:08:35 +08:00
type: 'app/updateActivatedMenu',
2025-08-25 10:08:30 +08:00
payload: {
currActivatedTab: menu.Node.ID,
currActivatedMenu: menu.Node,
},
});
props.history.push({ pathname: `/main/${menu.Node.ID}` });
};
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
return <span></span>;
} else {
2025-11-18 17:08:35 +08:00
return <OPTSearch dataSource={autoCompleteData} onChange={handleSearchMenu} onSelect={handleSelectMenu} />;
2025-08-25 10:08:30 +08:00
}
//return (
//
// <OPTSearch
// dataSource={autoCompleteData}
// onChange={handleSearchMenu}
// onSelect={handleSelectMenu}
// />
//)
};
const HeaderSearch = withRouter(connect(({ login }) => ({ login }))(Search));
// 个人中心
const User = (props) => {
const [visible, setVisible] = useState(false);
/**
* 注销登录
*/
const handleLogout = () => {
const { OrgId, userId } = props.login;
2025-11-18 17:08:35 +08:00
const logJson = initFilter(OrgId, userId, '', 0, 1, 0);
2025-08-25 10:08:30 +08:00
props.dispatch({
2025-11-18 17:08:35 +08:00
type: 'app/addLoginOut',
2025-08-25 10:08:30 +08:00
payload: logJson,
});
2025-11-18 17:08:35 +08:00
localStorage.removeItem('accessToken');
localStorage.removeItem('currentMineTypeName');
props.history.push({ pathname: '/login' });
2025-08-25 10:08:30 +08:00
};
/**
* 锁屏
*/
const handleLockScreen = () => {
2025-11-18 17:08:35 +08:00
localStorage.removeItem('accessToken');
2025-08-25 10:08:30 +08:00
props.dispatch({
2025-11-18 17:08:35 +08:00
type: 'login/save',
2025-08-25 10:08:30 +08:00
payload: {
screenLocked: true,
},
});
};
/**
* 菜单选中
* @param {*} evt
*/
const handleUserMenuClick = (evt) => {
switch (evt.key) {
2025-11-18 17:08:35 +08:00
case 'user-menu-logout':
2025-08-25 10:08:30 +08:00
handleLogout();
break;
2025-11-18 17:08:35 +08:00
case 'user-menu-lockscreen':
2025-08-25 10:08:30 +08:00
handleLockScreen();
break;
2025-11-18 17:08:35 +08:00
case 'user-menu-cacheclean':
2025-08-25 10:08:30 +08:00
window.localStorage.clear();
2025-11-18 17:08:35 +08:00
message.success('清除成功,即将重新加载页面', 2, () => {
2025-08-25 10:08:30 +08:00
setTimeout(() => window.location.reload(true), 500);
});
break;
default:
break;
}
setVisible(false);
};
const { loginInfo = {} } = props.login;
return (
<Dropdown
visible={visible}
onVisibleChange={setVisible}
overlay={
<Menu onClick={handleUserMenuClick}>
2025-11-18 17:08:35 +08:00
<Menu.Item key="user-menu-userinfo">当前登录{loginInfo.User?.NAME}</Menu.Item>
2025-08-25 10:08:30 +08:00
<Menu.Item key="user-menu-UserInfoShow">
<FoUserInfoShow>我的资料</FoUserInfoShow>
</Menu.Item>
<Menu.Item key="user-menu-updatepwd">
<ModifyPassword>修改密码</ModifyPassword>
</Menu.Item>
{/* <Menu.Item key='user-menu-feedbackqtn'><FeedbackQuestion>问题反馈</FeedbackQuestion></Menu.Item> */}
{/* <Menu.Item key='user-menu-lockscreen'>屏幕锁定</Menu.Item> */}
<Menu.Item key="user-menu-cacheclean">清除缓存</Menu.Item>
<Menu.Item>版本号:{config.version}</Menu.Item>
<Menu.Item key="user-menu-logout">退出登录</Menu.Item>
</Menu>
}
>
<span className="header__right-user">
<Icon type="user" className="header__right-icon" />
</span>
</Dropdown>
);
};
const HeaderUser = withRouter(connect(({ login }) => ({ login }))(User));
// 2023-10-08 生产单元
const MineType = (props) => {
const [visible, setVisible] = useState(false);
2025-11-18 17:08:35 +08:00
let currUserMineType = localStorage.getItem('MineType');
2025-08-25 10:08:30 +08:00
if (currUserMineType == null || currUserMineType == undefined) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('MineType', '30');
localStorage.setItem('currentMineTypeName', '露天矿');
2025-08-25 10:08:30 +08:00
} else {
2025-11-18 17:08:35 +08:00
if (localStorage.getItem('currentMineTypeName') == null) {
2025-08-25 10:08:30 +08:00
if (currUserMineType.indexOf(30) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineType', 30);
localStorage.setItem('currentMineTypeName', '露天矿');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(20) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineType', 20);
localStorage.setItem('currentMineTypeName', '尾矿库');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(10) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineType', 10);
localStorage.setItem('currentMineTypeName', '选矿厂');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(40) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineType', 40);
localStorage.setItem('currentMineTypeName', '地下矿');
} else if (currUserMineType.indexOf(31) > -1) {
localStorage.setItem('currentMineType', 31);
localStorage.setItem('currentMineTypeName', '职能口');
} else if (currUserMineType.indexOf(32) > -1) {
localStorage.setItem('currentMineType', 32);
localStorage.setItem('currentMineTypeName', '非金属');
2025-08-25 10:08:30 +08:00
}
} else {
2025-11-18 17:08:35 +08:00
let currentMineType = localStorage.getItem('currentMineType');
2025-08-25 10:08:30 +08:00
if (currUserMineType.indexOf(currentMineType) > -1) {
if (currentMineType == 30) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '露天矿');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType == 20) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '尾矿库');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType == 10) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '选矿厂');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType == 40) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '地下矿');
} else if (currUserMineType == 31) {
localStorage.setItem('currentMineTypeName', '职能口');
} else if (currUserMineType == 32) {
localStorage.setItem('currentMineTypeName', '非金属');
2025-08-25 10:08:30 +08:00
}
} else {
if (currUserMineType.indexOf(30) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '露天矿');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(20) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '尾矿库');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(10) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '选矿厂');
2025-08-25 10:08:30 +08:00
} else if (currUserMineType.indexOf(40) > -1) {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineTypeName', '地下矿');
} else if (currUserMineType.indexOf(31) > -1) {
localStorage.setItem('currentMineTypeName', '职能口');
} else if (currUserMineType.indexOf(32) > -1) {
localStorage.setItem('currentMineTypeName', '非金属');
2025-08-25 10:08:30 +08:00
}
}
}
}
let currUserMineTypeArray = [];
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('30') > -1) {
currUserMineTypeArray.push({ key: '30', label: '露天矿' });
2025-08-25 10:08:30 +08:00
}
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('10') > -1) {
currUserMineTypeArray.push({ key: '10', label: '选矿厂' });
2025-08-25 10:08:30 +08:00
}
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('20') > -1) {
currUserMineTypeArray.push({ key: '20', label: '尾矿库' });
2025-08-25 10:08:30 +08:00
}
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('40') > -1) {
currUserMineTypeArray.push({ key: '40', label: '地下矿' });
2025-08-25 10:08:30 +08:00
}
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('31') > -1) {
currUserMineTypeArray.push({ key: '31', label: '职能口' });
2025-08-25 10:08:30 +08:00
}
2025-11-18 17:08:35 +08:00
if (currUserMineType.indexOf('32') > -1) {
currUserMineTypeArray.push({ key: '32', label: '非金属' });
2025-08-25 10:08:30 +08:00
}
const MineTypeMenu = () => {
return (
<Menu onClick={handleMineTypeClick}>
{currUserMineTypeArray.map((item) => (
<Menu.Item key={item.key}>{item.label}</Menu.Item>
))}
</Menu>
);
};
/**
* 生产单元切换
* @param {*} evt
*/
const handleMineTypeClick = (evt) => {
2025-11-18 17:08:35 +08:00
localStorage.setItem('currentMineType', evt.key);
localStorage.setItem('currentMineTypeName', evt.item.props.children);
2025-08-25 10:08:30 +08:00
setVisible(false);
window.location.reload();
};
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
return <div></div>;
} else {
return (
2025-11-18 17:08:35 +08:00
<Dropdown visible={visible} onVisibleChange={setVisible} overlay={MineTypeMenu}>
<a style={{ color: '#000000A6', marginLeft: '20px' }}>
<b>生产单元{localStorage.getItem('currentMineTypeName')}</b>
2025-08-25 10:08:30 +08:00
</a>
</Dropdown>
);
}
};
2025-11-18 17:08:35 +08:00
const HeaderMineType = withRouter(connect(({ login }) => ({ login }))(MineType));
2025-08-25 10:08:30 +08:00
const GuideCodePage = (props) => {
const [showCanvas, setshowCanvas] = useState(false);
const currVans = (val) => {
setshowCanvas(true);
};
/**
* 生产单元切换
* @param {*} evt
*/
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
return <div></div>;
} else {
return (
<div>
<div
onClick={() => {
currVans();
}}
2025-11-18 17:08:35 +08:00
style={{ margin: '0px 36px', display: 'flex', alignItems: 'center' }}
2025-08-25 10:08:30 +08:00
>
<Icon type="qrcode" className="header__right-icon" />
</div>
<Modal
title=""
visible={showCanvas}
2025-11-18 17:08:35 +08:00
width="450px"
2025-08-25 10:08:30 +08:00
centered={true}
onOk={() => {
setshowCanvas(false);
}}
onCancel={() => {
setshowCanvas(false);
}}
footer={null}
>
<GuideCanvas />
</Modal>
</div>
);
}
};
2025-11-18 17:08:35 +08:00
const GuideCode = withRouter(connect(({ login }) => ({ login }))(GuideCodePage));
2025-08-25 10:08:30 +08:00
const NavOpton = (props) => {
const [showModal, setshowModal] = useState(false);
const getChildCount = (val) => {
setshowModal(val);
};
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
return <div></div>;
} else {
return (
<div>
<div
type="primary"
onClick={() => {
setshowModal(true);
}}
>
{/* <Icon type='bars' className='header__right-icon'></Icon> */}
2025-11-18 17:08:35 +08:00
<IconFont type="icon-line-108" style={{ fontSize: '22px', color: '#333333', cursor: 'pointer' }}></IconFont>
2025-08-25 10:08:30 +08:00
</div>
<Modal
title="功能导航"
visible={showModal}
width="96%"
centered={true}
onOk={() => {
setshowModal(false);
}}
onCancel={() => {
setshowModal(false);
}}
className="headerModal"
>
<Option getCount={getChildCount}></Option>
</Modal>
</div>
);
}
};
const FullScreenOpton = (props) => {
const [showModal, setshowModal] = useState(false);
const getChildCount = (val) => {
setshowModal(val);
};
const [fullScreen, setFullScreen] = useState(false);
const [originResizeFunc, setOriginResizeFunc] = useState();
const escFunction = () => {
let isFull = !!(
document.fullscreen ||
document.mozFullScreen ||
document.webkitIsFullScreen ||
document.webkitFullScreen ||
document.msFullScreen
);
if (isFull) {
2025-11-18 17:08:35 +08:00
// /
} else {
2025-08-25 10:08:30 +08:00
// requestFullScreenMethod(document.body);
setshowModal(false);
}
};
useEffect(() => {
// 监听退出全屏事件 --- chrome 用 esc 退出全屏并不会触发 keyup 事件
2025-11-18 17:08:35 +08:00
document.addEventListener('webkitfullscreenchange', escFunction); /* Chrome, Safari and Opera */
document.addEventListener('mozfullscreenchange', escFunction); /* Firefox */
document.addEventListener('fullscreenchange', escFunction); /* Standard syntax */
document.addEventListener('msfullscreenchange', escFunction); /* IE / Edge */
2025-08-25 10:08:30 +08:00
return () => {
//销毁时清除监听
2025-11-18 17:08:35 +08:00
document.removeEventListener('webkitfullscreenchange', escFunction);
document.removeEventListener('mozfullscreenchange', escFunction);
document.removeEventListener('fullscreenchange', escFunction);
document.removeEventListener('MSFullscreenChange', escFunction);
2025-08-25 10:08:30 +08:00
};
}, []);
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
return <div></div>;
} else {
return (
<div>
<div
type="primary"
onClick={() => {
setshowModal(true);
2025-11-18 17:08:35 +08:00
requestFullScreenMethod(document.body); // 进入全屏
2025-08-25 10:08:30 +08:00
}}
>
2025-11-18 17:08:35 +08:00
<Icon type="alert" className="header__right-icon"></Icon>
2025-08-25 10:08:30 +08:00
{/* <IconFont
type="icon-line-108"
style={{ fontSize: "22px", color: "#333333", cursor: "pointer" }}
></IconFont> */}
</div>
<Modal
title="功能导航"
visible={showModal}
width="100%"
centered={true}
onOk={() => {
setshowModal(false);
}}
onCancel={() => {
setshowModal(false);
}}
className="fullScreen"
>
<FullScreenPage />
</Modal>
</div>
);
}
};
2025-11-18 17:08:35 +08:00
const FullScreen = withRouter(connect(({ login }) => ({ login }))(FullScreenOpton));
2025-08-25 10:08:30 +08:00
const HeaderNav = withRouter(connect(({ login }) => ({ login }))(NavOpton));
function Header(props) {
const { baseConfig = {} } = props.login;
2025-11-18 17:08:35 +08:00
const thumbCode = baseConfig.Nav_PictureLogo ? baseConfig.Nav_PictureLogo.CODE : '';
2025-08-25 10:08:30 +08:00
let isMobile = false;
2025-11-18 17:08:35 +08:00
if (window.navigator.userAgent.indexOf('Windows') < 1) {
2025-08-25 10:08:30 +08:00
isMobile = true;
}
return (
2025-11-18 17:08:35 +08:00
<div className={`header ${props.matchLogin ? 'login' : ''}`}>
2025-08-25 10:08:30 +08:00
<div className="header__left">
<PictureThumb
thumbCodes={thumbCode ? [thumbCode] : []}
thumbConfigs={[{ target: thumbCode }]}
2025-11-18 17:08:35 +08:00
defaultThumb={require('../assets/layout/headerno-logo-new.png')}
2025-08-25 10:08:30 +08:00
className="header__left-logo"
/>
{isMobile ? (
<span className="header__left-slogan-mobile"> </span>
) : (
2025-11-18 17:08:35 +08:00
<span className={`${props.matchLogin ? 'header__left-sloganLogin' : 'header__left-slogan'}`}>
2025-10-10 16:46:42 +08:00
矿山安全生产信息化平台
2025-11-18 17:08:35 +08:00
<span style={{ color: '#c99d03' }}></span>
{baseConfig.SYS_NAME}{' '}
2025-08-25 10:08:30 +08:00
</span>
)}
</div>
{!props.matchLogin ? (
<div className="header__right">
{/* <RiskFourColor/> */}
2025-10-13 08:42:00 +08:00
{/* <FullScreen /> */}
2025-09-25 15:56:17 +08:00
{/* {window.location.host == "121.41.2.71:8001" ? <FullScreen /> : ""} */}
2025-08-25 10:08:30 +08:00
<GuideCode />
<HeaderNav />
<HeaderDataV />
<HeaderSearch />
{/* style={{"color":"#f3eded"}} */}
<HeaderMineType />
<HeaderUser />
<b>
{props.login.user.NAME}({props.login.user.CODE})
</b>
</div>
) : null}
</div>
);
}
export default connect(({ login }) => ({ login }))(Header);