diff --git a/package.json b/package.json
index 0e36ba9..4add90e 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
"react-transition-group": "^4.4.5",
"sass": "^1.97.0",
"sass-loader": "^16.0.6",
- "zy-react-library": "^2.0.13"
+ "zy-react-library": "^2.0.15"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",
diff --git a/src/pages/Container/Map/components/Content/branchOffice/FengBi/ClosedAreaStatsPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/FengBi/ClosedAreaStatsPanel/index.js
new file mode 100644
index 0000000..65f04eb
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/FengBi/ClosedAreaStatsPanel/index.js
@@ -0,0 +1,67 @@
+import CountUp from "react-countup";
+import areaIcon from "~/assets/images/map_bi/content/icon29.png";
+import quayIcon from "~/assets/images/map_bi/content/icon30.png";
+import cornerIcon from "~/assets/images/map_bi/content/icon32.png";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const statistics = [
+ { img: areaIcon, title: "堆场区", peopleCount: 123, vehicleCount: 45 },
+ { img: quayIcon, title: "码头区", peopleCount: 141, vehicleCount: 43 },
+];
+
+/** 负责展示封闭区域内的人员和车辆统计。 */
+function ClosedAreaStatsPanel() {
+ return (
+
+
+ {statistics.map(item => (
+
+
+

+
+
+
+ {item.title}
+
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
+
+/** 封闭区域统计项的单个数值展示。 */
+function Statistic({ label, value }) {
+ return (
+
-
-
-
-
-
-
-
})
-
-
{weatherData.text || "暂无"}
-
-
-
-
-

-
-
-
温度:
-
{weatherData.temp ? `${weatherData.temp}℃` : "--"}
-
-
-
-
-

-
-
-
风速:
-
{weatherData.wind_class || "--"}
-
-
-
-
-
-
-
- {
- alert.map((item, index) => (
-
- ))
- }
-
-
-
-
-
-
部门名称
-
需锚定设备数
-
已锚定设备数
-
-
-
- {block1List.map((item, index) => (
-
-
{item.department}
-
{item.requiredDevices}
-
{item.anchoredDevices}
-
- ))}
-
-
-
-
-
-
-
-
-
- {block2List.map((item, index) => (
-
-
-
- {item.levelName}
-
-
-
- 风险点数:
- {item.riskCount}
-
-
-
- 检查覆盖率:
- {`${(item.riskCount / item.riskCount * 100).toFixed(0)}%`}
-
-
- 未覆盖风险点数:
- {item.notRiskCount}
-
-
-
-
- ))}
-
-
-
-
-
-
-
-
-
-
相关方类别
-
一级单位数
-
一级人数
-
二级单位数
-
二级人数
-
-
-
- {block4List.map((item, index) => (
-
-
{item.relatedPartyCategory}
-
{item.firstLevelUnits}
-
{item.firstLevelPersonnel}
-
{item.secondLevelUnits}
-
{item.secondLevelPersonnel}
-
- ))}
-
-
-
-
-
+
+
+
+
+
);
}
-export default Connect([NS_BI_STATISTICS], true)(IndexLeft);
+export default IndexLeft;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexLeft/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexLeft/index.less
deleted file mode 100644
index 4f60fe2..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/IndexLeft/index.less
+++ /dev/null
@@ -1,229 +0,0 @@
-.branch_office_index_left {
- .block1 {
- background-color: rgba(12, 28, 88, 0.4);
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .weather {
- display: flex;
- align-items: center;
- gap: 40px;
-
- .icon {
- padding: 10px;
- display: flex;
- align-items: center;
- gap: 5px;
-
- .img {
- img {
- width: 40px;
- height: 40px;
- }
- }
-
- .text {
- color: #fff;
- writing-mode: vertical-lr;
- letter-spacing: 5px;
- }
- }
-
- .items {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
-
- .item {
- flex: 1;
- display: flex;
- align-items: center;
- gap: 10px;
-
- .img {
- img {
- width: 42px;
- height: 42px;
- }
- }
-
- .info {
- .label {
- font-size: 12px;
- color: #fff;
- }
-
- .value {
- font-size: 18px;
- color: #00e7ff;
- font-weight: bold;
- }
- }
- }
- }
- }
-
- .alert {
- margin-top: 10px;
-
- .scroll {
- height: 20px;
- overflow-y: hidden;
-
- .item {
- .title {
- font-weight: bold;
- font-size: 14px;
- }
- }
- }
- }
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 60px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- background-image: linear-gradient(to bottom, rgba(0, 42, 85, 0.38), rgba(1, 37, 74, 0.47), rgba(4, 38, 87, 0));
- border: 1px solid;
- border-image: linear-gradient(to top, rgba(8, 41, 87, 0.5), rgba(64, 152, 255, 0.5)) 1;
- border-bottom: none;
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-
- .block2 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .items {
- .item {
- position: relative;
- margin-top: 5px;
- display: flex;
- align-items: center;
- gap: 19px;
- border: 1px solid rgba(0, 168, 255, 0.36);
- background-color: rgba(1, 37, 74, 0.47);
- border-radius: 4px;
- padding: 6px 10px;
-
- &:first-child {
- margin-top: 0;
- }
-
- .decoration {
- width: 2px;
- height: 15px;
- position: absolute;
- left: 0;
- top: 50%;
- transform: translateY(-50%);
- }
-
- .title {
- border-radius: 4px;
- padding: 10px 7px;
- font-weight: bold;
- border-width: 1px;
- border-style: solid;
- flex-basis: 85px;
- text-align: center;
- }
-
- .info {
- flex: 1;
- color: #fff;
- font-size: 14px;
-
- .bottom {
- display: flex;
- justify-content: space-between;
- }
- }
- }
- }
- }
- }
-
- .block3 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
- }
- }
-
- .block4 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 60px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr;
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.js
new file mode 100644
index 0000000..cc422c1
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.js
@@ -0,0 +1,64 @@
+import { Connect } from "@cqsjjb/jjb-dva-runtime";
+import { Spin } from "antd";
+import { useContext, useEffect, useState } from "react";
+import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
+import { NS_BI_STATISTICS } from "~/enumerate/namespace";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import { Context } from "~/pages/Container/Map/js/context";
+import "./index.less";
+
+const disposalStatus = { 10: "报警中", 20: "未处置", 30: "已消警" };
+
+/** 负责查询并滚动展示封闭区域告警。 */
+function AreaAlarmPanel(props) {
+ const { portArea, currentBranchOffice } = useContext(Context);
+ const [records, setRecords] = useState([]);
+
+ useEffect(() => {
+ const loadRecords = async () => {
+ const { data = [] } = await props.getAlarmRecordScreenIotDeviceAlarmPage({
+ portArea,
+ corpinfoId: currentBranchOffice,
+ pageIndex: 1,
+ pageSize: 9999,
+ });
+ setRecords(data);
+ };
+ loadRecords();
+ }, []);
+
+ return (
+
+
+
+
+
区域名称
+
告警类型
+
告警时间
+
处置状态
+
+
+
+
+ {records.map((item, index) => (
+
+
{item.fireRegionName}
+
{item.alarmTypeName}
+
{item.alarmTime}
+
{disposalStatus[item.status]}
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+export default Connect([NS_BI_STATISTICS], true)(AreaAlarmPanel);
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.less
new file mode 100644
index 0000000..2105d6b
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/AreaAlarmPanel/index.less
@@ -0,0 +1,30 @@
+.branch-office-index-right__area-alarm {
+ margin-top: 10px;
+}
+
+.branch-office-area-alarm__content {
+ padding: 10px 15px;
+}
+
+.branch-office-area-alarm__table {
+ margin-top: 5px;
+}
+
+.branch-office-area-alarm__body {
+ height: 165px;
+ overflow-y: hidden;
+}
+
+.branch-office-area-alarm__row {
+ display: grid;
+ grid-template-columns: 1.5fr 1fr 2fr 1fr;
+ margin-top: 5px;
+ background-color: rgba(17, 51, 112, 0.8);
+}
+
+.branch-office-area-alarm__row div {
+ padding: 5px;
+ color: #fff;
+ font-size: 12px;
+ text-align: center;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.js
new file mode 100644
index 0000000..3ed3ec1
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.js
@@ -0,0 +1,245 @@
+import { useMount } from "ahooks";
+import * as echarts from "echarts";
+import { useRef } from "react";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { name: "技术部1", unitCount: 95, personnelCount: 92 },
+ { name: "技术部2", unitCount: 95, personnelCount: 92 },
+ { name: "技术部3", unitCount: 95, personnelCount: 92 },
+ { name: "技术部4", unitCount: 95, personnelCount: 92 },
+ { name: "技术部5", unitCount: 95, personnelCount: 92 },
+ { name: "技术部6", unitCount: 95, personnelCount: 92 },
+ { name: "技术部7", unitCount: 95, personnelCount: 92 },
+ { name: "技术部8", unitCount: 95, personnelCount: 92 },
+ { name: "技术部9", unitCount: 95, personnelCount: 92 },
+ { name: "技术部0", unitCount: 95, personnelCount: 92 },
+];
+
+/** 负责展示封闭区域人员状态图表,并管理图表实例生命周期。 */
+function ClosedAreaPersonnelPanel() {
+ const chartInstance = useRef(null);
+ const chartRef = useRef(null);
+
+ const initEcharts = (mainRef, chartInstance, data) => {
+ chartInstance.current = echarts.init(mainRef.current);
+
+ const option = {
+ color: ["#F1C416", "#0AFCFF"],
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ type: "shadow",
+ label: {
+ backgroundColor: "#6a7985",
+ },
+ },
+ },
+ grid: {
+ left: "1%",
+ right: "4%",
+ bottom: "6%",
+ top: 30,
+ padding: "0 0 10 0",
+ containLabel: true,
+ },
+ legend: {
+ right: 10,
+ top: 0,
+ itemGap: 16,
+ itemWidth: 18,
+ itemHeight: 10,
+ textStyle: {
+ color: "#fff",
+ fontStyle: "normal",
+ fontFamily: "微软雅黑",
+ fontSize: 12,
+ },
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ xAxisIndex: 0,
+ start: 0,
+ end: 50,
+ zoomOnMouseWheel: "shift",
+ moveOnMouseWheel: true,
+ moveOnMouseMove: true,
+ },
+ {
+ type: "slider",
+ height: 6,
+ bottom: 0,
+ show: true,
+ start: 0,
+ end: 50,
+ handleSize: 3,
+ handleStyle: {
+ color: "#DCE2E8",
+ },
+ xAxisIndex: [0],
+ filterMode: "filter",
+ showDetail: false,
+ },
+ ],
+ xAxis: [
+ {
+ type: "category",
+ boundaryGap: true,
+ data: data.map(item => item.name),
+ axisLabel: {
+ interval: 0,
+ margin: 15,
+ textStyle: {
+ color: "#fff",
+ fontStyle: "normal",
+ fontFamily: "微软雅黑",
+ fontSize: 12,
+ },
+ },
+ axisTick: {
+ show: false,
+ },
+ axisLine: {
+ lineStyle: {
+ color: "#fff",
+ opacity: 0.2,
+ },
+ },
+ splitLine: {
+ show: false,
+ },
+ },
+ ],
+ yAxis: [
+ {
+ type: "value",
+ splitNumber: 5,
+ axisLabel: {
+ textStyle: {
+ color: "#fff",
+ fontStyle: "normal",
+ fontFamily: "微软雅黑",
+ fontSize: 12,
+ },
+ },
+ axisLine: {
+ show: false,
+ },
+ axisTick: {
+ show: false,
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: ["#fff"],
+ opacity: 0.06,
+ },
+ },
+ },
+ ],
+ series: [
+ {
+ name: "单位人员数",
+ type: "pictorialBar",
+ symbol: "roundRect",
+ symbolOffset: [-5, 0],
+ symbolMargin: "1",
+ barWidth: "10%",
+ barMaxWidth: "20%",
+ animationDelay: (dataIndex, params) => {
+ return params.index * 50;
+ },
+ itemStyle: {
+ normal: {
+ color: () => {
+ return new echarts.graphic.LinearGradient(0, 0, 1, 1, [
+ {
+ offset: 0,
+ color: "#F1C416",
+ },
+ {
+ offset: 1,
+ color: "#FF2F01",
+ },
+ ]);
+ },
+ },
+ },
+ z: 1,
+ barGap: 0,
+ symbolRepeat: true,
+ symbolSize: [14, 5],
+ data: data.map(item => item.unitCount),
+ animationEasing: "elasticOut",
+ stack: "2",
+ },
+ {
+ name: "相关方人员数",
+ type: "pictorialBar",
+ symbol: "roundRect",
+ barWidth: "10%",
+ symbolOffset: [5, 0],
+ barMaxWidth: "20%",
+ symbolMargin: "1",
+ animationDelay: (dataIndex, params) => {
+ return params.index * 50;
+ },
+ itemStyle: {
+ normal: {
+ color: () => {
+ return new echarts.graphic.LinearGradient(0, 0, 1, 1, [
+ {
+ offset: 0,
+ color: "#0AFCFF",
+ },
+ {
+ offset: 1,
+ color: "#0CA1FE",
+ },
+ ]);
+ },
+ },
+ },
+ z: 1,
+ barGap: 0,
+ symbolRepeat: true,
+ symbolSize: [14, 5],
+ data: data.map(item => item.personnelCount),
+ animationEasing: "elasticOut",
+ stack: "1",
+ },
+ ],
+ };
+
+ chartInstance.current.setOption(option);
+ };
+
+ useMount(() => {
+ initEcharts(chartRef, chartInstance, records);
+
+ return () => {
+ if (chartInstance.current) {
+ chartInstance.current.dispose();
+ chartInstance.current = null;
+ }
+ };
+ });
+
+ return (
+
+
+
+ );
+}
+
+export default ClosedAreaPersonnelPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.less
new file mode 100644
index 0000000..49dc520
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/ClosedAreaPersonnelPanel/index.less
@@ -0,0 +1,12 @@
+.branch-office-index-right__personnel {
+ margin-top: 10px;
+}
+
+.branch-office-closed-area-personnel__content {
+ padding: 10px 15px;
+}
+
+.branch-office-closed-area-personnel__chart {
+ width: 100%;
+ height: 200px;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.js
new file mode 100644
index 0000000..12256f6
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.js
@@ -0,0 +1,74 @@
+import gateBackground from "~/assets/images/map_bi/content/bg4.png";
+import areaBackground from "~/assets/images/map_bi/content/bg5.png";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ {
+ title: "口门进出统计",
+ label1: "人数",
+ label2: "车数",
+ count1: 123,
+ count2: 123,
+ background: gateBackground,
+ },
+ {
+ title: "进入申请待审批",
+ label1: "人数",
+ label2: "车数",
+ count1: 123,
+ count2: 123,
+ background: gateBackground,
+ },
+ {
+ title: "封闭区域人员情况",
+ label1: "区域数",
+ label2: "人数",
+ count1: 123,
+ count2: 123,
+ background: areaBackground,
+ },
+ {
+ title: "封闭区域作业情况",
+ label1: "区域数",
+ label2: "作业数",
+ count1: 123,
+ count2: 123,
+ background: areaBackground,
+ },
+];
+
+/** 负责展示口门和封闭区域的基础统计。 */
+function GateAndClosedAreaPanel() {
+ return (
+
+
+ {records.map(item => (
+
+
+ {item.title}
+
+
+
+ {item.label1}
+ :
+ {item.count1}
+
+
+ {item.label2}
+ :
+ {item.count2}
+
+
+
+ ))}
+
+
+ );
+}
+
+export default GateAndClosedAreaPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.less
new file mode 100644
index 0000000..1cc1923
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/GateAndClosedAreaPanel/index.less
@@ -0,0 +1,27 @@
+.branch-office-gate-closed-area__content {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px 20px;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 15px;
+ color: #fff;
+ font-size: 12px;
+}
+
+.branch-office-gate-closed-area__item {
+ width: calc(50% - 10px);
+ padding: 5px 20px;
+}
+
+.branch-office-gate-closed-area__title {
+ font-weight: bold;
+ text-align: center;
+}
+
+.branch-office-gate-closed-area__values {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-top: 10px;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.js
new file mode 100644
index 0000000..a071142
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.js
@@ -0,0 +1,97 @@
+import { Connect } from "@cqsjjb/jjb-dva-runtime";
+import { Spin } from "antd";
+import { useContext, useEffect, useState } from "react";
+import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
+import { NS_BI_STATISTICS } from "~/enumerate/namespace";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import { Context } from "~/pages/Container/Map/js/context";
+import "./index.less";
+
+/** 负责合并两类作业统计并展示部门维度数据。 */
+function KeyWorkStatsPanel(props) {
+ const { portArea, currentBranchOffice } = useContext(Context);
+ const [records, setRecords] = useState([]);
+
+ useEffect(() => {
+ const loadRecords = async () => {
+ const [{ data: eightWorkData = [] }, { data: keyProjectData = [] }]
+ = await Promise.all([
+ props.getEightWorkInfoScreenDepartmentStatistics({
+ portArea,
+ corpinfoId: currentBranchOffice,
+ }),
+ props.getKeyProjectLargeScreenDepartmentStatistics({
+ portArea,
+ corpinfoId: currentBranchOffice,
+ }),
+ ]);
+ const departmentMap = new Map(
+ keyProjectData.map(item => [
+ item.departmentId,
+ {
+ departmentName: item.departmentName,
+ fourNewHomeworkCount: item.fourNewHomeworkCount,
+ eightWorkCount: 0,
+ morePeopleCount: item.morePeopleCount,
+ },
+ ]),
+ );
+ eightWorkData.forEach((item) => {
+ const department = departmentMap.get(item.departmentId) || {
+ departmentName: item.departmentName,
+ fourNewHomeworkCount: 0,
+ eightWorkCount: 0,
+ morePeopleCount: 0,
+ };
+ department.eightWorkCount = item.workCount || 0;
+ departmentMap.set(item.departmentId, department);
+ });
+ setRecords([...departmentMap.values()]);
+ };
+ loadRecords();
+ }, []);
+
+ return (
+
+
+
+
+
部门名称
+
三人以上作业数
+
危险作业数
+
四新作业数
+
+
+
+
+ {records.map((item, index) => (
+
+
{item.departmentName}
+
{item.morePeopleCount}
+
{item.eightWorkCount}
+
{item.fourNewHomeworkCount}
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+export default Connect([NS_BI_STATISTICS], true)(KeyWorkStatsPanel);
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.less
new file mode 100644
index 0000000..0d2c255
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/KeyWorkStatsPanel/index.less
@@ -0,0 +1,30 @@
+.branch-office-index-right__key-work {
+ margin-top: 10px;
+}
+
+.branch-office-key-work-stats__content {
+ padding: 10px 15px;
+}
+
+.branch-office-key-work-stats__table {
+ margin-top: 5px;
+}
+
+.branch-office-key-work-stats__body {
+ height: 165px;
+ overflow-y: hidden;
+}
+
+.branch-office-key-work-stats__row {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ margin-top: 5px;
+ background-color: rgba(17, 51, 112, 0.8);
+}
+
+.branch-office-key-work-stats__row div {
+ padding: 5px;
+ color: #fff;
+ font-size: 12px;
+ text-align: center;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/echarts.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/echarts.js
deleted file mode 100644
index 7590c50..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/echarts.js
+++ /dev/null
@@ -1,195 +0,0 @@
-import * as echarts from "echarts";
-
-export const initEcharts1 = (mainRef, chartInstance, data) => {
- chartInstance.current = echarts.init(mainRef.current);
-
- const option = {
- color: ["#F1C416", "#0AFCFF"],
- tooltip: {
- trigger: "axis",
- axisPointer: {
- type: "shadow",
- label: {
- backgroundColor: "#6a7985",
- },
- },
- },
- grid: {
- left: "1%",
- right: "4%",
- bottom: "6%",
- top: 30,
- padding: "0 0 10 0",
- containLabel: true,
- },
- legend: {
- right: 10,
- top: 0,
- itemGap: 16,
- itemWidth: 18,
- itemHeight: 10,
- textStyle: {
- color: "#fff",
- fontStyle: "normal",
- fontFamily: "微软雅黑",
- fontSize: 12,
- },
- },
- dataZoom: [
- {
- type: "inside",
- xAxisIndex: 0,
- start: 0,
- end: 50,
- zoomOnMouseWheel: "shift",
- moveOnMouseWheel: true,
- moveOnMouseMove: true,
- },
- {
- type: "slider",
- height: 6,
- bottom: 0,
- show: true,
- start: 0,
- end: 50,
- handleSize: 3,
- handleStyle: {
- color: "#DCE2E8",
- },
- xAxisIndex: [0],
- filterMode: "filter",
- showDetail: false,
- },
- ],
- xAxis: [
- {
- type: "category",
- boundaryGap: true,
- data: data.map(item => item.name),
- axisLabel: {
- interval: 0,
- margin: 15,
- textStyle: {
- color: "#fff",
- fontStyle: "normal",
- fontFamily: "微软雅黑",
- fontSize: 12,
- },
- },
- axisTick: {
- show: false,
- },
- axisLine: {
- lineStyle: {
- color: "#fff",
- opacity: 0.2,
- },
- },
- splitLine: {
- show: false,
- },
- },
- ],
- yAxis: [
- {
- type: "value",
- splitNumber: 5,
- axisLabel: {
- textStyle: {
- color: "#fff",
- fontStyle: "normal",
- fontFamily: "微软雅黑",
- fontSize: 12,
- },
- },
- axisLine: {
- show: false,
- },
- axisTick: {
- show: false,
- },
- splitLine: {
- show: true,
- lineStyle: {
- color: ["#fff"],
- opacity: 0.06,
- },
- },
- },
- ],
- series: [
- {
- name: "单位人员数",
- type: "pictorialBar",
- symbol: "roundRect",
- symbolOffset: [-5, 0],
- symbolMargin: "1",
- barWidth: "10%",
- barMaxWidth: "20%",
- animationDelay: (dataIndex, params) => {
- return params.index * 50;
- },
- itemStyle: {
- normal: {
- color: () => {
- return new echarts.graphic.LinearGradient(0, 0, 1, 1, [
- {
- offset: 0,
- color: "#F1C416",
- },
- {
- offset: 1,
- color: "#FF2F01",
- },
- ]);
- },
- },
- },
- z: 1,
- barGap: 0,
- symbolRepeat: true,
- symbolSize: [14, 5],
- data: data.map(item => item.unitCount),
- animationEasing: "elasticOut",
- stack: "2",
- },
- {
- name: "相关方人员数",
- type: "pictorialBar",
- symbol: "roundRect",
- barWidth: "10%",
- symbolOffset: [5, 0],
- barMaxWidth: "20%",
- symbolMargin: "1",
- animationDelay: (dataIndex, params) => {
- return params.index * 50;
- },
- itemStyle: {
- normal: {
- color: (params) => {
- return new echarts.graphic.LinearGradient(0, 0, 1, 1, [
- {
- offset: 0,
- color: "#0AFCFF",
- },
- {
- offset: 1,
- color: "#0CA1FE",
- },
- ]);
- },
- },
- },
- z: 1,
- barGap: 0,
- symbolRepeat: true,
- symbolSize: [14, 5],
- data: data.map(item => item.personnelCount),
- animationEasing: "elasticOut",
- stack: "1",
- },
- ],
- };
-
- chartInstance.current.setOption(option);
-};
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.js b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.js
index 6447a22..d53d2d6 100644
--- a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.js
+++ b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.js
@@ -1,194 +1,18 @@
-import { Connect } from "@cqsjjb/jjb-dva-runtime";
-import { useMount } from "ahooks";
-import { Spin } from "antd";
-import { useContext, useEffect, useRef, useState } from "react";
-import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
-import bg4 from "~/assets/images/map_bi/content/bg4.png";
-import bg5 from "~/assets/images/map_bi/content/bg5.png";
-import { NS_BI_STATISTICS } from "~/enumerate/namespace";
-import Title from "~/pages/Container/Map/components/Content/branchOffice/Title";
-import { Context } from "~/pages/Container/Map/js/context";
-import { initEcharts1 } from "./echarts";
-import "./index.less";
-
-function IndexRight(props) {
- const { portArea, currentBranchOffice } = useContext(Context);
-
- const [block1List, setBlock1List] = useState([
- { title: "口门进出统计", label1: "人数", label2: "车数", count1: 123, count2: 123, bgImg: bg4 },
- { title: "进入申请待审批", label1: "人数", label2: "车数", count1: 123, count2: 123, bgImg: bg4 },
- { title: "封闭区域人员情况", label1: "区域数", label2: "人数", count1: 123, count2: 123, bgImg: bg5 },
- { title: "封闭区域作业情况", label1: "区域数", label2: "作业数", count1: 123, count2: 123, bgImg: bg5 },
- ]);
- const [block3List, setBlock3List] = useState([]);
- const [block4List, setBlock4List] = useState([]);
-
- const chartInstance = useRef(null);
- const main1Ref = useRef(null);
-
- useMount(() => {
- initEcharts1(main1Ref, chartInstance, [
- { name: "技术部1", unitCount: 95, personnelCount: 92 },
- { name: "技术部2", unitCount: 95, personnelCount: 92 },
- { name: "技术部3", unitCount: 95, personnelCount: 92 },
- { name: "技术部4", unitCount: 95, personnelCount: 92 },
- { name: "技术部5", unitCount: 95, personnelCount: 92 },
- { name: "技术部6", unitCount: 95, personnelCount: 92 },
- { name: "技术部7", unitCount: 95, personnelCount: 92 },
- { name: "技术部8", unitCount: 95, personnelCount: 92 },
- { name: "技术部9", unitCount: 95, personnelCount: 92 },
- { name: "技术部0", unitCount: 95, personnelCount: 92 },
- ]);
-
- return () => {
- if (chartInstance.current) {
- chartInstance.current.dispose();
- chartInstance.current = null;
- }
- };
- });
-
- const getAlarmRecordScreenIotDeviceAlarmPage = async () => {
- const { data } = await props.getAlarmRecordScreenIotDeviceAlarmPage({
- portArea,
- corpinfoId: currentBranchOffice,
- pageIndex: 1,
- pageSize: 9999,
- });
- setBlock3List(data);
- };
-
- const getBlock4List = async () => {
- const [{ data: eightWorkData = [] }, { data: keyProjectData = [] }]
- = await Promise.all([
- props.getEightWorkInfoScreenDepartmentStatistics({
- portArea,
- corpinfoId: currentBranchOffice,
- }),
- props.getKeyProjectLargeScreenDepartmentStatistics({
- portArea,
- corpinfoId: currentBranchOffice,
- }),
- ]);
- const departmentMap = new Map(
- keyProjectData.map(item => [
- item.departmentId,
- {
- departmentName: item.departmentName,
- fourNewHomeworkCount: item.fourNewHomeworkCount,
- eightWorkCount: 0,
- morePeopleCount: item.morePeopleCount,
- },
- ]),
- );
- eightWorkData.forEach((item) => {
- const department = departmentMap.get(item.departmentId) || {
- departmentName: item.departmentName,
- fourNewHomeworkCount: 0,
- eightWorkCount: 0,
- morePeopleCount: 0,
- };
- department.eightWorkCount = item.workCount || 0;
- departmentMap.set(item.departmentId, department);
- });
- setBlock4List([...departmentMap.values()]);
- };
-
- useEffect(() => {
- getAlarmRecordScreenIotDeviceAlarmPage();
- getBlock4List();
- }, []);
+import AreaAlarmPanel from "./AreaAlarmPanel";
+import ClosedAreaPersonnelPanel from "./ClosedAreaPersonnelPanel";
+import GateAndClosedAreaPanel from "./GateAndClosedAreaPanel";
+import KeyWorkStatsPanel from "./KeyWorkStatsPanel";
+/** 分公司首页右侧区域仅负责按展示顺序组合业务区块。 */
+function IndexRight() {
return (
-
-
-
-
-
- {
- block1List.map((item, index) => (
-
-
{item.title}
-
-
- {item.label1}
- :
- {item.count1}
-
-
- {item.label2}
- :
- {item.count2}
-
-
-
- ))
- }
-
-
-
-
-
-
-
-
-
-
区域名称
-
告警类型
-
告警时间
-
处置状态
-
-
-
-
- {block3List.map((item, index) => (
-
-
{item.fireRegionName}
-
{item.alarmTypeName}
-
{item.alarmTime}
-
{{ 10: "报警中", 20: "未处置", 30: "已消警" }[item.status]}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
部门名称
-
三人以上作业数
-
危险作业数
-
四新作业数
-
-
-
-
- {block4List.map((item, index) => (
-
-
{item.departmentName}
-
{item.morePeopleCount}
-
{item.eightWorkCount}
-
{item.fourNewHomeworkCount}
-
- ))}
-
-
-
-
-
-
+
);
}
-export default Connect([NS_BI_STATISTICS], true)(IndexRight);
+export default IndexRight;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.less b/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.less
deleted file mode 100644
index b7f939a..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/IndexRight/index.less
+++ /dev/null
@@ -1,129 +0,0 @@
-.branch_office_index_right {
- .block1 {
- background-color: rgba(12, 28, 88, 0.4);
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .items {
- color: #fff;
- font-size: 12px;
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- justify-content: space-between;
- gap: 10px 20px;
-
- .item {
- width: calc(50% - 10px);
- padding: 5px 20px;
-
- .title {
- font-weight: bold;
- text-align: center;
- }
-
- .info {
- margin-top: 10px;
- display: flex;
- align-items: center;
- justify-content: space-between;
- }
- }
- }
- }
- }
-
- .block2 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
- }
- }
-
- .block3 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 165px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: 1.5fr 1fr 2fr 1fr;
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-
- .block4 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 165px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: 1fr 1fr 1fr 1fr;
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.js
new file mode 100644
index 0000000..c80f982
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.js
@@ -0,0 +1,55 @@
+import CountUp from "react-countup";
+import closedAreaIcon from "~/assets/images/map_bi/content/ico15.png";
+import vehiclePassageIcon from "~/assets/images/map_bi/content/ico16.png";
+import pedestrianPassageIcon from "~/assets/images/map_bi/content/ico17.png";
+import peopleIcon from "~/assets/images/map_bi/content/ico18.png";
+import cornerIcon from "~/assets/images/map_bi/content/icon32.png";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { label: "封闭区域数", count: 123, icon: closedAreaIcon },
+ { label: "车行通道数", count: 123, icon: vehiclePassageIcon },
+ { label: "人行通道数", count: 123, icon: pedestrianPassageIcon },
+ { label: "封闭区域当前人数", count: 123, icon: peopleIcon },
+];
+
+/** 负责展示封闭区域及通道基础统计。 */
+function ClosedAreaStatsPanel() {
+ return (
+
+
+ {records.map(item => (
+
+
+

+
+
+
+ {item.label}
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
+
+/** 封闭区域统计卡片的四角装饰图标。 */
+function Corner({ className }) {
+ return (
+
+

+
+ );
+}
+
+export default ClosedAreaStatsPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.less
new file mode 100644
index 0000000..f2ae9b4
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/MenJin/ClosedAreaStatsPanel/index.less
@@ -0,0 +1,65 @@
+.branch-office-gate-stats__content {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px 20px;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 15px;
+}
+
+.branch-office-gate-stats__item {
+ position: relative;
+ display: flex;
+ width: calc(50% - 10px);
+ align-items: center;
+ padding: 9px 0 9px 9px;
+ color: #fff;
+ background-color: rgba(1, 56, 154, 0.26);
+ border: 1px solid #2091f3;
+}
+
+.branch-office-gate-stats__image {
+ padding: 8px;
+ margin-right: 10px;
+ background-color: #102561;
+ border: 1px solid #19455b;
+ border-radius: 4px;
+}
+
+.branch-office-gate-stats__image img {
+ width: 35px;
+ height: 30px;
+}
+
+.branch-office-gate-stats__label {
+ font-weight: bold;
+}
+
+.branch-office-gate-stats__corner {
+ position: absolute;
+ width: 12px;
+ height: 12px;
+}
+
+.branch-office-gate-stats__corner--top-left {
+ top: -10px;
+ left: -3px;
+}
+
+.branch-office-gate-stats__corner--top-right {
+ top: -3px;
+ right: -10px;
+ transform: rotate(90deg);
+}
+
+.branch-office-gate-stats__corner--bottom-left {
+ bottom: -3px;
+ left: -10px;
+ transform: rotate(270deg);
+}
+
+.branch-office-gate-stats__corner--bottom-right {
+ right: -3px;
+ bottom: -10px;
+ transform: rotate(180deg);
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.js
new file mode 100644
index 0000000..98cfc93
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.js
@@ -0,0 +1,202 @@
+import { useMount } from "ahooks";
+import * as echarts from "echarts";
+import { useRef, useState } from "react";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const tabs = ["人员", "车辆"];
+const records = [
+ { NAME: "零号门", IN: "0", OUT: "0" },
+ { NAME: "一号门", IN: "15", OUT: "12" },
+ { NAME: "二号门", IN: "8", OUT: "10" },
+ { NAME: "三号门", IN: "22", OUT: "18" },
+ { NAME: "四号门", IN: "5", OUT: "7" },
+ { NAME: "五号门", IN: "30", OUT: "25" },
+ { NAME: "六号门", IN: "12", OUT: "14" },
+ { NAME: "七号门", IN: "18", OUT: "16" },
+ { NAME: "八号门", IN: "9", OUT: "11" },
+ { NAME: "九号门", IN: "25", OUT: "20" },
+];
+
+/** 负责展示封闭区域进出趋势并管理图表实例生命周期。 */
+function EntryExitTrendPanel() {
+ const [activeIndex, setActiveIndex] = useState(0);
+ const chartInstance = useRef(null);
+ const chartRef = useRef(null);
+
+ const initEcharts = (mainRef, chartInstance, data) => {
+ chartInstance.current = echarts.init(mainRef.current);
+
+ const inData = data.map(item => Number.parseInt(item.IN));
+ const outData = data.map(item => Number.parseInt(item.OUT));
+ const names = data.map(item => item.NAME);
+
+ const option = {
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ type: "none",
+ },
+ },
+ legend: {
+ data: ["进", "出"],
+ top: "0%",
+ right: "0%",
+ textStyle: {
+ color: "#fff",
+ fontSize: 14,
+ },
+ itemWidth: 12,
+ itemHeight: 10,
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ xAxisIndex: 0,
+ start: 0,
+ end: 50,
+ zoomOnMouseWheel: "shift",
+ moveOnMouseWheel: true,
+ moveOnMouseMove: true,
+ },
+ {
+ type: "slider",
+ height: 6,
+ bottom: "7%",
+ show: true,
+ start: 0,
+ end: 50,
+ handleSize: 5,
+ handleStyle: {
+ color: "#DCE2E8",
+ },
+ xAxisIndex: [0],
+ filterMode: "filter",
+ showDetail: false,
+ },
+ ],
+ grid: {
+ left: "10%",
+ right: "5%",
+ top: "10%",
+ bottom: "20%",
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: names,
+ axisTick: {
+ alignWithLabel: true,
+ },
+ axisLabel: {
+ color: "#fff",
+ },
+ },
+ ],
+ yAxis: {
+ axisLine: {
+ show: false,
+ },
+ axisTick: {
+ show: false,
+ },
+ axisLabel: {
+ color: "#fff",
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ type: "dashed",
+ },
+ },
+ },
+ series: [
+ {
+ name: "进",
+ type: "bar",
+ backgroundStyle: {
+ color: "rgba(216, 229, 247, 0.55)",
+ borderRadius: [8, 8, 0, 0],
+ },
+ itemStyle: {
+ borderRadius: [12, 12, 0, 0],
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 1,
+ color: "rgba(121,103,255,0.7)",
+ },
+ {
+ offset: 0,
+ color: "#7967FF",
+ },
+ ]),
+ },
+ barWidth: "10",
+ data: inData,
+ },
+ {
+ name: "出",
+ type: "bar",
+ backgroundStyle: {
+ color: "rgba(216, 229, 247, 0.55)",
+ borderRadius: [8, 8, 0, 0],
+ },
+ itemStyle: {
+ borderRadius: [12, 12, 0, 0],
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 1,
+ color: "rgba(255,198,124,0.7)",
+ },
+ {
+ offset: 0,
+ color: "#FFC67C",
+ },
+ ]),
+ },
+ barWidth: "10",
+ data: outData,
+ },
+ ],
+ };
+
+ chartInstance.current.setOption(option);
+ };
+
+ useMount(() => {
+ initEcharts(chartRef, chartInstance, records);
+
+ return () => {
+ if (chartInstance.current) {
+ chartInstance.current.dispose();
+ chartInstance.current = null;
+ }
+ };
+ });
+
+ return (
+
+ {tabs.map((item, index) => (
+ setActiveIndex(index)}
+ >
+ {item}
+
+ ))}
+
+ )}
+ >
+
+
+ );
+}
+
+export default EntryExitTrendPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.less
new file mode 100644
index 0000000..07c1d89
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/MenJin/EntryExitTrendPanel/index.less
@@ -0,0 +1,31 @@
+.branch-office-gate__trend {
+ margin-top: 10px;
+}
+
+.branch-office-gate-trend__tabs {
+ display: flex;
+}
+
+.branch-office-gate-trend__tab {
+ padding: 2px 12px;
+ color: #fff;
+ font-size: 12px;
+ cursor: pointer;
+ background-color: rgba(36, 115, 239, 0.27);
+ border: 1px solid #5d718c;
+ border-radius: 2px;
+}
+
+.branch-office-gate-trend__tab--active {
+ background-color: #2473ef;
+ border-color: #2473ef;
+}
+
+.branch-office-gate-trend__content {
+ padding: 10px 15px;
+}
+
+.branch-office-gate-trend__chart {
+ width: 100%;
+ height: 300px;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/MenJin/GateApplicationPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/MenJin/GateApplicationPanel/index.js
new file mode 100644
index 0000000..a8bcfc2
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/MenJin/GateApplicationPanel/index.js
@@ -0,0 +1,125 @@
+import { useState } from "react";
+import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const tabs = ["人员", "车辆"];
+const records = [
+ {
+ permissionRange: "A区",
+ status: "1",
+ applicant: "张三",
+ approver: "李主管",
+ },
+ {
+ permissionRange: "B区",
+ status: "1",
+ applicant: "李四",
+ approver: "王经理",
+ },
+ {
+ permissionRange: "C区",
+ status: "1",
+ applicant: "王五",
+ approver: "赵主任",
+ },
+ {
+ permissionRange: "D区",
+ status: "0",
+ applicant: "赵六",
+ approver: "钱总监",
+ },
+ {
+ permissionRange: "E区",
+ status: "0",
+ applicant: "钱七",
+ approver: "孙部长",
+ },
+ {
+ permissionRange: "F区",
+ status: "0",
+ applicant: "孙八",
+ approver: "周经理",
+ },
+ {
+ permissionRange: "G区",
+ status: "0",
+ applicant: "周九",
+ approver: "吴主任",
+ },
+ {
+ permissionRange: "H区",
+ status: "1",
+ applicant: "吴十",
+ approver: "郑主管",
+ },
+ {
+ permissionRange: "I区",
+ status: "0",
+ applicant: "郑一",
+ approver: "王总监",
+ },
+ {
+ permissionRange: "J区",
+ status: "1",
+ applicant: "王二",
+ approver: "张部长",
+ },
+];
+
+/** 负责展示口门申请记录及人员、车辆分类标签状态。 */
+function GateApplicationPanel() {
+ const [activeIndex, setActiveIndex] = useState(0);
+
+ return (
+
+ {tabs.map((item, index) => (
+ setActiveIndex(index)}
+ >
+ {item}
+
+ ))}
+
+ )}
+ >
+
-
-
-
-
-
-
-
})
-
-
{weatherData.text || "暂无"}
-
-
-
-
-

