地图和BI页

master
LiuJiaNan 2026-01-16 17:18:09 +08:00
parent 6ac4ffc4e8
commit e2b3969a70
36 changed files with 1615 additions and 1355 deletions

View File

@ -3,7 +3,7 @@
width: 1350px;
height: 240px;
position: absolute;
bottom: 35px;
bottom: -1050px;
left: 50%;
transform: translateX(-50%);

View File

@ -1,14 +1,27 @@
import img1 from "~/assets/images/public/bigScreen/btnbg.png";
import "./index.less";
function Btn() {
function Btn(props) {
return (
<div className="index_info_btn" >
<div className="item" style={{ backgroundImage: `url(${img1})` }}>秦皇岛港</div>
<div className="item" style={{ backgroundImage: `url(${img1})` }}>沧州港</div>
<div className="item" style={{ backgroundImage: `url(${img1})` }}>曹实业</div>
<div className="item" style={{ backgroundImage: `url(${img1})` }}>曹煤炭</div>
<div className="index_info_btn">
<div
className="item"
style={{ backgroundImage: `url(${img1})` }}
onClick={() => {
props.history.push("./white/branchOffice");
}}
>
分公司大屏
</div>
<div
className="item"
style={{ backgroundImage: `url(${img1})` }}
onClick={() => {
props.history.push("./white/share");
}}
>
监管端大屏
</div>
</div>
);
}

View File

@ -1,9 +1,9 @@
.index_info_btn{
.index_info_btn {
position: absolute;
top: 200px;
right: 450px;
.item{
.item {
width: 127px;
height: 43px;
color: #ffffff;

View File

@ -1,18 +1,18 @@
import Bottom from "./Bottom";
import Btn from "./Btn";
import LeftPanel from "./LeftPanel";
import RightPanel from "./RightPanel";
import Search from "./Search";
import Btn from "./Btn";
import "./index.less";
function IndexInfo() {
function IndexInfo(props) {
return (
<div className="index_info_container">
<LeftPanel />
<RightPanel />
<Bottom />
<Search />
<Btn />
<Btn history={props.history} />
</div>
);
}

View File

@ -29,34 +29,44 @@ import { Context } from "~/pages/Container/Map/js/context";
import { useContentAnimation } from "./useContentAnimation";
import "./index.less";
function Content() {
function Content(props) {
const { currentPort, currentBranchOffice, pureMap, bottomUtilsCurrentIndex } = useContext(Context);
const [collapseLeft, setCollapseLeft] = useState(false);
const [collapseRight, setCollapseRight] = useState(false);
const {
controls: indexInfoControls,
isVisible: isIndexInfoVisible,
} = useContentAnimation({
currentContent: { currentPort, currentBranchOffice },
type: "index",
});
const {
controls: leftControls,
displayedContent: leftDisplayedContent,
isVisible: isLeftVisible,
handleCollapse: handleLeftCollapse,
} = useContentAnimation(
{ currentPort, currentBranchOffice, bottomUtilsCurrentIndex },
collapseLeft,
"left",
pureMap,
);
} = useContentAnimation({
currentContent: { currentPort, currentBranchOffice, bottomUtilsCurrentIndex },
isCollapsed: collapseLeft,
side: "left",
isPureMap: pureMap,
type: "panel",
});
const {
controls: rightControls,
displayedContent: rightDisplayedContent,
isVisible: isRightVisible,
handleCollapse: handleRightCollapse,
} = useContentAnimation(
{ currentBranchOffice, bottomUtilsCurrentIndex },
collapseRight,
"right",
pureMap,
);
} = useContentAnimation({
currentContent: { currentBranchOffice, bottomUtilsCurrentIndex },
isCollapsed: collapseRight,
side: "right",
isPureMap: pureMap,
type: "panel",
});
const renderPortContent = () => {
const bottomUtilsCurrentType = (leftDisplayedContent.bottomUtilsCurrentIndex !== -1 && portUtilsList[leftDisplayedContent.bottomUtilsCurrentIndex])
@ -115,7 +125,11 @@ function Content() {
const renderContent = () => {
return (
<>
{!leftDisplayedContent.currentPort && (<IndexInfo />)}
{isIndexInfoVisible && (
<motion.div animate={indexInfoControls} className="map_content_container__indexinfo">
<IndexInfo history={props.history} />
</motion.div>
)}
{isLeftVisible && (
<motion.div
animate={leftControls}

View File

@ -26,6 +26,11 @@
// 执行循环
.loop();
&__indexinfo {
position: relative;
opacity: 0;
}
&__content {
width: 430px;
position: absolute;
@ -33,13 +38,11 @@
&.port {
top: 75px;
max-height: calc(100vh - 75px);
opacity: 0;
}
&.branch_office {
top: 70px;
max-height: calc(100vh - 70px);
opacity: 0;
}
}

View File

@ -2,53 +2,145 @@ import { useAnimation } from "motion/react";
import { useEffect, useRef, useState } from "react";
/**
* 内容切换动画 Hook
* 内容动画 Hook统一处理 IndexInfo 和面板动画
*
* 功能说明
* 1. 管理内容面板的显示/隐藏状态
* 2. 处理内容切换时的动画效果离开 + 进入
* 3. 处理折叠/展开时的动画效果
* 4. 处理纯地图模式下的动画效果
* 1. 通过 type 参数区分动画类型"index"IndexInfo 缩放动画 "panel"面板滑动动画
* 2. IndexInfo 类型管理首页内容的显示/隐藏使用缩放动画
* 3. Panel 类型管理内容面板的显示/隐藏使用滑动动画支持折叠/展开
*
* 优先级pureMap > 折叠状态 > 内容变化
*
* @param {object} currentContent - 当前要显示的内容状态包含 currentPortcurrentBranchOfficebottomUtilsCurrentIndex
* @param {boolean} isCollapsed - 当前是否处于折叠状态
* @param {string} side - 'left' 'right'控制动画方向
* @param {boolean} isPureMap - 是否为纯地图模式
* @param {object} params - 参数对象
* @param {object} params.currentContent - 当前要显示的内容状态包含 currentPortcurrentBranchOfficebottomUtilsCurrentIndex
* @param {boolean} params.isCollapsed - 当前是否处于折叠状态 panel 类型
* @param {string} params.side - 'left' 'right'控制动画方向 panel 类型
* @param {boolean} params.isPureMap - 是否为纯地图模式 panel 类型
* @param {string} params.type - 动画类型"index" "panel"默认 "panel"
* @returns {object} 返回包含以下属性的对象
* - controls: motion 动画控制器
* - displayedContent: 延迟显示的内容状态用于动画过渡
* - displayedContent: 延迟显示的内容状态panel 类型
* - isVisible: 元素可见性状态
* - handleCollapse: 处理折叠/展开的函数
* - handleCollapse: 处理折叠/展开的函数 panel 类型
*/
export function useContentAnimation(currentContent, isCollapsed, side = "left", isPureMap = false) {
export function useContentAnimation({
currentContent,
isCollapsed = false,
side = "left",
isPureMap = false,
type = "panel",
}) {
// ==================== 状态管理 ====================
// motion 动画控制器,用于控制元素的动画
const controls = useAnimation();
// 标记是否是首次渲染(首次渲染不执行离开动画,直接进入)
const isLeftFirstRender = useRef(true);
// 标记当前是否正在执行动画(防止动画冲突)
const isAnimating = useRef(false);
// 延迟显示的内容状态
// 作用:在内容切换时,先显示旧内容,动画完成后再更新为新内容
const [displayedContent, setDisplayedContent] = useState(currentContent);
// 元素可见性状态
// false: 元素被隐藏(折叠或纯地图模式)
// true: 元素可见(非折叠、非纯地图模式)
const [isVisible, setIsVisible] = useState(true);
// ==================== 辅助函数 ====================
// 标记当前是否正在执行动画(防止动画冲突)
const isAnimating = useRef(false);
/**
* 计算动画的初始位置
* @returns {number} 初始 X 轴位移值负数表示在左侧正数表示在右侧
*/
// 标记是否是首次渲染(首次渲染不执行离开动画,直接进入)
const isFirstRender = useRef(true);
// 延迟显示的内容状态(仅 panel 类型使用)
// 作用:在内容切换时,先显示旧内容,动画完成后再更新为新内容
const [displayedContent, setDisplayedContent] = useState(type === "index" ? {} : currentContent);
// ==================== IndexInfo 类型的缩放动画逻辑 ====================
useEffect(() => {
// 仅处理 index 类型
if (type !== "index") {
return;
}
// 判断是否应该显示 IndexInfo没有选择任何港口或分公司时
const shouldShowIndexInfo = !currentContent.currentPort && !currentContent.currentBranchOffice;
// ==================== 场景 1应该显示 IndexInfo ====================
if (shouldShowIndexInfo) {
// ----- 情况 A首次渲染 -----
if (isFirstRender.current) {
// 1. 设置元素到初始缩小状态
controls.set({
scale: 0.8, // 缩小到 80%
opacity: 0, // 透明
});
// 2. 显示元素
setIsVisible(true);
// 3. 执行放大进入动画(从小到大缩放)
requestAnimationFrame(() => {
controls.start({
scale: 1, // 放大到正常大小
opacity: 1, // 淡入
transition: { duration: 0.5, ease: "easeOut" },
});
});
// 4. 标记首次渲染完成
isFirstRender.current = false;
}
// ----- 情况 B从其他内容切换回来放大进入带延迟等待其他内容离开动画完成 -----
else if (!isVisible && !isAnimating.current) {
// 标记开始执行动画(防止动画冲突)
isAnimating.current = true;
// 1. 显示元素
setIsVisible(true);
// 2. 执行放大进入动画
requestAnimationFrame(() => {
// 设置元素到初始缩小状态
controls.set({
scale: 0.8,
opacity: 0,
});
// 然后触发放大进入动画(带 0.3s 延迟,等待其他内容离开)
requestAnimationFrame(() => {
controls.start({
scale: 1,
opacity: 1,
transition: { duration: 0.5, ease: "easeOut", delay: 0.3 },
}).then(() => {
// 动画完成标记
isAnimating.current = false;
});
});
});
}
}
// ==================== 场景 2不应该显示 IndexInfo选择了港口或分公司====================
else if (isVisible && !isAnimating.current) {
// 标记开始执行动画(防止动画冲突)
isAnimating.current = true;
// 执行缩小离开动画
controls.start({
scale: 0.8, // 缩小到 80%
opacity: 0, // 淡出
transition: { duration: 0.3, ease: "easeIn" },
}).then(() => {
// 动画完成后:
// 1. 隐藏元素
setIsVisible(false);
// 2. 标记动画完成
isAnimating.current = false;
});
}
}, [currentContent.currentPort, currentContent.currentBranchOffice, controls, isVisible, type]);
// ==================== Panel 类型的滑动动画逻辑 ====================
// 辅助函数:计算动画的初始位置
// @returns {number} 初始 X 轴位移值(负数表示在左侧,正数表示在右侧)
const getInitialX = () => side === "left" ? -300 : 300;
// ==================== 折叠/展开处理 ====================
@ -109,6 +201,11 @@ export function useContentAnimation(currentContent, isCollapsed, side = "left",
// ==================== 主题:监听状态变化并执行动画 ====================
useEffect(() => {
// 仅处理 panel 类型
if (type !== "panel") {
return;
}
// ==================== 场景 1纯地图模式最高优先级====================
if (isPureMap) {
// 如果元素当前可见,执行离开动画并隐藏
@ -155,7 +252,7 @@ export function useContentAnimation(currentContent, isCollapsed, side = "left",
);
// ----- 情况 A首次渲染 -----
if (isLeftFirstRender.current) {
if (isFirstRender.current) {
// 1. 设置元素到初始隐藏位置(侧边外部)
controls.set({
x: getInitialX(),
@ -173,7 +270,7 @@ export function useContentAnimation(currentContent, isCollapsed, side = "left",
});
// 4. 标记首次渲染完成
isLeftFirstRender.current = false;
isFirstRender.current = false;
}
// ----- 情况 B内容变化用户切换工具-----
@ -230,10 +327,18 @@ export function useContentAnimation(currentContent, isCollapsed, side = "left",
});
});
}
}, [currentContent, isCollapsed, isPureMap, controls, displayedContent, side, isVisible]);
}, [currentContent, isCollapsed, isPureMap, controls, displayedContent, side, isVisible, type]);
// ==================== 返回值 ====================
// 返回值根据类型不同而不同
if (type === "index") {
return {
controls, // motion 动画控制器
isVisible, // 元素可见性状态
};
}
return {
controls, // motion 动画控制器
displayedContent, // 延迟显示的内容(用于动画过渡)

View File

@ -18,7 +18,7 @@ import {
} from "./js/mittKey";
import "./index.less";
function Map() {
function Map(props) {
const query = useGetUrlQuery();
const viewer = useRef(null); // cesium地图实例
@ -98,7 +98,7 @@ function Map() {
<CenterUtils setArea={setArea} />
<RightUtils isFullscreen={isFullscreen} toggleFullscreen={toggleFullscreen} setPureMap={setPureMap} />
<BottomUtils setBottomUtilsCurrentIndex={setBottomUtilsCurrentIndex} />
<Content />
<Content history={props.history} />
</div>
</Context.Provider>
<div

View File

@ -1,203 +0,0 @@
import "./index.less";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import cake from "~/assets/images/public/white/img7.png";
import bg1 from "~/assets/images/public/white/bg1.png";
import img1 from "~/assets/images/public/white/img1.png";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import {useState} from "react";
function WhiteShareLeft() {
const [block1List, setBlock1List] = useState([
{ name: "隐患总数", num: "1398" },
{ name: "隐患整改数", num: "1212" },
{ name: "隐患未整改数", num: "563" },
{ name: "隐患整改率", num: "89%" },
]);
const [block2List, setBlock2List] = useState([
{ name: "隐患总数", num: "1398" },
{ name: "隐患整改数", num: "1212" },
{ name: "隐患未整改数", num: "563" },
{ name: "隐患整改率", num: "89%" },
]);
const [block3List, setBlock3List] = useState([
{ id: 1, level: "二级", name: "东区一号罐", state: "正常"},
{ id: 2, level: "二级", name: "东区一号罐", state: "正常"},
{ id: 3, level: "二级", name: "东区一号罐", state: "正常"},
{ id: 4, level: "二级", name: "东区一号罐", state: "正常"},
{ id: 5, level: "二级", name: "东区一号罐", state: "正常"},
{ id: 6, level: "二级", name: "东区一号罐", state: "正常"},
]);
const [block4List, setBlock4List] = useState([
{ name: "一级", total: "1398" ,rectificationNumber:"56", unNumber:"56", rectificationRate:"89%" },
{ name: "一级", total: "1398" ,rectificationNumber:"56", unNumber:"56", rectificationRate:"89%" },
{ name: "一级", total: "1398" ,rectificationNumber:"56", unNumber:"56", rectificationRate:"89%" },
{ name: "一级", total: "1398" ,rectificationNumber:"56", unNumber:"56", rectificationRate:"89%" },
]);
return (
<div className="white_share_left">
<div className="block1">
<Title title={"风险辨识管控情况"} />
<div className="white_share_left_conten">
<div className="cake">
<img src={cake} alt="" />
</div>
<div className="cake_contant" style={{ backgroundImage: `url(${bg1})` }}>
<div className="item">
<div className="title">重大风险</div>
<div className="num fcr">467</div>
</div>
<div className="item">
<div className="title">较大风险</div>
<div className="num fco">467</div>
</div>
<div className="item">
<div className="title">一般风险</div>
<div className="num fcc">467</div>
</div>
<div className="item">
<div className="title">低风险</div>
<div className="num fcb">98091</div>
</div>
</div>
</div>
</div>
<div className="block2">
<Title title={"重大危险源安全情况"} />
<div className="white_share_left_conten">
<div className="top">
<div className="item">
<div className="title">二级重大危险源1</div>
<div className="item_container">
<span>储罐数: <span className="fcb">3</span> </span>
<span>在用数: <span className="fcg">3</span> </span>
<span>停用数: <span className="fcr">0</span></span>
</div>
</div>
<div className="item">
<div className="title">三级重大危险源2</div>
<div className="item_container">
<span>储罐数: <span className="fcb">10</span> </span>
<span>在用数: <span className="fcg">10</span> </span>
<span>停用数: <span className="fcr">0</span></span>
</div>
</div>
</div>
<div className="container">
<div className="left_table">
<div className="table">
<div className="tr">
<div className="th">级别</div>
<div className="th">名称</div>
<div className="th">状态</div>
</div>
<div className="scroll">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.level}</div>
<div className="td">{item.name}</div>
<div className="td">{item.state}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
<div className="info">
<div className="title"><img src={img1} alt=""/> 东区二号罐液位过低</div>
<div className="comment">
<p>温度待处置数/报警个数<span>0/0</span> </p>
<p>压力待处置数/报警个数<span>0/0</span></p>
<p>液位待处置数/报警个数<span> <span className="fcr">1</span>/1</span></p>
</div>
</div>
</div>
</div>
</div>
<div className="block3">
<Title title={"隐患排查治理情况"} />
<div className="white_share_left_conten">
<div className="top">
<div className="item">
<div className="content">
<div className="title">股份<br/>公司</div>
<div className="info">
{
block1List.map((item, index) => (
<div key={index} className="list">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
))
}
</div>
</div>
</div>
<div className="item">
<div className="content">
<div className="title">分子<br/>公司</div>
<div className="info">
{
block2List.map((item, index) => (
<div key={index} className="list">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div className="field">
<div className="top">领域隐患</div>
</div>
<div className="main">
<div className="table">
<div className="tr">
<div className="th">领域名称</div>
<div className="th">隐患总数</div>
<div className="th">整改数</div>
<div className="th">未整改数</div>
<div className="th">整改率</div>
</div>
<div className="scroll">
<SeamlessScroll list={block4List} step={0.5}>
{block4List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.name}</div>
<div className="td">{item.total}</div>
<div className="td">{item.rectificationNumber}</div>
<div className="td">{item.unNumber}</div>
<div className="td">{item.rectificationRate}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default WhiteShareLeft;

View File

@ -1,275 +0,0 @@
import "./index.less";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import weather from "~/assets/images/public/weather/1.png";
import img1 from "~/assets/images/public/white/titlebg1.png";
import {useState} from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
function WhiteShareMiddle() {
const [block1List, setBlock1List] = useState([
{ name: "综合应急预案", num: "13" },
{ name: "现场处置方案", num: "75" },
{ name: "应急应对措施", num: "58" },
{ name: "应急救援队伍", num: "3" },
]);
const [block2List, setBlock2List] = useState([
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
{ unitName: "二公司", name: "王岩" ,duties:"公司经理", phone:"3095311" },
]);
const [block3List, setBlock3List] = useState([
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置" ,preventiveMeasures:"远离大树、电线杆..." },
]);
const [block4List, setBlock4List] = useState([
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
{ unitName: "二公司", safetySupervisionDepartment: "4" ,technicalDepartment:"3", engineeringDepartment:"2", businessDepartment:"1", accident:"0", humanResourcesDepartment:"0", score:"0" },
]);
const [block5List, setBlock5List] = useState([
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
])
const [block6List, setBlock6List] = useState([
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
])
const [block7List, setBlock7List] = useState([
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
])
return (
<div className="white_share_middle">
<div className="block1">
<Title title={"应急管理"} />
<div className="block1_content">
<div className="block1_content_con">
<div className="emergency_left">
<div className="top">
{
block1List.map((item, index) => (
<div key={index} className="item">
<p className="name">{item.name}</p>
<div className="num">{item.num}</div>
</div>
))
}
</div>
<div className="emergency_left_main">
<div className="table">
<div className="tr">
<div className="th">单位名称</div>
<div className="th">姓名</div>
<div className="th">职务</div>
<div className="th">电话</div>
</div>
<div className="scroll">
<SeamlessScroll list={block2List} step={0.5}>
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.name}</div>
<div className="td">{item.duties}</div>
<div className="td">{item.phone}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="emergency_right">
<div className="weather">
<div className="title">秦皇岛市气象台发布大风橙色预警[工级/严重]</div>
<div className="weather_main">
<div className="item">
<img src={weather} alt=""/>
</div>
<div className="item">
<div>温度</div>
<div className="num">25</div>
</div>
<div className="item">
<div>风速</div>
<div className="num">16米8级</div>
</div>
</div>
<div className="weather_bottom">
<div className="table">
<div className="tr">
<div className="th">公司名称</div>
<div className="th">处置状态</div>
<div className="th">预防措施</div>
</div>
<div className="scroll">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td fcb">{item.state}</div>
<div className="td">{item.preventiveMeasures}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block1_content_bottem">
<div className="top">
<div className="title"><img src={img1} alt=""/> 分子公司安全考评</div>
<div className="block1_content_bottem_tab">
<div className="item active">年度</div>
<div className="item">季度</div>
</div>
</div>
<div className="block1_content_con">
<div className="table">
<div className="tr">
<div className="th"> </div>
<div className="th">安监部扣分</div>
<div className="th">技设部扣分</div>
<div className="th">工程部扣分</div>
<div className="th">业务部扣分</div>
<div className="th">事故考核扣分</div>
<div className="th">人资部扣分</div>
<div className="th">得分</div>
</div>
<div className="scroll">
<SeamlessScroll list={block4List} step={0.5}>
{block4List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.safetySupervisionDepartment}</div>
<div className="td">{item.technicalDepartment}</div>
<div className="td">{item.engineeringDepartment}</div>
<div className="td">{item.businessDepartment}</div>
<div className="td">{item.accident}</div>
<div className="td">{item.humanResourcesDepartment}</div>
<div className="td">{item.score}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block2">
<Title title={"履职尽责"} />
<div className="block2_content">
<div className="item">
<div className="title">分子公司排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">公司名称</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block5List} step={0.5}>
{block5List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">领域排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">领域名称</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block6List} step={0.5}>
{block6List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.domainName}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">人员排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">姓名</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block7List} step={0.5}>
{block7List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.Name}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default WhiteShareMiddle;

View File

@ -1,242 +0,0 @@
.white_share_middle{
width: 840px;
.block1{
width: 840px;
.block1_content{
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
.block1_content_con{
display: flex;
.emergency_left{
width: 480px;
.top{
width: 100%;
display: flex;
justify-content: space-between;
padding: 5px;
box-sizing: border-box;
.item{
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
background-color: rgba(197, 224, 246, 0.8);
box-shadow: inset 1px 1.732px 1px 0 rgba(124, 163, 189, 0.3);
padding: 5px 12px;
text-align: center;
color: #3d5882;
border-radius: 4px;
p{
padding: 0;
margin: 0;
}
.num{
font-size: 20px;
color: #4387d6;
}
}
}
.emergency_left_main{
width: 470px;
margin: 0 5px 5px;
border-style: solid;
border-width: 1px;
border-color: #b5d7f7;
border-radius: 4px;
background-color: rgb(205, 233, 255);
padding: 5px;
box-sizing: border-box;
.table-style(109px, 1fr 1fr 1fr 1fr);
}
}
.emergency_right{
padding: 5px;
flex: 1;
margin: 5px;
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
border-radius: 2px;
background-color: rgba(197, 224, 246, 0.8);
box-shadow: inset 1px 1.732px 1px 0 rgba(124, 163, 189, 0.3);
.weather{
.title{
color: #ff6600;
font-size: 14px;
font-weight: bold;
}
.weather_main{
width: 100%;
display: flex;
justify-content: space-between;
color: #2b4977;
font-size: 14px;
font-weight: bold;
margin-top: 5px;
.item{
width: 30%;
text-align: center;
.num{
color: #2e75c6;
}
}
}
.weather_bottom{
.fcb{
color: #0c90ff;
}
.table-style(105px, 1fr 1fr 2fr);
}
}
}
}
.block1_content_bottem{
width: 100%;
.top{
width: 100%;
display: flex;
justify-content: space-between;
margin-bottom: 10px;
align-items: center;
.title{
font-size: 15px;
font-weight: bold;
color: #3f4554;
margin-left: 5px;
}
.block1_content_bottem_tab{
display: flex;
border-style: solid;
border-width: 1px;
border-color: rgb(163, 204, 250);
border-radius: 4px;
background-color: rgb(214, 236, 255);
margin-right: 5px;
align-items: center;
.item{
padding: 0 10px;
&.active{
background: #6291fa;
color: #ffffff;
}
&:hover{
background: #6291fa;
color: #ffffff;
cursor: pointer;
}
}
}
}
.block1_content_con{
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
border-radius: 4px;
background-color: rgba(234, 246, 255, 0.8);
margin: 5px;
padding: 5px;
.table-style(200px, 2fr 1.5fr 1fr 1fr 1fr 1fr 1fr 1fr)
}
}
}
}
.block2{
margin-top: 10px;
.block2_content{
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
.table-style(165px, 1fr 1fr );
padding: 5px;
.item{
width: 33%;
text-align: center;
.title{
font-size: 16px;
font-weight: bold;
color: #3b445c;
}
}
}
}
}
.table-style(@height, @grid-template-columns) {
.table {
border: 1px solid #fff;
.scroll {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
}
}
.tr {
display: grid;
grid-template-columns: @grid-template-columns;
background-color: #C4E2F8;
&:not(:last-child) {
border-bottom: 1px solid #fff;
}
.td, .th {
text-align: center;
font-size: 14px;
color: #3B445C;
border-right: 1px solid #fff;
height: 28px;
line-height: 28px;
&:last-child {
border-right: none;
}
}
.fcb{
color: #0c90ff;
}
.th {
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
}
}
}

View File

@ -1,187 +0,0 @@
import "./index.less";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import img1 from "~/assets/images/public/white/img3.png";
import bg1 from "~/assets/images/public/white/bg5.png";
import bg2 from "~/assets/images/public/white/bg6.png";
import {useState} from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
function WhiteShareRight() {
const [block1List, setBlock1List] = useState([
{ name: "封闭区域公司数", num: "13" },
{ name: "封闭区域数", num: "75" },
{ name: "封闭区域当前人数", num: "58" },
]);
const [block2List, setBlock2List] = useState([
{ type: "生产类", numberOfUnits: "23" ,number:"33"},
{ type: "工程类", numberOfUnits: "21" ,number:"22"},
{ type: "劳务类", numberOfUnits: "2" ,number:"11"},
{ type: "卫生环保类", numberOfUnits: "22" ,number:"454"},
{ type: "物资管理类", numberOfUnits: "33" ,number:"65"},
{ type: "其他", numberOfUnits: "44" ,number:"43"},
{ type: "统计", numberOfUnits: "55" ,number:"44"},
]);
const [block3List, setBlock3List] = useState([
{ unitName: "生产类", numberOfItems: "23" ,number:"33" ,amount:"5698"},
{ unitName: "生产类", numberOfItems: "23" ,number:"33" ,amount:"5698"},
{ unitName: "生产类", numberOfItems: "23" ,number:"33" ,amount:"5698"},
{ unitName: "生产类", numberOfItems: "23" ,number:"33" ,amount:"5698"},
]);
return (
<div className="white_share_right">
<div className="block1">
<Title title="四色四固定" extra="更多>" />
<div className="white_share_right_block1_content">
{
block1List.map((item, index) => (
<div key={index} className="item">
<img src={img1} alt="" />
<div className="info">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
</div>
))
}
</div>
</div>
<div className="block2">
<Title title="封闭区域重点作业" extra="更多>" />
<div className="block2_content">
<div className="item" style={{ backgroundImage: `url(${bg1})` }}>
<div className="title">重点作业 <br/>情况统计</div>
<div className="content">
<div className="wrap">
<div className="name">单项发包作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">危险作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">三人及以上作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">四新作业</div>
<div className="num">56</div>
</div>
</div>
</div>
<div className="item" style={{ backgroundImage: `url(${bg2})` }}>
<div className="title">聚集场所<br/>情况统计</div>
<div className="content">
<div className="wrap">
<div className="name">聚集场所数</div>
<div className="num fc9">56</div>
</div>
<div className="wrap">
<div className="name">聚集场所检查数</div>
<div className="num fc9">56</div>
</div>
<div className="wrap">
<div className="name">检查率</div>
<div className="num fc9">56</div>
</div>
</div>
</div>
</div>
</div>
<div className="block3">
<Title title="相关方单位情况统计" extra="更多>" />
<div className="block3_content">
<div className="item">
<div className="title">一级相关方</div>
<div className="content_main">
<div className="table">
<div className="tr">
<div className="th">类型</div>
<div className="th">单位数</div>
<div className="th">人数</div>
</div>
<div className="scroll">
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.type}</div>
<div className="td">{item.numberOfUnits}</div>
<div className="td">{item.number}</div>
</div>
))}
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">二级相关方</div>
<div className="content_main">
<div className="table">
<div className="tr">
<div className="th">类型</div>
<div className="th">单位数</div>
<div className="th">人数</div>
</div>
<div className="scroll">
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.type}</div>
<div className="td">{item.numberOfUnits}</div>
<div className="td">{item.number}</div>
</div>
))}
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block4">
<Title title="相关方处罚统计表" extra="更多>" />
<div className="block4_content">
<div className="block4_content_con">
<div className="table">
<div className="tr">
<div className="th">相关方单位名称</div>
<div className="th">被处罚项目数</div>
<div className="th">处罚次数</div>
<div className="th">处罚金额</div>
</div>
<div className="scroll1">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.number}</div>
<div className="td">{item.numberOfItems}</div>
<div className="td">{item.amount}</div>
</div>
))}
</SeamlessScroll>
</div>
<div className="tr fch">
<div className="td">统计</div>
<div className="td">43</div>
<div className="td">33</div>
<div className="td">345</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default WhiteShareRight;

View File

@ -1,231 +0,0 @@
.white_share_right{
width: 540px;
.block1{
.white_share_right_block1_content{
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.item{
width: 33%;
display: flex;
font-weight: bold;
font-size: 14px;
color: #3d5882;
align-items: center;
img{
width: 33px;
height: 40px;
}
.info{
margin-left: 10px;
.num{
color: #347fd3;
font-size: 18px;
font-weight:normal;
}
}
}
}
}
.block2{
margin-top: 10px;
.block2_content{
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
flex-wrap: wrap;
.item{
display: flex;
width: 100%;
align-items: center;
background-size: 100% 100%;
margin-bottom: 5px;
.title{
width: 78px;
text-align: center;
font-weight: bold;
color: #3b576a;
}
.content{
display: flex;
width: 440px;
flex-wrap: wrap;
justify-content: space-around;
.wrap{
text-align: center;
padding-top: 5px;
width: 25%;
.name{
font-weight: bold;
color: #3b576a;
font-size: 12px;
}
.num{
color: #347fd3;
font-size: 18px;
}
.fc9{
color: #ff9000;
}
}
}
}
}
}
.block3{
margin-top: 10px;
.block3_content{
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.item{
width: 49.5%;
.title{
width: 100%;
border-style: solid;
border-width: 1px;
border-color: rgb(255, 255, 255);
border-radius: 2px;
box-shadow: inset 0 1px 1px 0 rgba(49, 122, 202, 0.19);
font-weight: bold;
text-align: center;
color: #305683;
line-height: 30px;
background: #bcdffd;
}
.content_main{
.table-style(200px, 1fr 1fr 1fr);
}
}
}
}
.block4{
margin-top: 10px;
.block4_content{
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.block4_content_con{
width: 100%;
.table-style(72px, 2fr 2fr 1.5fr 1.5fr);
.fch{
background: #e8ede1 !important;
}
}
}
}
}
.table-style(@height, @grid-template-columns) {
.table {
border: 1px solid #fff;
.scroll {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
&:last-child {
background: #e8ede1;
}
}
}
.scroll1 {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
}
}
.tr{
display: grid;
grid-template-columns: @grid-template-columns;
background-color: #C4E2F8;
&:not(:last-child) {
border-bottom: 1px solid #fff;
}
.td, .th {
text-align: center;
font-size: 14px;
color: #3B445C;
border-right: 1px solid #fff;
height: 28px;
line-height: 28px;
&:last-child {
border-right: none;
}
}
.fcb{
color: #0c90ff;
}
.th {
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
}
}
}

View File

@ -1,33 +0,0 @@
import bg from "~/assets/images/public/white/bg.png";
import "./index.less";
import Header from "~/pages/Container/Share/components/Header";
import Left from "~/pages/Container/Share/components/LeftPanel";
import Middle from "~/pages/Container/Share/components/MiddlePanel";
import Right from "~/pages/Container/Share/components/RightPanel";
import {useMount} from "ahooks";
import autoFit from "autofit.js";
function WhiteShareOffice() {
useMount(() => {
autoFit.init({ dw: 1920, dh: 1080, el: ".white_branch_office", resize: true });
});
return (
<div className="white_share_office" style={{ backgroundImage: `url(${bg})` }}>
<Header />
<div className="white_share_office_content">
<div className="left">
<Left/>
</div>
<div className="middle">
<Middle/>
</div>
<div className="right">
<Right/>
</div>
</div>
</div>
);
}
export default WhiteShareOffice;

View File

@ -2,7 +2,7 @@ import { useEventListener, useMount } from "ahooks";
import { useEffect, useRef, useState } from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import { getAlertColor, getWeatherIcon } from "~/pages/Container/Map/components/Content/branchOffice/IndexLeft";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import { initEcharts1, initEcharts2, initEcharts3, initEcharts4, initEcharts5 } from "./echarts";
import "./index.less";

View File

@ -3,7 +3,7 @@ import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import img4 from "~/assets/images/public/white/img4.png";
import img5 from "~/assets/images/public/white/img5.png";
import img6 from "~/assets/images/public/white/img6.png";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import "./index.less";
function LeftPanel() {

View File

@ -3,7 +3,7 @@ import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import bg1 from "~/assets/images/public/white/bg5.png";
import bg2 from "~/assets/images/public/white/bg6.png";
import img1 from "~/assets/images/public/white/img3.png";
import Title from "~/pages/Container/WhiteBranchOffice/components/Title";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import "./index.less";
function RightPanel() {

View File

@ -1,13 +1,13 @@
import { useMount } from "ahooks";
import autoFit from "autofit.js";
import bg from "~/assets/images/public/white/bg.png";
import Header from "~/pages/Container/Share/components/Header";
import CenterPanel from "~/pages/Container/WhiteBranchOffice/components/CenterPanel";
import LeftPanel from "~/pages/Container/WhiteBranchOffice/components/LeftPanel";
import RightPanel from "~/pages/Container/WhiteBranchOffice/components/RightPanel";
import CenterPanel from "~/pages/Container/White/BranchOffice/components/CenterPanel";
import LeftPanel from "~/pages/Container/White/BranchOffice/components/LeftPanel";
import RightPanel from "~/pages/Container/White/BranchOffice/components/RightPanel";
import Header from "~/pages/Container/White/Share/components/Header";
import "./index.less";
function WhiteBranchOffice() {
function BranchOffice() {
useMount(() => {
autoFit.init({ dw: 1920, dh: 1080, el: ".white_branch_office", resize: true });
});
@ -24,4 +24,4 @@ function WhiteBranchOffice() {
);
}
export default WhiteBranchOffice;
export default BranchOffice;

View File

@ -1,11 +1,9 @@
import bg from "~/assets/images/public/white/titlebg.png";
import title from "~/assets/images/public/white/title.png";
import more from "~/assets/images/public/white/more.png";
import title from "~/assets/images/public/white/title.png";
import bg from "~/assets/images/public/white/titlebg.png";
import "./index.less";
function WhiteShareHead() {
function Header() {
return (
<div className="white_share_header" style={{ backgroundImage: `url(${bg})` }}>
<div className="left">
@ -13,13 +11,13 @@ function WhiteShareHead() {
<div className="list">10~27 多云 星期三</div>
</div>
<div className="title">
<img src={title} alt=""/>
<img src={title} alt="" />
</div>
<div className="right">
<div className="top">
<div className="name">股份公司数据统计</div>
<div className="more">
<img src={more} alt=""/>
<img src={more} alt="" />
</div>
<div className="down_main">
<div className="list">二公司</div>
@ -28,10 +26,9 @@ function WhiteShareHead() {
<div className="list">九公司</div>
</div>
</div>
</div>
</div>
);
}
export default WhiteShareHead;
export default Header;

View File

@ -1,57 +1,60 @@
.white_share_header{
.white_share_header {
width: 100%;
height: 86px;
position: relative;
background-repeat: no-repeat;
background-size: 100% 100%;
.title{
.title {
position: absolute;
left: 50.5%;
transform: translateX(-50%);
top: 25px;
}
.left{
.left {
position: absolute;
top: 30px;
left: 20px;
display: flex;
.list{
.list {
padding: 6px 15px;
border-radius: 23px;
background-image: -moz-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -webkit-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -ms-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: linear-gradient(180deg, rgb(217, 239, 253) 0%, rgb(225, 243, 254) 58%, rgb(232, 246, 255) 100%);
box-shadow: inset 0 1px 3px 0 rgba(49, 122, 202, 0.75);
margin-right: 10px;
color: #465683;
opacity: 0.8;
}
}
.right{
.right {
position: absolute;
right: 20px;
top:25px;
top: 25px;
border-radius: 23px;
background-image: -moz-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -webkit-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -ms-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: linear-gradient(180deg, rgb(217, 239, 253) 0%, rgb(225, 243, 254) 58%, rgb(232, 246, 255) 100%);
box-shadow: inset 0 1px 3px 0 rgba(49, 122, 202, 0.75);
padding: 6px 15px;
color: #465683;
.top{
.top {
display: flex;
justify-content: space-between;
position: relative;
.name{
.name {
margin-right: 20px;
font-weight: bold;
}
.more{
.more {
cursor: pointer;
}
.down_main{
.down_main {
width: 150px;
position: absolute;
top: 30px;
@ -60,7 +63,8 @@
border: 1px solid #b8dcf3;
border-radius: 4px;
opacity: 0;
.list{
.list {
font-weight: bold;
border-bottom: 1px solid #d4e3f7;
line-height: 36px;
@ -68,17 +72,18 @@
text-align: center;
font-size: 12px;
cursor: pointer;
&:hover{
&:hover {
background: #def1ff;
}
}
}
&:hover{
.down_main{
&:hover {
.down_main {
opacity: 1;
}
}
}
}
}

View File

@ -0,0 +1,239 @@
import { useState } from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import bg1 from "~/assets/images/public/white/bg1.png";
import img1 from "~/assets/images/public/white/img1.png";
import cake from "~/assets/images/public/white/img7.png";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import "./index.less";
function LeftPanel() {
const [block1List, setBlock1List] = useState([
{ name: "隐患总数", num: "1398" },
{ name: "隐患整改数", num: "1212" },
{ name: "隐患未整改数", num: "563" },
{ name: "隐患整改率", num: "89%" },
]);
const [block2List, setBlock2List] = useState([
{ name: "隐患总数", num: "1398" },
{ name: "隐患整改数", num: "1212" },
{ name: "隐患未整改数", num: "563" },
{ name: "隐患整改率", num: "89%" },
]);
const [block3List, setBlock3List] = useState([
{ id: 1, level: "二级", name: "东区一号罐", state: "正常" },
{ id: 2, level: "二级", name: "东区一号罐", state: "正常" },
{ id: 3, level: "二级", name: "东区一号罐", state: "正常" },
{ id: 4, level: "二级", name: "东区一号罐", state: "正常" },
{ id: 5, level: "二级", name: "东区一号罐", state: "正常" },
{ id: 6, level: "二级", name: "东区一号罐", state: "正常" },
]);
const [block4List, setBlock4List] = useState([
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
{ name: "一级", total: "1398", rectificationNumber: "56", unNumber: "56", rectificationRate: "89%" },
]);
return (
<div className="white_share_left">
<div className="block1">
<Title title="风险辨识管控情况" />
<div className="white_share_left_conten">
<div className="cake">
<img src={cake} alt="" />
</div>
<div className="cake_contant" style={{ backgroundImage: `url(${bg1})` }}>
<div className="item">
<div className="title">重大风险</div>
<div className="num fcr">467</div>
</div>
<div className="item">
<div className="title">较大风险</div>
<div className="num fco">467</div>
</div>
<div className="item">
<div className="title">一般风险</div>
<div className="num fcc">467</div>
</div>
<div className="item">
<div className="title">低风险</div>
<div className="num fcb">98091</div>
</div>
</div>
</div>
</div>
<div className="block2">
<Title title="重大危险源安全情况" />
<div className="white_share_left_conten">
<div className="top">
<div className="item">
<div className="title">二级重大危险源1</div>
<div className="item_container">
<span>
储罐数:
<span className="fcb">3</span>
</span>
<span>
在用数:
<span className="fcg">3</span>
</span>
<span>
停用数:
<span className="fcr">0</span>
</span>
</div>
</div>
<div className="item">
<div className="title">三级重大危险源2</div>
<div className="item_container">
<span>
储罐数:
<span className="fcb">10</span>
</span>
<span>
在用数:
<span className="fcg">10</span>
</span>
<span>
停用数:
<span className="fcr">0</span>
</span>
</div>
</div>
</div>
<div className="container">
<div className="left_table">
<div className="table">
<div className="tr">
<div className="th">级别</div>
<div className="th">名称</div>
<div className="th">状态</div>
</div>
<div className="scroll">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.level}</div>
<div className="td">{item.name}</div>
<div className="td">{item.state}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
<div className="info">
<div className="title">
<img src={img1} alt="" />
东区二号罐液位过低
</div>
<div className="comment">
<p>
温度待处置数/报警个数
<span>0/0</span>
</p>
<p>
压力待处置数/报警个数
<span>0/0</span>
</p>
<p>
液位待处置数/报警个数
<span>
<span className="fcr">1</span>
/1
</span>
</p>
</div>
</div>
</div>
</div>
</div>
<div className="block3">
<Title title="隐患排查治理情况" />
<div className="white_share_left_conten">
<div className="top">
<div className="item">
<div className="content">
<div className="title">
股份
<br />
公司
</div>
<div className="info">
{
block1List.map((item, index) => (
<div key={index} className="list">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
))
}
</div>
</div>
</div>
<div className="item">
<div className="content">
<div className="title">
分子
<br />
公司
</div>
<div className="info">
{
block2List.map((item, index) => (
<div key={index} className="list">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
))
}
</div>
</div>
</div>
</div>
<div className="field">
<div className="top">领域隐患</div>
</div>
<div className="main">
<div className="table">
<div className="tr">
<div className="th">领域名称</div>
<div className="th">隐患总数</div>
<div className="th">整改数</div>
<div className="th">未整改数</div>
<div className="th">整改率</div>
</div>
<div className="scroll">
<SeamlessScroll list={block4List} step={0.5}>
{block4List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.name}</div>
<div className="td">{item.total}</div>
<div className="td">{item.rectificationNumber}</div>
<div className="td">{item.unNumber}</div>
<div className="td">{item.rectificationRate}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default LeftPanel;

View File

@ -1,25 +1,20 @@
.white_share_left{
width: 500px;
.white_share_left {
color: #305683;
.block1{
.block1 {
width: 100%;
.white_share_left_conten{
.white_share_left_conten {
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
padding: 5px;
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
display: flex;
align-items: center;
border-radius: 2px;
.cake_contant{
.cake_contant {
width: 100%;
background-size: 100% 100%;
background-repeat: no-repeat;
@ -27,53 +22,59 @@
display: flex;
flex-wrap: wrap;
.item{
.item {
width: 50%;
text-align: center;
margin: 5px 0;
.title{
.title {
font-size: 14px;
font-weight: bold;
color: #2b4977;
}
.num{
.num {
font-size: 24px;
}
.fcb{
.fcb {
color: #5daaff;
}
.fcc{
.fcc {
color: #ffa801;
}
.fco{
.fco {
color: #ff6000;
}
.fcr{
.fcr {
color: #ff2709;
}
}
}
}
}
.block2{
.block2 {
margin-top: 10px;
.white_share_left_conten{
.white_share_left_conten {
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
padding: 5px;
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
.top{
.top {
width: 100%;
display: flex;
justify-content: space-between;
.item{
.item {
text-align: center;
border-style: solid;
border-width: 1px;
@ -84,101 +85,107 @@
box-shadow: 0 2px 2px 0 rgba(114, 163, 191, 0.45);
padding: 10px;
.title{
.title {
font-weight: bold;
color: #305683;
}
.item_container{
color: #51719c;
.item_container {
color: #51719c;
margin-top: 5px;
.fcb{
.fcb {
color: #0097f7;
}
.fcg{
.fcg {
color: #0a9503;
}
.fcr{
.fcr {
color: #ff2100;
}
}
}
}
.container{
.container {
width: 100%;
display: flex;
margin-top: 10px;
.left_table{
.left_table {
width: 50%;
.table-style(109px, 1fr 1.2fr 1fr);
}
.info{
.info {
width: 50%;
margin-left: 10px;
.title{
.title {
font-size: 14px;
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
background-image: -moz-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -webkit-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: -ms-linear-gradient( 180deg, rgb(217,239,253) 0%, rgb(225,243,254) 58%, rgb(232,246,255) 100%);
background-image: linear-gradient(180deg, rgb(217, 239, 253) 0%, rgb(225, 243, 254) 58%, rgb(232, 246, 255) 100%);
box-shadow: inset 0 1px 3px 0 rgba(49, 122, 202, 0.48);
border-radius: 50px;
padding: 5px 10px;
font-weight: bold;
color: #38688e;
}
.comment{
.comment {
padding-left: 10px;
margin-top: 10px;
p{
p {
margin: 0;
line-height: 30px;
color: #305683;
span{
span {
color: #00aeff;
font-weight: bold;
.fcr{
.fcr {
color: #f90102;
}
}
}
}
}
}
}
}
.block3{
.block3 {
margin-top: 10px;
.white_share_left_conten{
.white_share_left_conten {
width: 100%;
background-image: -moz-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(218,233,250) 39%, rgb(226,239,255) 100%);
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
padding: 5px;
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255,255,255,0), #ffffff) 1;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
.top{
.top {
width: 100%;
.item{
.item {
width: 100%;
border-style: solid;
border-width: 1px;
border-color:#aacbed;
border-color: #aacbed;
border-radius: 4px;
background-color: rgb(205, 233, 255);
padding: 4px;
margin-bottom: 5px;
.content{
.content {
width: 100%;
border-style: solid;
border-width: 1px;
@ -188,30 +195,33 @@
box-shadow: 0 1px 1px 0 rgba(114, 163, 191, 0.45);
display: flex;
align-items: center;
.title{
.title {
font-size: 18px;
color: #457fc0;
font-weight: bold;
border-style: solid;
border-width: 2px;
border-color: #c6e6fe;
background-image: -moz-linear-gradient( 90deg, rgb(227,240,255) 0%, rgb(201,231,249) 100%);
background-image: -webkit-linear-gradient( 90deg, rgb(227,240,255) 0%, rgb(201,231,249) 100%);
background-image: -ms-linear-gradient( 90deg, rgb(227,240,255) 0%, rgb(201,231,249) 100%);
background-image: linear-gradient(90deg, rgb(227, 240, 255) 0%, rgb(201, 231, 249) 100%);
text-align: center;
padding: 2px 10px;
line-height: 20px;
}
.info{
.info {
flex: 1;
display: flex;
.list{
.list {
text-align: center;
width: 25%;
.name{
.name {
font-size: 12px;
}
.num{
.num {
font-size: 16px;
}
}
@ -219,9 +229,11 @@
}
}
}
.field{
.field {
width: 100%;
.top{
.top {
width: 100%;
background-color: rgb(205, 233, 255);
text-align: center;
@ -232,13 +244,15 @@
color: #457fc0;
}
}
.main{
.main {
width: 100%;
.table-style(70px, 1fr 1fr 1fr 1fr 1fr);
.table-style(200px, 1fr 1fr 1fr 1fr 1fr);
}
}
}
}
.table-style(@height, @grid-template-columns) {
.table {
border: 1px solid #fff;

View File

@ -0,0 +1,315 @@
import { useState } from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import weather from "~/assets/images/public/weather/1.png";
import img1 from "~/assets/images/public/white/titlebg1.png";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import "./index.less";
function MiddlePanel() {
const [block1List, setBlock1List] = useState([
{ name: "综合应急预案", num: "13" },
{ name: "现场处置方案", num: "75" },
{ name: "应急应对措施", num: "58" },
{ name: "应急救援队伍", num: "3" },
]);
const [block2List, setBlock2List] = useState([
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
{ unitName: "二公司", name: "王岩", duties: "公司经理", phone: "3095311" },
]);
const [block3List, setBlock3List] = useState([
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
{ unitName: "二公司", state: "未处置", preventiveMeasures: "远离大树、电线杆..." },
]);
const [block4List, setBlock4List] = useState([
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
{ unitName: "二公司", safetySupervisionDepartment: "4", technicalDepartment: "3", engineeringDepartment: "2", businessDepartment: "1", accident: "0", humanResourcesDepartment: "0", score: "0" },
]);
const [block5List, setBlock5List] = useState([
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
{ unitName: "二公司", scores: "96" },
]);
const [block6List, setBlock6List] = useState([
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
{ domainName: "设备", scores: "96" },
]);
const [block7List, setBlock7List] = useState([
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
{ Name: "王丹", scores: "96" },
]);
return (
<div className="white_share_middle">
<div className="block1">
<Title title="应急管理" />
<div className="block1_content">
<div className="block1_content_con">
<div className="emergency_left">
<div className="top">
{
block1List.map((item, index) => (
<div key={index} className="item">
<p className="name">{item.name}</p>
<div className="num">{item.num}</div>
</div>
))
}
</div>
<div className="emergency_left_main">
<div className="table">
<div className="tr">
<div className="th">单位名称</div>
<div className="th">姓名</div>
<div className="th">职务</div>
<div className="th">电话</div>
</div>
<div className="scroll">
<SeamlessScroll list={block2List} step={0.5}>
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.name}</div>
<div className="td">{item.duties}</div>
<div className="td">{item.phone}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="emergency_right">
<div className="weather">
<div className="title">秦皇岛市气象台发布大风橙色预警[工级/严重]</div>
<div className="weather_main">
<div className="item">
<img src={weather} alt="" />
</div>
<div className="item">
<div>温度</div>
<div className="num">25</div>
</div>
<div className="item">
<div>风速</div>
<div className="num">16米8级</div>
</div>
</div>
<div className="weather_bottom">
<div className="table">
<div className="tr">
<div className="th">公司名称</div>
<div className="th">处置状态</div>
<div className="th">预防措施</div>
</div>
<div className="scroll">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td fcb">{item.state}</div>
<div className="td">{item.preventiveMeasures}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block1_content_bottem">
<div className="top">
<div className="title">
<img src={img1} alt="" />
分子公司安全考评
</div>
<div className="block1_content_bottem_tab">
<div className="item active">年度</div>
<div className="item">季度</div>
</div>
</div>
<div className="block1_content_con">
<div className="table">
<div className="tr">
<div className="th"> </div>
<div className="th">安监部扣分</div>
<div className="th">技设部扣分</div>
<div className="th">工程部扣分</div>
<div className="th">业务部扣分</div>
<div className="th">事故考核扣分</div>
<div className="th">人资部扣分</div>
<div className="th">得分</div>
</div>
<div className="scroll">
<SeamlessScroll list={block4List} step={0.5}>
{block4List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.safetySupervisionDepartment}</div>
<div className="td">{item.technicalDepartment}</div>
<div className="td">{item.engineeringDepartment}</div>
<div className="td">{item.businessDepartment}</div>
<div className="td">{item.accident}</div>
<div className="td">{item.humanResourcesDepartment}</div>
<div className="td">{item.score}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block2">
<Title title="履职尽责" />
<div className="block2_content">
<div className="item">
<div className="title">分子公司排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">公司名称</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block5List} step={0.5}>
{block5List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">领域排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">领域名称</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block6List} step={0.5}>
{block6List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.domainName}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">人员排名</div>
<div className="block2_content_con">
<div className="table">
<div className="tr">
<div className="th">姓名</div>
<div className="th">分数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block7List} step={0.5}>
{block7List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.Name}</div>
<div className="td">{item.scores}</div>
</div>
))}
</SeamlessScroll>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default MiddlePanel;

View File

@ -0,0 +1,251 @@
.white_share_middle {
.block1 {
.block1_content {
width: 100%;
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
.block1_content_con {
display: flex;
.emergency_left {
width: 480px;
.top {
width: 100%;
display: flex;
justify-content: space-between;
padding: 5px;
box-sizing: border-box;
.item {
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
background-color: rgba(197, 224, 246, 0.8);
box-shadow: inset 1px 1.732px 1px 0 rgba(124, 163, 189, 0.3);
padding: 5px 12px;
text-align: center;
color: #3d5882;
border-radius: 4px;
p {
padding: 0;
margin: 0;
}
.num {
font-size: 20px;
color: #4387d6;
}
}
}
.emergency_left_main {
width: 470px;
margin: 0 5px 5px;
border-style: solid;
border-width: 1px;
border-color: #b5d7f7;
border-radius: 4px;
background-color: rgb(205, 233, 255);
padding: 5px;
box-sizing: border-box;
.table-style(149px, 1fr 1fr 1fr 1fr);
}
}
.emergency_right {
padding: 5px;
flex: 1;
margin: 5px;
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
border-radius: 2px;
background-color: rgba(197, 224, 246, 0.8);
box-shadow: inset 1px 1.732px 1px 0 rgba(124, 163, 189, 0.3);
.weather {
.title {
color: #ff6600;
font-size: 14px;
font-weight: bold;
}
.weather_main {
width: 100%;
display: flex;
justify-content: space-between;
color: #2b4977;
font-size: 14px;
font-weight: bold;
margin-top: 5px;
.item {
width: 30%;
text-align: center;
.num {
color: #2e75c6;
}
}
}
.weather_bottom {
.fcb {
color: #0c90ff;
}
.table-style(145px, 1fr 1fr 2fr);
}
}
}
}
.block1_content_bottem {
width: 100%;
.top {
width: 100%;
display: flex;
justify-content: space-between;
margin-bottom: 10px;
align-items: center;
.title {
font-size: 15px;
font-weight: bold;
color: #3f4554;
margin-left: 5px;
}
.block1_content_bottem_tab {
display: flex;
border-style: solid;
border-width: 1px;
border-color: rgb(163, 204, 250);
border-radius: 4px;
background-color: rgb(214, 236, 255);
margin-right: 5px;
align-items: center;
.item {
padding: 0 10px;
&.active {
background: #6291fa;
color: #ffffff;
}
&:hover {
background: #6291fa;
color: #ffffff;
cursor: pointer;
}
}
}
}
.block1_content_con {
border-width: 1px;
border-color: rgb(255, 255, 255);
border-style: solid;
border-radius: 4px;
background-color: rgba(234, 246, 255, 0.8);
margin: 5px;
padding: 5px;
.table-style(240px, 2fr 1.5fr 1fr 1fr 1fr 1fr 1fr 1fr);
.table {
width: 100%;
}
}
}
}
}
.block2 {
margin-top: 10px;
.block2_content {
width: 100%;
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
.table-style(215px, 1fr 1fr);
padding: 5px;
.item {
width: 33%;
text-align: center;
.title {
font-size: 16px;
font-weight: bold;
color: #3b445c;
}
}
}
}
}
.table-style(@height, @grid-template-columns) {
.table {
border: 1px solid #fff;
.scroll {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
}
}
.tr {
display: grid;
grid-template-columns: @grid-template-columns;
background-color: #C4E2F8;
&:not(:last-child) {
border-bottom: 1px solid #fff;
}
.td, .th {
text-align: center;
font-size: 14px;
color: #3B445C;
border-right: 1px solid #fff;
height: 28px;
line-height: 28px;
&:last-child {
border-right: none;
}
}
.fcb {
color: #0c90ff;
}
.th {
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
}
}
}

View File

@ -0,0 +1,206 @@
import { useState } from "react";
import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
import bg1 from "~/assets/images/public/white/bg5.png";
import bg2 from "~/assets/images/public/white/bg6.png";
import img1 from "~/assets/images/public/white/img3.png";
import Title from "~/pages/Container/White/BranchOffice/components/Title";
import "./index.less";
function RightPanel() {
const [block1List, setBlock1List] = useState([
{ name: "封闭区域公司数", num: "13" },
{ name: "封闭区域数", num: "75" },
{ name: "封闭区域当前人数", num: "58" },
]);
const [block2List, setBlock2List] = useState([
{ type: "生产类", numberOfUnits: "23", number: "33" },
{ type: "工程类", numberOfUnits: "21", number: "22" },
{ type: "劳务类", numberOfUnits: "2", number: "11" },
{ type: "卫生环保类", numberOfUnits: "22", number: "454" },
{ type: "物资管理类", numberOfUnits: "33", number: "65" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
{ type: "其他", numberOfUnits: "44", number: "43" },
]);
const [block3List, setBlock3List] = useState([
{ unitName: "生产类", numberOfItems: "23", number: "33", amount: "5698" },
{ unitName: "生产类", numberOfItems: "23", number: "33", amount: "5698" },
{ unitName: "生产类", numberOfItems: "23", number: "33", amount: "5698" },
{ unitName: "生产类", numberOfItems: "23", number: "33", amount: "5698" },
]);
return (
<div className="white_share_right">
<div className="block1">
<Title title="四色四固定" extra="更多>" />
<div className="white_share_right_block1_content">
{
block1List.map((item, index) => (
<div key={index} className="item">
<img src={img1} alt="" />
<div className="info">
<div className="name">{item.name}</div>
<div className="num">{item.num}</div>
</div>
</div>
))
}
</div>
</div>
<div className="block2">
<Title title="封闭区域重点作业" extra="更多>" />
<div className="block2_content">
<div className="item" style={{ backgroundImage: `url(${bg1})` }}>
<div className="title">
重点作业
<br />
情况统计
</div>
<div className="content">
<div className="wrap">
<div className="name">单项发包作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">危险作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">三人及以上作业</div>
<div className="num">56</div>
</div>
<div className="wrap">
<div className="name">四新作业</div>
<div className="num">56</div>
</div>
</div>
</div>
<div className="item" style={{ backgroundImage: `url(${bg2})` }}>
<div className="title">
聚集场所
<br />
情况统计
</div>
<div className="content">
<div className="wrap">
<div className="name">聚集场所数</div>
<div className="num fc9">56</div>
</div>
<div className="wrap">
<div className="name">聚集场所检查数</div>
<div className="num fc9">56</div>
</div>
<div className="wrap">
<div className="name">检查率</div>
<div className="num fc9">56</div>
</div>
</div>
</div>
</div>
</div>
<div className="block3">
<Title title="相关方单位情况统计" extra="更多>" />
<div className="block3_content">
<div className="item">
<div className="title">一级相关方</div>
<div className="content_main">
<div className="table">
<div className="tr">
<div className="th">类型</div>
<div className="th">单位数</div>
<div className="th">人数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block2List} step={0.5}>
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.type}</div>
<div className="td">{item.numberOfUnits}</div>
<div className="td">{item.number}</div>
</div>
))}
</SeamlessScroll>
</div>
<div className="tr fch">
<div className="td">统计</div>
<div className="td">43</div>
<div className="td">345</div>
</div>
</div>
</div>
</div>
<div className="item">
<div className="title">二级相关方</div>
<div className="content_main">
<div className="table">
<div className="tr">
<div className="th">类型</div>
<div className="th">单位数</div>
<div className="th">人数</div>
</div>
<div className="scroll">
<SeamlessScroll list={block2List} step={0.5}>
{block2List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.type}</div>
<div className="td">{item.numberOfUnits}</div>
<div className="td">{item.number}</div>
</div>
))}
</SeamlessScroll>
</div>
<div className="tr fch">
<div className="td">统计</div>
<div className="td">43</div>
<div className="td">345</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="block4">
<Title title="相关方处罚统计表" extra="更多>" />
<div className="block4_content">
<div className="block4_content_con">
<div className="table">
<div className="tr">
<div className="th">相关方单位名称</div>
<div className="th">被处罚项目数</div>
<div className="th">处罚次数</div>
<div className="th">处罚金额</div>
</div>
<div className="scroll1">
<SeamlessScroll list={block3List} step={0.5}>
{block3List.map((item, index) => (
<div key={index} className="tr">
<div className="td">{item.unitName}</div>
<div className="td">{item.number}</div>
<div className="td">{item.numberOfItems}</div>
<div className="td">{item.amount}</div>
</div>
))}
</SeamlessScroll>
</div>
<div className="tr fch">
<div className="td">统计</div>
<div className="td">43</div>
<div className="td">33</div>
<div className="td">345</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default RightPanel;

View File

@ -0,0 +1,228 @@
.white_share_right {
.block1 {
.white_share_right_block1_content {
width: 100%;
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.item {
width: 33%;
display: flex;
font-weight: bold;
font-size: 14px;
color: #3d5882;
align-items: center;
img {
width: 33px;
height: 40px;
}
.info {
margin-left: 10px;
.num {
color: #347fd3;
font-size: 18px;
font-weight: normal;
}
}
}
}
}
.block2 {
margin-top: 10px;
.block2_content {
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
flex-wrap: wrap;
.item {
display: flex;
width: 100%;
align-items: center;
background-size: 100% 100%;
margin-bottom: 5px;
.title {
width: 78px;
text-align: center;
font-weight: bold;
color: #3b576a;
}
.content {
display: flex;
width: 440px;
flex-wrap: wrap;
justify-content: space-around;
.wrap {
text-align: center;
padding-top: 5px;
width: 25%;
.name {
font-weight: bold;
color: #3b576a;
font-size: 12px;
}
.num {
color: #347fd3;
font-size: 18px;
}
.fc9 {
color: #ff9000;
}
}
}
}
}
}
.block3 {
margin-top: 10px;
.block3_content {
width: 100%;
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.item {
width: 49.5%;
.title {
width: 100%;
border-style: solid;
border-width: 1px;
border-color: rgb(255, 255, 255);
border-radius: 2px;
box-shadow: inset 0 1px 1px 0 rgba(49, 122, 202, 0.19);
font-weight: bold;
text-align: center;
color: #305683;
line-height: 30px;
background: #bcdffd;
}
.content_main {
.table-style(260px, 1fr 1fr 1fr);
.fch {
background: #e8ede1 !important;
}
}
}
}
}
.block4 {
margin-top: 10px;
.block4_content {
width: 100%;
background-image: linear-gradient(90deg, rgb(218, 233, 250) 39%, rgb(226, 239, 255) 100%);
border: 2px solid transparent;
border-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #ffffff) 1;
border-radius: 2px;
display: flex;
justify-content: space-between;
padding: 5px;
.block4_content_con {
width: 100%;
.table-style(112px, 2fr 2fr 1.5fr 1.5fr);
.fch {
background: #e8ede1 !important;
}
}
}
}
}
.table-style(@height, @grid-template-columns) {
.table {
border: 1px solid #fff;
.scroll {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
}
}
.scroll1 {
height: @height;
overflow-y: hidden;
.tr {
&:nth-child(odd) {
background-color: transparent;
}
}
}
.tr {
display: grid;
grid-template-columns: @grid-template-columns;
background-color: #C4E2F8;
&:not(:last-child) {
border-bottom: 1px solid #fff;
}
.td, .th {
text-align: center;
font-size: 14px;
color: #3B445C;
border-right: 1px solid #fff;
height: 28px;
line-height: 28px;
&:last-child {
border-right: none;
}
}
.fcb {
color: #0c90ff;
}
.th {
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
}
}
}

View File

@ -0,0 +1,33 @@
import { useMount } from "ahooks";
import autoFit from "autofit.js";
import bg from "~/assets/images/public/white/bg.png";
import Header from "~/pages/Container/White/Share/components/Header";
import Left from "~/pages/Container/White/Share/components/LeftPanel";
import Middle from "~/pages/Container/White/Share/components/MiddlePanel";
import Right from "~/pages/Container/White/Share/components/RightPanel";
import "./index.less";
function Share() {
useMount(() => {
autoFit.init({ dw: 1920, dh: 1080, el: ".white_share_office", resize: true });
});
return (
<div className="white_share_office" style={{ backgroundImage: `url(${bg})` }}>
<Header />
<div className="white_share_office_content">
<div className="left">
<Left />
</div>
<div className="middle">
<Middle />
</div>
<div className="right">
<Right />
</div>
</div>
</div>
);
}
export default Share;

View File

@ -1,23 +1,26 @@
.white_share_office{
.white_share_office {
width: 100vw;
height: 100vh;
background-size: 100% 100%;
background-repeat: no-repeat;
.white_share_office_content{
.white_share_office_content {
width: 100%;
display: flex;
justify-content: space-between;
.left{
gap: 10px;
padding: 0 10px;
.left {
width: 500px;
margin-left: 10px;
}
.middle{
width: 840px;
margin-left: 10px;
}
.right{
.middle {
flex: 1;
margin-left: 10px;
}
.right {
width: 540px;
}
}
}

View File

@ -0,0 +1,5 @@
function White(props) {
return props.children;
}
export default White;