-
-
-
温度:
-
{weatherData.temp ? `${weatherData.temp}℃` : "--"}
-
-
-
-
-

-
-
-
风速:
-
{weatherData.wind_class || "--"}
-
-
-
-
-

-
-
-
降水量:
-
{weatherData.prec_1h ? `${weatherData.prec_1h}毫米` : "--"}
-
-
-
-
-
-
-
- {
- alert.map((item, index) => (
-
- ))
- }
-
-
-
-
-
-
部门名称
-
需锚定设备数
-
已锚定设备数
-
-
-
- {block1List.map((item, index) => (
-
-
{item.department}
-
{item.requiredDevices}
-
{item.anchoredDevices}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
- {block2List.map((item, index) => (
-
-
{item.source}
-
{item.level}
-
{item.area}
-
- ))}
-
-
-
-
-
+
+
+
);
}
-export default Connect([NS_BI_STATISTICS], true)(QiXiang);
+export default QiXiang;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/QiXiang/index.less b/src/pages/Container/Map/components/Content/branchOffice/QiXiang/index.less
deleted file mode 100644
index a7c0545..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/QiXiang/index.less
+++ /dev/null
@@ -1,153 +0,0 @@
-.branch_office_qixiang{
- .block1 {
- background-color: rgba(12, 28, 88, 0.4);
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .weather {
- display: flex;
- gap: 40px;
-
- .icon {
- padding: 10px;
- display: flex;
- gap: 5px;
-
- .img {
- img {
- width: 40px;
- height: 40px;
- }
- }
-
- .text {
- color: #fff;
- writing-mode: vertical-lr;
- letter-spacing: 5px;
- }
- }
-
- .items {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- flex-wrap: wrap;
- gap: 20px 10px;
-
- .item {
- width: calc((100% / 2) - 10px);
- display: flex;
- align-items: center;
- gap: 10px;
-
- .img {
- img {
- width: 42px;
- height: 42px;
- }
- }
-
- .info {
- .label {
- font-size: 12px;
- color: #fff;
- }
-
- .value {
- font-size: 18px;
- color: #00e7ff;
- font-weight: bold;
- }
- }
- }
- }
- }
-
- .alert {
- margin-top: 10px;
-
- .scroll {
- height: 20px;
- overflow-y: hidden;
-
- .item {
- .title {
- font-weight: bold;
- font-size: 14px;
- }
- }
- }
- }
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 200px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- background-image: linear-gradient(to bottom, rgba(0, 42, 85, 0.38), rgba(1, 37, 74, 0.47), rgba(4, 38, 87, 0));
- border: 1px solid;
- border-image: linear-gradient(to top, rgba(8, 41, 87, 0.5), rgba(64, 152, 255, 0.5)) 1;
- border-bottom: none;
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-
- .block2 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 300px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.js
new file mode 100644
index 0000000..d28044d
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.js
@@ -0,0 +1,52 @@
+import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { alarmContent: "SOS紧急告警", personnelInvolved: "张三", dispositionStatus: 1 },
+ { alarmContent: "静止/滞留告警", personnelInvolved: "李四", dispositionStatus: 2 },
+ { alarmContent: "电子围栏越界", personnelInvolved: "王五", dispositionStatus: 1 },
+ { alarmContent: "非授权区域停留", personnelInvolved: "赵六", dispositionStatus: 3 },
+ { alarmContent: "设备及信号类告警", personnelInvolved: "钱七", dispositionStatus: 1 },
+ { alarmContent: "聚集告警", personnelInvolved: "孙八", dispositionStatus: 2 },
+ { alarmContent: "单独作业告警", personnelInvolved: "周九", dispositionStatus: 1 },
+ { alarmContent: "超员/缺员告警", personnelInvolved: "吴十", dispositionStatus: 3 },
+ { alarmContent: "SOS紧急告警", personnelInvolved: "郑一", dispositionStatus: 1 },
+ { alarmContent: "静止/滞留告警", personnelInvolved: "王二", dispositionStatus: 2 },
+];
+
+const dispositionText = { 1: "已处置", 2: "未处置", 3: "处置中" };
+
+/** 负责展示人员告警处置状态列表。 */
+function AlarmHandlingPanel() {
+ return (
+
+
+
+
+
+
+ {records.map((item, index) => (
+
+
{item.alarmContent}
+
{item.personnelInvolved}
+
+ {dispositionText[item.dispositionStatus]}
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+export default AlarmHandlingPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.less
new file mode 100644
index 0000000..82832b8
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmHandlingPanel/index.less
@@ -0,0 +1,42 @@
+.branch-office-personnel__alarm-handling {
+ margin-top: 10px;
+}
+
+.branch-office-alarm-handling__content {
+ padding: 10px 15px;
+}
+
+.branch-office-alarm-handling__table {
+ margin-top: 5px;
+}
+
+.branch-office-alarm-handling__body {
+ height: 100px;
+ overflow-y: hidden;
+}
+
+.branch-office-alarm-handling__row {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ margin-top: 5px;
+ background-color: rgba(17, 51, 112, 0.8);
+}
+
+.branch-office-alarm-handling__row div {
+ padding: 5px;
+ color: #fff;
+ font-size: 12px;
+ text-align: center;
+}
+
+.branch-office-alarm-handling__row .branch-office-alarm-handling__status--1 {
+ color: #1db924;
+}
+
+.branch-office-alarm-handling__row .branch-office-alarm-handling__status--2 {
+ color: #ff611c;
+}
+
+.branch-office-alarm-handling__row .branch-office-alarm-handling__status--3 {
+ color: #258ff1;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.js
new file mode 100644
index 0000000..6f59420
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.js
@@ -0,0 +1,75 @@
+import { useMount } from "ahooks";
+import * as echarts from "echarts";
+import { useRef } from "react";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { name: "SOS紧急告警", value: "120" },
+ { name: "静止/滞留告警", value: "10" },
+ { name: "电子围栏越界", value: "10" },
+ { name: "非授权区域停留", value: "20" },
+ { name: "设备及信号类告警", value: "30" },
+ { name: "聚集告警", value: "40" },
+ { name: "单独作业告警", value: "50" },
+ { name: "超员/缺员告警", value: "60" },
+ { name: "已处置报警数/报警数", value: "10" },
+];
+
+/** 负责展示报警类型占比图,并管理图表实例生命周期。 */
+function AlarmTypeChartPanel() {
+ const chartInstance = useRef(null);
+ const chartRef = useRef(null);
+
+ const initEcharts = (mainRef, chartInstance, data) => {
+ chartInstance.current = echarts.init(mainRef.current);
+
+ const option = {
+ tooltip: {
+ trigger: "item",
+ },
+ legend: {
+ left: "center",
+ top: "0",
+ textStyle: {
+ color: "#fff",
+ },
+ },
+ series: [{
+ color: ["#4198AF", "#285DF0", "#EA439D", "#F59FBC", "#FCA158", "#03D4B9", "#9FD224", "#13C871", "#FF611C"],
+ type: "pie",
+ radius: [0, "50%"],
+ center: ["50%", "60%"],
+ label: {
+ textStyle: {
+ color: "#fff",
+ },
+ },
+ data,
+ }],
+ };
+
+ chartInstance.current.setOption(option);
+ };
+
+ useMount(() => {
+ initEcharts(chartRef, chartInstance, records);
+
+ return () => {
+ if (chartInstance.current) {
+ chartInstance.current.dispose();
+ chartInstance.current = null;
+ }
+ };
+ });
+
+ return (
+
+
+
+ );
+}
+
+export default AlarmTypeChartPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.less
new file mode 100644
index 0000000..b7f9b07
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/AlarmTypeChartPanel/index.less
@@ -0,0 +1,8 @@
+.branch-office-alarm-type-chart__content {
+ padding: 10px 15px;
+}
+
+.branch-office-alarm-type-chart__chart {
+ width: 100%;
+ height: 250px;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.js
new file mode 100644
index 0000000..553b297
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.js
@@ -0,0 +1,187 @@
+import { useMount } from "ahooks";
+import * as echarts from "echarts";
+import { useRef } from "react";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { name: "A区", unitPersonnelCount: 120, relatedPartyPersonnelCount: 85 },
+ { name: "B区", unitPersonnelCount: 95, relatedPartyPersonnelCount: 70 },
+ { name: "C区", unitPersonnelCount: 80, relatedPartyPersonnelCount: 60 },
+ { name: "D区", unitPersonnelCount: 150, relatedPartyPersonnelCount: 110 },
+ { name: "E区", unitPersonnelCount: 75, relatedPartyPersonnelCount: 55 },
+ { name: "F区", unitPersonnelCount: 110, relatedPartyPersonnelCount: 80 },
+ { name: "G区", unitPersonnelCount: 65, relatedPartyPersonnelCount: 45 },
+ { name: "H区", unitPersonnelCount: 140, relatedPartyPersonnelCount: 100 },
+ { name: "I区", unitPersonnelCount: 90, relatedPartyPersonnelCount: 65 },
+ { name: "J区", unitPersonnelCount: 125, relatedPartyPersonnelCount: 90 },
+];
+
+/** 负责展示封闭区域人员统计图,并管理图表实例生命周期。 */
+function ClosedAreaPersonnelPanel() {
+ const chartInstance = useRef(null);
+ const chartRef = useRef(null);
+
+ const initEcharts = (mainRef, chartInstance, data) => {
+ chartInstance.current = echarts.init(mainRef.current);
+
+ const unitPersonnelData = data.map(item => Number.parseInt(item.unitPersonnelCount));
+ const relatedPartyPersonnelData = data.map(item => Number.parseInt(item.relatedPartyPersonnelCount));
+ const names = data.map(item => item.name);
+
+ const option = {
+ tooltip: {
+ trigger: "axis",
+ axisPointer: {
+ type: "none",
+ },
+ },
+ legend: {
+ data: ["单位人员数", "相关方人员数"],
+ top: "0%",
+ right: "0%",
+ textStyle: {
+ color: "#fff",
+ fontSize: 14,
+ },
+ itemWidth: 12,
+ itemHeight: 10,
+ },
+ dataZoom: [
+ {
+ type: "inside",
+ xAxisIndex: 0,
+ start: 0,
+ end: 50,
+ zoomOnMouseWheel: "shift",
+ moveOnMouseWheel: true,
+ moveOnMouseMove: true,
+ },
+ {
+ type: "slider",
+ height: 6,
+ bottom: "7%",
+ show: true,
+ start: 0,
+ end: 50,
+ handleSize: 5,
+ handleStyle: {
+ color: "#DCE2E8",
+ },
+ xAxisIndex: [0],
+ filterMode: "filter",
+ showDetail: false,
+ },
+ ],
+ grid: {
+ left: "10%",
+ right: "5%",
+ top: "15%",
+ bottom: "25%",
+ },
+ xAxis: [
+ {
+ type: "category",
+ data: names,
+ axisTick: {
+ alignWithLabel: true,
+ },
+ axisLabel: {
+ color: "#fff",
+ },
+ },
+ ],
+ yAxis: {
+ axisLine: {
+ show: false,
+ },
+ axisTick: {
+ show: false,
+ },
+ axisLabel: {
+ color: "#fff",
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ type: "dashed",
+ },
+ },
+ },
+ series: [
+ {
+ name: "单位人员数",
+ type: "bar",
+ backgroundStyle: {
+ color: "rgba(216, 229, 247, 0.55)",
+ borderRadius: [8, 8, 0, 0],
+ },
+ itemStyle: {
+ borderRadius: [12, 12, 0, 0],
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 1,
+ color: "rgba(84,173,147,0.2)",
+ },
+ {
+ offset: 0,
+ color: "#54AD93",
+ },
+ ]),
+ },
+ barWidth: "10",
+ data: unitPersonnelData,
+ },
+ {
+ name: "相关方人员数",
+ type: "bar",
+ backgroundStyle: {
+ color: "rgba(216, 229, 247, 0.55)",
+ borderRadius: [8, 8, 0, 0],
+ },
+ itemStyle: {
+ borderRadius: [12, 12, 0, 0],
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+ {
+ offset: 1,
+ color: "rgba(72,117,231,0.2)",
+ },
+ {
+ offset: 0,
+ color: "#4875E7",
+ },
+ ]),
+ },
+ barWidth: "10",
+ data: relatedPartyPersonnelData,
+ },
+ ],
+ };
+
+ chartInstance.current.setOption(option);
+ };
+
+ useMount(() => {
+ initEcharts(chartRef, chartInstance, records);
+
+ return () => {
+ if (chartInstance.current) {
+ chartInstance.current.dispose();
+ chartInstance.current = null;
+ }
+ };
+ });
+
+ return (
+
+
+
+ );
+}
+
+export default ClosedAreaPersonnelPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.less
new file mode 100644
index 0000000..d3109c2
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/ClosedAreaPersonnelPanel/index.less
@@ -0,0 +1,12 @@
+.branch-office-personnel__area-statistics {
+ margin-top: 10px;
+}
+
+.branch-office-area-personnel__content {
+ padding: 10px 15px;
+}
+
+.branch-office-area-personnel__chart {
+ width: 100%;
+ height: 200px;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.js
new file mode 100644
index 0000000..8cbacc5
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.js
@@ -0,0 +1,50 @@
+import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
+import Panel from "~/pages/Container/Map/components/Content/branchOffice/Panel";
+import "./index.less";
+
+const records = [
+ { name: "张三", area: "A区", onlineStatus: 1 },
+ { name: "李四", area: "B区", onlineStatus: 1 },
+ { name: "王五", area: "C区", onlineStatus: 2 },
+ { name: "赵六", area: "D区", onlineStatus: 1 },
+ { name: "钱七", area: "E区", onlineStatus: 1 },
+ { name: "孙八", area: "F区", onlineStatus: 2 },
+ { name: "周九", area: "G区", onlineStatus: 1 },
+ { name: "吴十", area: "H区", onlineStatus: 1 },
+ { name: "郑一", area: "I区", onlineStatus: 2 },
+ { name: "王二", area: "J区", onlineStatus: 1 },
+];
+
+/** 负责展示人员定位与在线状态列表。 */
+function PersonnelLocationPanel() {
+ return (
+
+
+
+
+
+
+ {records.map((item, index) => (
+
+
{item.name}
+
{item.area}
+
+ {item.onlineStatus === 1 ? "在线" : "离线"}
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+export default PersonnelLocationPanel;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.less b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.less
new file mode 100644
index 0000000..36d55ea
--- /dev/null
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/PersonnelLocationPanel/index.less
@@ -0,0 +1,34 @@
+.branch-office-personnel__location {
+ margin-top: 10px;
+}
+
+.branch-office-personnel-location__content {
+ padding: 10px 15px;
+}
+
+.branch-office-personnel-location__table {
+ margin-top: 5px;
+}
+
+.branch-office-personnel-location__body {
+ height: 100px;
+ overflow-y: hidden;
+}
+
+.branch-office-personnel-location__row {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ margin-top: 5px;
+ background-color: rgba(17, 51, 112, 0.8);
+}
+
+.branch-office-personnel-location__row div {
+ padding: 5px;
+ color: #fff;
+ font-size: 12px;
+ text-align: center;
+}
+
+.branch-office-personnel-location__row .branch-office-personnel-location__status--1 {
+ color: #1db924;
+}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/echarts.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/echarts.js
deleted file mode 100644
index 4dd5f05..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/echarts.js
+++ /dev/null
@@ -1,171 +0,0 @@
-import * as echarts from "echarts";
-
-export const initEcharts1 = (mainRef, chartInstance, data) => {
- chartInstance.current = echarts.init(mainRef.current);
-
- const option = {
- tooltip: {
- trigger: "item",
- },
- legend: {
- left: "center",
- top: "0",
- textStyle: {
- color: "#fff",
- },
- },
- series: [{
- color: ["#4198AF", "#285DF0", "#EA439D", "#F59FBC", "#FCA158", "#03D4B9", "#9FD224", "#13C871", "#FF611C"],
- type: "pie",
- radius: [0, "50%"],
- center: ["50%", "60%"],
- label: {
- textStyle: {
- color: "#fff",
- },
- },
- data,
- }],
- };
-
- chartInstance.current.setOption(option);
-};
-
-export const initEcharts2 = (mainRef, chartInstance, data) => {
- chartInstance.current = echarts.init(mainRef.current);
-
- const unitPersonnelData = data.map(item => Number.parseInt(item.unitPersonnelCount));
- const relatedPartyPersonnelData = data.map(item => Number.parseInt(item.relatedPartyPersonnelCount));
- const names = data.map(item => item.name);
-
- const option = {
- tooltip: {
- trigger: "axis",
- axisPointer: {
- type: "none",
- },
- },
- legend: {
- data: ["单位人员数", "相关方人员数"],
- top: "0%",
- right: "0%",
- textStyle: {
- color: "#fff",
- fontSize: 14,
- },
- itemWidth: 12,
- itemHeight: 10,
- },
- dataZoom: [
- {
- type: "inside",
- xAxisIndex: 0,
- start: 0,
- end: 50,
- zoomOnMouseWheel: "shift",
- moveOnMouseWheel: true,
- moveOnMouseMove: true,
- },
- {
- type: "slider",
- height: 6,
- bottom: "7%",
- show: true,
- start: 0,
- end: 50,
- handleSize: 5,
- handleStyle: {
- color: "#DCE2E8",
- },
- xAxisIndex: [0],
- filterMode: "filter",
- showDetail: false,
- },
- ],
- grid: {
- left: "10%",
- right: "5%",
- top: "15%",
- bottom: "25%",
- },
- xAxis: [
- {
- type: "category",
- data: names,
- axisTick: {
- alignWithLabel: true,
- },
- axisLabel: {
- color: "#fff",
- },
- },
- ],
- yAxis: {
- axisLine: {
- show: false,
- },
- axisTick: {
- show: false,
- },
- axisLabel: {
- color: "#fff",
- },
- splitLine: {
- show: true,
- lineStyle: {
- type: "dashed",
- },
- },
- },
- series: [
- {
- name: "单位人员数",
- type: "bar",
- backgroundStyle: {
- color: "rgba(216, 229, 247, 0.55)",
- borderRadius: [8, 8, 0, 0],
- },
- itemStyle: {
- borderRadius: [12, 12, 0, 0],
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 1,
- color: "rgba(84,173,147,0.2)",
- },
- {
- offset: 0,
- color: "#54AD93",
- },
- ]),
- },
- barWidth: "10",
- data: unitPersonnelData,
- },
- {
- name: "相关方人员数",
- type: "bar",
- backgroundStyle: {
- color: "rgba(216, 229, 247, 0.55)",
- borderRadius: [8, 8, 0, 0],
- },
- itemStyle: {
- borderRadius: [12, 12, 0, 0],
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 1,
- color: "rgba(72,117,231,0.2)",
- },
- {
- offset: 0,
- color: "#4875E7",
- },
- ]),
- },
- barWidth: "10",
- data: relatedPartyPersonnelData,
- },
- ],
- };
-
- chartInstance.current.setOption(option);
-};
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.js b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.js
index 120ed3f..77ed55f 100644
--- a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.js
+++ b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.js
@@ -1,140 +1,16 @@
-import { useMount } from "ahooks";
-import { useRef, useState } from "react";
-import SeamlessScroll from "zy-react-library/components/SeamlessScroll";
-import Title from "~/pages/Container/Map/components/Content/branchOffice/Title";
-import { initEcharts1, initEcharts2 } from "./echarts";
-import "./index.less";
+import AlarmHandlingPanel from "./AlarmHandlingPanel";
+import AlarmTypeChartPanel from "./AlarmTypeChartPanel";
+import ClosedAreaPersonnelPanel from "./ClosedAreaPersonnelPanel";
+import PersonnelLocationPanel from "./PersonnelLocationPanel";
+/** 分公司人员模块仅负责按展示顺序组合业务区块。 */
function RenYuan() {
- const chart1Instance = useRef(null);
- const main1Ref = useRef(null);
- const chart2Instance = useRef(null);
- const main2Ref = useRef(null);
-
- const [block3List, setBlock3List] = useState([
- { name: "张三", area: "A区", onlineStatus: 1 },
- { name: "李四", area: "B区", onlineStatus: 1 },
- { name: "王五", area: "C区", onlineStatus: 2 },
- { name: "赵六", area: "D区", onlineStatus: 1 },
- { name: "钱七", area: "E区", onlineStatus: 1 },
- { name: "孙八", area: "F区", onlineStatus: 2 },
- { name: "周九", area: "G区", onlineStatus: 1 },
- { name: "吴十", area: "H区", onlineStatus: 1 },
- { name: "郑一", area: "I区", onlineStatus: 2 },
- { name: "王二", area: "J区", onlineStatus: 1 },
- ]);
- const [block4List, setBlock4List] = useState([
- { alarmContent: "SOS紧急告警", personnelInvolved: "张三", dispositionStatus: 1 },
- { alarmContent: "静止/滞留告警", personnelInvolved: "李四", dispositionStatus: 2 },
- { alarmContent: "电子围栏越界", personnelInvolved: "王五", dispositionStatus: 1 },
- { alarmContent: "非授权区域停留", personnelInvolved: "赵六", dispositionStatus: 3 },
- { alarmContent: "设备及信号类告警", personnelInvolved: "钱七", dispositionStatus: 1 },
- { alarmContent: "聚集告警", personnelInvolved: "孙八", dispositionStatus: 2 },
- { alarmContent: "单独作业告警", personnelInvolved: "周九", dispositionStatus: 1 },
- { alarmContent: "超员/缺员告警", personnelInvolved: "吴十", dispositionStatus: 3 },
- { alarmContent: "SOS紧急告警", personnelInvolved: "郑一", dispositionStatus: 1 },
- { alarmContent: "静止/滞留告警", personnelInvolved: "王二", dispositionStatus: 2 },
- ]);
-
- useMount(() => {
- initEcharts1(main1Ref, chart1Instance, [
- { name: "SOS紧急告警", value: "120" },
- { name: "静止/滞留告警", value: "10" },
- { name: "电子围栏越界", value: "10" },
- { name: "非授权区域停留", value: "20" },
- { name: "设备及信号类告警", value: "30" },
- { name: "聚集告警", value: "40" },
- { name: "单独作业告警", value: "50" },
- { name: "超员/缺员告警", value: "60" },
- { name: "已处置报警数/报警数", value: "10" },
- ]);
- initEcharts2(main2Ref, chart2Instance, [
- { name: "A区", unitPersonnelCount: 120, relatedPartyPersonnelCount: 85 },
- { name: "B区", unitPersonnelCount: 95, relatedPartyPersonnelCount: 70 },
- { name: "C区", unitPersonnelCount: 80, relatedPartyPersonnelCount: 60 },
- { name: "D区", unitPersonnelCount: 150, relatedPartyPersonnelCount: 110 },
- { name: "E区", unitPersonnelCount: 75, relatedPartyPersonnelCount: 55 },
- { name: "F区", unitPersonnelCount: 110, relatedPartyPersonnelCount: 80 },
- { name: "G区", unitPersonnelCount: 65, relatedPartyPersonnelCount: 45 },
- { name: "H区", unitPersonnelCount: 140, relatedPartyPersonnelCount: 100 },
- { name: "I区", unitPersonnelCount: 90, relatedPartyPersonnelCount: 65 },
- { name: "J区", unitPersonnelCount: 125, relatedPartyPersonnelCount: 90 },
- ]);
-
- return () => {
- if (chart1Instance.current) {
- chart1Instance.current.dispose();
- chart1Instance.current = null;
- }
- if (chart2Instance.current) {
- chart2Instance.current.dispose();
- chart2Instance.current = null;
- }
- };
- });
-
return (
-
-
-
-
-
-
-
-
-
-
- {block3List.map((item, index) => (
-
-
{item.name}
-
{item.area}
-
{item.onlineStatus === 1 ? "在线" : "离线"}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
- {block4List.map((item, index) => (
-
-
{item.alarmContent}
-
{item.personnelInvolved}
-
- {item.dispositionStatus === 1 ? "已处置" : item.dispositionStatus === 2 ? "未处置" : "处置中"}
-
-
- ))}
-
-
-
-
-
+
);
}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.less b/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.less
deleted file mode 100644
index ce20015..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/RenYuan/index.less
+++ /dev/null
@@ -1,106 +0,0 @@
-.branch_office_renyuan {
- .block1 {
- background-color: rgba(12, 28, 88, 0.4);
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
- }
- }
-
- .block2 {
- background-color: rgba(12, 28, 88, 0.4);
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
- }
- }
-
- .block3 {
- background-image: linear-gradient(to bottom,
- rgba(0, 0, 0, 0),
- rgba(0, 0, 0, 0.8));
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 100px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-
- .block4 {
- background-image: linear-gradient(to bottom,
- rgba(0, 0, 0, 0),
- rgba(0, 0, 0, 0.8));
- margin-top: 10px;
-
- .options {
- padding: 10px 15px;
- border: 1px solid;
- border-image: linear-gradient(to bottom,
- rgba(58, 122, 149, 0),
- rgba(58, 122, 149, 1)) 1;
- border-top: none;
-
- .table {
- margin-top: 5px;
-
- .scroll {
- height: 100px;
- overflow-y: hidden;
- }
-
- .tr {
- margin-top: 5px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- background-color: rgba(17, 51, 112, 0.8);
-
- .td {
- text-align: center;
- font-size: 12px;
- color: #fff;
- padding: 5px;
- }
- }
- }
- }
- }
-}
diff --git a/src/pages/Container/Map/components/Content/branchOffice/Title/index.js b/src/pages/Container/Map/components/Content/branchOffice/Title/index.js
deleted file mode 100644
index e1cca96..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/Title/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import titleBgImg from "~/assets/images/map_bi/content/title_bg2.png";
-import "./index.less";
-
-function Title(props) {
- return (
-
- );
-}
-
-export default Title;
diff --git a/src/pages/Container/Map/components/Content/branchOffice/Title/index.less b/src/pages/Container/Map/components/Content/branchOffice/Title/index.less
deleted file mode 100644
index 5ef6d72..0000000
--- a/src/pages/Container/Map/components/Content/branchOffice/Title/index.less
+++ /dev/null
@@ -1,25 +0,0 @@
-.map_content_branch_office_title_container {
- width: 100%;
- height: 41px;
- background-size: 100% 100%;
- background-repeat: no-repeat;
- display: flex;
- align-items: center;
- justify-content: space-between;
-
- .basic {
- display: flex;
- align-items: center;
-
- .label {
- font-size: 14px;
- font-weight: bold;
- color: #fff;
- padding-left: 25px;
- }
- }
-
- .extra {
- margin-right: 5px;
- }
-}