diff --git a/config/routes.js b/config/routes.js
index 0614436..a5d721d 100644
--- a/config/routes.js
+++ b/config/routes.js
@@ -24,6 +24,12 @@ export default [
name: 'business',
component: './nav_system_content/SystemContentList',
routes: [
+ // 应急资源管理
+ {
+ path: '/topnavbar00/business/emergencyResource',
+ name: 'emergencyResource',
+ component: './business_emergencyResource/EmergencyResource',
+ },
// 安全管理基础信息
{
path: '/topnavbar00/business/basicinformation',
diff --git a/src/assets/img/background_menu.png b/src/assets/img/background_menu.png
new file mode 100644
index 0000000..8c36051
Binary files /dev/null and b/src/assets/img/background_menu.png differ
diff --git a/src/assets/img/menuicon1.svg b/src/assets/img/menuicon1.svg
new file mode 100644
index 0000000..254e2b9
--- /dev/null
+++ b/src/assets/img/menuicon1.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/pages/business_envInformation copy/EnvInformation.js b/src/pages/business_emergencyResource copy 2/EmergencyResource.js
similarity index 98%
rename from src/pages/business_envInformation copy/EnvInformation.js
rename to src/pages/business_emergencyResource copy 2/EmergencyResource.js
index fd7e99a..07ab758 100644
--- a/src/pages/business_envInformation copy/EnvInformation.js
+++ b/src/pages/business_emergencyResource copy 2/EmergencyResource.js
@@ -1,6 +1,6 @@
import React, { useState } from 'react';
import { Card, Row, Col, Statistic, Progress, Button, Space } from 'antd';
-import styles from './EnvInformation.less';
+import styles from './EmergencyResource.less';
import ComplianceManagement from './components/ComplianceManagement'; //合规性管理
import OnlineMonitoring from './components/OnlineMonitoring'; //在线监测预警
import EnvironmentalPersonnelManagement from './components/EnvironmentalPersonnelManagement'; //环保人员管理
diff --git a/src/pages/business_envInformation copy/EnvInformation.less b/src/pages/business_emergencyResource copy 2/EmergencyResource.less
similarity index 100%
rename from src/pages/business_envInformation copy/EnvInformation.less
rename to src/pages/business_emergencyResource copy 2/EmergencyResource.less
diff --git a/src/pages/business_envInformation copy/components/AtmospherePollutantLibrary.js b/src/pages/business_emergencyResource copy 2/components/AtmospherePollutantLibrary.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/AtmospherePollutantLibrary.js
rename to src/pages/business_emergencyResource copy 2/components/AtmospherePollutantLibrary.js
diff --git a/src/pages/business_envInformation copy/components/AtmospherePollutantLibrary.less b/src/pages/business_emergencyResource copy 2/components/AtmospherePollutantLibrary.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/AtmospherePollutantLibrary.less
rename to src/pages/business_emergencyResource copy 2/components/AtmospherePollutantLibrary.less
diff --git a/src/pages/business_envInformation copy/components/ComplianceManagement.js b/src/pages/business_emergencyResource copy 2/components/ComplianceManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/ComplianceManagement.js
rename to src/pages/business_emergencyResource copy 2/components/ComplianceManagement.js
diff --git a/src/pages/business_envInformation copy/components/ComplianceManagement.less b/src/pages/business_emergencyResource copy 2/components/ComplianceManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/ComplianceManagement.less
rename to src/pages/business_emergencyResource copy 2/components/ComplianceManagement.less
diff --git a/src/pages/business_envInformation copy/components/EnvironmentalPersonnelManagement.js b/src/pages/business_emergencyResource copy 2/components/EnvironmentalPersonnelManagement.js
similarity index 99%
rename from src/pages/business_envInformation copy/components/EnvironmentalPersonnelManagement.js
rename to src/pages/business_emergencyResource copy 2/components/EnvironmentalPersonnelManagement.js
index ee14763..805e60e 100644
--- a/src/pages/business_envInformation copy/components/EnvironmentalPersonnelManagement.js
+++ b/src/pages/business_emergencyResource copy 2/components/EnvironmentalPersonnelManagement.js
@@ -14,10 +14,10 @@ import map1 from '@/assets/safe_majorHazard/online_monitoring/map.png';
import risk1 from '@/assets/safe_majorHazard/online_monitoring/risk1.png';
import risk2 from '@/assets/safe_majorHazard/online_monitoring/risk2.png';
import risk3 from '@/assets/safe_majorHazard/online_monitoring/risk3.png';
-import eqicon1 from '@/assets/business_basic/eqicon1.png';
-import eqicon2 from '@/assets/business_basic/eqicon2.png';
-import eqicon3 from '@/assets/business_basic/eqicon3.png';
-import eqicon4 from '@/assets/business_basic/eqicon4.png';
+// import eqicon1 from '@/assets/business_basic/eqicon1.png';
+// import eqicon2 from '@/assets/business_basic/eqicon2.png';
+// import eqicon3 from '@/assets/business_basic/eqicon3.png';
+// import eqicon4 from '@/assets/business_basic/eqicon4.png';
import viewIcon from '@/assets/business_envinformation/viewicon.svg';
import editIcon from '@/assets/business_envinformation/editicon.svg';
import deleteIcon from '@/assets/business_envinformation/deleteicon.svg';
diff --git a/src/pages/business_envInformation copy/components/EnvironmentalPersonnelManagement.less b/src/pages/business_emergencyResource copy 2/components/EnvironmentalPersonnelManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/EnvironmentalPersonnelManagement.less
rename to src/pages/business_emergencyResource copy 2/components/EnvironmentalPersonnelManagement.less
diff --git a/src/pages/business_envInformation copy/components/EquipmentManagement.js b/src/pages/business_emergencyResource copy 2/components/EquipmentManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/EquipmentManagement.js
rename to src/pages/business_emergencyResource copy 2/components/EquipmentManagement.js
diff --git a/src/pages/business_envInformation copy/components/EquipmentManagement.less b/src/pages/business_emergencyResource copy 2/components/EquipmentManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/EquipmentManagement.less
rename to src/pages/business_emergencyResource copy 2/components/EquipmentManagement.less
diff --git a/src/pages/business_envInformation copy/components/EvaluationReport.js b/src/pages/business_emergencyResource copy 2/components/EvaluationReport.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/EvaluationReport.js
rename to src/pages/business_emergencyResource copy 2/components/EvaluationReport.js
diff --git a/src/pages/business_envInformation copy/components/EvaluationReport.less b/src/pages/business_emergencyResource copy 2/components/EvaluationReport.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/EvaluationReport.less
rename to src/pages/business_emergencyResource copy 2/components/EvaluationReport.less
diff --git a/src/pages/business_envInformation copy/components/OnlineMonitoring.js b/src/pages/business_emergencyResource copy 2/components/OnlineMonitoring.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/OnlineMonitoring.js
rename to src/pages/business_emergencyResource copy 2/components/OnlineMonitoring.js
diff --git a/src/pages/business_envInformation copy/components/OnlineMonitoring.less b/src/pages/business_emergencyResource copy 2/components/OnlineMonitoring.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/OnlineMonitoring.less
rename to src/pages/business_emergencyResource copy 2/components/OnlineMonitoring.less
diff --git a/src/pages/business_envInformation copy/components/PollutionSourceManagement.js b/src/pages/business_emergencyResource copy 2/components/PollutionSourceManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/PollutionSourceManagement.js
rename to src/pages/business_emergencyResource copy 2/components/PollutionSourceManagement.js
diff --git a/src/pages/business_envInformation copy/components/PollutionSourceManagement.less b/src/pages/business_emergencyResource copy 2/components/PollutionSourceManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/PollutionSourceManagement.less
rename to src/pages/business_emergencyResource copy 2/components/PollutionSourceManagement.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/DischargePermitManagement.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/DischargePermitManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/DischargePermitManagement.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/DischargePermitManagement.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/DischargePermitManagement.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/DischargePermitManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/DischargePermitManagement.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/DischargePermitManagement.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/EnvironmentalTaskList.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/EnvironmentalTaskList.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/EnvironmentalTaskList.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/EnvironmentalTaskList.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/EnvironmentalTaskList.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/EnvironmentalTaskList.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/EnvironmentalTaskList.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/EnvironmentalTaskList.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/InformationDisclosure.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/InformationDisclosure.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/InformationDisclosure.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/InformationDisclosure.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/InformationDisclosure.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/InformationDisclosure.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/InformationDisclosure.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/InformationDisclosure.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/PermitManagement.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/PermitManagement.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitManagement.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/PermitManagement.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/PermitManagement.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitManagement.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/PermitStatistics.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitStatistics.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/PermitStatistics.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitStatistics.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/PermitStatistics.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitStatistics.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/PermitStatistics.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/PermitStatistics.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/ProtectionFacilityMaintenance.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/ProtectionFacilityMaintenance.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/ProtectionFacilityMaintenance.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/ProtectionFacilityMaintenance.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/ProtectionFacilityMaintenance.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/ProtectionFacilityMaintenance.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/ProtectionFacilityMaintenance.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/ProtectionFacilityMaintenance.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/RegulationCompliance.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/RegulationCompliance.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/RegulationCompliance.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/RegulationCompliance.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/RegulationCompliance.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/RegulationCompliance.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/RegulationCompliance.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/RegulationCompliance.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/SupervisionInspection.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/SupervisionInspection.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/SupervisionInspection.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/SupervisionInspection.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/SupervisionInspection.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/SupervisionInspection.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/SupervisionInspection.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/SupervisionInspection.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/WasteGasPollutionControl.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/WasteGasPollutionControl.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/WasteGasPollutionControl.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/WasteGasPollutionControl.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/WasteGasPollutionControl.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/WasteGasPollutionControl.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/WasteGasPollutionControl.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/WasteGasPollutionControl.less
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/WastewaterFacilityManagement.js b/src/pages/business_emergencyResource copy 2/components/secondary_menu/WastewaterFacilityManagement.js
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/WastewaterFacilityManagement.js
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/WastewaterFacilityManagement.js
diff --git a/src/pages/business_envInformation copy/components/secondary_menu/WastewaterFacilityManagement.less b/src/pages/business_emergencyResource copy 2/components/secondary_menu/WastewaterFacilityManagement.less
similarity index 100%
rename from src/pages/business_envInformation copy/components/secondary_menu/WastewaterFacilityManagement.less
rename to src/pages/business_emergencyResource copy 2/components/secondary_menu/WastewaterFacilityManagement.less
diff --git a/src/pages/business_emergencyResource copy 3/EmergencyResource.js b/src/pages/business_emergencyResource copy 3/EmergencyResource.js
new file mode 100644
index 0000000..07ab758
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/EmergencyResource.js
@@ -0,0 +1,77 @@
+import React, { useState } from 'react';
+import { Card, Row, Col, Statistic, Progress, Button, Space } from 'antd';
+import styles from './EmergencyResource.less';
+import ComplianceManagement from './components/ComplianceManagement'; //合规性管理
+import OnlineMonitoring from './components/OnlineMonitoring'; //在线监测预警
+import EnvironmentalPersonnelManagement from './components/EnvironmentalPersonnelManagement'; //环保人员管理
+import EvaluationReport from './components/EvaluationReport'; //评估报告
+import EquipmentManagement from './components/EquipmentManagement'; //环保设备设施管理
+import PollutionSourceManagement from './components/PollutionSourceManagement'; //污染源管理
+
+
+
+const SafeMajorHazardList = () => {
+ const [activeModule, setActiveModule] = useState('organization');
+
+ const handleModuleClick = (module) => {
+ setActiveModule(module)
+ }
+
+
+ const renderModule = () => {
+ switch (activeModule) {
+ case 'organization':
+ return ;
+ case 'equipment':
+ return ;
+ case 'firefighting':
+ return ;
+ case 'other':
+ return ;
+ case 'equipmentManagement':
+ return ;
+ case 'pollutionSource':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+
+ return (
+
+
+
+
+
+
+
+
+
+ {renderModule()}
+
+
+ );
+};
+
+export default SafeMajorHazardList;
diff --git a/src/pages/business_emergencyResource copy 3/EmergencyResource.less b/src/pages/business_emergencyResource copy 3/EmergencyResource.less
new file mode 100644
index 0000000..08e9b05
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/EmergencyResource.less
@@ -0,0 +1,69 @@
+.container {
+ background-color: transparent;
+ width: 100%;
+ height: 89vh;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+
+ .TopButton {
+ background-color: white;
+ width: 100%;
+ padding: 8px 30px 5px 30px;
+ display: flex;
+ gap: 24px;
+ margin-left: 6px;
+
+ .TopButtonItem {
+ background-color: #FFFFFF !important;
+ color: #999999 !important;
+ font-family: 'PingFang SC', sans-serif !important;
+ font-weight: 500 !important;
+ font-size: 14px !important;
+ line-height: 100% !important;
+ border-radius: 8px !important;
+ padding: 4px 16px !important;
+ height: auto !important;
+ border: none !important;
+ box-shadow: none !important;
+ position: relative !important;
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ gap: 5px !important;
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &:focus {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &.active {
+ background: linear-gradient(98.03deg, #00E49C 0.68%, #00D841 98.3%) !important;
+ box-shadow: 0px 2px 2px 0px #AEEDDE !important;
+ color: #FFFFFF !important;
+
+ &::after {
+ content: '';
+ width: 28px;
+ height: 5px;
+ background-color: #FFFFFF;
+ border-radius: 6px;
+ opacity: 1;
+ }
+ }
+ }
+ }
+
+ .content {
+ // ======== 内容区域样式 ========
+ flex: 1; // ======== 占据剩余空间 ========
+ overflow-y: auto; // ======== 允许垂直滚动 ========
+ padding: 0; // ======== 无内边距 ========
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.js b/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.js
new file mode 100644
index 0000000..a16f589
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.js
@@ -0,0 +1,513 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './AtmospherePollutantLibrary.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+import icon_add from '@/assets/business_envinformation/icon_add.svg';
+
+const AtmospherePollutantLibrary = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 19,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ serialNumber: 1,
+ pollutantName: '对乙酰氨基酚栓',
+ category: 25,
+ mainFeatures: '在接受调查的19为华尔街分析师...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '每日协通(北京)咨询有限公司',
+ monthlyEmission: 4.6,
+ quarterlyEmission: 4.6,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 2,
+ serialNumber: 2,
+ pollutantName: '萘普生缓释胶囊(适洛特)',
+ category: 27,
+ mainFeatures: '热到融化的马路、无穷无尽的野火...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '赢王科技有限公司',
+ monthlyEmission: 1.1,
+ quarterlyEmission: 1.1,
+ yearlyEmission: 1.8,
+ },
+ {
+ key: 3,
+ serialNumber: 3,
+ pollutantName: '复方感冒灵片',
+ category: 44,
+ mainFeatures: '从病虫害探测、土壤墒情监测智能...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京福商商务服务有限公司',
+ monthlyEmission: 2.4,
+ quarterlyEmission: 2.4,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 4,
+ serialNumber: 4,
+ pollutantName: '红药片',
+ category: 21,
+ mainFeatures: '近日,有科普博主发帖称,某社交...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '实华国际租赁有限公司',
+ monthlyEmission: 3.6,
+ quarterlyEmission: 3.6,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 5,
+ serialNumber: 5,
+ pollutantName: '布洛芬混悬液(翔宇赛可)',
+ category: 56,
+ mainFeatures: '在七八十年代,这种面料做成的服...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京冠钧财经策划有限公司',
+ monthlyEmission: 3.0,
+ quarterlyEmission: 3.0,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 6,
+ serialNumber: 6,
+ pollutantName: '阿莫西林胶囊',
+ category: 32,
+ mainFeatures: '抗生素类药物,用于治疗细菌感染...',
+ monitoringPoint: 1.15,
+ emittingEnterprise: '华北制药集团有限责任公司',
+ monthlyEmission: 2.8,
+ quarterlyEmission: 2.8,
+ yearlyEmission: 3.5,
+ },
+ {
+ key: 7,
+ serialNumber: 7,
+ pollutantName: '头孢拉定胶囊',
+ category: 28,
+ mainFeatures: '头孢类抗生素,广谱抗菌药物...',
+ monitoringPoint: 1.30,
+ emittingEnterprise: '石药集团欧意药业有限公司',
+ monthlyEmission: 1.9,
+ quarterlyEmission: 1.9,
+ yearlyEmission: 2.3,
+ },
+ {
+ key: 8,
+ serialNumber: 8,
+ pollutantName: '复方甘草片',
+ category: 35,
+ mainFeatures: '镇咳祛痰药物,含有甘草提取物...',
+ monitoringPoint: 1.20,
+ emittingEnterprise: '太极集团重庆桐君阁药厂有限公司',
+ monthlyEmission: 3.2,
+ quarterlyEmission: 3.2,
+ yearlyEmission: 4.1,
+ },
+ {
+ key: 9,
+ serialNumber: 9,
+ pollutantName: '板蓝根颗粒',
+ category: 41,
+ mainFeatures: '清热解毒,凉血利咽的中成药...',
+ monitoringPoint: 1.10,
+ emittingEnterprise: '广州白云山和记黄埔中药有限公司',
+ monthlyEmission: 4.5,
+ quarterlyEmission: 4.5,
+ yearlyEmission: 5.8,
+ },
+ {
+ key: 10,
+ serialNumber: 10,
+ pollutantName: '维生素C片',
+ category: 22,
+ mainFeatures: '补充维生素C,增强免疫力...',
+ monitoringPoint: 1.35,
+ emittingEnterprise: '华润三九医药股份有限公司',
+ monthlyEmission: 2.1,
+ quarterlyEmission: 2.1,
+ yearlyEmission: 2.7,
+ },
+ {
+ key: 11,
+ serialNumber: 11,
+ pollutantName: '感冒清热颗粒',
+ category: 38,
+ mainFeatures: '疏风散寒,解表清热的中成药...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京同仁堂股份有限公司',
+ monthlyEmission: 3.7,
+ quarterlyEmission: 3.7,
+ yearlyEmission: 4.9,
+ },
+ {
+ key: 12,
+ serialNumber: 12,
+ pollutantName: '双氯芬酸钠缓释片',
+ category: 29,
+ mainFeatures: '非甾体抗炎药,用于缓解疼痛...',
+ monitoringPoint: 1.18,
+ emittingEnterprise: '扬子江药业集团有限公司',
+ monthlyEmission: 1.6,
+ quarterlyEmission: 1.6,
+ yearlyEmission: 2.0,
+ },
+ {
+ key: 13,
+ serialNumber: 13,
+ pollutantName: '藿香正气水',
+ category: 43,
+ mainFeatures: '解表化湿,理气和中的中成药...',
+ monitoringPoint: 1.22,
+ emittingEnterprise: '云南白药集团股份有限公司',
+ monthlyEmission: 2.9,
+ quarterlyEmission: 2.9,
+ yearlyEmission: 3.8,
+ },
+ {
+ key: 14,
+ serialNumber: 14,
+ pollutantName: '蒙脱石散',
+ category: 26,
+ mainFeatures: '止泻药物,保护胃肠黏膜...',
+ monitoringPoint: 1.28,
+ emittingEnterprise: '博福-益普生制药有限公司',
+ monthlyEmission: 1.4,
+ quarterlyEmission: 1.4,
+ yearlyEmission: 1.9,
+ },
+ {
+ key: 15,
+ serialNumber: 15,
+ pollutantName: '复方丹参片',
+ category: 37,
+ mainFeatures: '活血化瘀,理气止痛的中成药...',
+ monitoringPoint: 1.16,
+ emittingEnterprise: '天津中新药业集团股份有限公司',
+ monthlyEmission: 3.3,
+ quarterlyEmission: 3.3,
+ yearlyEmission: 4.2,
+ },
+ {
+ key: 16,
+ serialNumber: 16,
+ pollutantName: '奥美拉唑肠溶胶囊',
+ category: 31,
+ mainFeatures: '质子泵抑制剂,治疗胃溃疡...',
+ monitoringPoint: 1.33,
+ emittingEnterprise: '阿斯利康制药有限公司',
+ monthlyEmission: 2.2,
+ quarterlyEmission: 2.2,
+ yearlyEmission: 2.8,
+ },
+ {
+ key: 17,
+ serialNumber: 17,
+ pollutantName: '六味地黄丸',
+ category: 45,
+ mainFeatures: '滋阴补肾的经典中成药...',
+ monitoringPoint: 1.12,
+ emittingEnterprise: '仲景宛西制药股份有限公司',
+ monthlyEmission: 4.1,
+ quarterlyEmission: 4.1,
+ yearlyEmission: 5.3,
+ },
+ {
+ key: 18,
+ serialNumber: 18,
+ pollutantName: '阿司匹林肠溶片',
+ category: 24,
+ mainFeatures: '解热镇痛抗炎药,预防血栓...',
+ monitoringPoint: 1.27,
+ emittingEnterprise: '拜耳医药保健有限公司',
+ monthlyEmission: 1.8,
+ quarterlyEmission: 1.8,
+ yearlyEmission: 2.4,
+ },
+ {
+ key: 19,
+ serialNumber: 19,
+ pollutantName: '复方黄连素片',
+ category: 39,
+ mainFeatures: '清热燥湿,行气止痛的中成药...',
+ monitoringPoint: 1.21,
+ emittingEnterprise: '哈药集团三精制药有限公司',
+ monthlyEmission: 2.6,
+ quarterlyEmission: 2.6,
+ yearlyEmission: 3.4,
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '序号',
+ dataIndex: 'serialNumber',
+ key: 'serialNumber',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '特征污染物名称',
+ dataIndex: 'pollutantName',
+ key: 'pollutantName',
+ width: 200,
+ align: 'center',
+ },
+ {
+ title: '种类',
+ dataIndex: 'category',
+ key: 'category',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '主要特征',
+ dataIndex: 'mainFeatures',
+ key: 'mainFeatures',
+ width: 300,
+ },
+ {
+ title: '环境监测点',
+ dataIndex: 'monitoringPoint',
+ key: 'monitoringPoint',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放企业',
+ dataIndex: 'emittingEnterprise',
+ key: 'emittingEnterprise',
+ width: 200,
+ },
+ {
+ title: '本月排放量',
+ dataIndex: 'monthlyEmission',
+ key: 'monthlyEmission',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '本季度排放量',
+ dataIndex: 'quarterlyEmission',
+ key: 'quarterlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '本年度排放量',
+ dataIndex: 'yearlyEmission',
+ key: 'yearlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleEdit(record)}
+ />
+
handleDownload(record)}
+ /> */}
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 页面头部 */}
+
+ 大气污染特征污染物名录库
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ // scroll={{ x: 3000}}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default AtmospherePollutantLibrary;
diff --git a/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.less b/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.less
new file mode 100644
index 0000000..d1550dc
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/AtmospherePollutantLibrary.less
@@ -0,0 +1,218 @@
+.atmospherePollutantLibrary {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ // background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .pageHeader {
+ margin-bottom: 15px;
+ background: #fff;
+ padding: 15px 15px 15px 20px;
+ border-radius: 2px;
+ color: #333333;
+ font-size: 16px;
+ font-weight: 500;
+ }
+
+ .searchSection {
+ background: #fff;
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #00D48A;
+ color: #fff;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ }
+ }
+
+ .importButton {
+ display: flex;
+ align-items: center;
+ background-color: #fff;
+ border-color: #D7D7D7;
+ color: #333;
+ height: 28px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // .rightControls {
+ // display: flex;
+ // align-items: center;
+ // gap: 12px;
+
+ // .filterLabel {
+ // color: #333;
+ // font-size: 14px;
+ // white-space: nowrap;
+ // }
+
+ // .queryButton {
+ // background-color: #52c41a;
+ // border-color: #52c41a;
+ // color: white;
+ // height: 28px;
+ // border-radius: 4px;
+ // display: flex;
+ // align-items: center;
+ // justify-content: center;
+
+ // &:hover {
+ // background-color: #73d13d;
+ // border-color: #73d13d;
+ // }
+ // }
+
+ // .selectInput {
+ // :global {
+ // .ant-select-selector {
+ // display: flex;
+ // align-items: center;
+ // height: 28px !important;
+ // }
+
+ // .ant-select-selection-item {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+
+ // .ant-select-selection-placeholder {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+ // }
+ // }
+ // }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 25px 0;
+ background-color: #fff;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead>tr>th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr>td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr:hover>td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead>tr>th.ant-table-cell-fix-left,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead>tr>th.ant-table-cell-fix-right,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // 页码距离上边距
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.js b/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.js
new file mode 100644
index 0000000..e44970b
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.js
@@ -0,0 +1,62 @@
+import React, { useState } from 'react';
+import styles from './ComplianceManagement.less';
+import PermitManagement from './secondary_menu/PermitManagement'; // 排污许可
+import RegulationCompliance from './secondary_menu/RegulationCompliance'; // 法规符合性
+import SupervisionInspection from './secondary_menu/SupervisionInspection'; // 监督检查
+import InformationDisclosure from './secondary_menu/InformationDisclosure'; // 信息公开及绿色通道
+
+const ComplianceManagement = () => {
+ const [activeMenu, setActiveMenu] = useState('permit');
+
+ const menuItems = [
+ { key: 'permit', label: '排污许可' },
+ { key: 'regulation', label: '法规符合性' },
+ { key: 'inspection', label: '监督检查' },
+ { key: 'disclosure', label: '信息公开及绿色通道' }
+ ];
+
+ const handleMenuClick = (key) => {
+ setActiveMenu(key);
+ };
+
+ const renderContent = () => {
+ switch (activeMenu) {
+ case 'permit':
+ return ;
+ case 'regulation':
+ return ;
+ case 'inspection':
+ return ;
+ case 'disclosure':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+ {/* 左侧菜单 */}
+
+ {menuItems.map(item => (
+
handleMenuClick(item.key)}
+ >
+ {activeMenu === item.key &&
}
+
{item.label}
+
+ ))}
+
+
+ {/* 右侧内容区 */}
+
+ {renderContent()}
+
+
+ );
+};
+
+export default ComplianceManagement;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.less b/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.less
new file mode 100644
index 0000000..b58637a
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/ComplianceManagement.less
@@ -0,0 +1,85 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ gap: 10px;
+ padding-left: 5px;
+ // padding-right: 5px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ background-color: #f5f5f5;
+
+ // 左侧菜单
+ .leftMenu {
+ display: flex;
+ flex-direction: column;
+ // gap: 1px;
+ flex-shrink: 0;
+ background-color: #fff;
+
+ .menuItem {
+ width: 180px;
+ height: 50px;
+ background-color: #FFFFFF;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ position: relative;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ padding-left: 20px;
+
+ .menuText {
+ font-size: 14px;
+ color: #999999;
+ font-weight: 400;
+ transition: color 0.3s ease;
+ }
+
+ // 激活状态的指示器(左侧长条)
+ .activeIndicator {
+ position: absolute;
+ left: 3px;
+ width: 17.34765625px;
+ height: 1.97802734375px;
+ border-radius: 6px;
+ background-color: #009D6F;
+ transform: rotate(-90deg);
+ }
+
+ // 激活状态样式
+ &.active {
+ background-color: #D4FFEC;
+
+ .menuText {
+ color: #009D6F;
+ }
+ }
+
+ // 鼠标悬停效果
+ &:hover:not(.active) {
+ background-color: #f9f9f9;
+ }
+ }
+ }
+
+ // 右侧内容区
+ .rightContent {
+ flex: 1;
+ // background-color: #FFFFFF;
+ border-radius: 4px;
+ // padding: 20px;
+ overflow: auto;
+
+ .contentPlaceholder {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ color: #666666;
+ }
+ }
+}
+
diff --git a/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.js b/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.js
new file mode 100644
index 0000000..805e60e
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.js
@@ -0,0 +1,1025 @@
+
+import React, { useState, useEffect } from 'react';
+import moment from 'moment';
+import { Card, Result, Select, Button, Drawer, Upload, Input, Modal, Form, DatePicker, Row, Col } from 'antd';
+import { CheckCircleOutlined, ExportOutlined, PlusOutlined, UploadOutlined, UserOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './EnvironmentalPersonnelManagement.less';
+// import './EnvironmentalPersonnelManagement.less';
+
+import img1 from '@/assets/safe_majorHazard/online_monitoring/img1.png';
+import img2 from '@/assets/safe_majorHazard/online_monitoring/img2.png';
+import img3 from '@/assets/safe_majorHazard/online_monitoring/img3.png';
+import map1 from '@/assets/safe_majorHazard/online_monitoring/map.png';
+import risk1 from '@/assets/safe_majorHazard/online_monitoring/risk1.png';
+import risk2 from '@/assets/safe_majorHazard/online_monitoring/risk2.png';
+import risk3 from '@/assets/safe_majorHazard/online_monitoring/risk3.png';
+// import eqicon1 from '@/assets/business_basic/eqicon1.png';
+// import eqicon2 from '@/assets/business_basic/eqicon2.png';
+// import eqicon3 from '@/assets/business_basic/eqicon3.png';
+// import eqicon4 from '@/assets/business_basic/eqicon4.png';
+import viewIcon from '@/assets/business_envinformation/viewicon.svg';
+import editIcon from '@/assets/business_envinformation/editicon.svg';
+import deleteIcon from '@/assets/business_envinformation/deleteicon.svg';
+import personnelIcon from '@/assets/business_envinformation/personnel.svg';
+
+
+
+
+
+const EnvironmentalPersonnelManagement = () => {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 0,
+ });
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRecord, setSelectedRecord] = useState(null);
+ const [modalVisible, setModalVisible] = useState(false);
+ const [form] = Form.useForm();
+ const [editDrawerVisible, setEditDrawerVisible] = useState(false);
+ const [editForm] = Form.useForm();
+
+
+
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 10;
+ const number = (page - 1) * pageSize + index + 1;
+ return number;
+ }
+ },
+ {
+ title: '姓名',
+ dataIndex: 'name',
+ key: 'name',
+ width: 120,
+ },
+ {
+ title: '部门',
+ dataIndex: 'department',
+ key: 'department',
+ width: 120,
+ filters: [
+ { text: '环保管理', value: '环保管理' },
+ { text: '技术部', value: '技术部' },
+ { text: '生产部', value: '生产部' },
+ { text: '质量部', value: '质量部' },
+ ],
+ onFilter: (value, record) => record.department === value,
+ },
+ {
+ title: '岗位',
+ dataIndex: 'position',
+ key: 'position',
+ width: 120,
+ filters: [
+ { text: '污水化验', value: '污水化验' },
+ { text: '环境监测', value: '环境监测' },
+ { text: '环保工程师', value: '环保工程师' },
+ { text: '安全员', value: '安全员' },
+ { text: '技术员', value: '技术员' },
+ ],
+ onFilter: (value, record) => record.position === value,
+ },
+ {
+ title: '入职时间',
+ dataIndex: 'joinDate',
+ key: 'joinDate',
+ width: 120,
+ sorter: (a, b) => {
+ // 将日期字符串转换为Date对象进行比较
+ const dateA = new Date(a.joinDate);
+ const dateB = new Date(b.joinDate);
+ return dateA - dateB;
+ },
+ },
+ {
+ title: '岗位职责',
+ dataIndex: 'responsibility',
+ key: 'responsibility',
+ width: 200,
+ },
+ {
+ title: '联系方式',
+ dataIndex: 'contact',
+ key: 'contact',
+ width: 150,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 180,
+ render: (_, record) => (
+
+

handleView(record)}
+ />
+

handleEdit(record)}
+ />
+

+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ name: '吴振峰',
+ department: '环保管理',
+ position: '污水运行',
+ joinDate: '2025-09-02',
+ responsibility: '保障污水设备运行、处理故障',
+ contact: '13321493732',
+ employeeId: '434545',
+ gender: '男',
+ birthDate: '2025-08-08',
+ idCard: '340802199809050811',
+ address: '西辛南区46号楼2单元101室',
+ other: '暂无'
+ },
+ {
+ key: '2',
+ id: '002',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138002',
+ },
+ {
+ key: '3',
+ id: '003',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138003',
+ },
+ {
+ key: '4',
+ id: '004',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138004',
+ },
+ {
+ key: '5',
+ id: '005',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138005',
+ },
+ {
+ key: '6',
+ id: '006',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138006',
+ },
+ {
+ key: '7',
+ id: '007',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138007',
+ },
+ {
+ key: '8',
+ id: '008',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138008',
+ },
+ {
+ key: '9',
+ id: '009',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138009',
+ },
+ {
+ key: '10',
+ id: '010',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138010',
+ },
+ {
+ key: '11',
+ id: '011',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138011',
+ },
+ {
+ key: '12',
+ id: '012',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138012',
+ },
+ {
+ key: '13',
+ id: '013',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138013',
+ },
+ {
+ key: '14',
+ id: '014',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138014',
+ },
+ {
+ key: '15',
+ id: '015',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138015',
+ },
+ {
+ key: '16',
+ id: '016',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138016',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 新增设备按钮点击事件
+ const handleAddDevice = () => {
+ console.log('新增设备');
+ // TODO: 实现新增设备逻辑
+ };
+
+ // 导出数据按钮点击事件
+ const handleExportData = () => {
+ console.log('导出数据');
+ // TODO: 实现导出数据逻辑
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 查看详情
+ const handleView = (record) => {
+ setSelectedRecord(record);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const handleCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRecord(null);
+ };
+
+ // 打开新增模态框
+ const handleOpenModal = () => {
+ setModalVisible(true);
+ };
+
+ // 关闭新增模态框
+ const handleCloseModal = () => {
+ setModalVisible(false);
+ form.resetFields();
+ };
+
+ // 保存新增数据
+ const handleSave = () => {
+ form.validateFields().then(values => {
+ console.log('新增数据:', values);
+ // TODO: 实现保存逻辑
+ setModalVisible(false);
+ form.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ // 打开编辑抽屉
+ const handleEdit = (record) => {
+ console.log('点击编辑按钮,记录:', record);
+ setSelectedRecord(record);
+ setEditDrawerVisible(true);
+ console.log('设置编辑抽屉可见:', true);
+ // 设置表单初始值
+ editForm.setFieldsValue({
+ name: record.name,
+ employeeId: record.employeeId,
+ department: record.department,
+ position: record.position,
+ gender: record.gender,
+ address: record.address,
+ birthDate: record.birthDate ? moment(record.birthDate) : null,
+ joinDate: record.joinDate ? moment(record.joinDate) : null,
+ idCard: record.idCard,
+ contact: record.contact,
+ responsibility: record.responsibility,
+ other: record.other
+ });
+ };
+
+ // 关闭编辑抽屉
+ const handleCloseEditDrawer = () => {
+ setEditDrawerVisible(false);
+ setSelectedRecord(null);
+ editForm.resetFields();
+ };
+
+ // 保存编辑数据
+ const handleEditSave = () => {
+ editForm.validateFields().then(values => {
+ console.log('编辑数据:', values);
+ // TODO: 实现保存逻辑
+ setEditDrawerVisible(false);
+ editForm.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ return (
+
+ {/* 第一个div - 高度20% */}
+
+
+
+ {/* 块1 */}
+
+
+
环保总人数
+
258
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块2 */}
+
+
+
管理岗人数
+
58
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块3 */}
+
+
+
污水运行人数
+
51
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块4 */}
+
+
+
污水化验人数
+
28
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块5 */}
+
+
+
危废管理人员
+
50
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块6 */}
+
+
+
一般固体废物管理人员
+
58
+
截止到 2025-09-11 07:35
+
+
+
+
+
+
+
+
+
+ {/* 第三个div - 占满剩余位置 */}
+
+
+ {/* 第一行 - 表单控件 */}
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二行 - 表格 */}
+
+
+ `共 ${total} 条`,
+ }}
+ />
+
+
+
+
+ {/* 侧边抽屉 */}
+
查看}
+ placement="right"
+ onClose={handleCloseDrawer}
+ open={drawerVisible}
+ width={600}
+ closable={false}
+ bodyStyle={{ fontSize: '12px' }}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ {/* 新增模态框 */}
+
+ 取消
+ ,
+
+ ]}
+ closable={true}
+ >
+ 岗位职责}
+ name="responsibility"
+ rules={[{ required: true, message: '请输入岗位职责' }]}
+ >
+
+
+
+ {/* 其他 */}
+ 其他}
+ name="other"
+ >
+
+
+
+
+
+ {/* 编辑抽屉 */}
+
编辑}
+ placement="right"
+ onClose={handleCloseEditDrawer}
+ open={editDrawerVisible}
+ width={600}
+ closable={false}
+ destroyOnClose={true}
+ bodyStyle={{ fontSize: '12px' }}
+ footer={[
+ ,
+
+ ]}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ );
+};
+
+export default EnvironmentalPersonnelManagement;
diff --git a/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.less b/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.less
new file mode 100644
index 0000000..744c04b
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EnvironmentalPersonnelManagement.less
@@ -0,0 +1,536 @@
+
+
+
+// 表单输入框样式
+.formInput {
+ :global(.ant-input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-select-selector) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-picker-input input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+}
+
+
+.Rcontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+
+ // 第一个div - 高度20%
+ .RcontainerTop {
+ height: 18%;
+ // background-color: #fff;
+ border-radius: 4px;
+ display: flex;
+ flex-direction: column;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ // padding: 15px;
+
+ .blocksContainer {
+ flex: 1;
+ display: flex;
+ gap: 10px;
+ height: 100%;
+
+ .blockItem {
+ flex: 1;
+ height: 100%;
+ display: flex;
+ // background: linear-gradient(170.5deg, #F5F7FF 6.87%, #FFFFFF 47.65%);
+ border-radius: 4px;
+ // border: 2px solid #FFFFFF;
+
+ // 块1 - 蓝色渐变 + SVG背景
+ &.block1 {
+ background:
+ url('@/assets/business_envinformation/background1.svg'),
+
+ linear-gradient(180deg, #DBEBFF 0%, #DBEBFF 12.5%, rgba(255, 255, 255, 0.700824) 56%, rgba(255, 255, 255, 0.01) 100%),
+ linear-gradient(0deg, #FFFFFF, #FFFFFF);
+ // linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块2 - 黄色渐变
+ &.block2 {
+ background:
+ url('@/assets/business_envinformation/background2.svg'),
+ linear-gradient(180deg, #FFFEDB 0%, #F5FFDB 19.23%, #FFFFFF 55.77%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块3 - 绿色渐变
+ &.block3 {
+ background:
+ url('@/assets/business_envinformation/background3.svg'),
+ linear-gradient(180deg, #8CFFCD 0%, #C0FFE4 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块4 - 青色渐变
+ &.block4 {
+ background:
+ url('@/assets/business_envinformation/background4.svg'),
+ linear-gradient(180deg, #C5FFFC 0%, #C0FFFC 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块5 - 红色渐变
+ &.block5 {
+ background:
+ url('@/assets/business_envinformation/background5.svg'),
+ linear-gradient(180deg, #FFD2D2 0%, #FFD9D9 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块6 - 紫色渐变
+ &.block6 {
+ background:
+ url('@/assets/business_envinformation/background6.svg'),
+ linear-gradient(180deg, #F2D7FF 0%, #F4DDFF 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ .blockLeft {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 15px;
+ padding-left: 20px;
+ gap: 8px;
+
+ .blockTitle {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #333333;
+ line-height: 1.2;
+ }
+
+ .blockNumber {
+ font-family: PingFang SC;
+ font-weight: 700;
+ font-size: 24px;
+ color: #333333;
+ line-height: 1.2;
+
+ // 特定数字颜色
+ &.number258 {
+ color: #0080FF;
+ }
+
+ &.number58 {
+ color: #EFB700;
+ }
+
+ &.number51 {
+ color: #00DA86;
+ }
+
+ &.number28 {
+ color: #00DA86;
+ }
+
+ &.number50 {
+ color: #FD0404;
+ }
+
+ &.number58Second {
+ color: #A318E4;
+ }
+ }
+
+ .blockTime {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 10px;
+ color: #999999;
+ line-height: 1.2;
+ }
+
+ .blockChange {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #1269FF;
+ line-height: 1.2;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .arrow {
+ font-size: 14px;
+ font-weight: bold;
+ }
+
+ .checkIcon {
+ font-size: 16px;
+ color: #1269FF;
+ }
+ }
+ }
+
+ .blockRight {
+ flex: 1;
+ height: 100%;
+ background-color: transparent;
+ border-radius: 0 4px 4px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .blockImage {
+ // width: 80%;
+ height: 65%;
+ // height: 80%;
+ object-fit: contain;
+ margin-right: -5px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ // 第三个div - 占满剩余位置
+ .RcontainerBottom {
+ flex: 1; // 占满剩余空间
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ padding: 15px;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+
+ // 第一行 - 表单控件
+ .formRow {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ flex-shrink: 0;
+
+ .addButton {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ height: 28px;
+ border: 1px solid #00D48A;
+ border-radius: 2px;
+ color: #fff;
+ font-weight: 400;
+ font-size: 12px;
+ padding: 0 10px;
+ background: #00D48A;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ }
+
+ .buttonIcon {
+ font-size: 16px;
+ font-weight: bold;
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-left: auto;
+
+ .filterLabel {
+ font-size: 13px;
+ color: #333333;
+ white-space: nowrap;
+ }
+
+ // Select组件样式
+ :global(.ant-select) {
+ font-size: 12px;
+ height: 28px !important;
+ }
+
+ :global(.ant-select .ant-select-selector) {
+ height: 28px !important;
+ font-size: 12px;
+ border-radius: 2px !important;
+ display: flex !important;
+ align-items: center !important;
+ padding: 0 11px !important;
+ }
+
+ :global(.ant-select .ant-select-selection-item) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ }
+
+ :global(.ant-select .ant-select-selection-placeholder) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ color: #00000040 !important;
+ }
+
+ .searchInput {
+ width: 150px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 0 12px;
+ font-size: 12px;
+
+ &:focus {
+ border-color: #2E4CD4;
+ outline: none;
+ }
+
+ &::placeholder {
+ color: #00000040;
+ }
+ }
+
+ .queryButton, .resetButton {
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ padding: 0 16px;
+ font-size: 12px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ border-color: #2E4CD4;
+ color: #2E4CD4;
+ }
+ }
+
+ .queryButton {
+ background-color: #00D48A;
+ color: #fff;
+ border-color: #00D48A;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ color: #fff;
+ }
+ }
+
+ .resetButton {
+ background-color: #fff;
+ color: #666;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+ }
+ }
+
+ // 第二行 - 表格
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+ margin: 16px 0 0 0;
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ }
+ }
+ }
+ }
+ }
+}
+
+// 操作按钮图标样式
+.eye-icon {
+ width: 20px;
+ height: 12.5px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 20px;
+ height: 12.5px;
+ border: 2px solid #86F278;
+ border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
+ top: 0;
+ left: 0;
+ transform: rotate(-180deg);
+ opacity: 1;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 6px;
+ height: 6px;
+ background-color: #86F278;
+ border-radius: 50%;
+ top: 3.5px;
+ left: 7px;
+ transform: rotate(-180deg);
+ }
+}
+
+.edit-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #1890ff;
+ top: 3px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 2px;
+ height: 12px;
+ background-color: #1890ff;
+ top: 2px;
+ left: 7px;
+ transform: rotate(45deg);
+ }
+}
+
+.delete-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(-45deg);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.js b/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.js
new file mode 100644
index 0000000..fea3dd2
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.js
@@ -0,0 +1,58 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EquipmentManagement.less';
+
+// 导入子页面组件
+import WasteGasPollutionControl from './secondary_menu/WasteGasPollutionControl';
+import WastewaterFacilityManagement from './secondary_menu/WastewaterFacilityManagement';
+import ProtectionFacilityMaintenance from './secondary_menu/ProtectionFacilityMaintenance';
+
+const EquipmentManagement = () => {
+ const [activeTab, setActiveTab] = useState('waste-gas-control');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'waste-gas-control',
+ label: '废气污染防治信息',
+ children:
+ },
+ {
+ key: 'wastewater-facility',
+ label: '废水设置运行管理',
+ children:
+ },
+ {
+ key: 'protection-facility',
+ label: '防护设施检维修管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EquipmentManagement;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.less b/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EquipmentManagement.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/EvaluationReport.js b/src/pages/business_emergencyResource copy 3/components/EvaluationReport.js
new file mode 100644
index 0000000..3015091
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EvaluationReport.js
@@ -0,0 +1,57 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EvaluationReport.less';
+
+// 导入子页面组件
+import PermitStatistics from './secondary_menu/PermitStatistics';
+import EnvironmentalTaskList from './secondary_menu/EnvironmentalTaskList';
+import DischargePermitManagement from './secondary_menu/DischargePermitManagement';
+
+const EvaluationReport = () => {
+ const [activeTab, setActiveTab] = useState('permit-statistics');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'permit-statistics',
+ label: '许可证信息统计表',
+ children:
+ },
+ {
+ key: 'environmental-task-list',
+ label: '环保管理任务清单',
+ children:
+ },
+ {
+ key: 'discharge-permit-management',
+ label: '排污许可执行管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EvaluationReport;
diff --git a/src/pages/business_emergencyResource copy 3/components/EvaluationReport.less b/src/pages/business_emergencyResource copy 3/components/EvaluationReport.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/EvaluationReport.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.js b/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.js
new file mode 100644
index 0000000..3e4b6b5
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.js
@@ -0,0 +1,716 @@
+
+import React, { useEffect, useRef, useState } from 'react';
+import { Card, Result, Select, Button } from 'antd';
+import * as echarts from 'echarts';
+import StandardTable from '@/components/StandardTable';
+import styles from './OnlineMonitoring.less';
+
+import alarm0 from '@/assets/safe_majorHazard/online_monitoring/alarm0.png';
+import alarm1 from '@/assets/safe_majorHazard/online_monitoring/alarm1.png';
+import alarm2 from '@/assets/safe_majorHazard/online_monitoring/alarm2.png';
+import alarm3 from '@/assets/safe_majorHazard/online_monitoring/alarm3.png';
+import exportIcon from '@/assets/safe_majorHazard/online_monitoring/export.png';
+import deleteIcon from '@/assets/safe_majorHazard/online_monitoring/delete.png';
+
+const OnlineMonitoring = () => {
+ const chartRef = useRef(null);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 5,
+ total: 0,
+ });
+
+ useEffect(() => {
+ if (chartRef.current) {
+ const chart = echarts.init(chartRef.current);
+
+ const option = {
+ color: ['#04A7F3', '#E7C42C', '#EC6941'],
+
+ legend: {
+ data: ['液位', '温度', '压力'],
+ top: "-3px",
+ left: "center",
+ itemGap: 40, // 图例间距
+ textStyle: {
+ fontSize: 10
+ }
+ },
+ grid: {
+ left: '2%',
+ right: '4%',
+ bottom: '2%',
+ top: '12%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: ['0:00', '2:00', '4:00', '6:00', '8:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00', '22:00', '24:00'],
+ axisLabel: {
+ fontSize: 10
+ }
+ },
+ yAxis: {
+ type: 'value',
+ min: 0,
+ max: 500,
+ axisLabel: {
+ formatter: '{value}',
+ fontSize: 10
+ }
+ },
+ series: [
+ {
+ name: '液位',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#04A7F3'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(4, 167, 243, 0.3)' },
+ { offset: 1, color: 'rgba(4, 167, 243, 0)' }
+ ]
+ }
+ },
+ symbol: 'none', // 不显示数据点
+ data: [120, 200, 150, 300, 250, 400, 350, 280, 320, 180, 220, 160, 140]
+ },
+ {
+ name: '温度',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#E7C42C'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(231, 196, 44, 0.3)' },
+ { offset: 1, color: 'rgba(231, 196, 44, 0)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [80, 120, 100, 180, 160, 220, 200, 150, 170, 90, 110, 85, 75]
+ },
+ {
+ name: '压力',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#EC6941'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 1,
+ x2: 0,
+ y2: 0,
+ colorStops: [
+ { offset: 0, color: 'rgba(236, 105, 65, 0)' },
+ { offset: 1, color: 'rgba(236, 105, 65, 0.3)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [200, 300, 250, 450, 400, 430, 480, 420, 480, 280, 320, 260, 240]
+ }
+ ]
+ };
+
+ chart.setOption(option);
+
+ // 响应式调整 - 使用ResizeObserver监听容器尺寸变化
+ let resizeTimer = null;
+ const handleResize = () => {
+ // 防抖处理,避免频繁调用resize
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ resizeTimer = setTimeout(() => {
+ chart.resize();
+ }, 100);
+ };
+
+ // 监听窗口大小变化
+ window.addEventListener('resize', handleResize);
+
+ // 监听容器尺寸变化(解决菜单栏伸缩时的自适应问题)
+ let resizeObserver = null;
+ if (window.ResizeObserver) {
+ resizeObserver = new ResizeObserver(() => {
+ // 使用setTimeout确保DOM更新完成后再调整图表
+ setTimeout(() => {
+ handleResize();
+ }, 0);
+ });
+ resizeObserver.observe(chartRef.current);
+ }
+
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ if (resizeObserver) {
+ resizeObserver.disconnect();
+ }
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ chart.dispose();
+ };
+ }
+ }, []);
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '编号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 5;
+ const number = (page - 1) * pageSize + index + 1;
+ return `0${number}`.slice(-2);
+ }
+ },
+ {
+ title: '报警时间',
+ dataIndex: 'alarmTime',
+ key: 'alarmTime',
+ width: 150,
+ },
+ {
+ title: '报警传感器名称',
+ dataIndex: 'sensorName',
+ key: 'sensorName',
+ width: 150,
+ },
+ {
+ title: '报警类型',
+ dataIndex: 'alarmType',
+ key: 'alarmType',
+ width: 120,
+ },
+ {
+ title: '报警内容',
+ dataIndex: 'alarmContent',
+ key: 'alarmContent',
+ width: 200,
+ },
+ {
+ title: '优先级',
+ dataIndex: 'priority',
+ key: 'priority',
+ width: 80,
+ render: (text) => {
+ const colorMap = {
+ '高': '#FF4D4F',
+ '中': '#FAAD14',
+ '低': '#52C41A'
+ };
+ return {text};
+ }
+ },
+ {
+ title: '处理状态',
+ dataIndex: 'status',
+ key: 'status',
+ width: 100,
+ render: (text) => {
+ const statusMap = {
+ '未处理': { color: '#FF4D4F', bg: '#FFF2F0' },
+ '处理中': { color: '#FAAD14', bg: '#FFFBE6' },
+ '已处理': { color: '#52C41A', bg: '#F6FFED' }
+ };
+ const status = statusMap[text] || { color: '#333', bg: '#F5F5F5' };
+ return (
+
+ {text}
+
+ );
+ }
+ },
+ {
+ title: '处理时间',
+ dataIndex: 'processTime',
+ key: 'processTime',
+ width: 150,
+ },
+ {
+ title: '处理人',
+ dataIndex: 'processor',
+ key: 'processor',
+ width: 100,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+
+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ alarmTime: '2024-01-15 08:30:25',
+ sensorName: 'LNG储罐',
+ alarmType: '温度超限',
+ alarmContent: '储罐温度超过安全阈值',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '2',
+ id: '002',
+ alarmTime: '2024-01-15 09:15:10',
+ sensorName: 'LNG储罐',
+ alarmType: '压力异常',
+ alarmContent: '管道压力异常波动',
+ priority: '中',
+ status: '处理中',
+ processTime: '2024-01-15 09:20:00',
+ processor: '张三',
+ },
+ {
+ key: '3',
+ id: '003',
+ alarmTime: '2024-01-15 10:45:30',
+ sensorName: 'LNG储罐',
+ alarmType: '液位异常',
+ alarmContent: '储罐液位低于警戒线',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 11:00:15',
+ processor: '李四',
+ },
+ {
+ key: '4',
+ id: '004',
+ alarmTime: '2024-01-15 11:20:45',
+ sensorName: 'LNG储罐',
+ alarmType: '气体泄漏',
+ alarmContent: '检测到可燃气体泄漏',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '5',
+ id: '005',
+ alarmTime: '2024-01-15 12:10:20',
+ sensorName: 'LNG储罐',
+ alarmType: '设备振动',
+ alarmContent: '设备异常振动',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 12:30:00',
+ processor: '王五',
+ },
+ {
+ key: '6',
+ id: '006',
+ alarmTime: '2024-01-15 13:25:15',
+ sensorName: 'LNG管道',
+ alarmType: '流量异常',
+ alarmContent: '管道流量异常波动',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '7',
+ id: '007',
+ alarmTime: '2024-01-15 14:10:30',
+ sensorName: 'LNG储罐',
+ alarmType: '温度异常',
+ alarmContent: '储罐温度异常升高',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 14:15:00',
+ processor: '赵六',
+ },
+ {
+ key: '8',
+ id: '008',
+ alarmTime: '2024-01-15 15:45:20',
+ sensorName: 'LNG管道',
+ alarmType: '压力超限',
+ alarmContent: '管道压力超过安全阈值',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 16:00:00',
+ processor: '孙七',
+ },
+ {
+ key: '9',
+ id: '009',
+ alarmTime: '2024-01-15 16:30:45',
+ sensorName: 'LNG储罐',
+ alarmType: '液位超限',
+ alarmContent: '储罐液位超过警戒线',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '10',
+ id: '010',
+ alarmTime: '2024-01-15 17:15:10',
+ sensorName: 'LNG管道',
+ alarmType: '泄漏检测',
+ alarmContent: '检测到轻微气体泄漏',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 17:30:00',
+ processor: '周八',
+ },
+ {
+ key: '11',
+ id: '011',
+ alarmTime: '2024-01-15 18:20:35',
+ sensorName: 'LNG储罐',
+ alarmType: '设备故障',
+ alarmContent: '储罐阀门异常关闭',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 18:25:00',
+ processor: '吴九',
+ },
+ {
+ key: '12',
+ id: '012',
+ alarmTime: '2024-01-15 19:05:50',
+ sensorName: 'LNG管道',
+ alarmType: '温度异常',
+ alarmContent: '管道温度异常下降',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 导出功能
+ const handleExport = () => {
+ console.log('导出数据');
+ // 这里可以添加导出逻辑
+ };
+
+ // 批量删除功能
+ const handleBatchDelete = () => {
+ if (selectedRowKeys.length === 0) {
+ console.log('没有选中任何行');
+ // 可以在这里添加提示用户选择行的逻辑
+ return;
+ }
+ console.log('批量删除', selectedRowKeys);
+ // 这里可以添加批量删除逻辑
+ };
+
+ return (
+
+
+
+
+
+
+

+
+
+
+
总报警
+
1456
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
一级报警
+
357
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
二级报警
+
401
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
三级报警
+
556
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+ {/* 表格 */}
+
+ {/* 首行 左侧标题左对齐 右侧按钮右对齐 */}
+
+
+
+
+
+
+
+
+
+ {/* 表格 5行10列 带页码 每页5条数据 */}
+
+
+ `共 ${total} 条`,
+ }}
+ scroll={{ x: 1200 }}
+ />
+
+
+
+ );
+};
+
+export default OnlineMonitoring;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.less b/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.less
new file mode 100644
index 0000000..283ce83
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/OnlineMonitoring.less
@@ -0,0 +1,919 @@
+.Ocontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .OcontainerTop {
+ display: flex;
+
+ height: 50%;
+ margin-bottom: 5px;
+
+ .OcontainerTopLeft {
+ width: 72%;
+ height: 100%;
+ // background-color: pink;
+ margin-right: 10px;
+ // display: flex;
+
+ .OcontainerTopLeftTop {
+ width: 100%;
+ height: 35%;
+ display: flex;
+ gap: 12px;
+
+ .alarmO {
+ flex: 1;
+ height: 100%;
+ background-color: #F4F7FF;
+ border: 1px solid #AED3FF;
+ border-bottom: 0px solid #AED3FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #5382FE33 inset;
+ display: flex;
+
+ .alarmOLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmORight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmORightText1 {
+ margin-top: 15px;
+ }
+
+
+ .alarmORightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmORightText3 {
+ display: flex;
+ gap: 22px;
+ }
+
+ }
+
+
+
+ }
+
+ .alarmTw {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF5f4;
+ border: 1px solid #FFC5BC;
+ border-bottom: 0px solid #FFC5BC;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FE5F4C33 inset;
+ display: flex;
+
+ .alarmTwLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmTwRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmTwRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmTwRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmTwRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmTh {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF7F2;
+ border: 1px solid #FFD9B2;
+ border-bottom: 0px solid #FFD9B2;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FD883C33 inset;
+ display: flex;
+
+ .alarmThLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmThRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmThRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmThRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmThRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmF {
+ flex: 1;
+ height: 100%;
+ background-color: #EFF9FF;
+ border: 1px solid #89E1FF;
+ border-bottom: 0px solid #89E1FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #22A4FD33 inset;
+ display: flex;
+
+ .alarmFLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmFRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmFRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmFRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmFRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottom {
+ margin-top: 12px;
+ background-color: #fff;
+ width: 100%;
+ height: 60%;
+
+ .OcontainerTopLeftBottomTitle {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // padding: 8px 15px;
+ padding: 8px 15px 0px 15px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .titleRight {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ font-family: PingFang SC;
+ font-style: Medium;
+ font-size: 13px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .selectBox {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ background-color: #fff;
+ font-size: 12px;
+ color: #333;
+ outline: none;
+
+ &:focus {
+ border-color: #2E4CD4;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottomChart {
+ flex: 1;
+ width: 100%;
+ height: 75%;
+ }
+ }
+ }
+
+ .OcontainerTopRight {
+ flex: 1;
+ height: calc(100% - 3.3px);
+ background-color: #fff;
+ background-image: url('@/assets/safe_majorHazard/online_monitoring/backTopRight.png');
+ background-size: 100% auto;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+
+ .realTimeDataHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 15px;
+ margin-bottom: 10px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .totalCount {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ }
+ }
+
+ .dataItem {
+ height: 23%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 2px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: PingFang SC;
+ font-size: 14px;
+ // color: #666;
+ background-color: #EFF9FF;
+
+ &:last-child {
+ // margin-bottom: 1px;
+ }
+ }
+
+ .dataItem1 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1; // 强制宽高比1:1
+
+ .outerCircle {
+
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem2 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 197, 188, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fff5f4;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(254, 214, 209, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(253, 41, 14, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem3 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 217, 178, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fef6f1;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 234, 218, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(252, 103, 18, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem4 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ .OcontainerBottom {
+ background-color: #fff;
+ flex: 1;
+ padding: 8px 15px 5px 15px;
+ display: flex;
+ flex-direction: column;
+
+ .tableHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // margin-bottom: 15px;
+ padding-bottom: 5px;
+ // border-bottom: 1px solid #f0f0f0;
+
+ .tableTitle {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .tableActions {
+ display: flex;
+ gap: 8px;
+
+ // 自定义按钮样式
+ :global(.ant-btn) {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ // 主要按钮样式
+ &.ant-btn-primary {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 危险按钮样式
+ &.ant-btn-dangerous {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 禁用状态
+ &:disabled {
+ background-color: #f5f5f5 !important;
+ border-color: #d9d9d9 !important;
+ color: #bfbfbf !important;
+ box-shadow: none !important;
+ }
+ }
+ }
+ }
+
+ .tableContainer {
+ flex: 1;
+ overflow: hidden;
+
+ :global(.ant-table) {
+ font-size: 12px;
+ }
+
+ :global(.ant-table-thead > tr > th) {
+ background-color: #f5f5fa;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+ border-bottom: 1px solid #f0f0f0;
+ padding: 8px 12px;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ padding: 8px 12px;
+ border-bottom: 1px solid #f0f0f0;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr:hover > td) {
+ background-color: #f5f5f5;
+ }
+
+ :global(.ant-pagination) {
+ margin-top: 16px;
+ text-align: right;
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.js b/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.js
new file mode 100644
index 0000000..40494a0
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.js
@@ -0,0 +1,656 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { Select, Button, Table, Input, Space, Tooltip, message } from 'antd';
+import { SearchOutlined, PlusOutlined, FileTextOutlined, DeleteOutlined, EditOutlined, MoreOutlined, RobotOutlined } from '@ant-design/icons';
+import ReactECharts from 'echarts-for-react';
+import { history } from 'umi';
+import StandardTable from '@/components/StandardTable';
+import styles from './PollutionSourceManagement.less';
+import icon_water from '@/assets/business_envinformation/icon_water.svg';
+import icon_soil from '@/assets/business_envinformation/icon_soil.svg';
+import icon_factory from '@/assets/business_envinformation/icon_atmosphere.svg';
+
+
+
+const { Option } = Select;
+
+const PollutionSourceManagement = () => {
+ const [loading, setLoading] = useState(false);
+ const [chartReady, setChartReady] = useState(false);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [tableData, setTableData] = useState({
+ list: [],
+ pagination: {
+ current: 1,
+ pageSize: 5,
+ total: 85
+ }
+ });
+
+ // 确保DOM准备好后再渲染图表
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setChartReady(true);
+ }, 100);
+ return () => clearTimeout(timer);
+ }, []);
+
+ // 污染物排放统计图表配置 - 闭合环图+进度饼图
+ const pollutantEmissionOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F6F1E8',
+ shadowBlur: 4,
+ shadowColor: '#FFF5F0',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: 'rgba(255, 227, 208, 0.6)', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 62,
+ name: '超标污染物数量',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 1, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#FFF4B3' },
+ { offset: 0.5, color: '#FF8351' },
+ { offset: 1, color: '#FF7125' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 38,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标污染物种类统计图表配置 - 闭合环图+进度饼图
+ const pollutantTypeOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F2F0FF',
+ shadowBlur: 4,
+ shadowColor: '#F2F0FF',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: '#E4E1FB', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 25,
+ name: '超标污染物种类',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#B3D6FF' },
+ { offset: 0.476, color: '#9E7DFF' },
+ { offset: 1, color: '#2549FF' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 75,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标排放统计图表配置
+ const exceedanceOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ },
+ formatter: function (params) {
+ const data = params[0];
+ const exceedanceData = [
+ { name: '污染物1', status: '轻微超标', exceedance: '15%' },
+ { name: '污染物2', status: '严重超标', exceedance: '66%' },
+ { name: '污染物3', status: '轻微超标', exceedance: '8%' },
+ { name: '污染物4', status: '正常', exceedance: '0%' },
+ { name: '污染物5', status: '轻微超标', exceedance: '12%' }
+ ];
+ const item = exceedanceData[data.dataIndex];
+ return `
+
+
${data.name}
+
${item.status}
+
超标 ${item.exceedance}
+
大气环境特征污染物
+
+ `;
+ }
+ },
+ grid: {
+ left: '12%',
+ right: '5%',
+ top: '5%',
+ bottom: '12%'
+ },
+ xAxis: {
+ type: 'value',
+ max: 100,
+ min: 0,
+ interval: 10,
+ splitNumber: 10,
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6',
+ width: 1
+ }
+ },
+ axisTick: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisLabel: {
+ color: '#666',
+ formatter: function (value) {
+ return value;
+ }
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: '#f0f0f0',
+ type: 'dashed'
+ }
+ }
+ },
+ yAxis: {
+ type: 'category',
+ data: ['污染物1', '污染物2', '污染物3', '污染物4', '污染物5'],
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisTick: {
+ show: false
+ },
+ axisLabel: {
+ color: '#666',
+ fontSize: 12
+ }
+ },
+ series: [{
+ type: 'bar',
+ data: [45, 66, 32, 28, 38],
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 1,
+ y2: 0,
+ colorStops: [{
+ offset: 0, color: '#FFEBD9'
+ }, {
+ offset: 1, color: '#FF0000'
+ }]
+ },
+ // borderRadius: [0, 4, 0, 0]
+ },
+ barWidth: '60%',
+ barCategoryGap: '20px'
+ }]
+ };
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '生产工艺设备',
+ dataIndex: 'equipment',
+ key: 'equipment',
+ width: 120,
+ },
+ {
+ title: '原材料产品',
+ dataIndex: 'material',
+ key: 'material',
+ width: 150,
+ },
+ {
+ title: '污染物排放处理设施',
+ dataIndex: 'facility',
+ key: 'facility',
+ width: 180,
+ },
+ {
+ title: '污染物排放种类',
+ dataIndex: 'type',
+ key: 'type',
+ width: 150,
+ render: (text) => (
+
+ {text}
+ {/* */}
+
+ ),
+ },
+ {
+ title: '排放数量',
+ dataIndex: 'quantity',
+ key: 'quantity',
+ width: 100,
+ },
+ {
+ title: '数量单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ },
+ {
+ title: '排放方式',
+ dataIndex: 'method',
+ key: 'method',
+ width: 100,
+ },
+ {
+ title: '趋向',
+ dataIndex: 'trend',
+ key: 'trend',
+ width: 200,
+ ellipsis: true,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 80,
+ render: (_, record) => (
+
+
+ handleDelete(record)}
+ />
+
+
+ ),
+ },
+ ];
+
+ // 模拟表格数据
+ const mockTableData = [
+ {
+ key: '1',
+ equipment: '比亚迪',
+ material: '丁硼乳膏(雅皓)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 47,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '2',
+ equipment: '荣威',
+ material: '东方活血膏(明仁)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 34,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '3',
+ equipment: '现代',
+ material: '骨友灵搽剂(太极)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 45,
+ unit: 'm³',
+ method: '方式1',
+ trend: '刘某及同伴三人前往该射'
+ },
+ {
+ key: '4',
+ equipment: '日产',
+ material: '对乙酰氨基酚栓',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 55,
+ unit: 'm³',
+ method: '方式1',
+ trend: '一到假期,大量"xx暑假'
+ },
+ {
+ key: '5',
+ equipment: '北汽',
+ material: '对乙酰氨基酚片(必理通)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 22,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近日,陕西延安培文实验'
+ },
+ {
+ key: '6',
+ equipment: '吉利',
+ material: '阿莫西林胶囊(联邦)',
+ facility: '污水处理设备001',
+ type: '种类2',
+ quantity: 38,
+ unit: 'kg',
+ method: '方式2',
+ trend: '环保部门加强监管力度,排放标准逐步提高'
+ },
+ {
+ key: '7',
+ equipment: '长城',
+ material: '布洛芬缓释胶囊(芬必得)',
+ facility: '废气处理设备002',
+ type: '种类3',
+ quantity: 29,
+ unit: 't',
+ method: '方式3',
+ trend: '企业积极响应绿色生产号召,投入环保设施'
+ },
+ {
+ key: '8',
+ equipment: '奇瑞',
+ material: '复方甘草片(太极)',
+ facility: '固废处理设备003',
+ type: '种类4',
+ quantity: 15,
+ unit: 'm³',
+ method: '方式4',
+ trend: '定期进行环境监测,确保排放达标'
+ }
+ ];
+
+ useEffect(() => {
+ setTableData({
+ list: mockTableData,
+ pagination: {
+ current: 6,
+ pageSize: 5,
+ total: 85
+ }
+ });
+ }, []);
+
+ // 处理删除操作
+ const handleDelete = (record) => {
+ message.success(`删除 ${record.equipment} 成功`);
+ };
+
+ // 处理新增操作
+ const handleAdd = () => {
+ message.info('新增功能开发中');
+ };
+
+ // 处理生成报表操作
+ const handleGenerateReport = () => {
+ message.info('生成报表功能开发中');
+ };
+
+ // 处理表格变化
+ const handleTableChange = (pagination) => {
+ setTableData(prev => ({
+ ...prev,
+ pagination: {
+ ...prev.pagination,
+ current: pagination.current,
+ pageSize: pagination.pageSize
+ }
+ }));
+ };
+
+ // 处理大气环境点击
+ const handleAtmosphereCardClick = () => {
+ history.push('/topnavbar00/business/atmospherePollutantLibrary');
+ };
+
+
+ return (
+
+ {/* 顶部统计区域 */}
+
+ {/* 污染物排放统计 */}
+
+
+
污染物排放统计
+
+
+
+
+
+
+
+ {/*
超标污染物数量
*/}
+ {chartReady && (
+
+ )}
+
+
+
+ {/*
超标污染物种类
*/}
+ {chartReady && (
+
+ )}
+
+
+
+
+
+ {/* 超标排放统计 */}
+
+
+
超标排放统计
+
+
+
+
+
+
+ {chartReady && (
+
+ )}
+
+
+
+ {/* 环境分类卡片 */}
+
+
+
+
AIR POLLUSION
+
+
+

+
+
+
+
WATER POLLUSION
+
+
+

+
+
+
+
SOILPOLLUSION
+
+
+

+
+
+
+
+
+
+ {/* 污染源管理表格区域 */}
+
+
+
污染源管理
+
+ }
+ onClick={handleAdd}
+ className={styles.titleAddButton}
+ >
+ 新增
+
+ }
+ onClick={handleGenerateReport}
+ className={styles.titleReportButton}
+ >
+ 生成报表
+
+
+
+
+
({
+ name: record.name,
+ }),
+ }}
+ pagination={{
+ showTotal: (total, range) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ pageSizeOptions: ['5', '10', '20', '50', '100'],
+ defaultPageSize: 5,
+ size: 'small',
+ }}
+ />
+
+
+ );
+};
+
+export default PollutionSourceManagement;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.less b/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.less
new file mode 100644
index 0000000..7f48f4c
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/PollutionSourceManagement.less
@@ -0,0 +1,590 @@
+.pollutionDashboard {
+ width: 100%;
+ min-height: 75vh;
+ // background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding: 15px;
+ box-sizing: border-box;
+
+ // 顶部统计区域
+ .statsSection {
+ display: flex;
+ gap: 15px;
+ margin-bottom: 15px;
+ height: 35vh;
+ align-items: stretch;
+
+ // 污染物排放统计卡片
+ .pollutantStatsCard {
+ width: 37%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background7.svg'),
+ linear-gradient(180deg, #E2FFF5 0%, rgba(255, 255, 255, 0.6) 51.44%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+ }
+
+ // 超标排放统计卡片
+ .exceedanceStatsCard {
+ width: 40%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background8.svg'),
+ linear-gradient(180.21deg, rgba(255, 227, 227, 0.58) 0.18%, #FFFFFF 53.1%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .exceedanceTimeFilter,
+ .exceedanceCategoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #FFC3C3;
+ background: #FFDEDEB2;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 卡片头部筛选器
+ .cardHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 0;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0;
+ border: none;
+ flex-shrink: 0;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .timeFilter,
+ .categoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #73E9C6;
+ background: #C0FFE9AB;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 图表容器
+ .chartsContainer {
+ display: flex;
+ gap: 20px;
+ justify-content: space-between;
+ background: transparent;
+ flex: 1;
+
+ .pieChartContainer {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ background: transparent;
+ height: 100%;
+ min-height: 200px;
+
+ .chartTitle {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 10px;
+ font-weight: 500;
+ background: transparent;
+ }
+
+ .chartCenterContent {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 10;
+ background: transparent;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .chartValue {
+ font-size: 18px;
+ font-weight: bold;
+ color: #FF2F2F;
+ background: transparent;
+ margin: 0;
+ line-height: 1;
+ }
+
+ .chartLabel {
+ font-size: 12px;
+ font-weight: 500;
+ color: #000000;
+ background: transparent;
+ margin: 0;
+ margin-top: 2px;
+ line-height: 1;
+ }
+ }
+ }
+
+ // 条形图容器
+ .barChartContainer {
+ flex: 1;
+ margin-top: 10px;
+ }
+
+ // 环境分类卡片区域
+ .environmentalCategories {
+ flex: 1; // 撑满剩余宽度
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ // background-color: pink;
+
+ .categoryCard1 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(27, 201, 181, 0.2) 0%, rgba(58, 255, 216, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .airPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 255, 217, 0.1) 2.62%, rgba(0, 153, 131, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard2 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(36, 149, 255, 0.2) 0%, rgba(85, 164, 255, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .waterPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 170, 255, 0.1) 2.62%, rgba(89, 186, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard3 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(25, 60, 234, 0.2) 0%, rgba(139, 193, 255, 0) 100%);
+ position: relative;
+ cursor: pointer;
+ padding: 5px 15px;
+
+ .soilPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 89, 255, 0.1) 2.62%, rgba(89, 117, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryContent {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .categoryInfo {
+ flex: 1;
+
+ .titleContainer {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 5px;
+ }
+
+ .categoryTitle {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 0px;
+
+ &.atmosphereGradient {
+ background: linear-gradient(183.17deg, #0EE5C5 2.62%, #08C2C2 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.atmosphereMirror {
+ background: linear-gradient(183.17deg, rgba(168, 255, 242, 0) 2.62%, rgba(86, 237, 214, 0) 65.7%, #00D9B9 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.waterGradient {
+ background: linear-gradient(183.17deg, #40AFFF 2.62%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.waterMirror {
+ background: linear-gradient(183.17deg, rgba(64, 175, 255, 0) 2.62%, rgba(0, 179, 255, 0) 65.7%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.soilGradient {
+ background: linear-gradient(183.17deg, #6E90FF 2.62%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.soilMirror {
+ background: linear-gradient(183.17deg, rgba(110, 144, 255, 0) 2.62%, rgba(61, 144, 239, 0) 65.7%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+ }
+
+ .categorySubtitle {
+ font-size: 12px;
+ color: #666;
+
+ &.pollutantSubtitle {
+ color: rgba(51, 51, 51, 1);
+ font-family: 'Alibaba PuHuiTi', sans-serif;
+ font-weight: 500;
+ font-size: 14px;
+ line-height: 22px;
+ letter-spacing: 4%;
+ margin-top: -20px;
+ }
+ }
+ }
+
+ .categoryIcon {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 5px;
+ // border-radius: 50%;
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+
+ .factoryIcon,
+ .waterIcon,
+ .soilIcon {
+ font-size: 20px;
+ filter: grayscale(0);
+ }
+ }
+ }
+ }
+ }
+
+ // 表格卡片
+ .tableCard {
+ background: #fff;
+ border-radius: 2px;
+ // box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ // border: 1px solid rgba(255, 255, 255, 0.2);
+ // backdrop-filter: blur(10px);
+ padding: 20px;
+
+ .cardTitle {
+ // background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
+ color: rgba(0, 0, 0, 1);
+ font-weight: 500;
+ font-size: 16px;
+ padding: 12px 16px;
+ margin: -20px -20px 10px -20px;
+ // border-radius: 12px 12px 0 0;
+ // border-bottom: 2px solid #e8f4fd;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .titleButtons {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+
+ .titleAddButton {
+ background: rgba(0, 212, 138, 1);
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+ }
+ }
+
+ .titleReportButton {
+ border-radius: 4px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #666;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ transform: translateY(-1px);
+ }
+ }
+ }
+ }
+ }
+
+
+ // 自定义Tooltip样式
+ .customTooltip {
+ background: rgba(0, 0, 0, 0.8);
+ border-radius: 8px;
+ padding: 10px;
+ color: white;
+ font-size: 12px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+
+ .tooltipLabel {
+ font-weight: 600;
+ margin-bottom: 5px;
+ color: #fff;
+ }
+
+ .tooltipStatus {
+ color: #ff6b6b;
+ margin-bottom: 3px;
+ }
+
+ .tooltipExceedance {
+ color: #ffd93d;
+ margin-bottom: 3px;
+ }
+
+ .tooltipType {
+ color: #a8e6cf;
+ font-size: 11px;
+ }
+ }
+
+ // 响应式设计
+ @media (max-width: 1200px) {
+ .statsSection {
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: auto auto;
+
+ .environmentalCategories {
+ grid-column: 1 / -1;
+ flex-direction: row;
+ gap: 15px;
+
+ .categoryCard {
+ flex: 1;
+ }
+ }
+ }
+ }
+
+ @media (max-width: 768px) {
+ padding: 10px;
+
+ .statsSection {
+ grid-template-columns: 1fr;
+ gap: 15px;
+
+ .environmentalCategories {
+ flex-direction: column;
+ }
+ }
+
+ }
+
+ // 表格样式优化
+ :global(.ant-table) {
+ // border-radius: 8px;
+ overflow: hidden;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.85);
+
+ :global(.ant-table-thead > tr > th) {
+ // background: linear-gradient(90deg, #f8f9fa 0%, #e9ecef 100%);
+ // border-bottom: 2px solid #dee2e6;
+ font-weight: 400;
+
+ }
+
+ :global(.ant-table-tbody > tr) {
+ // transition: all 0.3s ease;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ // border-bottom: 1px solid #f0f0f0;
+ }
+ }
+
+ // 分页器样式
+ // :global(.ant-pagination) {
+ // margin-top: 20px;
+ // text-align: center;
+
+ // :global(.ant-pagination-item) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+
+ // &.ant-pagination-item-active {
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ // border-color: #667eea;
+ // color: white;
+ // }
+ // }
+
+ // :global(.ant-pagination-prev),
+ // :global(.ant-pagination-next) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+ // }
+ // }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.js
new file mode 100644
index 0000000..765d995
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.js
@@ -0,0 +1,345 @@
+import React, { useState } from 'react';
+import { Button, Input, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, UploadOutlined, DownloadOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './DischargePermitManagement.less';
+// import attachment from '@/assets/business_envinformation/attachment.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+
+const DischargePermitManagement = () => {
+ const [activeTab, setActiveTab] = useState('actual');
+
+ // 实际排放数据
+ const actualEmissionData = [
+ { key: 1, emissionType: '前林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 3, emissionType: '长家界市', pollutant: '12345678', outletType: '环境设计', outletName: '上海环境科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 4, emissionType: '北京市', pollutant: '87654321', outletType: '污染治理', outletName: '北京环保科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 5, emissionType: '上海市', pollutant: '11223344', outletType: '排放监测', outletName: '上海监测技术有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 6, emissionType: '广州市', pollutant: '55667788', outletType: '工业废水', outletName: '广州环保科技股份有限公司', permittedEmission: '3年', annualTotal: '2025-09-10' },
+ { key: 7, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 8, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' },
+ { key: 9, emissionType: '南京市', pollutant: '77889900', outletType: '工业废气', outletName: '南京工业集团股份有限公司', permittedEmission: '6年', annualTotal: '2025-06-15' },
+ { key: 10, emissionType: '武汉市', pollutant: '11223355', outletType: '交通污染', outletName: '武汉交通发展有限公司', permittedEmission: '3年', annualTotal: '2025-11-20' },
+ { key: 11, emissionType: '成都市', pollutant: '66778899', outletType: '建筑扬尘', outletName: '成都建筑工程有限公司', permittedEmission: '5年', annualTotal: '2025-05-30' },
+ { key: 12, emissionType: '西安市', pollutant: '44556677', outletType: '餐饮油烟', outletName: '西安餐饮管理有限公司', permittedEmission: '4年', annualTotal: '2025-12-10' }
+ ];
+
+ // 超标排放数据
+ const excessiveEmissionData = [
+ { key: 1, emissionType: '俞林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-09' },
+ { key: 3, emissionType: '长家界市', pollutant: '1716652546', outletType: '环境设计', outletName: '水木晨曦(北京)科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 4, emissionType: '潭市', pollutant: '384654762', outletType: '电子竞技运动与管理', outletName: '亚商桥(北京)咨询有限公司', permittedEmission: '5年', annualTotal: '2025-08-18' },
+ { key: 5, emissionType: '次州市', pollutant: '34669295254', outletType: '精算学', outletName: '中讯通讯科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-13' },
+ { key: 6, emissionType: '驻马店市', pollutant: '4347052411', outletType: '数字媒体艺术', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-21' },
+ { key: 7, emissionType: '三亚市', pollutant: '388946891', outletType: '技术侦察学', outletName: '中大国际文化有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 8, emissionType: '巢湖市', pollutant: '7190228566', outletType: '财政学', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-20' },
+ { key: 9, emissionType: '东营市', pollutant: '6656363924', outletType: '保险学', outletName: '北京济丰国际医院管理有限公司', permittedEmission: '5年', annualTotal: '2025-08-27' },
+ { key: 10, emissionType: '九龙', pollutant: '622145211', outletType: '英语', outletName: '北京庆奔科贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-28' },
+ { key: 11, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 12, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' }
+ ];
+
+ // 污染治理设备异常情况数据
+ const equipmentAbnormalData = [
+ { key: 1, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 2, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 3, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 4, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 5, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 6, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 7, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 8, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 9, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 10, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 11, emissionType: '类型2', pollutant: '11:20:15—11:45:30', outletType: '风机', outletName: '磨损', permittedEmission: '因子名称2', annualTotal: '风机10m内' },
+ { key: 12, emissionType: '类型3', pollutant: '14:30:20—15:10:40', outletType: '泵站', outletName: '堵塞', permittedEmission: '因子名称3', annualTotal: '泵站15m内' }
+ ];
+
+ // 实际排放和超标排放的表格列定义
+ const normalColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '排放物类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '污染物',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 100,
+ },
+ {
+ title: '排放口类型',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 160,
+ },
+ {
+ title: '排放口编号/排放口名称',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 220,
+ },
+ {
+ title: '许可排放量(吨)',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 120,
+ },
+ {
+ title: '年度合计',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '第一季度',
+ key: 'q1',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '二季度',
+ key: 'q2',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '三季度',
+ key: 'q3',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '四季度',
+ key: 'q4',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 污染治理设备异常情况的表格列定义
+ const equipmentColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '故障类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '超标时段(开始时段—结束时段)',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 200,
+ },
+ {
+ title: '故障设施',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 100,
+ },
+ {
+ title: '故障原因',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 100,
+ },
+ {
+ title: '排放因子',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 100,
+ },
+ {
+ title: '排放范围',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '排放因子浓度(mg/m³或dB(A))',
+ key: 'concentration',
+ width: 200,
+ render: () => '2025-08-15',
+ },
+ {
+ title: '应对',
+ key: 'response',
+ width: 80,
+ render: () => '—',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 获取当前标签页的数据
+ const getCurrentData = () => {
+ switch (activeTab) {
+ case 'actual':
+ return actualEmissionData;
+ case 'excessive':
+ return excessiveEmissionData;
+ case 'equipment':
+ return equipmentAbnormalData;
+ default:
+ return actualEmissionData;
+ }
+ };
+
+ // 获取当前标签页的列定义
+ const getCurrentColumns = () => {
+ switch (activeTab) {
+ case 'actual':
+ case 'excessive':
+ return normalColumns;
+ case 'equipment':
+ return equipmentColumns;
+ default:
+ return normalColumns;
+ }
+ };
+
+ // 分页配置
+ const pagination = {
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ showTotal: (total) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ 筛选条件
+
+
+ }
+ className={styles.queryBtn}
+ >
+ 查询
+
+ }
+ className={styles.resetBtn}
+ >
+ 重置
+
+ }
+ className={styles.uploadBtn}
+ >
+ 上传
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DischargePermitManagement;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.less
new file mode 100644
index 0000000..6bb0c75
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/DischargePermitManagement.less
@@ -0,0 +1,160 @@
+.dischargePermitManagement {
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ padding: 20px;
+
+ .tabContainer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 15px;
+ padding: 0 ;
+ // border-bottom: 1px solid #e8e8e8;
+
+ .tabButtons {
+ display: flex;
+ gap: 0;
+ background-color: #F4F4F4;
+ border-radius: 4px;
+ padding: 4px 8px;
+ align-items: center;
+
+ .tabButton {
+ padding: 8px 20px;
+ border: none;
+ background-color: transparent;
+ color: #666;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ border-radius: 4px;
+ transition: all 0.3s ease;
+ height: auto;
+ line-height: 1.4;
+
+ &:hover {
+ color: #1890ff;
+ background-color: rgba(24, 144, 255, 0.1);
+ }
+
+ &.active {
+ background-color: #03C598;
+ color: #fff;
+ }
+ }
+ }
+
+ .filterSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ border-radius: 4px;
+
+ .filterLabel {
+ font-size: 14px;
+ color: #333;
+ }
+
+ .filterSelect {
+ min-width: 120px;
+ }
+
+ .filterInput {
+ min-width: 200px;
+ border-radius: 4px;
+ }
+
+ .queryBtn {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ border-radius: 4px;
+
+ &:hover {
+ background-color: #389e0d;
+ border-color: #389e0d;
+ }
+ }
+
+ .resetBtn, .uploadBtn {
+ background-color: #fff;
+ color: #666;
+ border-color: #d9d9d9;
+ border-radius: 4px;
+
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+ }
+ }
+ }
+
+ .tableContent {
+ width: 100%;
+
+ // 覆盖表头样式
+ :global {
+ .ant-table-thead > tr > th {
+ font-weight: 400 !important;
+ font-size: 12px !important;
+ color: #333 !important;
+ text-align: center !important;
+ background-color: #FAFAFA !important;
+ }
+
+ .ant-table-tbody > tr > td {
+ font-size: 12px;
+ color: #333;
+ text-align: center;
+ }
+
+ .ant-table-wrapper {
+ width: 100%;
+ max-width: 100%;
+ }
+ }
+
+ .attachmentLink {
+ color: #1890ff;
+ text-decoration: none;
+ font-size: 12px;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+
+ .actionButtons {
+ display: flex;
+ gap: 20px;
+ justify-content: center;
+ align-items: center;
+
+ .downloadIcon, .deleteIcon {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: scale(1.1);
+ opacity: 0.8;
+ }
+ }
+
+ .downloadIcon {
+ &:hover {
+ filter: brightness(1.2);
+ }
+ }
+
+ .deleteIcon {
+ &:hover {
+ filter: brightness(1.2) saturate(1.5);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.js
new file mode 100644
index 0000000..f4e6367
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import styles from './EnvironmentalTaskList.less';
+
+const EnvironmentalTaskList = () => {
+ return (
+
+
+
+
2) 环保管理任务清单
+
依据排污许可证副本中的环保要求,提供生成环保管理要求任务清单;
+
环保任务清单包括:大气排放口信息,大气污染物有组织排放许可年限值,大气污染物无组织排放年限制、企业大气排放总许可量;废水排放口、废水污染物排放许可限制;固体废物排放信息、自行贮存和自行利用/处置设施信息;工业噪声排放信息;
+
环境管理要求包括:自行检测及记录表、环境管理台账记录。
+
+
+
+
+ 共85条
+
+
+
+
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+
+ );
+};
+
+export default EnvironmentalTaskList;
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.less
new file mode 100644
index 0000000..c9f43c6
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/EnvironmentalTaskList.less
@@ -0,0 +1,105 @@
+.environmentalTaskListContainer {
+ width: 100%;
+ height: 72vh;
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ position: relative;
+}
+
+.environmentalTaskListContent {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0px 20px;
+}
+
+.environmentalTaskListText {
+ max-width: 800px;
+ text-align: left;
+ line-height: 1.6;
+
+ h2 {
+ font-size: 20px;
+ color: #333;
+ margin-bottom: 20px;
+ font-weight: 600;
+ }
+
+ p {
+ font-size: 16px;
+ color: #333;
+ margin-bottom: 15px;
+ text-indent: 2em;
+ }
+}
+
+.environmentalTaskListPagination {
+ position: absolute;
+ bottom: 20px;
+ right: 20px;
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ background: #fff;
+ padding: 10px 20px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.paginationInfo {
+ font-size: 14px;
+ color: #666;
+}
+
+.paginationControls {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.pageSizeSelect {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ font-size: 12px;
+ background: #fff;
+}
+
+.pageNumbers {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.pageButton, .pageNumber {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ border-radius: 4px;
+ font-size: 12px;
+ cursor: pointer;
+ min-width: 32px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+}
+
+.pageNumber.active {
+ background: #1890ff;
+ color: #fff;
+ border-color: #1890ff;
+}
+
+.pageEllipsis {
+ padding: 4px 8px;
+ font-size: 12px;
+ color: #666;
+}
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.js
new file mode 100644
index 0000000..4366372
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './InformationDisclosure.less';
+
+const InformationDisclosure = () => {
+ return (
+
+ );
+};
+
+export default InformationDisclosure;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/InformationDisclosure.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.js
new file mode 100644
index 0000000..f8e20d1
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.js
@@ -0,0 +1,286 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitManagement.less';
+import licence1 from '@/assets/business_envinformation/licence1.svg';
+import licence2 from '@/assets/business_envinformation/licence2.svg';
+
+const PermitManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ companyName: '北京某某环保有限公司',
+ permitNumber: 'PWX-BJ-2023-001',
+ issueOrg: '北京市生态环境局',
+ expireDate: '2025-12-31',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 2,
+ companyName: '上海某某化工有限公司',
+ permitNumber: 'PWX-SH-2023-002',
+ issueOrg: '上海市生态环境局',
+ expireDate: '2025-10-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 3,
+ companyName: '广州某某制造有限公司',
+ permitNumber: 'PWX-GZ-2023-003',
+ issueOrg: '广州市生态环境局',
+ expireDate: '2026-03-20',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 4,
+ companyName: '深圳某某电子有限公司',
+ permitNumber: 'PWX-SZ-2023-004',
+ issueOrg: '深圳市生态环境局',
+ expireDate: '2025-08-10',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 5,
+ companyName: '成都某某科技有限公司',
+ permitNumber: 'PWX-CD-2023-005',
+ issueOrg: '成都市生态环境局',
+ expireDate: '2026-01-25',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 6,
+ companyName: '武汉某某工业有限公司',
+ permitNumber: 'PWX-WH-2023-006',
+ issueOrg: '武汉市生态环境局',
+ expireDate: '2025-11-30',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 7,
+ companyName: '杭州某某环保有限公司',
+ permitNumber: 'PWX-HZ-2023-007',
+ issueOrg: '杭州市生态环境局',
+ expireDate: '2026-05-15',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 8,
+ companyName: '南京某某化学有限公司',
+ permitNumber: 'PWX-NJ-2023-008',
+ issueOrg: '南京市生态环境局',
+ expireDate: '2025-09-20',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 9,
+ companyName: '重庆某某重工有限公司',
+ permitNumber: 'PWX-CQ-2023-009',
+ issueOrg: '重庆市生态环境局',
+ expireDate: '2026-02-28',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 10,
+ companyName: '天津某某制药有限公司',
+ permitNumber: 'PWX-TJ-2023-010',
+ issueOrg: '天津市生态环境局',
+ expireDate: '2025-07-10',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 11,
+ companyName: '西安某某材料有限公司',
+ permitNumber: 'PWX-XA-2023-011',
+ issueOrg: '西安市生态环境局',
+ expireDate: '2026-04-05',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 12,
+ companyName: '青岛某某机械有限公司',
+ permitNumber: 'PWX-QD-2023-012',
+ issueOrg: '青岛市生态环境局',
+ expireDate: '2025-12-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 200,
+ },
+ {
+ title: '排污许可证号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 180,
+ },
+ {
+ title: '颁发机构',
+ dataIndex: 'issueOrg',
+ key: 'issueOrg',
+ width: 180,
+ },
+ {
+ title: '到期时间',
+ dataIndex: 'expireDate',
+ key: 'expireDate',
+ width: 120,
+ sorter: (a, b) => new Date(a.expireDate) - new Date(b.expireDate),
+ showSorterTooltip: false,
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 150,
+ align: 'center',
+ render: (_, record) => (
+
+ handleView(record)}
+ />
+ handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ }
+ }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitManagement;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.less
new file mode 100644
index 0000000..b200e6c
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitManagement.less
@@ -0,0 +1,137 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ // margin-bottom: 20px;
+ padding: 20px;
+ // background-color: #fafafa;
+ // border-radius: 2px;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.js
new file mode 100644
index 0000000..fec1778
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.js
@@ -0,0 +1,421 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitStatistics.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+const PermitStatistics = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 14,
+ });
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ administrativeRegion: '榆林市',
+ permitNumber: '51669811',
+ industryCategory: '信用风险管理与法律防',
+ companyName: '北京那蓝国际贸易有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 2,
+ administrativeRegion: '拉萨市',
+ permitNumber: '34887875',
+ industryCategory: '涉外警务',
+ companyName: '中潮石林企业咨询(上海)有限公司北京分公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-09',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 3,
+ administrativeRegion: '长家界市',
+ permitNumber: '1716652546',
+ industryCategory: '环境设计',
+ companyName: '水木晨曦(北京)科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 4,
+ administrativeRegion: '马潭市',
+ permitNumber: '384654762',
+ industryCategory: '电子竞技运动与管理',
+ companyName: '亚商桥(北京)咨询有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 5,
+ administrativeRegion: '交州市',
+ permitNumber: '34669295254',
+ industryCategory: '精算学',
+ companyName: '中讯通讯科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-13',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 6,
+ administrativeRegion: '驻马店市',
+ permitNumber: '4347052411',
+ industryCategory: '数字媒体艺术',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-21',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 7,
+ administrativeRegion: '三亚市',
+ permitNumber: '388946691',
+ industryCategory: '技术侦察学',
+ companyName: '中大国际文化有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 8,
+ administrativeRegion: '美湖市',
+ permitNumber: '7190228566',
+ industryCategory: '财政学',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-20',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 9,
+ administrativeRegion: '东营市',
+ permitNumber: '6656363924',
+ industryCategory: '保险学',
+ companyName: '北京清丰国际医院管理有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-06-27',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 10,
+ administrativeRegion: '九龙',
+ permitNumber: '622145211',
+ industryCategory: '英语',
+ companyName: '北京庆奔科贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-28',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 11,
+ administrativeRegion: '深圳市',
+ permitNumber: '755123456',
+ industryCategory: '计算机科学与技术',
+ companyName: '深圳创新科技有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-01',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 12,
+ administrativeRegion: '杭州市',
+ permitNumber: '571789012',
+ industryCategory: '电子商务',
+ companyName: '杭州数字贸易有限公司',
+ validityPeriod: '4年',
+ issueDate: '2025-09-05',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 13,
+ administrativeRegion: '成都市',
+ permitNumber: '028345678',
+ industryCategory: '生物技术',
+ companyName: '成都生物科技股份有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-09-10',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 14,
+ administrativeRegion: '武汉市',
+ permitNumber: '027456789',
+ industryCategory: '机械工程',
+ companyName: '武汉智能制造有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '行政区',
+ dataIndex: 'administrativeRegion',
+ key: 'administrativeRegion',
+ width: 120,
+ },
+ {
+ title: '许可证编号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 130,
+ },
+ {
+ title: '行业类别',
+ dataIndex: 'industryCategory',
+ key: 'industryCategory',
+ width: 200,
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 230,
+ },
+ {
+ title: '有效期限',
+ dataIndex: 'validityPeriod',
+ key: 'validityPeriod',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '发证日期',
+ dataIndex: 'issueDate',
+ key: 'issueDate',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 80,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 120,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ render: (_, record) => (
+
+
handleView(record)}
+ />
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 导入
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitStatistics;
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.less
new file mode 100644
index 0000000..54aa30e
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/PermitStatistics.less
@@ -0,0 +1,187 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.js
new file mode 100644
index 0000000..a83b5c2
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.js
@@ -0,0 +1,578 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './ProtectionFacilityMaintenance.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const ProtectionFacilityMaintenance = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 13,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ facilityCode: '35.236.217.212',
+ startTime: '2025-08-23 06:18',
+ endTime: '2025-08-23 06:18',
+ pollutantType: '123',
+ concentration: '39',
+ unit: 'm³/d',
+ dischargeDestination: '大气',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-23 06:18',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉骐',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ facilityCode: '65.177.48.116',
+ startTime: '2025-09-07 17:48',
+ endTime: '2025-09-07 17:48',
+ pollutantType: '大气污染物',
+ concentration: '52',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-07 17:48',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ facilityCode: '111.161.135.125',
+ startTime: '2025-09-04 13:08',
+ endTime: '2025-09-04 13:08',
+ pollutantType: '污水',
+ concentration: '28',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-04 13:08',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-22',
+ recorder: '王佛瑶',
+ reviewer: '赵玉',
+ facilityName: '烧烫伤膏(茂祥)',
+ facilityCode: '162.208.135.147',
+ startTime: '2025-08-28 22:40',
+ endTime: '2025-08-28 22:40',
+ pollutantType: '污水',
+ concentration: '46',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近期,高铁"熊孩子"事件频出,...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-28 22:40',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-31',
+ recorder: '吴子萱',
+ reviewer: '钱品妍',
+ facilityName: '云南白药(云南白药)',
+ facilityCode: '138.6.246.181',
+ startTime: '2025-09-17 19:48',
+ endTime: '2025-09-17 19:48',
+ pollutantType: '污水',
+ concentration: '37',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '刘某及同伴三人前往该射击俱乐部...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-17 19:48',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '何风景',
+ reviewer: '赵海洲',
+ facilityName: '麝香壮骨膏(修正)',
+ facilityCode: '134.80.173.128',
+ startTime: '2025-09-02 22:21',
+ endTime: '2025-09-02 22:21',
+ pollutantType: '污水',
+ concentration: '53',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '一位网友在社交平台发布的视频显...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-02 22:21',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-28',
+ recorder: '李琳颖',
+ reviewer: '李建刚',
+ facilityName: '复方醋酸甲羟孕酮胶囊(妇复春)',
+ facilityCode: '218.169.25.43',
+ startTime: '2025-09-06 16:27',
+ endTime: '2025-09-06 16:27',
+ pollutantType: '污水',
+ concentration: '24',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '盛夏时节,四川绵竹市汉旺镇一株...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-06 16:27',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-22',
+ recorder: '赵午光',
+ reviewer: '钱泽西',
+ facilityName: '桂龙药膏',
+ facilityCode: '54.218.80.84',
+ startTime: '2025-09-12 22:50',
+ endTime: '2025-09-12 22:50',
+ pollutantType: '污水',
+ concentration: '47',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '随着"热射病"这一高温疾病快速...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-12 22:50',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-21',
+ recorder: '王凤娇',
+ reviewer: '李金泽',
+ facilityName: '和兴白花油(和兴白花油)',
+ facilityCode: '222.1.18.173',
+ startTime: '2025-09-10 04:28',
+ endTime: '2025-09-10 04:28',
+ pollutantType: '污水',
+ concentration: '33',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '夏粮丰,全年稳。国家粮食和物资...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-10 04:28',
+ },
+ {
+ key: 10,
+ recordTime: '2025-09-09',
+ recorder: '赵涛',
+ reviewer: '何能',
+ facilityName: '茶苯海明含片(贻晗柠)',
+ facilityCode: '136.200.182.22',
+ startTime: '2025-08-30 07:15',
+ endTime: '2025-08-30 07:15',
+ pollutantType: '污水',
+ concentration: '34',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近日,一则"携程推出火车卧铺女...',
+ isReported: '未报告',
+ responseMeasures: '2025-08-30 07:15',
+ },
+ {
+ key: 11,
+ recordTime: '2025-09-15',
+ recorder: '李小明',
+ reviewer: '王建国',
+ facilityName: '阿莫西林胶囊(华北制药)',
+ facilityCode: '192.168.1.100',
+ startTime: '2025-09-15 14:30',
+ endTime: '2025-09-15 16:45',
+ pollutantType: '大气污染物',
+ concentration: '68',
+ unit: 'mg/m³',
+ dischargeDestination: '大气',
+ eventReason: '设备故障导致废气处理系统异常运行...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-15 16:45',
+ },
+ {
+ key: 12,
+ recordTime: '2025-09-18',
+ recorder: '张美丽',
+ reviewer: '刘德华',
+ facilityName: '布洛芬缓释胶囊(中美史克)',
+ facilityCode: '10.0.0.25',
+ startTime: '2025-09-18 09:20',
+ endTime: '2025-09-18 11:30',
+ pollutantType: '污水',
+ concentration: '42',
+ unit: 'mg/L',
+ dischargeDestination: '污水处理厂',
+ eventReason: '管道泄漏导致废水直接排放...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-18 11:30',
+ },
+ {
+ key: 13,
+ recordTime: '2025-09-20',
+ recorder: '陈志强',
+ reviewer: '周杰伦',
+ facilityName: '头孢拉定胶囊(石药集团)',
+ facilityCode: '172.16.0.88',
+ startTime: '2025-09-20 20:15',
+ endTime: '2025-09-20 22:00',
+ pollutantType: '噪声',
+ concentration: '85',
+ unit: 'dB',
+ dischargeDestination: '环境',
+ eventReason: '夜间施工未采取降噪措施...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-20 22:00',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编号',
+ dataIndex: 'facilityCode',
+ key: 'facilityCode',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '异常情况起始时刻',
+ dataIndex: 'startTime',
+ key: 'startTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '异常情况终止时刻',
+ dataIndex: 'endTime',
+ key: 'endTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '污染物种类',
+ dataIndex: 'pollutantType',
+ key: 'pollutantType',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污染物排放浓度',
+ dataIndex: 'concentration',
+ key: 'concentration',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '浓度单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '事件原因',
+ dataIndex: 'eventReason',
+ key: 'eventReason',
+ width: 180,
+ },
+ {
+ title: '是否报告',
+ dataIndex: 'isReported',
+ key: 'isReported',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '应对措施',
+ dataIndex: 'responseMeasures',
+ key: 'responseMeasures',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default ProtectionFacilityMaintenance;
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.less
new file mode 100644
index 0000000..38c8a2e
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/ProtectionFacilityMaintenance.less
@@ -0,0 +1,205 @@
+.protectionFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.js
new file mode 100644
index 0000000..8dcaeff
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.js
@@ -0,0 +1,592 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Select, Drawer, Descriptions, Tag } from 'antd';
+import styles from './RegulationCompliance.less';
+import stipulation1 from '@/assets/business_envinformation/stipulation1.svg';
+
+const RegulationCompliance = () => {
+ const [form] = Form.useForm();
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRegulation, setSelectedRegulation] = useState(null);
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ // 显示抽屉详情
+ const showDrawer = (regulation) => {
+ setSelectedRegulation(regulation);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const onCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRegulation(null);
+ };
+
+ // 模拟法规数据(实际应该从后端获取)
+ const mockRegulationDetail = {
+ name: '2025排污许可条例',
+ publishDate: '2025-08-24',
+ department: '环保部门名称',
+ content: '在此输入具体的法规内容...',
+ status: '有效',
+ category: '排污许可',
+ version: '1.0',
+ updateTime: '2025-08-24'
+ };
+
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格区域 */}
+
+
+ {/* 法规合规管理块1 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-24
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块2 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-25
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块3 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-26
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块4 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-27
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块5 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-28
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块6 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-29
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块7 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-30
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块8 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-31
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块9 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-01
+
+
+ 发布部门 环保部门名称9
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块10 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-02
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块11 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-03
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块12 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-04
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+
+
+ {/* 静态分页组件 */}
+
+
+ 共85条
+ {/* */}
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+ {/* 抽屉详情 */}
+
+ {selectedRegulation && (
+
+
+ {selectedRegulation.name}
+
+
+ {selectedRegulation.publishDate}
+
+
+ {selectedRegulation.department}
+
+
+ {selectedRegulation.status}
+
+
+ {selectedRegulation.category}
+
+
+ {selectedRegulation.version}
+
+
+ {selectedRegulation.updateTime}
+
+
+
+ {selectedRegulation.content}
+
+
+
+ )}
+
+
+ );
+};
+
+export default RegulationCompliance;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.less
new file mode 100644
index 0000000..f26410a
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/RegulationCompliance.less
@@ -0,0 +1,204 @@
+.regulationContainer {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+
+ .searchSection {
+ padding: 20px;
+ background-color: #fff;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 20px;
+
+ .blocksContainer {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: repeat(3, 1fr);
+ gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .regulationBlock {
+ background-color: #fff;
+ // border: 1px solid #EEEEEE;
+ border-radius: 2px;
+ // padding: 8px 16px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ min-height: 120px;
+ }
+
+
+ .regulationTitle {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333333;
+ padding: 8px 16px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .regulationInfo {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 15px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ }
+
+ .publishDate {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+ margin-bottom: 6px;
+
+ }
+
+ .publishDepartment {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+
+ }
+
+ .actionButtons {
+ display: flex;
+
+ justify-content: center;
+ gap: 8px;
+ width: 100%;
+ // margin-bottom: 0;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ // padding-top: 4px;
+ }
+
+ .actionButton {
+ width: calc(50% - 4px);
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border-radius: 2px;
+ transition: background-color 0.2s;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+
+ }
+
+ .paginationContainer {
+ position: fixed;
+ bottom: 10px;
+ right: 10px;
+ z-index: 1000;
+ }
+
+ .pagination {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ // background: #fff;
+ padding: 8px 30px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .totalItems {
+ font-size: 12px;
+ color: #666;
+ margin-right: 8px;
+ }
+
+ .pageSizeSelect {
+ font-size: 12px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 2px 6px;
+ margin-right: 8px;
+ background: #fff;
+ }
+
+ .pageButton {
+ width: 28px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #333;
+ font-size: 12px;
+ border-radius: 2px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s;
+
+ &:hover {
+ border-color: #00D48A;
+ color: #00D48A;
+ }
+
+ &.active {
+ background: #00D48A;
+ border-color: #00D48A;
+ color: #fff;
+ }
+ }
+
+ .ellipsis {
+ font-size: 12px;
+ color: #999;
+ padding: 0 4px;
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.js
new file mode 100644
index 0000000..da0cca8
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './SupervisionInspection.less';
+
+const SupervisionInspection = () => {
+ return (
+
+ );
+};
+
+export default SupervisionInspection;
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/SupervisionInspection.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.js
new file mode 100644
index 0000000..4c079d0
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.js
@@ -0,0 +1,803 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WasteGasPollutionControl.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WasteGasPollutionControl = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉琪',
+ reviewer: '赵子能',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ equipmentModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.12',
+ pressure: '95',
+ emissionTime: '100',
+ powerConsumption: '34',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ equipmentModel: '19b89E82-ae94-6bF7-2355-8DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.95',
+ pressure: '90',
+ emissionTime: '95',
+ powerConsumption: '55',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设备型号',
+ dataIndex: 'equipmentModel',
+ key: 'equipmentModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物烟气量(m³/h)',
+ dataIndex: 'pollutantFlueGasVolume',
+ key: 'pollutantFlueGasVolume',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排气筒高度(m)',
+ dataIndex: 'exhaustStackHeight',
+ key: 'exhaustStackHeight',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '排气温度(℃)',
+ dataIndex: 'exhaustTemperature',
+ key: 'exhaustTemperature',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '压力(kpa)',
+ dataIndex: 'pressure',
+ key: 'pressure',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放时间(h)',
+ dataIndex: 'emissionTime',
+ key: 'emissionTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物名称',
+ dataIndex: 'byproductName',
+ key: 'byproductName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物产生量(t)',
+ dataIndex: 'byproductProduction',
+ key: 'byproductProduction',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WasteGasPollutionControl;
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.less
new file mode 100644
index 0000000..7b23dad
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WasteGasPollutionControl.less
@@ -0,0 +1,205 @@
+.wasteGasContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.js b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.js
new file mode 100644
index 0000000..b830f24
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.js
@@ -0,0 +1,746 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WastewaterFacilityManagement.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WastewaterFacilityManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉祺',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ facilityModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.12',
+ treatmentMethod: '95',
+ powerConsumption: '34',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ facilityModel: '19b89EB2-ae94-6bF7-2355-6DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.95',
+ treatmentMethod: '90',
+ powerConsumption: '56',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设施型号',
+ dataIndex: 'facilityModel',
+ key: 'facilityModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物出口流量(m³/h)',
+ dataIndex: 'pollutantOutletFlow',
+ key: 'pollutantOutletFlow',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污泥产生量(t)',
+ dataIndex: 'sludgeProduction',
+ key: 'sludgeProduction',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '处理方式',
+ dataIndex: 'treatmentMethod',
+ key: 'treatmentMethod',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WastewaterFacilityManagement;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.less b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.less
new file mode 100644
index 0000000..6d2aaec
--- /dev/null
+++ b/src/pages/business_emergencyResource copy 3/components/secondary_menu/WastewaterFacilityManagement.less
@@ -0,0 +1,206 @@
+.wastewaterFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/EmergencyResource.js b/src/pages/business_emergencyResource/EmergencyResource.js
index e69de29..07ab758 100644
--- a/src/pages/business_emergencyResource/EmergencyResource.js
+++ b/src/pages/business_emergencyResource/EmergencyResource.js
@@ -0,0 +1,77 @@
+import React, { useState } from 'react';
+import { Card, Row, Col, Statistic, Progress, Button, Space } from 'antd';
+import styles from './EmergencyResource.less';
+import ComplianceManagement from './components/ComplianceManagement'; //合规性管理
+import OnlineMonitoring from './components/OnlineMonitoring'; //在线监测预警
+import EnvironmentalPersonnelManagement from './components/EnvironmentalPersonnelManagement'; //环保人员管理
+import EvaluationReport from './components/EvaluationReport'; //评估报告
+import EquipmentManagement from './components/EquipmentManagement'; //环保设备设施管理
+import PollutionSourceManagement from './components/PollutionSourceManagement'; //污染源管理
+
+
+
+const SafeMajorHazardList = () => {
+ const [activeModule, setActiveModule] = useState('organization');
+
+ const handleModuleClick = (module) => {
+ setActiveModule(module)
+ }
+
+
+ const renderModule = () => {
+ switch (activeModule) {
+ case 'organization':
+ return ;
+ case 'equipment':
+ return ;
+ case 'firefighting':
+ return ;
+ case 'other':
+ return ;
+ case 'equipmentManagement':
+ return ;
+ case 'pollutionSource':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+
+ return (
+
+
+
+
+
+
+
+
+
+ {renderModule()}
+
+
+ );
+};
+
+export default SafeMajorHazardList;
diff --git a/src/pages/business_emergencyResource/EmergencyResource.less b/src/pages/business_emergencyResource/EmergencyResource.less
index e69de29..08e9b05 100644
--- a/src/pages/business_emergencyResource/EmergencyResource.less
+++ b/src/pages/business_emergencyResource/EmergencyResource.less
@@ -0,0 +1,69 @@
+.container {
+ background-color: transparent;
+ width: 100%;
+ height: 89vh;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+
+ .TopButton {
+ background-color: white;
+ width: 100%;
+ padding: 8px 30px 5px 30px;
+ display: flex;
+ gap: 24px;
+ margin-left: 6px;
+
+ .TopButtonItem {
+ background-color: #FFFFFF !important;
+ color: #999999 !important;
+ font-family: 'PingFang SC', sans-serif !important;
+ font-weight: 500 !important;
+ font-size: 14px !important;
+ line-height: 100% !important;
+ border-radius: 8px !important;
+ padding: 4px 16px !important;
+ height: auto !important;
+ border: none !important;
+ box-shadow: none !important;
+ position: relative !important;
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ gap: 5px !important;
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &:focus {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &.active {
+ background: linear-gradient(98.03deg, #00E49C 0.68%, #00D841 98.3%) !important;
+ box-shadow: 0px 2px 2px 0px #AEEDDE !important;
+ color: #FFFFFF !important;
+
+ &::after {
+ content: '';
+ width: 28px;
+ height: 5px;
+ background-color: #FFFFFF;
+ border-radius: 6px;
+ opacity: 1;
+ }
+ }
+ }
+ }
+
+ .content {
+ // ======== 内容区域样式 ========
+ flex: 1; // ======== 占据剩余空间 ========
+ overflow-y: auto; // ======== 允许垂直滚动 ========
+ padding: 0; // ======== 无内边距 ========
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.js b/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.js
new file mode 100644
index 0000000..a16f589
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.js
@@ -0,0 +1,513 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './AtmospherePollutantLibrary.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+import icon_add from '@/assets/business_envinformation/icon_add.svg';
+
+const AtmospherePollutantLibrary = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 19,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ serialNumber: 1,
+ pollutantName: '对乙酰氨基酚栓',
+ category: 25,
+ mainFeatures: '在接受调查的19为华尔街分析师...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '每日协通(北京)咨询有限公司',
+ monthlyEmission: 4.6,
+ quarterlyEmission: 4.6,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 2,
+ serialNumber: 2,
+ pollutantName: '萘普生缓释胶囊(适洛特)',
+ category: 27,
+ mainFeatures: '热到融化的马路、无穷无尽的野火...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '赢王科技有限公司',
+ monthlyEmission: 1.1,
+ quarterlyEmission: 1.1,
+ yearlyEmission: 1.8,
+ },
+ {
+ key: 3,
+ serialNumber: 3,
+ pollutantName: '复方感冒灵片',
+ category: 44,
+ mainFeatures: '从病虫害探测、土壤墒情监测智能...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京福商商务服务有限公司',
+ monthlyEmission: 2.4,
+ quarterlyEmission: 2.4,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 4,
+ serialNumber: 4,
+ pollutantName: '红药片',
+ category: 21,
+ mainFeatures: '近日,有科普博主发帖称,某社交...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '实华国际租赁有限公司',
+ monthlyEmission: 3.6,
+ quarterlyEmission: 3.6,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 5,
+ serialNumber: 5,
+ pollutantName: '布洛芬混悬液(翔宇赛可)',
+ category: 56,
+ mainFeatures: '在七八十年代,这种面料做成的服...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京冠钧财经策划有限公司',
+ monthlyEmission: 3.0,
+ quarterlyEmission: 3.0,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 6,
+ serialNumber: 6,
+ pollutantName: '阿莫西林胶囊',
+ category: 32,
+ mainFeatures: '抗生素类药物,用于治疗细菌感染...',
+ monitoringPoint: 1.15,
+ emittingEnterprise: '华北制药集团有限责任公司',
+ monthlyEmission: 2.8,
+ quarterlyEmission: 2.8,
+ yearlyEmission: 3.5,
+ },
+ {
+ key: 7,
+ serialNumber: 7,
+ pollutantName: '头孢拉定胶囊',
+ category: 28,
+ mainFeatures: '头孢类抗生素,广谱抗菌药物...',
+ monitoringPoint: 1.30,
+ emittingEnterprise: '石药集团欧意药业有限公司',
+ monthlyEmission: 1.9,
+ quarterlyEmission: 1.9,
+ yearlyEmission: 2.3,
+ },
+ {
+ key: 8,
+ serialNumber: 8,
+ pollutantName: '复方甘草片',
+ category: 35,
+ mainFeatures: '镇咳祛痰药物,含有甘草提取物...',
+ monitoringPoint: 1.20,
+ emittingEnterprise: '太极集团重庆桐君阁药厂有限公司',
+ monthlyEmission: 3.2,
+ quarterlyEmission: 3.2,
+ yearlyEmission: 4.1,
+ },
+ {
+ key: 9,
+ serialNumber: 9,
+ pollutantName: '板蓝根颗粒',
+ category: 41,
+ mainFeatures: '清热解毒,凉血利咽的中成药...',
+ monitoringPoint: 1.10,
+ emittingEnterprise: '广州白云山和记黄埔中药有限公司',
+ monthlyEmission: 4.5,
+ quarterlyEmission: 4.5,
+ yearlyEmission: 5.8,
+ },
+ {
+ key: 10,
+ serialNumber: 10,
+ pollutantName: '维生素C片',
+ category: 22,
+ mainFeatures: '补充维生素C,增强免疫力...',
+ monitoringPoint: 1.35,
+ emittingEnterprise: '华润三九医药股份有限公司',
+ monthlyEmission: 2.1,
+ quarterlyEmission: 2.1,
+ yearlyEmission: 2.7,
+ },
+ {
+ key: 11,
+ serialNumber: 11,
+ pollutantName: '感冒清热颗粒',
+ category: 38,
+ mainFeatures: '疏风散寒,解表清热的中成药...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京同仁堂股份有限公司',
+ monthlyEmission: 3.7,
+ quarterlyEmission: 3.7,
+ yearlyEmission: 4.9,
+ },
+ {
+ key: 12,
+ serialNumber: 12,
+ pollutantName: '双氯芬酸钠缓释片',
+ category: 29,
+ mainFeatures: '非甾体抗炎药,用于缓解疼痛...',
+ monitoringPoint: 1.18,
+ emittingEnterprise: '扬子江药业集团有限公司',
+ monthlyEmission: 1.6,
+ quarterlyEmission: 1.6,
+ yearlyEmission: 2.0,
+ },
+ {
+ key: 13,
+ serialNumber: 13,
+ pollutantName: '藿香正气水',
+ category: 43,
+ mainFeatures: '解表化湿,理气和中的中成药...',
+ monitoringPoint: 1.22,
+ emittingEnterprise: '云南白药集团股份有限公司',
+ monthlyEmission: 2.9,
+ quarterlyEmission: 2.9,
+ yearlyEmission: 3.8,
+ },
+ {
+ key: 14,
+ serialNumber: 14,
+ pollutantName: '蒙脱石散',
+ category: 26,
+ mainFeatures: '止泻药物,保护胃肠黏膜...',
+ monitoringPoint: 1.28,
+ emittingEnterprise: '博福-益普生制药有限公司',
+ monthlyEmission: 1.4,
+ quarterlyEmission: 1.4,
+ yearlyEmission: 1.9,
+ },
+ {
+ key: 15,
+ serialNumber: 15,
+ pollutantName: '复方丹参片',
+ category: 37,
+ mainFeatures: '活血化瘀,理气止痛的中成药...',
+ monitoringPoint: 1.16,
+ emittingEnterprise: '天津中新药业集团股份有限公司',
+ monthlyEmission: 3.3,
+ quarterlyEmission: 3.3,
+ yearlyEmission: 4.2,
+ },
+ {
+ key: 16,
+ serialNumber: 16,
+ pollutantName: '奥美拉唑肠溶胶囊',
+ category: 31,
+ mainFeatures: '质子泵抑制剂,治疗胃溃疡...',
+ monitoringPoint: 1.33,
+ emittingEnterprise: '阿斯利康制药有限公司',
+ monthlyEmission: 2.2,
+ quarterlyEmission: 2.2,
+ yearlyEmission: 2.8,
+ },
+ {
+ key: 17,
+ serialNumber: 17,
+ pollutantName: '六味地黄丸',
+ category: 45,
+ mainFeatures: '滋阴补肾的经典中成药...',
+ monitoringPoint: 1.12,
+ emittingEnterprise: '仲景宛西制药股份有限公司',
+ monthlyEmission: 4.1,
+ quarterlyEmission: 4.1,
+ yearlyEmission: 5.3,
+ },
+ {
+ key: 18,
+ serialNumber: 18,
+ pollutantName: '阿司匹林肠溶片',
+ category: 24,
+ mainFeatures: '解热镇痛抗炎药,预防血栓...',
+ monitoringPoint: 1.27,
+ emittingEnterprise: '拜耳医药保健有限公司',
+ monthlyEmission: 1.8,
+ quarterlyEmission: 1.8,
+ yearlyEmission: 2.4,
+ },
+ {
+ key: 19,
+ serialNumber: 19,
+ pollutantName: '复方黄连素片',
+ category: 39,
+ mainFeatures: '清热燥湿,行气止痛的中成药...',
+ monitoringPoint: 1.21,
+ emittingEnterprise: '哈药集团三精制药有限公司',
+ monthlyEmission: 2.6,
+ quarterlyEmission: 2.6,
+ yearlyEmission: 3.4,
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '序号',
+ dataIndex: 'serialNumber',
+ key: 'serialNumber',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '特征污染物名称',
+ dataIndex: 'pollutantName',
+ key: 'pollutantName',
+ width: 200,
+ align: 'center',
+ },
+ {
+ title: '种类',
+ dataIndex: 'category',
+ key: 'category',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '主要特征',
+ dataIndex: 'mainFeatures',
+ key: 'mainFeatures',
+ width: 300,
+ },
+ {
+ title: '环境监测点',
+ dataIndex: 'monitoringPoint',
+ key: 'monitoringPoint',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放企业',
+ dataIndex: 'emittingEnterprise',
+ key: 'emittingEnterprise',
+ width: 200,
+ },
+ {
+ title: '本月排放量',
+ dataIndex: 'monthlyEmission',
+ key: 'monthlyEmission',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '本季度排放量',
+ dataIndex: 'quarterlyEmission',
+ key: 'quarterlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '本年度排放量',
+ dataIndex: 'yearlyEmission',
+ key: 'yearlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleEdit(record)}
+ />
+
handleDownload(record)}
+ /> */}
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 页面头部 */}
+
+ 大气污染特征污染物名录库
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ // scroll={{ x: 3000}}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default AtmospherePollutantLibrary;
diff --git a/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.less b/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.less
new file mode 100644
index 0000000..d1550dc
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/AtmospherePollutantLibrary.less
@@ -0,0 +1,218 @@
+.atmospherePollutantLibrary {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ // background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .pageHeader {
+ margin-bottom: 15px;
+ background: #fff;
+ padding: 15px 15px 15px 20px;
+ border-radius: 2px;
+ color: #333333;
+ font-size: 16px;
+ font-weight: 500;
+ }
+
+ .searchSection {
+ background: #fff;
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #00D48A;
+ color: #fff;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ }
+ }
+
+ .importButton {
+ display: flex;
+ align-items: center;
+ background-color: #fff;
+ border-color: #D7D7D7;
+ color: #333;
+ height: 28px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // .rightControls {
+ // display: flex;
+ // align-items: center;
+ // gap: 12px;
+
+ // .filterLabel {
+ // color: #333;
+ // font-size: 14px;
+ // white-space: nowrap;
+ // }
+
+ // .queryButton {
+ // background-color: #52c41a;
+ // border-color: #52c41a;
+ // color: white;
+ // height: 28px;
+ // border-radius: 4px;
+ // display: flex;
+ // align-items: center;
+ // justify-content: center;
+
+ // &:hover {
+ // background-color: #73d13d;
+ // border-color: #73d13d;
+ // }
+ // }
+
+ // .selectInput {
+ // :global {
+ // .ant-select-selector {
+ // display: flex;
+ // align-items: center;
+ // height: 28px !important;
+ // }
+
+ // .ant-select-selection-item {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+
+ // .ant-select-selection-placeholder {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+ // }
+ // }
+ // }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 25px 0;
+ background-color: #fff;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead>tr>th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr>td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr:hover>td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead>tr>th.ant-table-cell-fix-left,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead>tr>th.ant-table-cell-fix-right,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // 页码距离上边距
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/ComplianceManagement.js b/src/pages/business_emergencyResource/components/ComplianceManagement.js
new file mode 100644
index 0000000..e44970b
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/ComplianceManagement.js
@@ -0,0 +1,62 @@
+import React, { useState } from 'react';
+import styles from './ComplianceManagement.less';
+import PermitManagement from './secondary_menu/PermitManagement'; // 排污许可
+import RegulationCompliance from './secondary_menu/RegulationCompliance'; // 法规符合性
+import SupervisionInspection from './secondary_menu/SupervisionInspection'; // 监督检查
+import InformationDisclosure from './secondary_menu/InformationDisclosure'; // 信息公开及绿色通道
+
+const ComplianceManagement = () => {
+ const [activeMenu, setActiveMenu] = useState('permit');
+
+ const menuItems = [
+ { key: 'permit', label: '排污许可' },
+ { key: 'regulation', label: '法规符合性' },
+ { key: 'inspection', label: '监督检查' },
+ { key: 'disclosure', label: '信息公开及绿色通道' }
+ ];
+
+ const handleMenuClick = (key) => {
+ setActiveMenu(key);
+ };
+
+ const renderContent = () => {
+ switch (activeMenu) {
+ case 'permit':
+ return ;
+ case 'regulation':
+ return ;
+ case 'inspection':
+ return ;
+ case 'disclosure':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+ {/* 左侧菜单 */}
+
+ {menuItems.map(item => (
+
handleMenuClick(item.key)}
+ >
+ {activeMenu === item.key &&
}
+
{item.label}
+
+ ))}
+
+
+ {/* 右侧内容区 */}
+
+ {renderContent()}
+
+
+ );
+};
+
+export default ComplianceManagement;
+
diff --git a/src/pages/business_emergencyResource/components/ComplianceManagement.less b/src/pages/business_emergencyResource/components/ComplianceManagement.less
new file mode 100644
index 0000000..b58637a
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/ComplianceManagement.less
@@ -0,0 +1,85 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ gap: 10px;
+ padding-left: 5px;
+ // padding-right: 5px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ background-color: #f5f5f5;
+
+ // 左侧菜单
+ .leftMenu {
+ display: flex;
+ flex-direction: column;
+ // gap: 1px;
+ flex-shrink: 0;
+ background-color: #fff;
+
+ .menuItem {
+ width: 180px;
+ height: 50px;
+ background-color: #FFFFFF;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ position: relative;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ padding-left: 20px;
+
+ .menuText {
+ font-size: 14px;
+ color: #999999;
+ font-weight: 400;
+ transition: color 0.3s ease;
+ }
+
+ // 激活状态的指示器(左侧长条)
+ .activeIndicator {
+ position: absolute;
+ left: 3px;
+ width: 17.34765625px;
+ height: 1.97802734375px;
+ border-radius: 6px;
+ background-color: #009D6F;
+ transform: rotate(-90deg);
+ }
+
+ // 激活状态样式
+ &.active {
+ background-color: #D4FFEC;
+
+ .menuText {
+ color: #009D6F;
+ }
+ }
+
+ // 鼠标悬停效果
+ &:hover:not(.active) {
+ background-color: #f9f9f9;
+ }
+ }
+ }
+
+ // 右侧内容区
+ .rightContent {
+ flex: 1;
+ // background-color: #FFFFFF;
+ border-radius: 4px;
+ // padding: 20px;
+ overflow: auto;
+
+ .contentPlaceholder {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ color: #666666;
+ }
+ }
+}
+
diff --git a/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.js b/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.js
new file mode 100644
index 0000000..805e60e
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.js
@@ -0,0 +1,1025 @@
+
+import React, { useState, useEffect } from 'react';
+import moment from 'moment';
+import { Card, Result, Select, Button, Drawer, Upload, Input, Modal, Form, DatePicker, Row, Col } from 'antd';
+import { CheckCircleOutlined, ExportOutlined, PlusOutlined, UploadOutlined, UserOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './EnvironmentalPersonnelManagement.less';
+// import './EnvironmentalPersonnelManagement.less';
+
+import img1 from '@/assets/safe_majorHazard/online_monitoring/img1.png';
+import img2 from '@/assets/safe_majorHazard/online_monitoring/img2.png';
+import img3 from '@/assets/safe_majorHazard/online_monitoring/img3.png';
+import map1 from '@/assets/safe_majorHazard/online_monitoring/map.png';
+import risk1 from '@/assets/safe_majorHazard/online_monitoring/risk1.png';
+import risk2 from '@/assets/safe_majorHazard/online_monitoring/risk2.png';
+import risk3 from '@/assets/safe_majorHazard/online_monitoring/risk3.png';
+// import eqicon1 from '@/assets/business_basic/eqicon1.png';
+// import eqicon2 from '@/assets/business_basic/eqicon2.png';
+// import eqicon3 from '@/assets/business_basic/eqicon3.png';
+// import eqicon4 from '@/assets/business_basic/eqicon4.png';
+import viewIcon from '@/assets/business_envinformation/viewicon.svg';
+import editIcon from '@/assets/business_envinformation/editicon.svg';
+import deleteIcon from '@/assets/business_envinformation/deleteicon.svg';
+import personnelIcon from '@/assets/business_envinformation/personnel.svg';
+
+
+
+
+
+const EnvironmentalPersonnelManagement = () => {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 0,
+ });
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRecord, setSelectedRecord] = useState(null);
+ const [modalVisible, setModalVisible] = useState(false);
+ const [form] = Form.useForm();
+ const [editDrawerVisible, setEditDrawerVisible] = useState(false);
+ const [editForm] = Form.useForm();
+
+
+
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 10;
+ const number = (page - 1) * pageSize + index + 1;
+ return number;
+ }
+ },
+ {
+ title: '姓名',
+ dataIndex: 'name',
+ key: 'name',
+ width: 120,
+ },
+ {
+ title: '部门',
+ dataIndex: 'department',
+ key: 'department',
+ width: 120,
+ filters: [
+ { text: '环保管理', value: '环保管理' },
+ { text: '技术部', value: '技术部' },
+ { text: '生产部', value: '生产部' },
+ { text: '质量部', value: '质量部' },
+ ],
+ onFilter: (value, record) => record.department === value,
+ },
+ {
+ title: '岗位',
+ dataIndex: 'position',
+ key: 'position',
+ width: 120,
+ filters: [
+ { text: '污水化验', value: '污水化验' },
+ { text: '环境监测', value: '环境监测' },
+ { text: '环保工程师', value: '环保工程师' },
+ { text: '安全员', value: '安全员' },
+ { text: '技术员', value: '技术员' },
+ ],
+ onFilter: (value, record) => record.position === value,
+ },
+ {
+ title: '入职时间',
+ dataIndex: 'joinDate',
+ key: 'joinDate',
+ width: 120,
+ sorter: (a, b) => {
+ // 将日期字符串转换为Date对象进行比较
+ const dateA = new Date(a.joinDate);
+ const dateB = new Date(b.joinDate);
+ return dateA - dateB;
+ },
+ },
+ {
+ title: '岗位职责',
+ dataIndex: 'responsibility',
+ key: 'responsibility',
+ width: 200,
+ },
+ {
+ title: '联系方式',
+ dataIndex: 'contact',
+ key: 'contact',
+ width: 150,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 180,
+ render: (_, record) => (
+
+

handleView(record)}
+ />
+

handleEdit(record)}
+ />
+

+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ name: '吴振峰',
+ department: '环保管理',
+ position: '污水运行',
+ joinDate: '2025-09-02',
+ responsibility: '保障污水设备运行、处理故障',
+ contact: '13321493732',
+ employeeId: '434545',
+ gender: '男',
+ birthDate: '2025-08-08',
+ idCard: '340802199809050811',
+ address: '西辛南区46号楼2单元101室',
+ other: '暂无'
+ },
+ {
+ key: '2',
+ id: '002',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138002',
+ },
+ {
+ key: '3',
+ id: '003',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138003',
+ },
+ {
+ key: '4',
+ id: '004',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138004',
+ },
+ {
+ key: '5',
+ id: '005',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138005',
+ },
+ {
+ key: '6',
+ id: '006',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138006',
+ },
+ {
+ key: '7',
+ id: '007',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138007',
+ },
+ {
+ key: '8',
+ id: '008',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138008',
+ },
+ {
+ key: '9',
+ id: '009',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138009',
+ },
+ {
+ key: '10',
+ id: '010',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138010',
+ },
+ {
+ key: '11',
+ id: '011',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138011',
+ },
+ {
+ key: '12',
+ id: '012',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138012',
+ },
+ {
+ key: '13',
+ id: '013',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138013',
+ },
+ {
+ key: '14',
+ id: '014',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138014',
+ },
+ {
+ key: '15',
+ id: '015',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138015',
+ },
+ {
+ key: '16',
+ id: '016',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138016',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 新增设备按钮点击事件
+ const handleAddDevice = () => {
+ console.log('新增设备');
+ // TODO: 实现新增设备逻辑
+ };
+
+ // 导出数据按钮点击事件
+ const handleExportData = () => {
+ console.log('导出数据');
+ // TODO: 实现导出数据逻辑
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 查看详情
+ const handleView = (record) => {
+ setSelectedRecord(record);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const handleCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRecord(null);
+ };
+
+ // 打开新增模态框
+ const handleOpenModal = () => {
+ setModalVisible(true);
+ };
+
+ // 关闭新增模态框
+ const handleCloseModal = () => {
+ setModalVisible(false);
+ form.resetFields();
+ };
+
+ // 保存新增数据
+ const handleSave = () => {
+ form.validateFields().then(values => {
+ console.log('新增数据:', values);
+ // TODO: 实现保存逻辑
+ setModalVisible(false);
+ form.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ // 打开编辑抽屉
+ const handleEdit = (record) => {
+ console.log('点击编辑按钮,记录:', record);
+ setSelectedRecord(record);
+ setEditDrawerVisible(true);
+ console.log('设置编辑抽屉可见:', true);
+ // 设置表单初始值
+ editForm.setFieldsValue({
+ name: record.name,
+ employeeId: record.employeeId,
+ department: record.department,
+ position: record.position,
+ gender: record.gender,
+ address: record.address,
+ birthDate: record.birthDate ? moment(record.birthDate) : null,
+ joinDate: record.joinDate ? moment(record.joinDate) : null,
+ idCard: record.idCard,
+ contact: record.contact,
+ responsibility: record.responsibility,
+ other: record.other
+ });
+ };
+
+ // 关闭编辑抽屉
+ const handleCloseEditDrawer = () => {
+ setEditDrawerVisible(false);
+ setSelectedRecord(null);
+ editForm.resetFields();
+ };
+
+ // 保存编辑数据
+ const handleEditSave = () => {
+ editForm.validateFields().then(values => {
+ console.log('编辑数据:', values);
+ // TODO: 实现保存逻辑
+ setEditDrawerVisible(false);
+ editForm.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ return (
+
+ {/* 第一个div - 高度20% */}
+
+
+
+ {/* 块1 */}
+
+
+
环保总人数
+
258
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块2 */}
+
+
+
管理岗人数
+
58
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块3 */}
+
+
+
污水运行人数
+
51
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块4 */}
+
+
+
污水化验人数
+
28
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块5 */}
+
+
+
危废管理人员
+
50
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块6 */}
+
+
+
一般固体废物管理人员
+
58
+
截止到 2025-09-11 07:35
+
+
+
+
+
+
+
+
+
+ {/* 第三个div - 占满剩余位置 */}
+
+
+ {/* 第一行 - 表单控件 */}
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二行 - 表格 */}
+
+
+ `共 ${total} 条`,
+ }}
+ />
+
+
+
+
+ {/* 侧边抽屉 */}
+
查看}
+ placement="right"
+ onClose={handleCloseDrawer}
+ open={drawerVisible}
+ width={600}
+ closable={false}
+ bodyStyle={{ fontSize: '12px' }}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ {/* 新增模态框 */}
+
+ 取消
+ ,
+
+ ]}
+ closable={true}
+ >
+ 岗位职责}
+ name="responsibility"
+ rules={[{ required: true, message: '请输入岗位职责' }]}
+ >
+
+
+
+ {/* 其他 */}
+ 其他}
+ name="other"
+ >
+
+
+
+
+
+ {/* 编辑抽屉 */}
+
编辑}
+ placement="right"
+ onClose={handleCloseEditDrawer}
+ open={editDrawerVisible}
+ width={600}
+ closable={false}
+ destroyOnClose={true}
+ bodyStyle={{ fontSize: '12px' }}
+ footer={[
+ ,
+
+ ]}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ );
+};
+
+export default EnvironmentalPersonnelManagement;
diff --git a/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.less b/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.less
new file mode 100644
index 0000000..744c04b
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EnvironmentalPersonnelManagement.less
@@ -0,0 +1,536 @@
+
+
+
+// 表单输入框样式
+.formInput {
+ :global(.ant-input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-select-selector) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-picker-input input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+}
+
+
+.Rcontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+
+ // 第一个div - 高度20%
+ .RcontainerTop {
+ height: 18%;
+ // background-color: #fff;
+ border-radius: 4px;
+ display: flex;
+ flex-direction: column;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ // padding: 15px;
+
+ .blocksContainer {
+ flex: 1;
+ display: flex;
+ gap: 10px;
+ height: 100%;
+
+ .blockItem {
+ flex: 1;
+ height: 100%;
+ display: flex;
+ // background: linear-gradient(170.5deg, #F5F7FF 6.87%, #FFFFFF 47.65%);
+ border-radius: 4px;
+ // border: 2px solid #FFFFFF;
+
+ // 块1 - 蓝色渐变 + SVG背景
+ &.block1 {
+ background:
+ url('@/assets/business_envinformation/background1.svg'),
+
+ linear-gradient(180deg, #DBEBFF 0%, #DBEBFF 12.5%, rgba(255, 255, 255, 0.700824) 56%, rgba(255, 255, 255, 0.01) 100%),
+ linear-gradient(0deg, #FFFFFF, #FFFFFF);
+ // linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块2 - 黄色渐变
+ &.block2 {
+ background:
+ url('@/assets/business_envinformation/background2.svg'),
+ linear-gradient(180deg, #FFFEDB 0%, #F5FFDB 19.23%, #FFFFFF 55.77%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块3 - 绿色渐变
+ &.block3 {
+ background:
+ url('@/assets/business_envinformation/background3.svg'),
+ linear-gradient(180deg, #8CFFCD 0%, #C0FFE4 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块4 - 青色渐变
+ &.block4 {
+ background:
+ url('@/assets/business_envinformation/background4.svg'),
+ linear-gradient(180deg, #C5FFFC 0%, #C0FFFC 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块5 - 红色渐变
+ &.block5 {
+ background:
+ url('@/assets/business_envinformation/background5.svg'),
+ linear-gradient(180deg, #FFD2D2 0%, #FFD9D9 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块6 - 紫色渐变
+ &.block6 {
+ background:
+ url('@/assets/business_envinformation/background6.svg'),
+ linear-gradient(180deg, #F2D7FF 0%, #F4DDFF 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ .blockLeft {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 15px;
+ padding-left: 20px;
+ gap: 8px;
+
+ .blockTitle {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #333333;
+ line-height: 1.2;
+ }
+
+ .blockNumber {
+ font-family: PingFang SC;
+ font-weight: 700;
+ font-size: 24px;
+ color: #333333;
+ line-height: 1.2;
+
+ // 特定数字颜色
+ &.number258 {
+ color: #0080FF;
+ }
+
+ &.number58 {
+ color: #EFB700;
+ }
+
+ &.number51 {
+ color: #00DA86;
+ }
+
+ &.number28 {
+ color: #00DA86;
+ }
+
+ &.number50 {
+ color: #FD0404;
+ }
+
+ &.number58Second {
+ color: #A318E4;
+ }
+ }
+
+ .blockTime {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 10px;
+ color: #999999;
+ line-height: 1.2;
+ }
+
+ .blockChange {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #1269FF;
+ line-height: 1.2;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .arrow {
+ font-size: 14px;
+ font-weight: bold;
+ }
+
+ .checkIcon {
+ font-size: 16px;
+ color: #1269FF;
+ }
+ }
+ }
+
+ .blockRight {
+ flex: 1;
+ height: 100%;
+ background-color: transparent;
+ border-radius: 0 4px 4px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .blockImage {
+ // width: 80%;
+ height: 65%;
+ // height: 80%;
+ object-fit: contain;
+ margin-right: -5px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ // 第三个div - 占满剩余位置
+ .RcontainerBottom {
+ flex: 1; // 占满剩余空间
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ padding: 15px;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+
+ // 第一行 - 表单控件
+ .formRow {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ flex-shrink: 0;
+
+ .addButton {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ height: 28px;
+ border: 1px solid #00D48A;
+ border-radius: 2px;
+ color: #fff;
+ font-weight: 400;
+ font-size: 12px;
+ padding: 0 10px;
+ background: #00D48A;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ }
+
+ .buttonIcon {
+ font-size: 16px;
+ font-weight: bold;
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-left: auto;
+
+ .filterLabel {
+ font-size: 13px;
+ color: #333333;
+ white-space: nowrap;
+ }
+
+ // Select组件样式
+ :global(.ant-select) {
+ font-size: 12px;
+ height: 28px !important;
+ }
+
+ :global(.ant-select .ant-select-selector) {
+ height: 28px !important;
+ font-size: 12px;
+ border-radius: 2px !important;
+ display: flex !important;
+ align-items: center !important;
+ padding: 0 11px !important;
+ }
+
+ :global(.ant-select .ant-select-selection-item) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ }
+
+ :global(.ant-select .ant-select-selection-placeholder) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ color: #00000040 !important;
+ }
+
+ .searchInput {
+ width: 150px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 0 12px;
+ font-size: 12px;
+
+ &:focus {
+ border-color: #2E4CD4;
+ outline: none;
+ }
+
+ &::placeholder {
+ color: #00000040;
+ }
+ }
+
+ .queryButton, .resetButton {
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ padding: 0 16px;
+ font-size: 12px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ border-color: #2E4CD4;
+ color: #2E4CD4;
+ }
+ }
+
+ .queryButton {
+ background-color: #00D48A;
+ color: #fff;
+ border-color: #00D48A;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ color: #fff;
+ }
+ }
+
+ .resetButton {
+ background-color: #fff;
+ color: #666;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+ }
+ }
+
+ // 第二行 - 表格
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+ margin: 16px 0 0 0;
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ }
+ }
+ }
+ }
+ }
+}
+
+// 操作按钮图标样式
+.eye-icon {
+ width: 20px;
+ height: 12.5px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 20px;
+ height: 12.5px;
+ border: 2px solid #86F278;
+ border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
+ top: 0;
+ left: 0;
+ transform: rotate(-180deg);
+ opacity: 1;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 6px;
+ height: 6px;
+ background-color: #86F278;
+ border-radius: 50%;
+ top: 3.5px;
+ left: 7px;
+ transform: rotate(-180deg);
+ }
+}
+
+.edit-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #1890ff;
+ top: 3px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 2px;
+ height: 12px;
+ background-color: #1890ff;
+ top: 2px;
+ left: 7px;
+ transform: rotate(45deg);
+ }
+}
+
+.delete-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(-45deg);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/EquipmentManagement.js b/src/pages/business_emergencyResource/components/EquipmentManagement.js
new file mode 100644
index 0000000..fea3dd2
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EquipmentManagement.js
@@ -0,0 +1,58 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EquipmentManagement.less';
+
+// 导入子页面组件
+import WasteGasPollutionControl from './secondary_menu/WasteGasPollutionControl';
+import WastewaterFacilityManagement from './secondary_menu/WastewaterFacilityManagement';
+import ProtectionFacilityMaintenance from './secondary_menu/ProtectionFacilityMaintenance';
+
+const EquipmentManagement = () => {
+ const [activeTab, setActiveTab] = useState('waste-gas-control');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'waste-gas-control',
+ label: '废气污染防治信息',
+ children:
+ },
+ {
+ key: 'wastewater-facility',
+ label: '废水设置运行管理',
+ children:
+ },
+ {
+ key: 'protection-facility',
+ label: '防护设施检维修管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EquipmentManagement;
+
diff --git a/src/pages/business_emergencyResource/components/EquipmentManagement.less b/src/pages/business_emergencyResource/components/EquipmentManagement.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EquipmentManagement.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/EvaluationReport.js b/src/pages/business_emergencyResource/components/EvaluationReport.js
new file mode 100644
index 0000000..3015091
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EvaluationReport.js
@@ -0,0 +1,57 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EvaluationReport.less';
+
+// 导入子页面组件
+import PermitStatistics from './secondary_menu/PermitStatistics';
+import EnvironmentalTaskList from './secondary_menu/EnvironmentalTaskList';
+import DischargePermitManagement from './secondary_menu/DischargePermitManagement';
+
+const EvaluationReport = () => {
+ const [activeTab, setActiveTab] = useState('permit-statistics');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'permit-statistics',
+ label: '许可证信息统计表',
+ children:
+ },
+ {
+ key: 'environmental-task-list',
+ label: '环保管理任务清单',
+ children:
+ },
+ {
+ key: 'discharge-permit-management',
+ label: '排污许可执行管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EvaluationReport;
diff --git a/src/pages/business_emergencyResource/components/EvaluationReport.less b/src/pages/business_emergencyResource/components/EvaluationReport.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/EvaluationReport.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/OnlineMonitoring.js b/src/pages/business_emergencyResource/components/OnlineMonitoring.js
new file mode 100644
index 0000000..3e4b6b5
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/OnlineMonitoring.js
@@ -0,0 +1,716 @@
+
+import React, { useEffect, useRef, useState } from 'react';
+import { Card, Result, Select, Button } from 'antd';
+import * as echarts from 'echarts';
+import StandardTable from '@/components/StandardTable';
+import styles from './OnlineMonitoring.less';
+
+import alarm0 from '@/assets/safe_majorHazard/online_monitoring/alarm0.png';
+import alarm1 from '@/assets/safe_majorHazard/online_monitoring/alarm1.png';
+import alarm2 from '@/assets/safe_majorHazard/online_monitoring/alarm2.png';
+import alarm3 from '@/assets/safe_majorHazard/online_monitoring/alarm3.png';
+import exportIcon from '@/assets/safe_majorHazard/online_monitoring/export.png';
+import deleteIcon from '@/assets/safe_majorHazard/online_monitoring/delete.png';
+
+const OnlineMonitoring = () => {
+ const chartRef = useRef(null);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 5,
+ total: 0,
+ });
+
+ useEffect(() => {
+ if (chartRef.current) {
+ const chart = echarts.init(chartRef.current);
+
+ const option = {
+ color: ['#04A7F3', '#E7C42C', '#EC6941'],
+
+ legend: {
+ data: ['液位', '温度', '压力'],
+ top: "-3px",
+ left: "center",
+ itemGap: 40, // 图例间距
+ textStyle: {
+ fontSize: 10
+ }
+ },
+ grid: {
+ left: '2%',
+ right: '4%',
+ bottom: '2%',
+ top: '12%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: ['0:00', '2:00', '4:00', '6:00', '8:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00', '22:00', '24:00'],
+ axisLabel: {
+ fontSize: 10
+ }
+ },
+ yAxis: {
+ type: 'value',
+ min: 0,
+ max: 500,
+ axisLabel: {
+ formatter: '{value}',
+ fontSize: 10
+ }
+ },
+ series: [
+ {
+ name: '液位',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#04A7F3'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(4, 167, 243, 0.3)' },
+ { offset: 1, color: 'rgba(4, 167, 243, 0)' }
+ ]
+ }
+ },
+ symbol: 'none', // 不显示数据点
+ data: [120, 200, 150, 300, 250, 400, 350, 280, 320, 180, 220, 160, 140]
+ },
+ {
+ name: '温度',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#E7C42C'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(231, 196, 44, 0.3)' },
+ { offset: 1, color: 'rgba(231, 196, 44, 0)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [80, 120, 100, 180, 160, 220, 200, 150, 170, 90, 110, 85, 75]
+ },
+ {
+ name: '压力',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#EC6941'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 1,
+ x2: 0,
+ y2: 0,
+ colorStops: [
+ { offset: 0, color: 'rgba(236, 105, 65, 0)' },
+ { offset: 1, color: 'rgba(236, 105, 65, 0.3)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [200, 300, 250, 450, 400, 430, 480, 420, 480, 280, 320, 260, 240]
+ }
+ ]
+ };
+
+ chart.setOption(option);
+
+ // 响应式调整 - 使用ResizeObserver监听容器尺寸变化
+ let resizeTimer = null;
+ const handleResize = () => {
+ // 防抖处理,避免频繁调用resize
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ resizeTimer = setTimeout(() => {
+ chart.resize();
+ }, 100);
+ };
+
+ // 监听窗口大小变化
+ window.addEventListener('resize', handleResize);
+
+ // 监听容器尺寸变化(解决菜单栏伸缩时的自适应问题)
+ let resizeObserver = null;
+ if (window.ResizeObserver) {
+ resizeObserver = new ResizeObserver(() => {
+ // 使用setTimeout确保DOM更新完成后再调整图表
+ setTimeout(() => {
+ handleResize();
+ }, 0);
+ });
+ resizeObserver.observe(chartRef.current);
+ }
+
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ if (resizeObserver) {
+ resizeObserver.disconnect();
+ }
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ chart.dispose();
+ };
+ }
+ }, []);
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '编号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 5;
+ const number = (page - 1) * pageSize + index + 1;
+ return `0${number}`.slice(-2);
+ }
+ },
+ {
+ title: '报警时间',
+ dataIndex: 'alarmTime',
+ key: 'alarmTime',
+ width: 150,
+ },
+ {
+ title: '报警传感器名称',
+ dataIndex: 'sensorName',
+ key: 'sensorName',
+ width: 150,
+ },
+ {
+ title: '报警类型',
+ dataIndex: 'alarmType',
+ key: 'alarmType',
+ width: 120,
+ },
+ {
+ title: '报警内容',
+ dataIndex: 'alarmContent',
+ key: 'alarmContent',
+ width: 200,
+ },
+ {
+ title: '优先级',
+ dataIndex: 'priority',
+ key: 'priority',
+ width: 80,
+ render: (text) => {
+ const colorMap = {
+ '高': '#FF4D4F',
+ '中': '#FAAD14',
+ '低': '#52C41A'
+ };
+ return {text};
+ }
+ },
+ {
+ title: '处理状态',
+ dataIndex: 'status',
+ key: 'status',
+ width: 100,
+ render: (text) => {
+ const statusMap = {
+ '未处理': { color: '#FF4D4F', bg: '#FFF2F0' },
+ '处理中': { color: '#FAAD14', bg: '#FFFBE6' },
+ '已处理': { color: '#52C41A', bg: '#F6FFED' }
+ };
+ const status = statusMap[text] || { color: '#333', bg: '#F5F5F5' };
+ return (
+
+ {text}
+
+ );
+ }
+ },
+ {
+ title: '处理时间',
+ dataIndex: 'processTime',
+ key: 'processTime',
+ width: 150,
+ },
+ {
+ title: '处理人',
+ dataIndex: 'processor',
+ key: 'processor',
+ width: 100,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+
+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ alarmTime: '2024-01-15 08:30:25',
+ sensorName: 'LNG储罐',
+ alarmType: '温度超限',
+ alarmContent: '储罐温度超过安全阈值',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '2',
+ id: '002',
+ alarmTime: '2024-01-15 09:15:10',
+ sensorName: 'LNG储罐',
+ alarmType: '压力异常',
+ alarmContent: '管道压力异常波动',
+ priority: '中',
+ status: '处理中',
+ processTime: '2024-01-15 09:20:00',
+ processor: '张三',
+ },
+ {
+ key: '3',
+ id: '003',
+ alarmTime: '2024-01-15 10:45:30',
+ sensorName: 'LNG储罐',
+ alarmType: '液位异常',
+ alarmContent: '储罐液位低于警戒线',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 11:00:15',
+ processor: '李四',
+ },
+ {
+ key: '4',
+ id: '004',
+ alarmTime: '2024-01-15 11:20:45',
+ sensorName: 'LNG储罐',
+ alarmType: '气体泄漏',
+ alarmContent: '检测到可燃气体泄漏',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '5',
+ id: '005',
+ alarmTime: '2024-01-15 12:10:20',
+ sensorName: 'LNG储罐',
+ alarmType: '设备振动',
+ alarmContent: '设备异常振动',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 12:30:00',
+ processor: '王五',
+ },
+ {
+ key: '6',
+ id: '006',
+ alarmTime: '2024-01-15 13:25:15',
+ sensorName: 'LNG管道',
+ alarmType: '流量异常',
+ alarmContent: '管道流量异常波动',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '7',
+ id: '007',
+ alarmTime: '2024-01-15 14:10:30',
+ sensorName: 'LNG储罐',
+ alarmType: '温度异常',
+ alarmContent: '储罐温度异常升高',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 14:15:00',
+ processor: '赵六',
+ },
+ {
+ key: '8',
+ id: '008',
+ alarmTime: '2024-01-15 15:45:20',
+ sensorName: 'LNG管道',
+ alarmType: '压力超限',
+ alarmContent: '管道压力超过安全阈值',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 16:00:00',
+ processor: '孙七',
+ },
+ {
+ key: '9',
+ id: '009',
+ alarmTime: '2024-01-15 16:30:45',
+ sensorName: 'LNG储罐',
+ alarmType: '液位超限',
+ alarmContent: '储罐液位超过警戒线',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '10',
+ id: '010',
+ alarmTime: '2024-01-15 17:15:10',
+ sensorName: 'LNG管道',
+ alarmType: '泄漏检测',
+ alarmContent: '检测到轻微气体泄漏',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 17:30:00',
+ processor: '周八',
+ },
+ {
+ key: '11',
+ id: '011',
+ alarmTime: '2024-01-15 18:20:35',
+ sensorName: 'LNG储罐',
+ alarmType: '设备故障',
+ alarmContent: '储罐阀门异常关闭',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 18:25:00',
+ processor: '吴九',
+ },
+ {
+ key: '12',
+ id: '012',
+ alarmTime: '2024-01-15 19:05:50',
+ sensorName: 'LNG管道',
+ alarmType: '温度异常',
+ alarmContent: '管道温度异常下降',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 导出功能
+ const handleExport = () => {
+ console.log('导出数据');
+ // 这里可以添加导出逻辑
+ };
+
+ // 批量删除功能
+ const handleBatchDelete = () => {
+ if (selectedRowKeys.length === 0) {
+ console.log('没有选中任何行');
+ // 可以在这里添加提示用户选择行的逻辑
+ return;
+ }
+ console.log('批量删除', selectedRowKeys);
+ // 这里可以添加批量删除逻辑
+ };
+
+ return (
+
+
+
+
+
+
+

+
+
+
+
总报警
+
1456
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
一级报警
+
357
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
二级报警
+
401
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
三级报警
+
556
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+ {/* 表格 */}
+
+ {/* 首行 左侧标题左对齐 右侧按钮右对齐 */}
+
+
+
+
+
+
+
+
+
+ {/* 表格 5行10列 带页码 每页5条数据 */}
+
+
+ `共 ${total} 条`,
+ }}
+ scroll={{ x: 1200 }}
+ />
+
+
+
+ );
+};
+
+export default OnlineMonitoring;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/OnlineMonitoring.less b/src/pages/business_emergencyResource/components/OnlineMonitoring.less
new file mode 100644
index 0000000..283ce83
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/OnlineMonitoring.less
@@ -0,0 +1,919 @@
+.Ocontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .OcontainerTop {
+ display: flex;
+
+ height: 50%;
+ margin-bottom: 5px;
+
+ .OcontainerTopLeft {
+ width: 72%;
+ height: 100%;
+ // background-color: pink;
+ margin-right: 10px;
+ // display: flex;
+
+ .OcontainerTopLeftTop {
+ width: 100%;
+ height: 35%;
+ display: flex;
+ gap: 12px;
+
+ .alarmO {
+ flex: 1;
+ height: 100%;
+ background-color: #F4F7FF;
+ border: 1px solid #AED3FF;
+ border-bottom: 0px solid #AED3FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #5382FE33 inset;
+ display: flex;
+
+ .alarmOLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmORight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmORightText1 {
+ margin-top: 15px;
+ }
+
+
+ .alarmORightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmORightText3 {
+ display: flex;
+ gap: 22px;
+ }
+
+ }
+
+
+
+ }
+
+ .alarmTw {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF5f4;
+ border: 1px solid #FFC5BC;
+ border-bottom: 0px solid #FFC5BC;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FE5F4C33 inset;
+ display: flex;
+
+ .alarmTwLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmTwRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmTwRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmTwRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmTwRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmTh {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF7F2;
+ border: 1px solid #FFD9B2;
+ border-bottom: 0px solid #FFD9B2;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FD883C33 inset;
+ display: flex;
+
+ .alarmThLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmThRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmThRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmThRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmThRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmF {
+ flex: 1;
+ height: 100%;
+ background-color: #EFF9FF;
+ border: 1px solid #89E1FF;
+ border-bottom: 0px solid #89E1FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #22A4FD33 inset;
+ display: flex;
+
+ .alarmFLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmFRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmFRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmFRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmFRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottom {
+ margin-top: 12px;
+ background-color: #fff;
+ width: 100%;
+ height: 60%;
+
+ .OcontainerTopLeftBottomTitle {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // padding: 8px 15px;
+ padding: 8px 15px 0px 15px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .titleRight {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ font-family: PingFang SC;
+ font-style: Medium;
+ font-size: 13px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .selectBox {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ background-color: #fff;
+ font-size: 12px;
+ color: #333;
+ outline: none;
+
+ &:focus {
+ border-color: #2E4CD4;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottomChart {
+ flex: 1;
+ width: 100%;
+ height: 75%;
+ }
+ }
+ }
+
+ .OcontainerTopRight {
+ flex: 1;
+ height: calc(100% - 3.3px);
+ background-color: #fff;
+ background-image: url('@/assets/safe_majorHazard/online_monitoring/backTopRight.png');
+ background-size: 100% auto;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+
+ .realTimeDataHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 15px;
+ margin-bottom: 10px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .totalCount {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ }
+ }
+
+ .dataItem {
+ height: 23%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 2px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: PingFang SC;
+ font-size: 14px;
+ // color: #666;
+ background-color: #EFF9FF;
+
+ &:last-child {
+ // margin-bottom: 1px;
+ }
+ }
+
+ .dataItem1 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1; // 强制宽高比1:1
+
+ .outerCircle {
+
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem2 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 197, 188, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fff5f4;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(254, 214, 209, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(253, 41, 14, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem3 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 217, 178, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fef6f1;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 234, 218, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(252, 103, 18, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem4 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ .OcontainerBottom {
+ background-color: #fff;
+ flex: 1;
+ padding: 8px 15px 5px 15px;
+ display: flex;
+ flex-direction: column;
+
+ .tableHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // margin-bottom: 15px;
+ padding-bottom: 5px;
+ // border-bottom: 1px solid #f0f0f0;
+
+ .tableTitle {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .tableActions {
+ display: flex;
+ gap: 8px;
+
+ // 自定义按钮样式
+ :global(.ant-btn) {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ // 主要按钮样式
+ &.ant-btn-primary {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 危险按钮样式
+ &.ant-btn-dangerous {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 禁用状态
+ &:disabled {
+ background-color: #f5f5f5 !important;
+ border-color: #d9d9d9 !important;
+ color: #bfbfbf !important;
+ box-shadow: none !important;
+ }
+ }
+ }
+ }
+
+ .tableContainer {
+ flex: 1;
+ overflow: hidden;
+
+ :global(.ant-table) {
+ font-size: 12px;
+ }
+
+ :global(.ant-table-thead > tr > th) {
+ background-color: #f5f5fa;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+ border-bottom: 1px solid #f0f0f0;
+ padding: 8px 12px;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ padding: 8px 12px;
+ border-bottom: 1px solid #f0f0f0;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr:hover > td) {
+ background-color: #f5f5f5;
+ }
+
+ :global(.ant-pagination) {
+ margin-top: 16px;
+ text-align: right;
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/PollutionSourceManagement.js b/src/pages/business_emergencyResource/components/PollutionSourceManagement.js
new file mode 100644
index 0000000..40494a0
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/PollutionSourceManagement.js
@@ -0,0 +1,656 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { Select, Button, Table, Input, Space, Tooltip, message } from 'antd';
+import { SearchOutlined, PlusOutlined, FileTextOutlined, DeleteOutlined, EditOutlined, MoreOutlined, RobotOutlined } from '@ant-design/icons';
+import ReactECharts from 'echarts-for-react';
+import { history } from 'umi';
+import StandardTable from '@/components/StandardTable';
+import styles from './PollutionSourceManagement.less';
+import icon_water from '@/assets/business_envinformation/icon_water.svg';
+import icon_soil from '@/assets/business_envinformation/icon_soil.svg';
+import icon_factory from '@/assets/business_envinformation/icon_atmosphere.svg';
+
+
+
+const { Option } = Select;
+
+const PollutionSourceManagement = () => {
+ const [loading, setLoading] = useState(false);
+ const [chartReady, setChartReady] = useState(false);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [tableData, setTableData] = useState({
+ list: [],
+ pagination: {
+ current: 1,
+ pageSize: 5,
+ total: 85
+ }
+ });
+
+ // 确保DOM准备好后再渲染图表
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setChartReady(true);
+ }, 100);
+ return () => clearTimeout(timer);
+ }, []);
+
+ // 污染物排放统计图表配置 - 闭合环图+进度饼图
+ const pollutantEmissionOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F6F1E8',
+ shadowBlur: 4,
+ shadowColor: '#FFF5F0',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: 'rgba(255, 227, 208, 0.6)', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 62,
+ name: '超标污染物数量',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 1, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#FFF4B3' },
+ { offset: 0.5, color: '#FF8351' },
+ { offset: 1, color: '#FF7125' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 38,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标污染物种类统计图表配置 - 闭合环图+进度饼图
+ const pollutantTypeOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F2F0FF',
+ shadowBlur: 4,
+ shadowColor: '#F2F0FF',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: '#E4E1FB', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 25,
+ name: '超标污染物种类',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#B3D6FF' },
+ { offset: 0.476, color: '#9E7DFF' },
+ { offset: 1, color: '#2549FF' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 75,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标排放统计图表配置
+ const exceedanceOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ },
+ formatter: function (params) {
+ const data = params[0];
+ const exceedanceData = [
+ { name: '污染物1', status: '轻微超标', exceedance: '15%' },
+ { name: '污染物2', status: '严重超标', exceedance: '66%' },
+ { name: '污染物3', status: '轻微超标', exceedance: '8%' },
+ { name: '污染物4', status: '正常', exceedance: '0%' },
+ { name: '污染物5', status: '轻微超标', exceedance: '12%' }
+ ];
+ const item = exceedanceData[data.dataIndex];
+ return `
+
+
${data.name}
+
${item.status}
+
超标 ${item.exceedance}
+
大气环境特征污染物
+
+ `;
+ }
+ },
+ grid: {
+ left: '12%',
+ right: '5%',
+ top: '5%',
+ bottom: '12%'
+ },
+ xAxis: {
+ type: 'value',
+ max: 100,
+ min: 0,
+ interval: 10,
+ splitNumber: 10,
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6',
+ width: 1
+ }
+ },
+ axisTick: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisLabel: {
+ color: '#666',
+ formatter: function (value) {
+ return value;
+ }
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: '#f0f0f0',
+ type: 'dashed'
+ }
+ }
+ },
+ yAxis: {
+ type: 'category',
+ data: ['污染物1', '污染物2', '污染物3', '污染物4', '污染物5'],
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisTick: {
+ show: false
+ },
+ axisLabel: {
+ color: '#666',
+ fontSize: 12
+ }
+ },
+ series: [{
+ type: 'bar',
+ data: [45, 66, 32, 28, 38],
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 1,
+ y2: 0,
+ colorStops: [{
+ offset: 0, color: '#FFEBD9'
+ }, {
+ offset: 1, color: '#FF0000'
+ }]
+ },
+ // borderRadius: [0, 4, 0, 0]
+ },
+ barWidth: '60%',
+ barCategoryGap: '20px'
+ }]
+ };
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '生产工艺设备',
+ dataIndex: 'equipment',
+ key: 'equipment',
+ width: 120,
+ },
+ {
+ title: '原材料产品',
+ dataIndex: 'material',
+ key: 'material',
+ width: 150,
+ },
+ {
+ title: '污染物排放处理设施',
+ dataIndex: 'facility',
+ key: 'facility',
+ width: 180,
+ },
+ {
+ title: '污染物排放种类',
+ dataIndex: 'type',
+ key: 'type',
+ width: 150,
+ render: (text) => (
+
+ {text}
+ {/* */}
+
+ ),
+ },
+ {
+ title: '排放数量',
+ dataIndex: 'quantity',
+ key: 'quantity',
+ width: 100,
+ },
+ {
+ title: '数量单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ },
+ {
+ title: '排放方式',
+ dataIndex: 'method',
+ key: 'method',
+ width: 100,
+ },
+ {
+ title: '趋向',
+ dataIndex: 'trend',
+ key: 'trend',
+ width: 200,
+ ellipsis: true,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 80,
+ render: (_, record) => (
+
+
+ handleDelete(record)}
+ />
+
+
+ ),
+ },
+ ];
+
+ // 模拟表格数据
+ const mockTableData = [
+ {
+ key: '1',
+ equipment: '比亚迪',
+ material: '丁硼乳膏(雅皓)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 47,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '2',
+ equipment: '荣威',
+ material: '东方活血膏(明仁)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 34,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '3',
+ equipment: '现代',
+ material: '骨友灵搽剂(太极)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 45,
+ unit: 'm³',
+ method: '方式1',
+ trend: '刘某及同伴三人前往该射'
+ },
+ {
+ key: '4',
+ equipment: '日产',
+ material: '对乙酰氨基酚栓',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 55,
+ unit: 'm³',
+ method: '方式1',
+ trend: '一到假期,大量"xx暑假'
+ },
+ {
+ key: '5',
+ equipment: '北汽',
+ material: '对乙酰氨基酚片(必理通)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 22,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近日,陕西延安培文实验'
+ },
+ {
+ key: '6',
+ equipment: '吉利',
+ material: '阿莫西林胶囊(联邦)',
+ facility: '污水处理设备001',
+ type: '种类2',
+ quantity: 38,
+ unit: 'kg',
+ method: '方式2',
+ trend: '环保部门加强监管力度,排放标准逐步提高'
+ },
+ {
+ key: '7',
+ equipment: '长城',
+ material: '布洛芬缓释胶囊(芬必得)',
+ facility: '废气处理设备002',
+ type: '种类3',
+ quantity: 29,
+ unit: 't',
+ method: '方式3',
+ trend: '企业积极响应绿色生产号召,投入环保设施'
+ },
+ {
+ key: '8',
+ equipment: '奇瑞',
+ material: '复方甘草片(太极)',
+ facility: '固废处理设备003',
+ type: '种类4',
+ quantity: 15,
+ unit: 'm³',
+ method: '方式4',
+ trend: '定期进行环境监测,确保排放达标'
+ }
+ ];
+
+ useEffect(() => {
+ setTableData({
+ list: mockTableData,
+ pagination: {
+ current: 6,
+ pageSize: 5,
+ total: 85
+ }
+ });
+ }, []);
+
+ // 处理删除操作
+ const handleDelete = (record) => {
+ message.success(`删除 ${record.equipment} 成功`);
+ };
+
+ // 处理新增操作
+ const handleAdd = () => {
+ message.info('新增功能开发中');
+ };
+
+ // 处理生成报表操作
+ const handleGenerateReport = () => {
+ message.info('生成报表功能开发中');
+ };
+
+ // 处理表格变化
+ const handleTableChange = (pagination) => {
+ setTableData(prev => ({
+ ...prev,
+ pagination: {
+ ...prev.pagination,
+ current: pagination.current,
+ pageSize: pagination.pageSize
+ }
+ }));
+ };
+
+ // 处理大气环境点击
+ const handleAtmosphereCardClick = () => {
+ history.push('/topnavbar00/business/atmospherePollutantLibrary');
+ };
+
+
+ return (
+
+ {/* 顶部统计区域 */}
+
+ {/* 污染物排放统计 */}
+
+
+
污染物排放统计
+
+
+
+
+
+
+
+ {/*
超标污染物数量
*/}
+ {chartReady && (
+
+ )}
+
+
+
+ {/*
超标污染物种类
*/}
+ {chartReady && (
+
+ )}
+
+
+
+
+
+ {/* 超标排放统计 */}
+
+
+
超标排放统计
+
+
+
+
+
+
+ {chartReady && (
+
+ )}
+
+
+
+ {/* 环境分类卡片 */}
+
+
+
+
AIR POLLUSION
+
+
+

+
+
+
+
WATER POLLUSION
+
+
+

+
+
+
+
SOILPOLLUSION
+
+
+

+
+
+
+
+
+
+ {/* 污染源管理表格区域 */}
+
+
+
污染源管理
+
+ }
+ onClick={handleAdd}
+ className={styles.titleAddButton}
+ >
+ 新增
+
+ }
+ onClick={handleGenerateReport}
+ className={styles.titleReportButton}
+ >
+ 生成报表
+
+
+
+
+
({
+ name: record.name,
+ }),
+ }}
+ pagination={{
+ showTotal: (total, range) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ pageSizeOptions: ['5', '10', '20', '50', '100'],
+ defaultPageSize: 5,
+ size: 'small',
+ }}
+ />
+
+
+ );
+};
+
+export default PollutionSourceManagement;
+
diff --git a/src/pages/business_emergencyResource/components/PollutionSourceManagement.less b/src/pages/business_emergencyResource/components/PollutionSourceManagement.less
new file mode 100644
index 0000000..7f48f4c
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/PollutionSourceManagement.less
@@ -0,0 +1,590 @@
+.pollutionDashboard {
+ width: 100%;
+ min-height: 75vh;
+ // background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding: 15px;
+ box-sizing: border-box;
+
+ // 顶部统计区域
+ .statsSection {
+ display: flex;
+ gap: 15px;
+ margin-bottom: 15px;
+ height: 35vh;
+ align-items: stretch;
+
+ // 污染物排放统计卡片
+ .pollutantStatsCard {
+ width: 37%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background7.svg'),
+ linear-gradient(180deg, #E2FFF5 0%, rgba(255, 255, 255, 0.6) 51.44%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+ }
+
+ // 超标排放统计卡片
+ .exceedanceStatsCard {
+ width: 40%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background8.svg'),
+ linear-gradient(180.21deg, rgba(255, 227, 227, 0.58) 0.18%, #FFFFFF 53.1%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .exceedanceTimeFilter,
+ .exceedanceCategoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #FFC3C3;
+ background: #FFDEDEB2;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 卡片头部筛选器
+ .cardHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 0;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0;
+ border: none;
+ flex-shrink: 0;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .timeFilter,
+ .categoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #73E9C6;
+ background: #C0FFE9AB;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 图表容器
+ .chartsContainer {
+ display: flex;
+ gap: 20px;
+ justify-content: space-between;
+ background: transparent;
+ flex: 1;
+
+ .pieChartContainer {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ background: transparent;
+ height: 100%;
+ min-height: 200px;
+
+ .chartTitle {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 10px;
+ font-weight: 500;
+ background: transparent;
+ }
+
+ .chartCenterContent {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 10;
+ background: transparent;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .chartValue {
+ font-size: 18px;
+ font-weight: bold;
+ color: #FF2F2F;
+ background: transparent;
+ margin: 0;
+ line-height: 1;
+ }
+
+ .chartLabel {
+ font-size: 12px;
+ font-weight: 500;
+ color: #000000;
+ background: transparent;
+ margin: 0;
+ margin-top: 2px;
+ line-height: 1;
+ }
+ }
+ }
+
+ // 条形图容器
+ .barChartContainer {
+ flex: 1;
+ margin-top: 10px;
+ }
+
+ // 环境分类卡片区域
+ .environmentalCategories {
+ flex: 1; // 撑满剩余宽度
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ // background-color: pink;
+
+ .categoryCard1 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(27, 201, 181, 0.2) 0%, rgba(58, 255, 216, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .airPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 255, 217, 0.1) 2.62%, rgba(0, 153, 131, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard2 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(36, 149, 255, 0.2) 0%, rgba(85, 164, 255, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .waterPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 170, 255, 0.1) 2.62%, rgba(89, 186, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard3 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(25, 60, 234, 0.2) 0%, rgba(139, 193, 255, 0) 100%);
+ position: relative;
+ cursor: pointer;
+ padding: 5px 15px;
+
+ .soilPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 89, 255, 0.1) 2.62%, rgba(89, 117, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryContent {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .categoryInfo {
+ flex: 1;
+
+ .titleContainer {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 5px;
+ }
+
+ .categoryTitle {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 0px;
+
+ &.atmosphereGradient {
+ background: linear-gradient(183.17deg, #0EE5C5 2.62%, #08C2C2 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.atmosphereMirror {
+ background: linear-gradient(183.17deg, rgba(168, 255, 242, 0) 2.62%, rgba(86, 237, 214, 0) 65.7%, #00D9B9 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.waterGradient {
+ background: linear-gradient(183.17deg, #40AFFF 2.62%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.waterMirror {
+ background: linear-gradient(183.17deg, rgba(64, 175, 255, 0) 2.62%, rgba(0, 179, 255, 0) 65.7%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.soilGradient {
+ background: linear-gradient(183.17deg, #6E90FF 2.62%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.soilMirror {
+ background: linear-gradient(183.17deg, rgba(110, 144, 255, 0) 2.62%, rgba(61, 144, 239, 0) 65.7%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+ }
+
+ .categorySubtitle {
+ font-size: 12px;
+ color: #666;
+
+ &.pollutantSubtitle {
+ color: rgba(51, 51, 51, 1);
+ font-family: 'Alibaba PuHuiTi', sans-serif;
+ font-weight: 500;
+ font-size: 14px;
+ line-height: 22px;
+ letter-spacing: 4%;
+ margin-top: -20px;
+ }
+ }
+ }
+
+ .categoryIcon {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 5px;
+ // border-radius: 50%;
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+
+ .factoryIcon,
+ .waterIcon,
+ .soilIcon {
+ font-size: 20px;
+ filter: grayscale(0);
+ }
+ }
+ }
+ }
+ }
+
+ // 表格卡片
+ .tableCard {
+ background: #fff;
+ border-radius: 2px;
+ // box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ // border: 1px solid rgba(255, 255, 255, 0.2);
+ // backdrop-filter: blur(10px);
+ padding: 20px;
+
+ .cardTitle {
+ // background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
+ color: rgba(0, 0, 0, 1);
+ font-weight: 500;
+ font-size: 16px;
+ padding: 12px 16px;
+ margin: -20px -20px 10px -20px;
+ // border-radius: 12px 12px 0 0;
+ // border-bottom: 2px solid #e8f4fd;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .titleButtons {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+
+ .titleAddButton {
+ background: rgba(0, 212, 138, 1);
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+ }
+ }
+
+ .titleReportButton {
+ border-radius: 4px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #666;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ transform: translateY(-1px);
+ }
+ }
+ }
+ }
+ }
+
+
+ // 自定义Tooltip样式
+ .customTooltip {
+ background: rgba(0, 0, 0, 0.8);
+ border-radius: 8px;
+ padding: 10px;
+ color: white;
+ font-size: 12px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+
+ .tooltipLabel {
+ font-weight: 600;
+ margin-bottom: 5px;
+ color: #fff;
+ }
+
+ .tooltipStatus {
+ color: #ff6b6b;
+ margin-bottom: 3px;
+ }
+
+ .tooltipExceedance {
+ color: #ffd93d;
+ margin-bottom: 3px;
+ }
+
+ .tooltipType {
+ color: #a8e6cf;
+ font-size: 11px;
+ }
+ }
+
+ // 响应式设计
+ @media (max-width: 1200px) {
+ .statsSection {
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: auto auto;
+
+ .environmentalCategories {
+ grid-column: 1 / -1;
+ flex-direction: row;
+ gap: 15px;
+
+ .categoryCard {
+ flex: 1;
+ }
+ }
+ }
+ }
+
+ @media (max-width: 768px) {
+ padding: 10px;
+
+ .statsSection {
+ grid-template-columns: 1fr;
+ gap: 15px;
+
+ .environmentalCategories {
+ flex-direction: column;
+ }
+ }
+
+ }
+
+ // 表格样式优化
+ :global(.ant-table) {
+ // border-radius: 8px;
+ overflow: hidden;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.85);
+
+ :global(.ant-table-thead > tr > th) {
+ // background: linear-gradient(90deg, #f8f9fa 0%, #e9ecef 100%);
+ // border-bottom: 2px solid #dee2e6;
+ font-weight: 400;
+
+ }
+
+ :global(.ant-table-tbody > tr) {
+ // transition: all 0.3s ease;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ // border-bottom: 1px solid #f0f0f0;
+ }
+ }
+
+ // 分页器样式
+ // :global(.ant-pagination) {
+ // margin-top: 20px;
+ // text-align: center;
+
+ // :global(.ant-pagination-item) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+
+ // &.ant-pagination-item-active {
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ // border-color: #667eea;
+ // color: white;
+ // }
+ // }
+
+ // :global(.ant-pagination-prev),
+ // :global(.ant-pagination-next) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+ // }
+ // }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.js b/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.js
new file mode 100644
index 0000000..765d995
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.js
@@ -0,0 +1,345 @@
+import React, { useState } from 'react';
+import { Button, Input, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, UploadOutlined, DownloadOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './DischargePermitManagement.less';
+// import attachment from '@/assets/business_envinformation/attachment.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+
+const DischargePermitManagement = () => {
+ const [activeTab, setActiveTab] = useState('actual');
+
+ // 实际排放数据
+ const actualEmissionData = [
+ { key: 1, emissionType: '前林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 3, emissionType: '长家界市', pollutant: '12345678', outletType: '环境设计', outletName: '上海环境科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 4, emissionType: '北京市', pollutant: '87654321', outletType: '污染治理', outletName: '北京环保科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 5, emissionType: '上海市', pollutant: '11223344', outletType: '排放监测', outletName: '上海监测技术有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 6, emissionType: '广州市', pollutant: '55667788', outletType: '工业废水', outletName: '广州环保科技股份有限公司', permittedEmission: '3年', annualTotal: '2025-09-10' },
+ { key: 7, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 8, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' },
+ { key: 9, emissionType: '南京市', pollutant: '77889900', outletType: '工业废气', outletName: '南京工业集团股份有限公司', permittedEmission: '6年', annualTotal: '2025-06-15' },
+ { key: 10, emissionType: '武汉市', pollutant: '11223355', outletType: '交通污染', outletName: '武汉交通发展有限公司', permittedEmission: '3年', annualTotal: '2025-11-20' },
+ { key: 11, emissionType: '成都市', pollutant: '66778899', outletType: '建筑扬尘', outletName: '成都建筑工程有限公司', permittedEmission: '5年', annualTotal: '2025-05-30' },
+ { key: 12, emissionType: '西安市', pollutant: '44556677', outletType: '餐饮油烟', outletName: '西安餐饮管理有限公司', permittedEmission: '4年', annualTotal: '2025-12-10' }
+ ];
+
+ // 超标排放数据
+ const excessiveEmissionData = [
+ { key: 1, emissionType: '俞林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-09' },
+ { key: 3, emissionType: '长家界市', pollutant: '1716652546', outletType: '环境设计', outletName: '水木晨曦(北京)科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 4, emissionType: '潭市', pollutant: '384654762', outletType: '电子竞技运动与管理', outletName: '亚商桥(北京)咨询有限公司', permittedEmission: '5年', annualTotal: '2025-08-18' },
+ { key: 5, emissionType: '次州市', pollutant: '34669295254', outletType: '精算学', outletName: '中讯通讯科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-13' },
+ { key: 6, emissionType: '驻马店市', pollutant: '4347052411', outletType: '数字媒体艺术', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-21' },
+ { key: 7, emissionType: '三亚市', pollutant: '388946891', outletType: '技术侦察学', outletName: '中大国际文化有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 8, emissionType: '巢湖市', pollutant: '7190228566', outletType: '财政学', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-20' },
+ { key: 9, emissionType: '东营市', pollutant: '6656363924', outletType: '保险学', outletName: '北京济丰国际医院管理有限公司', permittedEmission: '5年', annualTotal: '2025-08-27' },
+ { key: 10, emissionType: '九龙', pollutant: '622145211', outletType: '英语', outletName: '北京庆奔科贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-28' },
+ { key: 11, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 12, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' }
+ ];
+
+ // 污染治理设备异常情况数据
+ const equipmentAbnormalData = [
+ { key: 1, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 2, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 3, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 4, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 5, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 6, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 7, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 8, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 9, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 10, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 11, emissionType: '类型2', pollutant: '11:20:15—11:45:30', outletType: '风机', outletName: '磨损', permittedEmission: '因子名称2', annualTotal: '风机10m内' },
+ { key: 12, emissionType: '类型3', pollutant: '14:30:20—15:10:40', outletType: '泵站', outletName: '堵塞', permittedEmission: '因子名称3', annualTotal: '泵站15m内' }
+ ];
+
+ // 实际排放和超标排放的表格列定义
+ const normalColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '排放物类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '污染物',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 100,
+ },
+ {
+ title: '排放口类型',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 160,
+ },
+ {
+ title: '排放口编号/排放口名称',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 220,
+ },
+ {
+ title: '许可排放量(吨)',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 120,
+ },
+ {
+ title: '年度合计',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '第一季度',
+ key: 'q1',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '二季度',
+ key: 'q2',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '三季度',
+ key: 'q3',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '四季度',
+ key: 'q4',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 污染治理设备异常情况的表格列定义
+ const equipmentColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '故障类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '超标时段(开始时段—结束时段)',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 200,
+ },
+ {
+ title: '故障设施',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 100,
+ },
+ {
+ title: '故障原因',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 100,
+ },
+ {
+ title: '排放因子',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 100,
+ },
+ {
+ title: '排放范围',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '排放因子浓度(mg/m³或dB(A))',
+ key: 'concentration',
+ width: 200,
+ render: () => '2025-08-15',
+ },
+ {
+ title: '应对',
+ key: 'response',
+ width: 80,
+ render: () => '—',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 获取当前标签页的数据
+ const getCurrentData = () => {
+ switch (activeTab) {
+ case 'actual':
+ return actualEmissionData;
+ case 'excessive':
+ return excessiveEmissionData;
+ case 'equipment':
+ return equipmentAbnormalData;
+ default:
+ return actualEmissionData;
+ }
+ };
+
+ // 获取当前标签页的列定义
+ const getCurrentColumns = () => {
+ switch (activeTab) {
+ case 'actual':
+ case 'excessive':
+ return normalColumns;
+ case 'equipment':
+ return equipmentColumns;
+ default:
+ return normalColumns;
+ }
+ };
+
+ // 分页配置
+ const pagination = {
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ showTotal: (total) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ 筛选条件
+
+
+ }
+ className={styles.queryBtn}
+ >
+ 查询
+
+ }
+ className={styles.resetBtn}
+ >
+ 重置
+
+ }
+ className={styles.uploadBtn}
+ >
+ 上传
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DischargePermitManagement;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.less b/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.less
new file mode 100644
index 0000000..6bb0c75
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/DischargePermitManagement.less
@@ -0,0 +1,160 @@
+.dischargePermitManagement {
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ padding: 20px;
+
+ .tabContainer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 15px;
+ padding: 0 ;
+ // border-bottom: 1px solid #e8e8e8;
+
+ .tabButtons {
+ display: flex;
+ gap: 0;
+ background-color: #F4F4F4;
+ border-radius: 4px;
+ padding: 4px 8px;
+ align-items: center;
+
+ .tabButton {
+ padding: 8px 20px;
+ border: none;
+ background-color: transparent;
+ color: #666;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ border-radius: 4px;
+ transition: all 0.3s ease;
+ height: auto;
+ line-height: 1.4;
+
+ &:hover {
+ color: #1890ff;
+ background-color: rgba(24, 144, 255, 0.1);
+ }
+
+ &.active {
+ background-color: #03C598;
+ color: #fff;
+ }
+ }
+ }
+
+ .filterSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ border-radius: 4px;
+
+ .filterLabel {
+ font-size: 14px;
+ color: #333;
+ }
+
+ .filterSelect {
+ min-width: 120px;
+ }
+
+ .filterInput {
+ min-width: 200px;
+ border-radius: 4px;
+ }
+
+ .queryBtn {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ border-radius: 4px;
+
+ &:hover {
+ background-color: #389e0d;
+ border-color: #389e0d;
+ }
+ }
+
+ .resetBtn, .uploadBtn {
+ background-color: #fff;
+ color: #666;
+ border-color: #d9d9d9;
+ border-radius: 4px;
+
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+ }
+ }
+ }
+
+ .tableContent {
+ width: 100%;
+
+ // 覆盖表头样式
+ :global {
+ .ant-table-thead > tr > th {
+ font-weight: 400 !important;
+ font-size: 12px !important;
+ color: #333 !important;
+ text-align: center !important;
+ background-color: #FAFAFA !important;
+ }
+
+ .ant-table-tbody > tr > td {
+ font-size: 12px;
+ color: #333;
+ text-align: center;
+ }
+
+ .ant-table-wrapper {
+ width: 100%;
+ max-width: 100%;
+ }
+ }
+
+ .attachmentLink {
+ color: #1890ff;
+ text-decoration: none;
+ font-size: 12px;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+
+ .actionButtons {
+ display: flex;
+ gap: 20px;
+ justify-content: center;
+ align-items: center;
+
+ .downloadIcon, .deleteIcon {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: scale(1.1);
+ opacity: 0.8;
+ }
+ }
+
+ .downloadIcon {
+ &:hover {
+ filter: brightness(1.2);
+ }
+ }
+
+ .deleteIcon {
+ &:hover {
+ filter: brightness(1.2) saturate(1.5);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.js b/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.js
new file mode 100644
index 0000000..f4e6367
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import styles from './EnvironmentalTaskList.less';
+
+const EnvironmentalTaskList = () => {
+ return (
+
+
+
+
2) 环保管理任务清单
+
依据排污许可证副本中的环保要求,提供生成环保管理要求任务清单;
+
环保任务清单包括:大气排放口信息,大气污染物有组织排放许可年限值,大气污染物无组织排放年限制、企业大气排放总许可量;废水排放口、废水污染物排放许可限制;固体废物排放信息、自行贮存和自行利用/处置设施信息;工业噪声排放信息;
+
环境管理要求包括:自行检测及记录表、环境管理台账记录。
+
+
+
+
+ 共85条
+
+
+
+
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+
+ );
+};
+
+export default EnvironmentalTaskList;
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.less b/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.less
new file mode 100644
index 0000000..c9f43c6
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/EnvironmentalTaskList.less
@@ -0,0 +1,105 @@
+.environmentalTaskListContainer {
+ width: 100%;
+ height: 72vh;
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ position: relative;
+}
+
+.environmentalTaskListContent {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0px 20px;
+}
+
+.environmentalTaskListText {
+ max-width: 800px;
+ text-align: left;
+ line-height: 1.6;
+
+ h2 {
+ font-size: 20px;
+ color: #333;
+ margin-bottom: 20px;
+ font-weight: 600;
+ }
+
+ p {
+ font-size: 16px;
+ color: #333;
+ margin-bottom: 15px;
+ text-indent: 2em;
+ }
+}
+
+.environmentalTaskListPagination {
+ position: absolute;
+ bottom: 20px;
+ right: 20px;
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ background: #fff;
+ padding: 10px 20px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.paginationInfo {
+ font-size: 14px;
+ color: #666;
+}
+
+.paginationControls {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.pageSizeSelect {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ font-size: 12px;
+ background: #fff;
+}
+
+.pageNumbers {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.pageButton, .pageNumber {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ border-radius: 4px;
+ font-size: 12px;
+ cursor: pointer;
+ min-width: 32px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+}
+
+.pageNumber.active {
+ background: #1890ff;
+ color: #fff;
+ border-color: #1890ff;
+}
+
+.pageEllipsis {
+ padding: 4px 8px;
+ font-size: 12px;
+ color: #666;
+}
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.js b/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.js
new file mode 100644
index 0000000..4366372
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './InformationDisclosure.less';
+
+const InformationDisclosure = () => {
+ return (
+
+ );
+};
+
+export default InformationDisclosure;
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.less b/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/InformationDisclosure.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.js b/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.js
new file mode 100644
index 0000000..f8e20d1
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.js
@@ -0,0 +1,286 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitManagement.less';
+import licence1 from '@/assets/business_envinformation/licence1.svg';
+import licence2 from '@/assets/business_envinformation/licence2.svg';
+
+const PermitManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ companyName: '北京某某环保有限公司',
+ permitNumber: 'PWX-BJ-2023-001',
+ issueOrg: '北京市生态环境局',
+ expireDate: '2025-12-31',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 2,
+ companyName: '上海某某化工有限公司',
+ permitNumber: 'PWX-SH-2023-002',
+ issueOrg: '上海市生态环境局',
+ expireDate: '2025-10-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 3,
+ companyName: '广州某某制造有限公司',
+ permitNumber: 'PWX-GZ-2023-003',
+ issueOrg: '广州市生态环境局',
+ expireDate: '2026-03-20',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 4,
+ companyName: '深圳某某电子有限公司',
+ permitNumber: 'PWX-SZ-2023-004',
+ issueOrg: '深圳市生态环境局',
+ expireDate: '2025-08-10',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 5,
+ companyName: '成都某某科技有限公司',
+ permitNumber: 'PWX-CD-2023-005',
+ issueOrg: '成都市生态环境局',
+ expireDate: '2026-01-25',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 6,
+ companyName: '武汉某某工业有限公司',
+ permitNumber: 'PWX-WH-2023-006',
+ issueOrg: '武汉市生态环境局',
+ expireDate: '2025-11-30',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 7,
+ companyName: '杭州某某环保有限公司',
+ permitNumber: 'PWX-HZ-2023-007',
+ issueOrg: '杭州市生态环境局',
+ expireDate: '2026-05-15',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 8,
+ companyName: '南京某某化学有限公司',
+ permitNumber: 'PWX-NJ-2023-008',
+ issueOrg: '南京市生态环境局',
+ expireDate: '2025-09-20',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 9,
+ companyName: '重庆某某重工有限公司',
+ permitNumber: 'PWX-CQ-2023-009',
+ issueOrg: '重庆市生态环境局',
+ expireDate: '2026-02-28',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 10,
+ companyName: '天津某某制药有限公司',
+ permitNumber: 'PWX-TJ-2023-010',
+ issueOrg: '天津市生态环境局',
+ expireDate: '2025-07-10',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 11,
+ companyName: '西安某某材料有限公司',
+ permitNumber: 'PWX-XA-2023-011',
+ issueOrg: '西安市生态环境局',
+ expireDate: '2026-04-05',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 12,
+ companyName: '青岛某某机械有限公司',
+ permitNumber: 'PWX-QD-2023-012',
+ issueOrg: '青岛市生态环境局',
+ expireDate: '2025-12-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 200,
+ },
+ {
+ title: '排污许可证号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 180,
+ },
+ {
+ title: '颁发机构',
+ dataIndex: 'issueOrg',
+ key: 'issueOrg',
+ width: 180,
+ },
+ {
+ title: '到期时间',
+ dataIndex: 'expireDate',
+ key: 'expireDate',
+ width: 120,
+ sorter: (a, b) => new Date(a.expireDate) - new Date(b.expireDate),
+ showSorterTooltip: false,
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 150,
+ align: 'center',
+ render: (_, record) => (
+
+ handleView(record)}
+ />
+ handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ }
+ }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitManagement;
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.less b/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.less
new file mode 100644
index 0000000..b200e6c
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/PermitManagement.less
@@ -0,0 +1,137 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ // margin-bottom: 20px;
+ padding: 20px;
+ // background-color: #fafafa;
+ // border-radius: 2px;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.js b/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.js
new file mode 100644
index 0000000..fec1778
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.js
@@ -0,0 +1,421 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitStatistics.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+const PermitStatistics = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 14,
+ });
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ administrativeRegion: '榆林市',
+ permitNumber: '51669811',
+ industryCategory: '信用风险管理与法律防',
+ companyName: '北京那蓝国际贸易有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 2,
+ administrativeRegion: '拉萨市',
+ permitNumber: '34887875',
+ industryCategory: '涉外警务',
+ companyName: '中潮石林企业咨询(上海)有限公司北京分公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-09',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 3,
+ administrativeRegion: '长家界市',
+ permitNumber: '1716652546',
+ industryCategory: '环境设计',
+ companyName: '水木晨曦(北京)科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 4,
+ administrativeRegion: '马潭市',
+ permitNumber: '384654762',
+ industryCategory: '电子竞技运动与管理',
+ companyName: '亚商桥(北京)咨询有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 5,
+ administrativeRegion: '交州市',
+ permitNumber: '34669295254',
+ industryCategory: '精算学',
+ companyName: '中讯通讯科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-13',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 6,
+ administrativeRegion: '驻马店市',
+ permitNumber: '4347052411',
+ industryCategory: '数字媒体艺术',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-21',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 7,
+ administrativeRegion: '三亚市',
+ permitNumber: '388946691',
+ industryCategory: '技术侦察学',
+ companyName: '中大国际文化有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 8,
+ administrativeRegion: '美湖市',
+ permitNumber: '7190228566',
+ industryCategory: '财政学',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-20',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 9,
+ administrativeRegion: '东营市',
+ permitNumber: '6656363924',
+ industryCategory: '保险学',
+ companyName: '北京清丰国际医院管理有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-06-27',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 10,
+ administrativeRegion: '九龙',
+ permitNumber: '622145211',
+ industryCategory: '英语',
+ companyName: '北京庆奔科贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-28',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 11,
+ administrativeRegion: '深圳市',
+ permitNumber: '755123456',
+ industryCategory: '计算机科学与技术',
+ companyName: '深圳创新科技有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-01',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 12,
+ administrativeRegion: '杭州市',
+ permitNumber: '571789012',
+ industryCategory: '电子商务',
+ companyName: '杭州数字贸易有限公司',
+ validityPeriod: '4年',
+ issueDate: '2025-09-05',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 13,
+ administrativeRegion: '成都市',
+ permitNumber: '028345678',
+ industryCategory: '生物技术',
+ companyName: '成都生物科技股份有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-09-10',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 14,
+ administrativeRegion: '武汉市',
+ permitNumber: '027456789',
+ industryCategory: '机械工程',
+ companyName: '武汉智能制造有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '行政区',
+ dataIndex: 'administrativeRegion',
+ key: 'administrativeRegion',
+ width: 120,
+ },
+ {
+ title: '许可证编号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 130,
+ },
+ {
+ title: '行业类别',
+ dataIndex: 'industryCategory',
+ key: 'industryCategory',
+ width: 200,
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 230,
+ },
+ {
+ title: '有效期限',
+ dataIndex: 'validityPeriod',
+ key: 'validityPeriod',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '发证日期',
+ dataIndex: 'issueDate',
+ key: 'issueDate',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 80,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 120,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ render: (_, record) => (
+
+
handleView(record)}
+ />
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 导入
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitStatistics;
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.less b/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.less
new file mode 100644
index 0000000..54aa30e
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/PermitStatistics.less
@@ -0,0 +1,187 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.js b/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.js
new file mode 100644
index 0000000..a83b5c2
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.js
@@ -0,0 +1,578 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './ProtectionFacilityMaintenance.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const ProtectionFacilityMaintenance = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 13,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ facilityCode: '35.236.217.212',
+ startTime: '2025-08-23 06:18',
+ endTime: '2025-08-23 06:18',
+ pollutantType: '123',
+ concentration: '39',
+ unit: 'm³/d',
+ dischargeDestination: '大气',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-23 06:18',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉骐',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ facilityCode: '65.177.48.116',
+ startTime: '2025-09-07 17:48',
+ endTime: '2025-09-07 17:48',
+ pollutantType: '大气污染物',
+ concentration: '52',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-07 17:48',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ facilityCode: '111.161.135.125',
+ startTime: '2025-09-04 13:08',
+ endTime: '2025-09-04 13:08',
+ pollutantType: '污水',
+ concentration: '28',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-04 13:08',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-22',
+ recorder: '王佛瑶',
+ reviewer: '赵玉',
+ facilityName: '烧烫伤膏(茂祥)',
+ facilityCode: '162.208.135.147',
+ startTime: '2025-08-28 22:40',
+ endTime: '2025-08-28 22:40',
+ pollutantType: '污水',
+ concentration: '46',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近期,高铁"熊孩子"事件频出,...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-28 22:40',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-31',
+ recorder: '吴子萱',
+ reviewer: '钱品妍',
+ facilityName: '云南白药(云南白药)',
+ facilityCode: '138.6.246.181',
+ startTime: '2025-09-17 19:48',
+ endTime: '2025-09-17 19:48',
+ pollutantType: '污水',
+ concentration: '37',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '刘某及同伴三人前往该射击俱乐部...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-17 19:48',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '何风景',
+ reviewer: '赵海洲',
+ facilityName: '麝香壮骨膏(修正)',
+ facilityCode: '134.80.173.128',
+ startTime: '2025-09-02 22:21',
+ endTime: '2025-09-02 22:21',
+ pollutantType: '污水',
+ concentration: '53',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '一位网友在社交平台发布的视频显...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-02 22:21',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-28',
+ recorder: '李琳颖',
+ reviewer: '李建刚',
+ facilityName: '复方醋酸甲羟孕酮胶囊(妇复春)',
+ facilityCode: '218.169.25.43',
+ startTime: '2025-09-06 16:27',
+ endTime: '2025-09-06 16:27',
+ pollutantType: '污水',
+ concentration: '24',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '盛夏时节,四川绵竹市汉旺镇一株...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-06 16:27',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-22',
+ recorder: '赵午光',
+ reviewer: '钱泽西',
+ facilityName: '桂龙药膏',
+ facilityCode: '54.218.80.84',
+ startTime: '2025-09-12 22:50',
+ endTime: '2025-09-12 22:50',
+ pollutantType: '污水',
+ concentration: '47',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '随着"热射病"这一高温疾病快速...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-12 22:50',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-21',
+ recorder: '王凤娇',
+ reviewer: '李金泽',
+ facilityName: '和兴白花油(和兴白花油)',
+ facilityCode: '222.1.18.173',
+ startTime: '2025-09-10 04:28',
+ endTime: '2025-09-10 04:28',
+ pollutantType: '污水',
+ concentration: '33',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '夏粮丰,全年稳。国家粮食和物资...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-10 04:28',
+ },
+ {
+ key: 10,
+ recordTime: '2025-09-09',
+ recorder: '赵涛',
+ reviewer: '何能',
+ facilityName: '茶苯海明含片(贻晗柠)',
+ facilityCode: '136.200.182.22',
+ startTime: '2025-08-30 07:15',
+ endTime: '2025-08-30 07:15',
+ pollutantType: '污水',
+ concentration: '34',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近日,一则"携程推出火车卧铺女...',
+ isReported: '未报告',
+ responseMeasures: '2025-08-30 07:15',
+ },
+ {
+ key: 11,
+ recordTime: '2025-09-15',
+ recorder: '李小明',
+ reviewer: '王建国',
+ facilityName: '阿莫西林胶囊(华北制药)',
+ facilityCode: '192.168.1.100',
+ startTime: '2025-09-15 14:30',
+ endTime: '2025-09-15 16:45',
+ pollutantType: '大气污染物',
+ concentration: '68',
+ unit: 'mg/m³',
+ dischargeDestination: '大气',
+ eventReason: '设备故障导致废气处理系统异常运行...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-15 16:45',
+ },
+ {
+ key: 12,
+ recordTime: '2025-09-18',
+ recorder: '张美丽',
+ reviewer: '刘德华',
+ facilityName: '布洛芬缓释胶囊(中美史克)',
+ facilityCode: '10.0.0.25',
+ startTime: '2025-09-18 09:20',
+ endTime: '2025-09-18 11:30',
+ pollutantType: '污水',
+ concentration: '42',
+ unit: 'mg/L',
+ dischargeDestination: '污水处理厂',
+ eventReason: '管道泄漏导致废水直接排放...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-18 11:30',
+ },
+ {
+ key: 13,
+ recordTime: '2025-09-20',
+ recorder: '陈志强',
+ reviewer: '周杰伦',
+ facilityName: '头孢拉定胶囊(石药集团)',
+ facilityCode: '172.16.0.88',
+ startTime: '2025-09-20 20:15',
+ endTime: '2025-09-20 22:00',
+ pollutantType: '噪声',
+ concentration: '85',
+ unit: 'dB',
+ dischargeDestination: '环境',
+ eventReason: '夜间施工未采取降噪措施...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-20 22:00',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编号',
+ dataIndex: 'facilityCode',
+ key: 'facilityCode',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '异常情况起始时刻',
+ dataIndex: 'startTime',
+ key: 'startTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '异常情况终止时刻',
+ dataIndex: 'endTime',
+ key: 'endTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '污染物种类',
+ dataIndex: 'pollutantType',
+ key: 'pollutantType',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污染物排放浓度',
+ dataIndex: 'concentration',
+ key: 'concentration',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '浓度单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '事件原因',
+ dataIndex: 'eventReason',
+ key: 'eventReason',
+ width: 180,
+ },
+ {
+ title: '是否报告',
+ dataIndex: 'isReported',
+ key: 'isReported',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '应对措施',
+ dataIndex: 'responseMeasures',
+ key: 'responseMeasures',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default ProtectionFacilityMaintenance;
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.less b/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.less
new file mode 100644
index 0000000..38c8a2e
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/ProtectionFacilityMaintenance.less
@@ -0,0 +1,205 @@
+.protectionFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.js b/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.js
new file mode 100644
index 0000000..8dcaeff
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.js
@@ -0,0 +1,592 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Select, Drawer, Descriptions, Tag } from 'antd';
+import styles from './RegulationCompliance.less';
+import stipulation1 from '@/assets/business_envinformation/stipulation1.svg';
+
+const RegulationCompliance = () => {
+ const [form] = Form.useForm();
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRegulation, setSelectedRegulation] = useState(null);
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ // 显示抽屉详情
+ const showDrawer = (regulation) => {
+ setSelectedRegulation(regulation);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const onCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRegulation(null);
+ };
+
+ // 模拟法规数据(实际应该从后端获取)
+ const mockRegulationDetail = {
+ name: '2025排污许可条例',
+ publishDate: '2025-08-24',
+ department: '环保部门名称',
+ content: '在此输入具体的法规内容...',
+ status: '有效',
+ category: '排污许可',
+ version: '1.0',
+ updateTime: '2025-08-24'
+ };
+
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格区域 */}
+
+
+ {/* 法规合规管理块1 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-24
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块2 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-25
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块3 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-26
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块4 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-27
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块5 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-28
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块6 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-29
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块7 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-30
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块8 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-31
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块9 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-01
+
+
+ 发布部门 环保部门名称9
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块10 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-02
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块11 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-03
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块12 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-04
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+
+
+ {/* 静态分页组件 */}
+
+
+ 共85条
+ {/* */}
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+ {/* 抽屉详情 */}
+
+ {selectedRegulation && (
+
+
+ {selectedRegulation.name}
+
+
+ {selectedRegulation.publishDate}
+
+
+ {selectedRegulation.department}
+
+
+ {selectedRegulation.status}
+
+
+ {selectedRegulation.category}
+
+
+ {selectedRegulation.version}
+
+
+ {selectedRegulation.updateTime}
+
+
+
+ {selectedRegulation.content}
+
+
+
+ )}
+
+
+ );
+};
+
+export default RegulationCompliance;
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.less b/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.less
new file mode 100644
index 0000000..f26410a
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/RegulationCompliance.less
@@ -0,0 +1,204 @@
+.regulationContainer {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+
+ .searchSection {
+ padding: 20px;
+ background-color: #fff;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 20px;
+
+ .blocksContainer {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: repeat(3, 1fr);
+ gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .regulationBlock {
+ background-color: #fff;
+ // border: 1px solid #EEEEEE;
+ border-radius: 2px;
+ // padding: 8px 16px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ min-height: 120px;
+ }
+
+
+ .regulationTitle {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333333;
+ padding: 8px 16px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .regulationInfo {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 15px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ }
+
+ .publishDate {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+ margin-bottom: 6px;
+
+ }
+
+ .publishDepartment {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+
+ }
+
+ .actionButtons {
+ display: flex;
+
+ justify-content: center;
+ gap: 8px;
+ width: 100%;
+ // margin-bottom: 0;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ // padding-top: 4px;
+ }
+
+ .actionButton {
+ width: calc(50% - 4px);
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border-radius: 2px;
+ transition: background-color 0.2s;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+
+ }
+
+ .paginationContainer {
+ position: fixed;
+ bottom: 10px;
+ right: 10px;
+ z-index: 1000;
+ }
+
+ .pagination {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ // background: #fff;
+ padding: 8px 30px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .totalItems {
+ font-size: 12px;
+ color: #666;
+ margin-right: 8px;
+ }
+
+ .pageSizeSelect {
+ font-size: 12px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 2px 6px;
+ margin-right: 8px;
+ background: #fff;
+ }
+
+ .pageButton {
+ width: 28px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #333;
+ font-size: 12px;
+ border-radius: 2px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s;
+
+ &:hover {
+ border-color: #00D48A;
+ color: #00D48A;
+ }
+
+ &.active {
+ background: #00D48A;
+ border-color: #00D48A;
+ color: #fff;
+ }
+ }
+
+ .ellipsis {
+ font-size: 12px;
+ color: #999;
+ padding: 0 4px;
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.js b/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.js
new file mode 100644
index 0000000..da0cca8
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './SupervisionInspection.less';
+
+const SupervisionInspection = () => {
+ return (
+
+ );
+};
+
+export default SupervisionInspection;
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.less b/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/SupervisionInspection.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.js b/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.js
new file mode 100644
index 0000000..4c079d0
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.js
@@ -0,0 +1,803 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WasteGasPollutionControl.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WasteGasPollutionControl = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉琪',
+ reviewer: '赵子能',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ equipmentModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.12',
+ pressure: '95',
+ emissionTime: '100',
+ powerConsumption: '34',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ equipmentModel: '19b89E82-ae94-6bF7-2355-8DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.95',
+ pressure: '90',
+ emissionTime: '95',
+ powerConsumption: '55',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设备型号',
+ dataIndex: 'equipmentModel',
+ key: 'equipmentModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物烟气量(m³/h)',
+ dataIndex: 'pollutantFlueGasVolume',
+ key: 'pollutantFlueGasVolume',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排气筒高度(m)',
+ dataIndex: 'exhaustStackHeight',
+ key: 'exhaustStackHeight',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '排气温度(℃)',
+ dataIndex: 'exhaustTemperature',
+ key: 'exhaustTemperature',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '压力(kpa)',
+ dataIndex: 'pressure',
+ key: 'pressure',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放时间(h)',
+ dataIndex: 'emissionTime',
+ key: 'emissionTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物名称',
+ dataIndex: 'byproductName',
+ key: 'byproductName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物产生量(t)',
+ dataIndex: 'byproductProduction',
+ key: 'byproductProduction',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WasteGasPollutionControl;
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.less b/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.less
new file mode 100644
index 0000000..7b23dad
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/WasteGasPollutionControl.less
@@ -0,0 +1,205 @@
+.wasteGasContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.js b/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.js
new file mode 100644
index 0000000..b830f24
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.js
@@ -0,0 +1,746 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WastewaterFacilityManagement.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WastewaterFacilityManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉祺',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ facilityModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.12',
+ treatmentMethod: '95',
+ powerConsumption: '34',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ facilityModel: '19b89EB2-ae94-6bF7-2355-6DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.95',
+ treatmentMethod: '90',
+ powerConsumption: '56',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设施型号',
+ dataIndex: 'facilityModel',
+ key: 'facilityModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物出口流量(m³/h)',
+ dataIndex: 'pollutantOutletFlow',
+ key: 'pollutantOutletFlow',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污泥产生量(t)',
+ dataIndex: 'sludgeProduction',
+ key: 'sludgeProduction',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '处理方式',
+ dataIndex: 'treatmentMethod',
+ key: 'treatmentMethod',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WastewaterFacilityManagement;
\ No newline at end of file
diff --git a/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.less b/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.less
new file mode 100644
index 0000000..6d2aaec
--- /dev/null
+++ b/src/pages/business_emergencyResource/components/secondary_menu/WastewaterFacilityManagement.less
@@ -0,0 +1,206 @@
+.wastewaterFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_envInformation copy/form/StaffSheetCreateForm.js b/src/pages/business_envInformation copy/form/StaffSheetCreateForm.js
deleted file mode 100644
index 6bdce8d..0000000
--- a/src/pages/business_envInformation copy/form/StaffSheetCreateForm.js
+++ /dev/null
@@ -1,271 +0,0 @@
-import { useState, useEffect } from 'react'
-import { Col, DatePicker, Form, Input, Modal, Row, Select } from 'antd'
-import SelectDeptTree from '@/components/SelectDeptTree'
-import SelectOrganTree from '@/components/SelectOrganTree'
-import datadictionary from '@/utils/dataDictionary'
-import { formatDictOptions, verifyPhone } from '@/utils/globalCommon'
-import { NumberInput } from '@/components/NumberInput'
-import styles from '../StaffSheetList.less'
-import style from '@/global.less'
-import dayjs from 'dayjs'
-import { formatDate } from '@/utils/formatUtils'
-
-const { Item: FormItem } = Form
-const { TextArea } = Input
-const dictData = datadictionary
-
-//新增表单
-let getDeptTreeBySelectTree
-let getOrganTreeBySelectTree
-
-const StaffSheetCreateForm = (props => {
- const [form] = Form.useForm()
- const [jobStatus, setJobStatus] = useState('1')
-
- const {
- modalVisible,
- handleAdd,
- handleModalVisible,
- loading,
- dispatch,
- selectDeptTree,
- selectOrganTree
- } = props
-
- useEffect(() => {
- form.setFieldsValue({
- user_type: 'employee',
- job_status: '1',
- mgr_type: '0'
- })
- }, [])
-
- const selectedDeptTreeValue = (deptRecord) => {
- getDeptTreeBySelectTree = deptRecord
- }
-
- const selectedOrganTreeValue = (orgRecord) => {
- getOrganTreeBySelectTree = orgRecord
- }
-
- const parentDeptTreeMethod = {
- dispatch: dispatch,
- selectDeptTree: selectDeptTree,
- selectedDeptTreeValue: selectedDeptTreeValue,
- }
-
- const parentOrganTreeMethod = {
- dispatch: dispatch,
- selectOrganTree: selectOrganTree,
- selectedOrganTreeValue: selectedOrganTreeValue
- }
-
- const okHandle = () => {
- form.validateFields()
- .then(fieldsValue => {
- form.resetFields()
- fieldsValue.birthday = formatDate(fieldsValue.birthday, 'YYYY-MM-DD')
- fieldsValue.hiredate = formatDate(fieldsValue.hiredate, 'YYYY-MM-DD')
- fieldsValue.departure_time = formatDate(fieldsValue.departure_time, 'YYYY-MM-DD')
- fieldsValue.posts = fieldsValue.posts ? JSON.stringify(fieldsValue.posts) : null
-
- // if (getDeptTreeBySelectTree) {
- // fieldsValue.dept_code = getDeptTreeBySelectTree.dept_code
- // fieldsValue.dept_name = getDeptTreeBySelectTree.title
- // }
-
- if (getOrganTreeBySelectTree) {
- fieldsValue.org_code = getOrganTreeBySelectTree.org_code
- fieldsValue.org_name = getOrganTreeBySelectTree.title
- }
-
- handleAdd(fieldsValue)
- })
- .catch(errInfo => {})
- }
-
- const afterClose = () =>{
- form.resetFields();
- }
-
- const handleJobStatusChange = (value) => {
- setJobStatus(value)
- }
-
- return (
- handleModalVisible()}
- afterClose={() => afterClose()}
- confirmLoading={loading}
- >
-
-
- )
-})
-
-export default StaffSheetCreateForm
diff --git a/src/pages/business_envInformation copy/form/StaffSheetRenderAdvancedForm.js b/src/pages/business_envInformation copy/form/StaffSheetRenderAdvancedForm.js
deleted file mode 100644
index 2625938..0000000
--- a/src/pages/business_envInformation copy/form/StaffSheetRenderAdvancedForm.js
+++ /dev/null
@@ -1,113 +0,0 @@
-import { useEffect } from 'react'
-import { Button, Col, Form, Input, Row } from 'antd'
-import { UpOutlined, SearchOutlined, RedoOutlined } from '@ant-design/icons'
-import SelectDeptTree from '@/components/SelectDeptTree'
-import SelectOrganTree from '@/components/SelectOrganTree'
-import style from '@/global.less'
-
-const { Item: FormItem } = Form
-let getDeptTreeBySelectTree
-let getOrganTreeBySelectTree
-
-const StaffSheetRenderAdvancedForm = (props) => {
- const [form] = Form.useForm()
- const { dispatch, handleSearch, handleFormReset, toggleForm, selectDeptTree, selectOrganTree, params } = props
-
- useEffect(() => {
- form.setFieldsValue({
- user_name: params?.user_name,
- user_name_cn: params?.user_name_cn,
- deptname: params?.deptname,
- orgname: params?.orgname,
- })
- }, [params])
-
- const onFinish = values => {
- // if (getDeptTreeBySelectTree) {
- // values.dept_code = getDeptTreeBySelectTree.dept_code
- // values.deptname = getDeptTreeBySelectTree.title
- // }
-
- if (getOrganTreeBySelectTree) {
- values.org_code = getOrganTreeBySelectTree.org_code
- values.orgname = getOrganTreeBySelectTree.title
- }
-
- handleSearch(values)
- }
-
- const myHandleFormReset = () => {
- form.resetFields()
- handleFormReset()
- }
-
- const selectedDeptTreeValue = (deptRecord) => {
- getDeptTreeBySelectTree = deptRecord
- }
-
- const selectedOrganTreeValue = (orgRecord) => {
- getOrganTreeBySelectTree = orgRecord
- }
-
- const parentDeptTreeMethod = {
- dispatch: dispatch,
- selectDeptTree: selectDeptTree,
- selectedDeptTreeValue: selectedDeptTreeValue
- }
-
- const parentOrganTreeMethod = {
- dispatch: dispatch,
- selectOrganTree: selectOrganTree,
- selectedOrganTreeValue: selectedOrganTreeValue
- }
-
- return (
-
- )
-}
-
-export default StaffSheetRenderAdvancedForm
diff --git a/src/pages/business_envInformation copy/form/StaffSheetRenderSimpleForm.js b/src/pages/business_envInformation copy/form/StaffSheetRenderSimpleForm.js
deleted file mode 100644
index 0468e76..0000000
--- a/src/pages/business_envInformation copy/form/StaffSheetRenderSimpleForm.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import { useEffect } from 'react'
-import {Button, Col, Form, Input, Row, DatePicker, Select} from 'antd'
-import {DownOutlined, RedoOutlined, SearchOutlined} from '@ant-design/icons'
-import style from '@/global.less'
-import dayjs from 'dayjs'
-const { Item: FormItem } = Form
-
-const StaffSheetRenderSimpleForm = (props) => {
- const [form] = Form.useForm()
- const { handleSearch, handleFormReset, toggleForm, params } = props
-
- useEffect(() => {
- form.setFieldsValue({
- user_name: params?.user_name,
- user_name_cn: params?.user_name_cn,
- })
- }, [params])
-
- const onFinish = values => {
- handleSearch(values)
- }
-
- const myHandleFormReset = () => {
- form.resetFields()
- handleFormReset()
- }
-
- return (
-
- )
-}
-
-export default StaffSheetRenderSimpleForm
diff --git a/src/pages/business_envInformation copy/form/StaffSheetUpdateForm.js b/src/pages/business_envInformation copy/form/StaffSheetUpdateForm.js
deleted file mode 100644
index f33d64b..0000000
--- a/src/pages/business_envInformation copy/form/StaffSheetUpdateForm.js
+++ /dev/null
@@ -1,362 +0,0 @@
-import { useState, useEffect } from 'react'
-import { Col, DatePicker, Form, Input, Modal, Row, Select } from 'antd'
-import SelectOrganTree from '@/components/SelectOrganTree'
-import datadictionary from '@/utils/dataDictionary'
-import { formatDictOptions, verifyPhone } from '@/utils/globalCommon'
-import { NumberInput } from '@/components/NumberInput'
-import styles from '../StaffSheetList.less'
-import style from '@/global.less'
-import dayjs from 'dayjs'
-import { formatDate, formatDateObject } from '@/utils/formatUtils'
-
-const { Item: FormItem } = Form
-const { TextArea } = Input
-const dictData = datadictionary
-
-//新增表单
-let getDeptTreeBySelectTree
-let getOrganTreeBySelectTree
-
-const StaffSheetUpdateForm = (props) => {
- const [form] = Form.useForm()
- const [jobStatus, setJobStatus] = useState('1')
- const [userStatus, setUserStatus] = useState('0')
-
- const {
- handleUpdate,
- updateModalVisible,
- handleUpdateModalVisible,
- values,
- loading,
- dispatch,
- selectDeptTree,
- selectOrganTree
- } = props
-
- const selectedDeptTreeValue = (deptRecord) => {
- getDeptTreeBySelectTree = deptRecord
- }
-
- const selectedOrganTreeValue = (orgRecord) => {
- getOrganTreeBySelectTree = orgRecord
- }
-
- const parentDeptTreeMethod = {
- dispatch: dispatch,
- selectDeptTree: selectDeptTree,
- selectedDeptTreeValue: selectedDeptTreeValue,
- }
-
- const parentOrganTreeMethod = {
- dispatch: dispatch,
- selectOrganTree: selectOrganTree,
- selectedOrganTreeValue: selectedOrganTreeValue
- }
-
- useEffect(() => {
- setJobStatus(values.job_status)
- setUserStatus(values.status)
-
- form.setFieldsValue({
- user_id: values.user_id,
- user_name: values.user_name,
- user_name_cn: values.user_name_cn,
- user_name_en: values.user_name_en,
- password: values.password,
- email: values.email,
- phone: values.phone,
- landline: values.landline,
- sex: values.sex,
- avatar: values.avatar,
- sign: values.sign,
- tags: values.tags,
- id_card: values.id_card,
- birthday: formatDateObject(values.birthday, 'YYYY-MM-DD'),
- job_status: values.job_status,
- hiredate: formatDateObject(values.hiredate, 'YYYY-MM-DD'),
- departure_time: formatDateObject(values.departure_time, 'YYYY-MM-DD'),
- user_type: values.user_type,
- emp_no: values.emp_no,
- access_card_no: values.access_card_no,
- country: values.country,
- province: values.province,
- city: values.city,
- address: values.address,
- work_addr: values.work_addr,
- floor: values.floor,
- inprovince: values.inprovince,
- // dept_code: values.dept_code,
- // dept_name: values.dept_name,
- inner_dept_code: values.inner_dept_code,
- org_code: values.org_code,
- org_name: values.org_name,
- inner_org_code: values.inner_org_code,
- posts: values.posts ? JSON.parse(values.posts) : [],
- wx_openid: values.wx_openid,
- wx_mpopenid: values.wx_mpopenid,
- wx_miniopenid: values.wx_miniopenid,
- wx_unionid: values.wx_unionid,
- mobile_imei: values.mobile_imei,
- device_num: values.device_num,
- al_taobao: values.al_taobao,
- al_alipay: values.al_alipay,
- al_dingding: values.al_dingding,
- is_system_user: values.is_system_user,
- mgr_type: values.mgr_type,
- pwd_security_level: values.pwd_security_level,
- pwd_update_date: values.pwd_update_date,
- last_login_ip: values.last_login_ip,
- last_login_date: values.last_login_date,
- freeze_date: values.freeze_date,
- freeze_cause: values.freeze_cause,
- zindex: values.zindex,
- wx_msg: values.wx_msg,
- email_msg: values.email_msg,
- system_msg: values.system_msg,
- remarks: values.remarks,
- status: values.status,
- creator: values.creator,
- create_date: values.create_date,
- updater: values.updater,
- update_date: values.update_date
- })
- }, [])
-
- const handleLocalUpdate = () => {
- form
- .validateFields()
- .then(fieldsValue => {
- const formVals = {...values, ...fieldsValue}
- formVals.birthday = formatDate(formVals.birthday, 'YYYY-MM-DD')
- formVals.hiredate = formatDate(formVals.hiredate, 'YYYY-MM-DD')
- formVals.departure_time = formatDate(formVals.departure_time, 'YYYY-MM-DD')
- formVals.posts = formVals.posts ? JSON.stringify(formVals.posts) : null
- formVals.freeze_date = '3' === formVals.status ? formatDate(dayjs().endOf('day'), 'YYYY-MM-DD') : null
- formVals.freeze_cause = '3' === formVals.status ? formVals.freeze_cause : null
-
- // if (getDeptTreeBySelectTree) {
- // formVals.dept_code = getDeptTreeBySelectTree.dept_code
- // formVals.dept_name = getDeptTreeBySelectTree.title
- // }
-
- if (getOrganTreeBySelectTree) {
- formVals.org_code = getOrganTreeBySelectTree.org_code
- formVals.org_name = getOrganTreeBySelectTree.title
- }
-
- handleUpdate(formVals)
-
- })
- .catch(errInfo => {})
- }
-
- const afterClose = () =>{
- form.resetFields();
- }
-
- const handleJobStatusChange = (value) => {
- setJobStatus(value)
- }
-
- const handleUserStatusChange = (value) => {
- setUserStatus(value)
- }
-
- return (
- handleLocalUpdate()}
- onCancel={() => handleUpdateModalVisible()}
- afterClose={() => afterClose()}
- confirmLoading={loading}
- >
-
-
- )
-}
-
-export default StaffSheetUpdateForm
diff --git a/src/pages/business_envInformation copy/form/StaffSheetViewForm.js b/src/pages/business_envInformation copy/form/StaffSheetViewForm.js
deleted file mode 100644
index 9acb9c4..0000000
--- a/src/pages/business_envInformation copy/form/StaffSheetViewForm.js
+++ /dev/null
@@ -1,299 +0,0 @@
-import { useState, useEffect } from 'react'
-import {Col, DatePicker, Form, Input, Modal, Row, Select} from 'antd'
-import datadictionary from '@/utils/dataDictionary'
-import style from "@/global.less";
-import {formatDictOptions, verifyPhone} from "@/utils/globalCommon";
-import {NumberInput} from "@/components/NumberInput";
-import dayjs from "dayjs";
-import SelectOrganTree from "@/components/SelectOrganTree";
-import {formatDateObject} from "@/utils/formatUtils";
-
-const { Item: FormItem } = Form
-const { TextArea } = Input
-const dictData = datadictionary
-
-const StaffSheetViewForm = (props) => {
- const [form] = Form.useForm()
- const [jobStatus, setJobStatus] = useState('1')
- const [userStatus, setUserStatus] = useState('0')
-
- const { viewModalVisible, handleViewModalVisible, values } = props
-
- useEffect(() => {
- setJobStatus(values.job_status)
- setUserStatus(values.status)
-
- form.setFieldsValue({
- user_id: values.user_id,
- user_name: values.user_name,
- user_name_cn: values.user_name_cn,
- user_name_en: values.user_name_en,
- password: values.password,
- email: values.email,
- phone: values.phone,
- landline: values.landline,
- sex: values.sex,
- avatar: values.avatar,
- sign: values.sign,
- tags: values.tags,
- id_card: values.id_card,
- birthday: formatDateObject(values.birthday, 'YYYY-MM-DD'),
- job_status: values.job_status,
- hiredate: formatDateObject(values.hiredate, 'YYYY-MM-DD'),
- departure_time: formatDateObject(values.departure_time, 'YYYY-MM-DD'),
- user_type: values.user_type,
- emp_no: values.emp_no,
- access_card_no: values.access_card_no,
- country: values.country,
- province: values.province,
- city: values.city,
- address: values.address,
- work_addr: values.work_addr,
- floor: values.floor,
- inprovince: values.inprovince,
- // dept_code: values.dept_code,
- // dept_name: values.dept_name,
- inner_dept_code: values.inner_dept_code,
- org_code: values.org_code,
- org_name: values.org_name,
- inner_org_code: values.inner_org_code,
- posts: values.posts ? JSON.parse(values.posts) : [],
- wx_openid: values.wx_openid,
- wx_mpopenid: values.wx_mpopenid,
- wx_miniopenid: values.wx_miniopenid,
- wx_unionid: values.wx_unionid,
- mobile_imei: values.mobile_imei,
- device_num: values.device_num,
- al_taobao: values.al_taobao,
- al_alipay: values.al_alipay,
- al_dingding: values.al_dingding,
- is_system_user: values.is_system_user,
- mgr_type: values.mgr_type,
- pwd_security_level: values.pwd_security_level,
- pwd_update_date: values.pwd_update_date,
- last_login_ip: values.last_login_ip,
- last_login_date: values.last_login_date,
- freeze_date: values.freeze_date,
- freeze_cause: values.freeze_cause,
- zindex: values.zindex,
- wx_msg: values.wx_msg,
- email_msg: values.email_msg,
- system_msg: values.system_msg,
- remarks: values.remarks,
- status: values.status,
- creator: values.creator,
- create_date: values.create_date,
- updater: values.updater,
- update_date: values.update_date
- })
- }, [])
-
- const afterClose = () =>{
- form.resetFields();
- }
-
- const handleJobStatusChange = (value) => {
- setJobStatus(value)
- }
-
- const handleUserStatusChange = (value) => {
- setUserStatus(value)
- }
-
- return (
- handleViewModalVisible()}
- onCancel={() => handleViewModalVisible()}
- afterClose={() => afterClose()}
- >
-
-
- )
-}
-
-export default StaffSheetViewForm
diff --git a/src/pages/business_envInformation copy/models/StaffSheet.js b/src/pages/business_envInformation copy/models/StaffSheet.js
deleted file mode 100644
index 79b74c9..0000000
--- a/src/pages/business_envInformation copy/models/StaffSheet.js
+++ /dev/null
@@ -1,319 +0,0 @@
-import { deleteByPrimaryKeyForProUser, selectByPrimaryKeyForProUser, insertForProUser, updateForProUser, deleteByMapForProUser,updateByMapForProUser, getOneForProUser,getAllForProUser,queryPageForProUser, countForProUser, insertBatchForProUser, deleteBatchForProUser,updateBatchForProUser, resetPwdForProUser } from '@/services/system/api_prouser';
-
-export default {
- namespace: 'safemajorhazard',
-
- state: {
- params: {},
- data: {
- list: [],
- pagination: {},
- },
- },
-
- effects: {
- *delete_by_primarykey_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(deleteByPrimaryKeyForProUser, payload)
- yield put({
- type: 'deleteByPrimaryKeyForProUser',
- payload: response
- })
-
- if (!response.success) {
- callback && callback(response)
- return
- }
-
- const params = yield select(state => state.prouser.params)
- const responseData = yield call(queryPageForProUser, params)
- yield put({
- type: 'queryPageForProUser',
- payload: responseData
- })
-
- if (callback) callback(response)
- },
- *select_by_primarykey_for_prouser({ payload, callback }, { call, put }) {
- const response = yield call(selectByPrimaryKeyForProUser, payload)
- yield put({
- type: 'selectByPrimaryKeyForProUser',
- payload: response
- })
-
- if (callback) callback(response)
- },
- *insert_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(insertForProUser, payload)
- yield put({
- type: 'insertForProUser',
- payload: response
- })
-
- if (!response.success) {
- callback && callback(response)
- return
- }
-
- const params = yield select(state => state.prouser.params)
- const responseData = yield call(queryPageForProUser, params)
- yield put({
- type: 'queryPageForProUser',
- payload: responseData
- })
-
- if (callback) callback(response)
- },
- *update_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(updateForProUser, payload)
- yield put({
- type: 'updateForProUser',
- payload: response
- })
-
- if (!response.success) {
- callback && callback(response)
- return
- }
-
- const params = yield select(state => state.prouser.params)
- const responseData = yield call(queryPageForProUser, params)
- yield put({
- type: 'queryPageForProUser',
- payload: responseData
- })
-
- if (callback) callback(response)
- },
- *delete_by_map_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(deleteByMapForProUser, payload);
- yield put({
- type: 'deleteByMapForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- *update_by_map_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(updateByMapForProUser, payload);
- yield put({
- type: 'updateByMapForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- *get_one_for_prouser({ payload, callback }, { call, put }) {
- const response = yield call(getOneForProUser, payload);
- yield put({
- type: 'getOneForProUser',
- payload: response,
- });
-
- if (callback) callback(response);
- },
- *get_all_for_prouser({ payload, callback }, { call, put }) {
- const response = yield call(getAllForProUser, payload);
- yield put({
- type: 'getAllForProUser',
- payload: response,
- });
-
- if (callback) callback(response);
- },
- *query_page_for_prouser({ payload, callback }, { select, call, put }) {
- const params = yield select(state => state.prouser.params);
- const newParams = payload?.resetFlag ? payload : {...params, ...payload};
- yield put({
- type: 'setQueryPageByParams',
- payload: newParams,
- });
- const response = yield call(queryPageForProUser, newParams);
- yield put({
- type: 'queryPageForProUser',
- payload: response,
- });
-
- if (callback) callback(response);
- },
- *count_for_prouser({ payload, callback }, { call, put }) {
- const response = yield call(countForProUser, payload);
- yield put({
- type: 'countForProUser',
- payload: response,
- });
-
- if (callback) callback(response);
- },
- *insert_batch_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(insertBatchForProUser, payload);
- yield put({
- type: 'insertBatchForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- *delete_batch_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(deleteBatchForProUser, payload);
- yield put({
- type: 'deleteBatchForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- *update_batch_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(updateBatchForProUser, payload);
- yield put({
- type: 'updateBatchForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- *resetpwd_for_prouser({ payload, callback }, { select, call, put }) {
- const response = yield call(resetPwdForProUser, payload);
- yield put({
- type: 'resetPwdForProUser',
- payload: response,
- });
-
- const params = yield select(state => state.prouser.params);
- const responsedata = yield call(queryPageForProUser, params);
- yield put({
- type: 'queryPageForProUser',
- payload: responsedata,
- });
-
- if (callback) callback(response);
- },
- },
-
- reducers: {
- setQueryPageByParams(state, { payload }) {
- return {
- ...state,
- params: {...payload},
- };
- },
- deleteByPrimaryKeyForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- selectByPrimaryKeyForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- insertForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- updateForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- deleteByMapForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- updateByMapForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- getOneForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- getAllForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- queryPageForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- countForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- insertBatchForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- deleteBatchForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- updateBatchForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- resetPwdForProUser(state, action) {
- return {
- ...state,
- data: action.payload,
- };
- },
- },
-};
diff --git a/src/pages/business_plan/EmergencyResource.js b/src/pages/business_plan/EmergencyResource.js
new file mode 100644
index 0000000..07ab758
--- /dev/null
+++ b/src/pages/business_plan/EmergencyResource.js
@@ -0,0 +1,77 @@
+import React, { useState } from 'react';
+import { Card, Row, Col, Statistic, Progress, Button, Space } from 'antd';
+import styles from './EmergencyResource.less';
+import ComplianceManagement from './components/ComplianceManagement'; //合规性管理
+import OnlineMonitoring from './components/OnlineMonitoring'; //在线监测预警
+import EnvironmentalPersonnelManagement from './components/EnvironmentalPersonnelManagement'; //环保人员管理
+import EvaluationReport from './components/EvaluationReport'; //评估报告
+import EquipmentManagement from './components/EquipmentManagement'; //环保设备设施管理
+import PollutionSourceManagement from './components/PollutionSourceManagement'; //污染源管理
+
+
+
+const SafeMajorHazardList = () => {
+ const [activeModule, setActiveModule] = useState('organization');
+
+ const handleModuleClick = (module) => {
+ setActiveModule(module)
+ }
+
+
+ const renderModule = () => {
+ switch (activeModule) {
+ case 'organization':
+ return ;
+ case 'equipment':
+ return ;
+ case 'firefighting':
+ return ;
+ case 'other':
+ return ;
+ case 'equipmentManagement':
+ return ;
+ case 'pollutionSource':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+
+ return (
+
+
+
+
+
+
+
+
+
+ {renderModule()}
+
+
+ );
+};
+
+export default SafeMajorHazardList;
diff --git a/src/pages/business_plan/EmergencyResource.less b/src/pages/business_plan/EmergencyResource.less
new file mode 100644
index 0000000..08e9b05
--- /dev/null
+++ b/src/pages/business_plan/EmergencyResource.less
@@ -0,0 +1,69 @@
+.container {
+ background-color: transparent;
+ width: 100%;
+ height: 89vh;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+
+ .TopButton {
+ background-color: white;
+ width: 100%;
+ padding: 8px 30px 5px 30px;
+ display: flex;
+ gap: 24px;
+ margin-left: 6px;
+
+ .TopButtonItem {
+ background-color: #FFFFFF !important;
+ color: #999999 !important;
+ font-family: 'PingFang SC', sans-serif !important;
+ font-weight: 500 !important;
+ font-size: 14px !important;
+ line-height: 100% !important;
+ border-radius: 8px !important;
+ padding: 4px 16px !important;
+ height: auto !important;
+ border: none !important;
+ box-shadow: none !important;
+ position: relative !important;
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ gap: 5px !important;
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &:focus {
+ color: #999999 !important;
+ border: none !important;
+ }
+
+ &.active {
+ background: linear-gradient(98.03deg, #00E49C 0.68%, #00D841 98.3%) !important;
+ box-shadow: 0px 2px 2px 0px #AEEDDE !important;
+ color: #FFFFFF !important;
+
+ &::after {
+ content: '';
+ width: 28px;
+ height: 5px;
+ background-color: #FFFFFF;
+ border-radius: 6px;
+ opacity: 1;
+ }
+ }
+ }
+ }
+
+ .content {
+ // ======== 内容区域样式 ========
+ flex: 1; // ======== 占据剩余空间 ========
+ overflow-y: auto; // ======== 允许垂直滚动 ========
+ padding: 0; // ======== 无内边距 ========
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/AtmospherePollutantLibrary.js b/src/pages/business_plan/components/AtmospherePollutantLibrary.js
new file mode 100644
index 0000000..a16f589
--- /dev/null
+++ b/src/pages/business_plan/components/AtmospherePollutantLibrary.js
@@ -0,0 +1,513 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './AtmospherePollutantLibrary.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+import icon_add from '@/assets/business_envinformation/icon_add.svg';
+
+const AtmospherePollutantLibrary = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 19,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ serialNumber: 1,
+ pollutantName: '对乙酰氨基酚栓',
+ category: 25,
+ mainFeatures: '在接受调查的19为华尔街分析师...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '每日协通(北京)咨询有限公司',
+ monthlyEmission: 4.6,
+ quarterlyEmission: 4.6,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 2,
+ serialNumber: 2,
+ pollutantName: '萘普生缓释胶囊(适洛特)',
+ category: 27,
+ mainFeatures: '热到融化的马路、无穷无尽的野火...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '赢王科技有限公司',
+ monthlyEmission: 1.1,
+ quarterlyEmission: 1.1,
+ yearlyEmission: 1.8,
+ },
+ {
+ key: 3,
+ serialNumber: 3,
+ pollutantName: '复方感冒灵片',
+ category: 44,
+ mainFeatures: '从病虫害探测、土壤墒情监测智能...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京福商商务服务有限公司',
+ monthlyEmission: 2.4,
+ quarterlyEmission: 2.4,
+ yearlyEmission: 5.0,
+ },
+ {
+ key: 4,
+ serialNumber: 4,
+ pollutantName: '红药片',
+ category: 21,
+ mainFeatures: '近日,有科普博主发帖称,某社交...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '实华国际租赁有限公司',
+ monthlyEmission: 3.6,
+ quarterlyEmission: 3.6,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 5,
+ serialNumber: 5,
+ pollutantName: '布洛芬混悬液(翔宇赛可)',
+ category: 56,
+ mainFeatures: '在七八十年代,这种面料做成的服...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京冠钧财经策划有限公司',
+ monthlyEmission: 3.0,
+ quarterlyEmission: 3.0,
+ yearlyEmission: 4.7,
+ },
+ {
+ key: 6,
+ serialNumber: 6,
+ pollutantName: '阿莫西林胶囊',
+ category: 32,
+ mainFeatures: '抗生素类药物,用于治疗细菌感染...',
+ monitoringPoint: 1.15,
+ emittingEnterprise: '华北制药集团有限责任公司',
+ monthlyEmission: 2.8,
+ quarterlyEmission: 2.8,
+ yearlyEmission: 3.5,
+ },
+ {
+ key: 7,
+ serialNumber: 7,
+ pollutantName: '头孢拉定胶囊',
+ category: 28,
+ mainFeatures: '头孢类抗生素,广谱抗菌药物...',
+ monitoringPoint: 1.30,
+ emittingEnterprise: '石药集团欧意药业有限公司',
+ monthlyEmission: 1.9,
+ quarterlyEmission: 1.9,
+ yearlyEmission: 2.3,
+ },
+ {
+ key: 8,
+ serialNumber: 8,
+ pollutantName: '复方甘草片',
+ category: 35,
+ mainFeatures: '镇咳祛痰药物,含有甘草提取物...',
+ monitoringPoint: 1.20,
+ emittingEnterprise: '太极集团重庆桐君阁药厂有限公司',
+ monthlyEmission: 3.2,
+ quarterlyEmission: 3.2,
+ yearlyEmission: 4.1,
+ },
+ {
+ key: 9,
+ serialNumber: 9,
+ pollutantName: '板蓝根颗粒',
+ category: 41,
+ mainFeatures: '清热解毒,凉血利咽的中成药...',
+ monitoringPoint: 1.10,
+ emittingEnterprise: '广州白云山和记黄埔中药有限公司',
+ monthlyEmission: 4.5,
+ quarterlyEmission: 4.5,
+ yearlyEmission: 5.8,
+ },
+ {
+ key: 10,
+ serialNumber: 10,
+ pollutantName: '维生素C片',
+ category: 22,
+ mainFeatures: '补充维生素C,增强免疫力...',
+ monitoringPoint: 1.35,
+ emittingEnterprise: '华润三九医药股份有限公司',
+ monthlyEmission: 2.1,
+ quarterlyEmission: 2.1,
+ yearlyEmission: 2.7,
+ },
+ {
+ key: 11,
+ serialNumber: 11,
+ pollutantName: '感冒清热颗粒',
+ category: 38,
+ mainFeatures: '疏风散寒,解表清热的中成药...',
+ monitoringPoint: 1.25,
+ emittingEnterprise: '北京同仁堂股份有限公司',
+ monthlyEmission: 3.7,
+ quarterlyEmission: 3.7,
+ yearlyEmission: 4.9,
+ },
+ {
+ key: 12,
+ serialNumber: 12,
+ pollutantName: '双氯芬酸钠缓释片',
+ category: 29,
+ mainFeatures: '非甾体抗炎药,用于缓解疼痛...',
+ monitoringPoint: 1.18,
+ emittingEnterprise: '扬子江药业集团有限公司',
+ monthlyEmission: 1.6,
+ quarterlyEmission: 1.6,
+ yearlyEmission: 2.0,
+ },
+ {
+ key: 13,
+ serialNumber: 13,
+ pollutantName: '藿香正气水',
+ category: 43,
+ mainFeatures: '解表化湿,理气和中的中成药...',
+ monitoringPoint: 1.22,
+ emittingEnterprise: '云南白药集团股份有限公司',
+ monthlyEmission: 2.9,
+ quarterlyEmission: 2.9,
+ yearlyEmission: 3.8,
+ },
+ {
+ key: 14,
+ serialNumber: 14,
+ pollutantName: '蒙脱石散',
+ category: 26,
+ mainFeatures: '止泻药物,保护胃肠黏膜...',
+ monitoringPoint: 1.28,
+ emittingEnterprise: '博福-益普生制药有限公司',
+ monthlyEmission: 1.4,
+ quarterlyEmission: 1.4,
+ yearlyEmission: 1.9,
+ },
+ {
+ key: 15,
+ serialNumber: 15,
+ pollutantName: '复方丹参片',
+ category: 37,
+ mainFeatures: '活血化瘀,理气止痛的中成药...',
+ monitoringPoint: 1.16,
+ emittingEnterprise: '天津中新药业集团股份有限公司',
+ monthlyEmission: 3.3,
+ quarterlyEmission: 3.3,
+ yearlyEmission: 4.2,
+ },
+ {
+ key: 16,
+ serialNumber: 16,
+ pollutantName: '奥美拉唑肠溶胶囊',
+ category: 31,
+ mainFeatures: '质子泵抑制剂,治疗胃溃疡...',
+ monitoringPoint: 1.33,
+ emittingEnterprise: '阿斯利康制药有限公司',
+ monthlyEmission: 2.2,
+ quarterlyEmission: 2.2,
+ yearlyEmission: 2.8,
+ },
+ {
+ key: 17,
+ serialNumber: 17,
+ pollutantName: '六味地黄丸',
+ category: 45,
+ mainFeatures: '滋阴补肾的经典中成药...',
+ monitoringPoint: 1.12,
+ emittingEnterprise: '仲景宛西制药股份有限公司',
+ monthlyEmission: 4.1,
+ quarterlyEmission: 4.1,
+ yearlyEmission: 5.3,
+ },
+ {
+ key: 18,
+ serialNumber: 18,
+ pollutantName: '阿司匹林肠溶片',
+ category: 24,
+ mainFeatures: '解热镇痛抗炎药,预防血栓...',
+ monitoringPoint: 1.27,
+ emittingEnterprise: '拜耳医药保健有限公司',
+ monthlyEmission: 1.8,
+ quarterlyEmission: 1.8,
+ yearlyEmission: 2.4,
+ },
+ {
+ key: 19,
+ serialNumber: 19,
+ pollutantName: '复方黄连素片',
+ category: 39,
+ mainFeatures: '清热燥湿,行气止痛的中成药...',
+ monitoringPoint: 1.21,
+ emittingEnterprise: '哈药集团三精制药有限公司',
+ monthlyEmission: 2.6,
+ quarterlyEmission: 2.6,
+ yearlyEmission: 3.4,
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '序号',
+ dataIndex: 'serialNumber',
+ key: 'serialNumber',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '特征污染物名称',
+ dataIndex: 'pollutantName',
+ key: 'pollutantName',
+ width: 200,
+ align: 'center',
+ },
+ {
+ title: '种类',
+ dataIndex: 'category',
+ key: 'category',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '主要特征',
+ dataIndex: 'mainFeatures',
+ key: 'mainFeatures',
+ width: 300,
+ },
+ {
+ title: '环境监测点',
+ dataIndex: 'monitoringPoint',
+ key: 'monitoringPoint',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放企业',
+ dataIndex: 'emittingEnterprise',
+ key: 'emittingEnterprise',
+ width: 200,
+ },
+ {
+ title: '本月排放量',
+ dataIndex: 'monthlyEmission',
+ key: 'monthlyEmission',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '本季度排放量',
+ dataIndex: 'quarterlyEmission',
+ key: 'quarterlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '本年度排放量',
+ dataIndex: 'yearlyEmission',
+ key: 'yearlyEmission',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleEdit(record)}
+ />
+
handleDownload(record)}
+ /> */}
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 页面头部 */}
+
+ 大气污染特征污染物名录库
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ // scroll={{ x: 3000}}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default AtmospherePollutantLibrary;
diff --git a/src/pages/business_plan/components/AtmospherePollutantLibrary.less b/src/pages/business_plan/components/AtmospherePollutantLibrary.less
new file mode 100644
index 0000000..d1550dc
--- /dev/null
+++ b/src/pages/business_plan/components/AtmospherePollutantLibrary.less
@@ -0,0 +1,218 @@
+.atmospherePollutantLibrary {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ // background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .pageHeader {
+ margin-bottom: 15px;
+ background: #fff;
+ padding: 15px 15px 15px 20px;
+ border-radius: 2px;
+ color: #333333;
+ font-size: 16px;
+ font-weight: 500;
+ }
+
+ .searchSection {
+ background: #fff;
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #00D48A;
+ color: #fff;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ }
+ }
+
+ .importButton {
+ display: flex;
+ align-items: center;
+ background-color: #fff;
+ border-color: #D7D7D7;
+ color: #333;
+ height: 28px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // .rightControls {
+ // display: flex;
+ // align-items: center;
+ // gap: 12px;
+
+ // .filterLabel {
+ // color: #333;
+ // font-size: 14px;
+ // white-space: nowrap;
+ // }
+
+ // .queryButton {
+ // background-color: #52c41a;
+ // border-color: #52c41a;
+ // color: white;
+ // height: 28px;
+ // border-radius: 4px;
+ // display: flex;
+ // align-items: center;
+ // justify-content: center;
+
+ // &:hover {
+ // background-color: #73d13d;
+ // border-color: #73d13d;
+ // }
+ // }
+
+ // .selectInput {
+ // :global {
+ // .ant-select-selector {
+ // display: flex;
+ // align-items: center;
+ // height: 28px !important;
+ // }
+
+ // .ant-select-selection-item {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+
+ // .ant-select-selection-placeholder {
+ // display: flex;
+ // align-items: center;
+ // line-height: 1;
+ // }
+ // }
+ // }
+ // }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 25px 0;
+ background-color: #fff;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead>tr>th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr>td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody>tr:hover>td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead>tr>th.ant-table-cell-fix-left,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead>tr>th.ant-table-cell-fix-right,
+ .ant-table-tbody>tr>td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ // 页码距离上边距
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/ComplianceManagement.js b/src/pages/business_plan/components/ComplianceManagement.js
new file mode 100644
index 0000000..e44970b
--- /dev/null
+++ b/src/pages/business_plan/components/ComplianceManagement.js
@@ -0,0 +1,62 @@
+import React, { useState } from 'react';
+import styles from './ComplianceManagement.less';
+import PermitManagement from './secondary_menu/PermitManagement'; // 排污许可
+import RegulationCompliance from './secondary_menu/RegulationCompliance'; // 法规符合性
+import SupervisionInspection from './secondary_menu/SupervisionInspection'; // 监督检查
+import InformationDisclosure from './secondary_menu/InformationDisclosure'; // 信息公开及绿色通道
+
+const ComplianceManagement = () => {
+ const [activeMenu, setActiveMenu] = useState('permit');
+
+ const menuItems = [
+ { key: 'permit', label: '排污许可' },
+ { key: 'regulation', label: '法规符合性' },
+ { key: 'inspection', label: '监督检查' },
+ { key: 'disclosure', label: '信息公开及绿色通道' }
+ ];
+
+ const handleMenuClick = (key) => {
+ setActiveMenu(key);
+ };
+
+ const renderContent = () => {
+ switch (activeMenu) {
+ case 'permit':
+ return ;
+ case 'regulation':
+ return ;
+ case 'inspection':
+ return ;
+ case 'disclosure':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+
+ {/* 左侧菜单 */}
+
+ {menuItems.map(item => (
+
handleMenuClick(item.key)}
+ >
+ {activeMenu === item.key &&
}
+
{item.label}
+
+ ))}
+
+
+ {/* 右侧内容区 */}
+
+ {renderContent()}
+
+
+ );
+};
+
+export default ComplianceManagement;
+
diff --git a/src/pages/business_plan/components/ComplianceManagement.less b/src/pages/business_plan/components/ComplianceManagement.less
new file mode 100644
index 0000000..b58637a
--- /dev/null
+++ b/src/pages/business_plan/components/ComplianceManagement.less
@@ -0,0 +1,85 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ gap: 10px;
+ padding-left: 5px;
+ // padding-right: 5px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ background-color: #f5f5f5;
+
+ // 左侧菜单
+ .leftMenu {
+ display: flex;
+ flex-direction: column;
+ // gap: 1px;
+ flex-shrink: 0;
+ background-color: #fff;
+
+ .menuItem {
+ width: 180px;
+ height: 50px;
+ background-color: #FFFFFF;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ position: relative;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ padding-left: 20px;
+
+ .menuText {
+ font-size: 14px;
+ color: #999999;
+ font-weight: 400;
+ transition: color 0.3s ease;
+ }
+
+ // 激活状态的指示器(左侧长条)
+ .activeIndicator {
+ position: absolute;
+ left: 3px;
+ width: 17.34765625px;
+ height: 1.97802734375px;
+ border-radius: 6px;
+ background-color: #009D6F;
+ transform: rotate(-90deg);
+ }
+
+ // 激活状态样式
+ &.active {
+ background-color: #D4FFEC;
+
+ .menuText {
+ color: #009D6F;
+ }
+ }
+
+ // 鼠标悬停效果
+ &:hover:not(.active) {
+ background-color: #f9f9f9;
+ }
+ }
+ }
+
+ // 右侧内容区
+ .rightContent {
+ flex: 1;
+ // background-color: #FFFFFF;
+ border-radius: 4px;
+ // padding: 20px;
+ overflow: auto;
+
+ .contentPlaceholder {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ color: #666666;
+ }
+ }
+}
+
diff --git a/src/pages/business_plan/components/EnvironmentalPersonnelManagement.js b/src/pages/business_plan/components/EnvironmentalPersonnelManagement.js
new file mode 100644
index 0000000..805e60e
--- /dev/null
+++ b/src/pages/business_plan/components/EnvironmentalPersonnelManagement.js
@@ -0,0 +1,1025 @@
+
+import React, { useState, useEffect } from 'react';
+import moment from 'moment';
+import { Card, Result, Select, Button, Drawer, Upload, Input, Modal, Form, DatePicker, Row, Col } from 'antd';
+import { CheckCircleOutlined, ExportOutlined, PlusOutlined, UploadOutlined, UserOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './EnvironmentalPersonnelManagement.less';
+// import './EnvironmentalPersonnelManagement.less';
+
+import img1 from '@/assets/safe_majorHazard/online_monitoring/img1.png';
+import img2 from '@/assets/safe_majorHazard/online_monitoring/img2.png';
+import img3 from '@/assets/safe_majorHazard/online_monitoring/img3.png';
+import map1 from '@/assets/safe_majorHazard/online_monitoring/map.png';
+import risk1 from '@/assets/safe_majorHazard/online_monitoring/risk1.png';
+import risk2 from '@/assets/safe_majorHazard/online_monitoring/risk2.png';
+import risk3 from '@/assets/safe_majorHazard/online_monitoring/risk3.png';
+// import eqicon1 from '@/assets/business_basic/eqicon1.png';
+// import eqicon2 from '@/assets/business_basic/eqicon2.png';
+// import eqicon3 from '@/assets/business_basic/eqicon3.png';
+// import eqicon4 from '@/assets/business_basic/eqicon4.png';
+import viewIcon from '@/assets/business_envinformation/viewicon.svg';
+import editIcon from '@/assets/business_envinformation/editicon.svg';
+import deleteIcon from '@/assets/business_envinformation/deleteicon.svg';
+import personnelIcon from '@/assets/business_envinformation/personnel.svg';
+
+
+
+
+
+const EnvironmentalPersonnelManagement = () => {
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 0,
+ });
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRecord, setSelectedRecord] = useState(null);
+ const [modalVisible, setModalVisible] = useState(false);
+ const [form] = Form.useForm();
+ const [editDrawerVisible, setEditDrawerVisible] = useState(false);
+ const [editForm] = Form.useForm();
+
+
+
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 10;
+ const number = (page - 1) * pageSize + index + 1;
+ return number;
+ }
+ },
+ {
+ title: '姓名',
+ dataIndex: 'name',
+ key: 'name',
+ width: 120,
+ },
+ {
+ title: '部门',
+ dataIndex: 'department',
+ key: 'department',
+ width: 120,
+ filters: [
+ { text: '环保管理', value: '环保管理' },
+ { text: '技术部', value: '技术部' },
+ { text: '生产部', value: '生产部' },
+ { text: '质量部', value: '质量部' },
+ ],
+ onFilter: (value, record) => record.department === value,
+ },
+ {
+ title: '岗位',
+ dataIndex: 'position',
+ key: 'position',
+ width: 120,
+ filters: [
+ { text: '污水化验', value: '污水化验' },
+ { text: '环境监测', value: '环境监测' },
+ { text: '环保工程师', value: '环保工程师' },
+ { text: '安全员', value: '安全员' },
+ { text: '技术员', value: '技术员' },
+ ],
+ onFilter: (value, record) => record.position === value,
+ },
+ {
+ title: '入职时间',
+ dataIndex: 'joinDate',
+ key: 'joinDate',
+ width: 120,
+ sorter: (a, b) => {
+ // 将日期字符串转换为Date对象进行比较
+ const dateA = new Date(a.joinDate);
+ const dateB = new Date(b.joinDate);
+ return dateA - dateB;
+ },
+ },
+ {
+ title: '岗位职责',
+ dataIndex: 'responsibility',
+ key: 'responsibility',
+ width: 200,
+ },
+ {
+ title: '联系方式',
+ dataIndex: 'contact',
+ key: 'contact',
+ width: 150,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 180,
+ render: (_, record) => (
+
+

handleView(record)}
+ />
+

handleEdit(record)}
+ />
+

+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ name: '吴振峰',
+ department: '环保管理',
+ position: '污水运行',
+ joinDate: '2025-09-02',
+ responsibility: '保障污水设备运行、处理故障',
+ contact: '13321493732',
+ employeeId: '434545',
+ gender: '男',
+ birthDate: '2025-08-08',
+ idCard: '340802199809050811',
+ address: '西辛南区46号楼2单元101室',
+ other: '暂无'
+ },
+ {
+ key: '2',
+ id: '002',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138002',
+ },
+ {
+ key: '3',
+ id: '003',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138003',
+ },
+ {
+ key: '4',
+ id: '004',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138004',
+ },
+ {
+ key: '5',
+ id: '005',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138005',
+ },
+ {
+ key: '6',
+ id: '006',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138006',
+ },
+ {
+ key: '7',
+ id: '007',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138007',
+ },
+ {
+ key: '8',
+ id: '008',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138008',
+ },
+ {
+ key: '9',
+ id: '009',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138009',
+ },
+ {
+ key: '10',
+ id: '010',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138010',
+ },
+ {
+ key: '11',
+ id: '011',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138011',
+ },
+ {
+ key: '12',
+ id: '012',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138012',
+ },
+ {
+ key: '13',
+ id: '013',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138013',
+ },
+ {
+ key: '14',
+ id: '014',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138014',
+ },
+ {
+ key: '15',
+ id: '015',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138015',
+ },
+ {
+ key: '16',
+ id: '016',
+ name: '张一龙',
+ department: '环保管理',
+ position: '污水化验',
+ joinDate: '2025-08-25',
+ responsibility: '定期采样分析',
+ contact: '13800138016',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 新增设备按钮点击事件
+ const handleAddDevice = () => {
+ console.log('新增设备');
+ // TODO: 实现新增设备逻辑
+ };
+
+ // 导出数据按钮点击事件
+ const handleExportData = () => {
+ console.log('导出数据');
+ // TODO: 实现导出数据逻辑
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 查看详情
+ const handleView = (record) => {
+ setSelectedRecord(record);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const handleCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRecord(null);
+ };
+
+ // 打开新增模态框
+ const handleOpenModal = () => {
+ setModalVisible(true);
+ };
+
+ // 关闭新增模态框
+ const handleCloseModal = () => {
+ setModalVisible(false);
+ form.resetFields();
+ };
+
+ // 保存新增数据
+ const handleSave = () => {
+ form.validateFields().then(values => {
+ console.log('新增数据:', values);
+ // TODO: 实现保存逻辑
+ setModalVisible(false);
+ form.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ // 打开编辑抽屉
+ const handleEdit = (record) => {
+ console.log('点击编辑按钮,记录:', record);
+ setSelectedRecord(record);
+ setEditDrawerVisible(true);
+ console.log('设置编辑抽屉可见:', true);
+ // 设置表单初始值
+ editForm.setFieldsValue({
+ name: record.name,
+ employeeId: record.employeeId,
+ department: record.department,
+ position: record.position,
+ gender: record.gender,
+ address: record.address,
+ birthDate: record.birthDate ? moment(record.birthDate) : null,
+ joinDate: record.joinDate ? moment(record.joinDate) : null,
+ idCard: record.idCard,
+ contact: record.contact,
+ responsibility: record.responsibility,
+ other: record.other
+ });
+ };
+
+ // 关闭编辑抽屉
+ const handleCloseEditDrawer = () => {
+ setEditDrawerVisible(false);
+ setSelectedRecord(null);
+ editForm.resetFields();
+ };
+
+ // 保存编辑数据
+ const handleEditSave = () => {
+ editForm.validateFields().then(values => {
+ console.log('编辑数据:', values);
+ // TODO: 实现保存逻辑
+ setEditDrawerVisible(false);
+ editForm.resetFields();
+ }).catch(error => {
+ console.log('表单验证失败:', error);
+ });
+ };
+
+ return (
+
+ {/* 第一个div - 高度20% */}
+
+
+
+ {/* 块1 */}
+
+
+
环保总人数
+
258
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块2 */}
+
+
+
管理岗人数
+
58
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块3 */}
+
+
+
污水运行人数
+
51
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块4 */}
+
+
+
污水化验人数
+
28
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块5 */}
+
+
+
危废管理人员
+
50
+
截止到 2025-09-11 07:35
+
+
+
+ {/* 块6 */}
+
+
+
一般固体废物管理人员
+
58
+
截止到 2025-09-11 07:35
+
+
+
+
+
+
+
+
+
+ {/* 第三个div - 占满剩余位置 */}
+
+
+ {/* 第一行 - 表单控件 */}
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二行 - 表格 */}
+
+
+ `共 ${total} 条`,
+ }}
+ />
+
+
+
+
+ {/* 侧边抽屉 */}
+
查看}
+ placement="right"
+ onClose={handleCloseDrawer}
+ open={drawerVisible}
+ width={600}
+ closable={false}
+ bodyStyle={{ fontSize: '12px' }}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ {/* 新增模态框 */}
+
+ 取消
+ ,
+
+ ]}
+ closable={true}
+ >
+
+
+
+
+
+ {/* 岗位职责 */}
+ 岗位职责}
+ name="responsibility"
+ rules={[{ required: true, message: '请输入岗位职责' }]}
+ >
+
+
+
+ {/* 其他 */}
+ 其他}
+ name="other"
+ >
+
+
+
+
+
+ {/* 编辑抽屉 */}
+
编辑}
+ placement="right"
+ onClose={handleCloseEditDrawer}
+ open={editDrawerVisible}
+ width={600}
+ closable={false}
+ destroyOnClose={true}
+ bodyStyle={{ fontSize: '12px' }}
+ footer={[
+ ,
+
+ ]}
+ >
+ {selectedRecord && (
+
+ {/* 姓名和头像区域 */}
+
+
+
+ {selectedRecord.name}
+
+
+ {/* 基本信息 - 两列布局 */}
+
+
+
+ 工号:
+ {selectedRecord.employeeId}
+
+
+ 部门:
+ {selectedRecord.department}
+
+
+ 岗位:
+ {selectedRecord.position}
+
+
+ 性别:
+ {selectedRecord.gender}
+
+
+ 住址:
+ {selectedRecord.address}
+
+
+
+
+
+ 出生日期:
+ {selectedRecord.birthDate}
+
+
+ 入职时间:
+ {selectedRecord.joinDate}
+
+
+ 身份证号:
+ {selectedRecord.idCard}
+
+
+ 联系方式:
+ {selectedRecord.contact}
+
+
+
+
+
+ {/* 头像上传区域 */}
+
+
+

+
+
上传
+
+
+
+ {/* 岗位职责 */}
+
+
+ {/* 其他 */}
+
+
+ )}
+
+
+ );
+};
+
+export default EnvironmentalPersonnelManagement;
diff --git a/src/pages/business_plan/components/EnvironmentalPersonnelManagement.less b/src/pages/business_plan/components/EnvironmentalPersonnelManagement.less
new file mode 100644
index 0000000..744c04b
--- /dev/null
+++ b/src/pages/business_plan/components/EnvironmentalPersonnelManagement.less
@@ -0,0 +1,536 @@
+
+
+
+// 表单输入框样式
+.formInput {
+ :global(.ant-input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-select-selector) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+
+ :global(.ant-picker-input input) {
+ color: #333333 !important;
+ font-size: 12px !important;
+ }
+}
+
+
+.Rcontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+
+ // 第一个div - 高度20%
+ .RcontainerTop {
+ height: 18%;
+ // background-color: #fff;
+ border-radius: 4px;
+ display: flex;
+ flex-direction: column;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ // padding: 15px;
+
+ .blocksContainer {
+ flex: 1;
+ display: flex;
+ gap: 10px;
+ height: 100%;
+
+ .blockItem {
+ flex: 1;
+ height: 100%;
+ display: flex;
+ // background: linear-gradient(170.5deg, #F5F7FF 6.87%, #FFFFFF 47.65%);
+ border-radius: 4px;
+ // border: 2px solid #FFFFFF;
+
+ // 块1 - 蓝色渐变 + SVG背景
+ &.block1 {
+ background:
+ url('@/assets/business_envinformation/background1.svg'),
+
+ linear-gradient(180deg, #DBEBFF 0%, #DBEBFF 12.5%, rgba(255, 255, 255, 0.700824) 56%, rgba(255, 255, 255, 0.01) 100%),
+ linear-gradient(0deg, #FFFFFF, #FFFFFF);
+ // linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块2 - 黄色渐变
+ &.block2 {
+ background:
+ url('@/assets/business_envinformation/background2.svg'),
+ linear-gradient(180deg, #FFFEDB 0%, #F5FFDB 19.23%, #FFFFFF 55.77%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块3 - 绿色渐变
+ &.block3 {
+ background:
+ url('@/assets/business_envinformation/background3.svg'),
+ linear-gradient(180deg, #8CFFCD 0%, #C0FFE4 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块4 - 青色渐变
+ &.block4 {
+ background:
+ url('@/assets/business_envinformation/background4.svg'),
+ linear-gradient(180deg, #C5FFFC 0%, #C0FFFC 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块5 - 红色渐变
+ &.block5 {
+ background:
+ url('@/assets/business_envinformation/background5.svg'),
+ linear-gradient(180deg, #FFD2D2 0%, #FFD9D9 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ // 块6 - 紫色渐变
+ &.block6 {
+ background:
+ url('@/assets/business_envinformation/background6.svg'),
+ linear-gradient(180deg, #F2D7FF 0%, #F4DDFF 12.5%, #FFFFFF 56%, #FFFFFF 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ .blockLeft {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding: 15px;
+ padding-left: 20px;
+ gap: 8px;
+
+ .blockTitle {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #333333;
+ line-height: 1.2;
+ }
+
+ .blockNumber {
+ font-family: PingFang SC;
+ font-weight: 700;
+ font-size: 24px;
+ color: #333333;
+ line-height: 1.2;
+
+ // 特定数字颜色
+ &.number258 {
+ color: #0080FF;
+ }
+
+ &.number58 {
+ color: #EFB700;
+ }
+
+ &.number51 {
+ color: #00DA86;
+ }
+
+ &.number28 {
+ color: #00DA86;
+ }
+
+ &.number50 {
+ color: #FD0404;
+ }
+
+ &.number58Second {
+ color: #A318E4;
+ }
+ }
+
+ .blockTime {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 10px;
+ color: #999999;
+ line-height: 1.2;
+ }
+
+ .blockChange {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #1269FF;
+ line-height: 1.2;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .arrow {
+ font-size: 14px;
+ font-weight: bold;
+ }
+
+ .checkIcon {
+ font-size: 16px;
+ color: #1269FF;
+ }
+ }
+ }
+
+ .blockRight {
+ flex: 1;
+ height: 100%;
+ background-color: transparent;
+ border-radius: 0 4px 4px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .blockImage {
+ // width: 80%;
+ height: 65%;
+ // height: 80%;
+ object-fit: contain;
+ margin-right: -5px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ // 第三个div - 占满剩余位置
+ .RcontainerBottom {
+ flex: 1; // 占满剩余空间
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ padding: 15px;
+
+ .sectionContent {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+
+ // 第一行 - 表单控件
+ .formRow {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ flex-shrink: 0;
+
+ .addButton {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ height: 28px;
+ border: 1px solid #00D48A;
+ border-radius: 2px;
+ color: #fff;
+ font-weight: 400;
+ font-size: 12px;
+ padding: 0 10px;
+ background: #00D48A;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ }
+
+ .buttonIcon {
+ font-size: 16px;
+ font-weight: bold;
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-left: auto;
+
+ .filterLabel {
+ font-size: 13px;
+ color: #333333;
+ white-space: nowrap;
+ }
+
+ // Select组件样式
+ :global(.ant-select) {
+ font-size: 12px;
+ height: 28px !important;
+ }
+
+ :global(.ant-select .ant-select-selector) {
+ height: 28px !important;
+ font-size: 12px;
+ border-radius: 2px !important;
+ display: flex !important;
+ align-items: center !important;
+ padding: 0 11px !important;
+ }
+
+ :global(.ant-select .ant-select-selection-item) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ }
+
+ :global(.ant-select .ant-select-selection-placeholder) {
+ line-height: 1.5714285714285714;
+ font-size: 12px;
+ color: #00000040 !important;
+ }
+
+ .searchInput {
+ width: 150px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 0 12px;
+ font-size: 12px;
+
+ &:focus {
+ border-color: #2E4CD4;
+ outline: none;
+ }
+
+ &::placeholder {
+ color: #00000040;
+ }
+ }
+
+ .queryButton, .resetButton {
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ padding: 0 16px;
+ font-size: 12px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ &:hover {
+ border-color: #2E4CD4;
+ color: #2E4CD4;
+ }
+ }
+
+ .queryButton {
+ background-color: #00D48A;
+ color: #fff;
+ border-color: #00D48A;
+
+ &:hover {
+ background-color: #00B875;
+ border-color: #00B875;
+ color: #fff;
+ }
+ }
+
+ .resetButton {
+ background-color: #fff;
+ color: #666;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+ }
+ }
+
+ // 第二行 - 表格
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+ margin: 16px 0 0 0;
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ }
+ }
+ }
+ }
+ }
+}
+
+// 操作按钮图标样式
+.eye-icon {
+ width: 20px;
+ height: 12.5px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 20px;
+ height: 12.5px;
+ border: 2px solid #86F278;
+ border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
+ top: 0;
+ left: 0;
+ transform: rotate(-180deg);
+ opacity: 1;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 6px;
+ height: 6px;
+ background-color: #86F278;
+ border-radius: 50%;
+ top: 3.5px;
+ left: 7px;
+ transform: rotate(-180deg);
+ }
+}
+
+.edit-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #1890ff;
+ top: 3px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 2px;
+ height: 12px;
+ background-color: #1890ff;
+ top: 2px;
+ left: 7px;
+ transform: rotate(45deg);
+ }
+}
+
+.delete-icon {
+ width: 16px;
+ height: 16px;
+ position: relative;
+ display: inline-block;
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(45deg);
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 2px;
+ background-color: #ff4d4f;
+ top: 7px;
+ left: 2px;
+ transform: rotate(-45deg);
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/EquipmentManagement.js b/src/pages/business_plan/components/EquipmentManagement.js
new file mode 100644
index 0000000..fea3dd2
--- /dev/null
+++ b/src/pages/business_plan/components/EquipmentManagement.js
@@ -0,0 +1,58 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EquipmentManagement.less';
+
+// 导入子页面组件
+import WasteGasPollutionControl from './secondary_menu/WasteGasPollutionControl';
+import WastewaterFacilityManagement from './secondary_menu/WastewaterFacilityManagement';
+import ProtectionFacilityMaintenance from './secondary_menu/ProtectionFacilityMaintenance';
+
+const EquipmentManagement = () => {
+ const [activeTab, setActiveTab] = useState('waste-gas-control');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'waste-gas-control',
+ label: '废气污染防治信息',
+ children:
+ },
+ {
+ key: 'wastewater-facility',
+ label: '废水设置运行管理',
+ children:
+ },
+ {
+ key: 'protection-facility',
+ label: '防护设施检维修管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EquipmentManagement;
+
diff --git a/src/pages/business_plan/components/EquipmentManagement.less b/src/pages/business_plan/components/EquipmentManagement.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_plan/components/EquipmentManagement.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/EvaluationReport.js b/src/pages/business_plan/components/EvaluationReport.js
new file mode 100644
index 0000000..3015091
--- /dev/null
+++ b/src/pages/business_plan/components/EvaluationReport.js
@@ -0,0 +1,57 @@
+import React, { useState } from 'react';
+import { Tabs } from 'antd';
+import styles from './EvaluationReport.less';
+
+// 导入子页面组件
+import PermitStatistics from './secondary_menu/PermitStatistics';
+import EnvironmentalTaskList from './secondary_menu/EnvironmentalTaskList';
+import DischargePermitManagement from './secondary_menu/DischargePermitManagement';
+
+const EvaluationReport = () => {
+ const [activeTab, setActiveTab] = useState('permit-statistics');
+
+ // 标签页配置
+ const tabItems = [
+ {
+ key: 'permit-statistics',
+ label: '许可证信息统计表',
+ children:
+ },
+ {
+ key: 'environmental-task-list',
+ label: '环保管理任务清单',
+ children:
+ },
+ {
+ key: 'discharge-permit-management',
+ label: '排污许可执行管理',
+ children:
+ }
+ ];
+
+ // 标签页切换处理
+ const handleTabChange = (key) => {
+ setActiveTab(key);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default EvaluationReport;
diff --git a/src/pages/business_plan/components/EvaluationReport.less b/src/pages/business_plan/components/EvaluationReport.less
new file mode 100644
index 0000000..e844009
--- /dev/null
+++ b/src/pages/business_plan/components/EvaluationReport.less
@@ -0,0 +1,119 @@
+.container {
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ // background-color: #f5f5f5;
+
+ .tabs {
+ height: 100%;
+ background-color: transparent;
+ border-radius: 8px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+
+ :global(.ant-tabs-nav) {
+ margin: 0;
+ padding: 0 0px;
+ background-color: transparent;
+ border-bottom: none;
+ }
+
+ :global(.ant-tabs-tab) {
+ padding: 16px 24px !important;
+ font-size: 14px !important;
+ font-weight: 400 !important;
+ color: #AFAFAF !important;
+ background: transparent !important;
+ border: none !important;
+ position: relative;
+
+ &:hover {
+ color: #AFAFAF !important;
+ background-color: transparent !important;
+ }
+
+ &.ant-tabs-tab-active {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+
+
+ }
+ }
+
+ // 额外的全局样式覆盖,确保优先级足够高
+ :global(.ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 更强的选择器优先级
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // 针对可能的嵌套结构
+ :global(.ant-tabs-nav .ant-tabs-tab.ant-tabs-tab-active) {
+ color: #009D6F !important;
+ background-color: #fff !important;
+ border-bottom: none !important;
+ }
+
+ // // 覆盖 Ant Design 5.x 的高优先级样式
+ // :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ // color: #009D6F !important;
+ // text-shadow: none !important;
+ // }
+
+ // 使用更高优先级的选择器
+ :global(.ant-tabs.ant-tabs-top .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 针对 CSS 模块的覆盖
+ :global(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 最高优先级覆盖
+ :global(.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn) {
+ color: #009D6F !important;
+ text-shadow: none !important;
+ }
+
+ // 覆盖Ant Design的默认下划线
+ :global(.ant-tabs-ink-bar) {
+ background: none !important;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%) rotate(180deg);
+ width: 38.36132812500014px;
+ height: 3.3613271713256965px;
+ background-color: #009D6F;
+ opacity: 1;
+ border-radius: 2px;
+ z-index: 1;
+ }
+ }
+
+ :global(.ant-tabs-content-holder) {
+ height: calc(100% - 60px);
+ // padding: 20px;
+
+ .ant-tabs-content {
+ height: 100%;
+
+ .ant-tabs-tabpane {
+ height: 100%;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/OnlineMonitoring.js b/src/pages/business_plan/components/OnlineMonitoring.js
new file mode 100644
index 0000000..3e4b6b5
--- /dev/null
+++ b/src/pages/business_plan/components/OnlineMonitoring.js
@@ -0,0 +1,716 @@
+
+import React, { useEffect, useRef, useState } from 'react';
+import { Card, Result, Select, Button } from 'antd';
+import * as echarts from 'echarts';
+import StandardTable from '@/components/StandardTable';
+import styles from './OnlineMonitoring.less';
+
+import alarm0 from '@/assets/safe_majorHazard/online_monitoring/alarm0.png';
+import alarm1 from '@/assets/safe_majorHazard/online_monitoring/alarm1.png';
+import alarm2 from '@/assets/safe_majorHazard/online_monitoring/alarm2.png';
+import alarm3 from '@/assets/safe_majorHazard/online_monitoring/alarm3.png';
+import exportIcon from '@/assets/safe_majorHazard/online_monitoring/export.png';
+import deleteIcon from '@/assets/safe_majorHazard/online_monitoring/delete.png';
+
+const OnlineMonitoring = () => {
+ const chartRef = useRef(null);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [dataSource, setDataSource] = useState([]);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 5,
+ total: 0,
+ });
+
+ useEffect(() => {
+ if (chartRef.current) {
+ const chart = echarts.init(chartRef.current);
+
+ const option = {
+ color: ['#04A7F3', '#E7C42C', '#EC6941'],
+
+ legend: {
+ data: ['液位', '温度', '压力'],
+ top: "-3px",
+ left: "center",
+ itemGap: 40, // 图例间距
+ textStyle: {
+ fontSize: 10
+ }
+ },
+ grid: {
+ left: '2%',
+ right: '4%',
+ bottom: '2%',
+ top: '12%',
+ containLabel: true
+ },
+ xAxis: {
+ type: 'category',
+ boundaryGap: false,
+ data: ['0:00', '2:00', '4:00', '6:00', '8:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00', '22:00', '24:00'],
+ axisLabel: {
+ fontSize: 10
+ }
+ },
+ yAxis: {
+ type: 'value',
+ min: 0,
+ max: 500,
+ axisLabel: {
+ formatter: '{value}',
+ fontSize: 10
+ }
+ },
+ series: [
+ {
+ name: '液位',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#04A7F3'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(4, 167, 243, 0.3)' },
+ { offset: 1, color: 'rgba(4, 167, 243, 0)' }
+ ]
+ }
+ },
+ symbol: 'none', // 不显示数据点
+ data: [120, 200, 150, 300, 250, 400, 350, 280, 320, 180, 220, 160, 140]
+ },
+ {
+ name: '温度',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#E7C42C'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ { offset: 0, color: 'rgba(231, 196, 44, 0.3)' },
+ { offset: 1, color: 'rgba(231, 196, 44, 0)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [80, 120, 100, 180, 160, 220, 200, 150, 170, 90, 110, 85, 75]
+ },
+ {
+ name: '压力',
+ type: 'line',
+ smooth: true,
+ lineStyle: {
+ width: 1.5,
+ color: '#EC6941'
+ },
+ areaStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 1,
+ x2: 0,
+ y2: 0,
+ colorStops: [
+ { offset: 0, color: 'rgba(236, 105, 65, 0)' },
+ { offset: 1, color: 'rgba(236, 105, 65, 0.3)' }
+ ]
+ }
+ },
+ symbol: 'none',
+ data: [200, 300, 250, 450, 400, 430, 480, 420, 480, 280, 320, 260, 240]
+ }
+ ]
+ };
+
+ chart.setOption(option);
+
+ // 响应式调整 - 使用ResizeObserver监听容器尺寸变化
+ let resizeTimer = null;
+ const handleResize = () => {
+ // 防抖处理,避免频繁调用resize
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ resizeTimer = setTimeout(() => {
+ chart.resize();
+ }, 100);
+ };
+
+ // 监听窗口大小变化
+ window.addEventListener('resize', handleResize);
+
+ // 监听容器尺寸变化(解决菜单栏伸缩时的自适应问题)
+ let resizeObserver = null;
+ if (window.ResizeObserver) {
+ resizeObserver = new ResizeObserver(() => {
+ // 使用setTimeout确保DOM更新完成后再调整图表
+ setTimeout(() => {
+ handleResize();
+ }, 0);
+ });
+ resizeObserver.observe(chartRef.current);
+ }
+
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ if (resizeObserver) {
+ resizeObserver.disconnect();
+ }
+ if (resizeTimer) {
+ clearTimeout(resizeTimer);
+ }
+ chart.dispose();
+ };
+ }
+ }, []);
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '编号',
+ dataIndex: 'id',
+ key: 'id',
+ width: 80,
+ render: (text, record, index) => {
+ const page = pagination.current || 1;
+ const pageSize = pagination.pageSize || 5;
+ const number = (page - 1) * pageSize + index + 1;
+ return `0${number}`.slice(-2);
+ }
+ },
+ {
+ title: '报警时间',
+ dataIndex: 'alarmTime',
+ key: 'alarmTime',
+ width: 150,
+ },
+ {
+ title: '报警传感器名称',
+ dataIndex: 'sensorName',
+ key: 'sensorName',
+ width: 150,
+ },
+ {
+ title: '报警类型',
+ dataIndex: 'alarmType',
+ key: 'alarmType',
+ width: 120,
+ },
+ {
+ title: '报警内容',
+ dataIndex: 'alarmContent',
+ key: 'alarmContent',
+ width: 200,
+ },
+ {
+ title: '优先级',
+ dataIndex: 'priority',
+ key: 'priority',
+ width: 80,
+ render: (text) => {
+ const colorMap = {
+ '高': '#FF4D4F',
+ '中': '#FAAD14',
+ '低': '#52C41A'
+ };
+ return {text};
+ }
+ },
+ {
+ title: '处理状态',
+ dataIndex: 'status',
+ key: 'status',
+ width: 100,
+ render: (text) => {
+ const statusMap = {
+ '未处理': { color: '#FF4D4F', bg: '#FFF2F0' },
+ '处理中': { color: '#FAAD14', bg: '#FFFBE6' },
+ '已处理': { color: '#52C41A', bg: '#F6FFED' }
+ };
+ const status = statusMap[text] || { color: '#333', bg: '#F5F5F5' };
+ return (
+
+ {text}
+
+ );
+ }
+ },
+ {
+ title: '处理时间',
+ dataIndex: 'processTime',
+ key: 'processTime',
+ width: 150,
+ },
+ {
+ title: '处理人',
+ dataIndex: 'processor',
+ key: 'processor',
+ width: 100,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+
+
+ ),
+ },
+ ];
+
+ // 模拟数据
+ const mockData = [
+ {
+ key: '1',
+ id: '001',
+ alarmTime: '2024-01-15 08:30:25',
+ sensorName: 'LNG储罐',
+ alarmType: '温度超限',
+ alarmContent: '储罐温度超过安全阈值',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '2',
+ id: '002',
+ alarmTime: '2024-01-15 09:15:10',
+ sensorName: 'LNG储罐',
+ alarmType: '压力异常',
+ alarmContent: '管道压力异常波动',
+ priority: '中',
+ status: '处理中',
+ processTime: '2024-01-15 09:20:00',
+ processor: '张三',
+ },
+ {
+ key: '3',
+ id: '003',
+ alarmTime: '2024-01-15 10:45:30',
+ sensorName: 'LNG储罐',
+ alarmType: '液位异常',
+ alarmContent: '储罐液位低于警戒线',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 11:00:15',
+ processor: '李四',
+ },
+ {
+ key: '4',
+ id: '004',
+ alarmTime: '2024-01-15 11:20:45',
+ sensorName: 'LNG储罐',
+ alarmType: '气体泄漏',
+ alarmContent: '检测到可燃气体泄漏',
+ priority: '高',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '5',
+ id: '005',
+ alarmTime: '2024-01-15 12:10:20',
+ sensorName: 'LNG储罐',
+ alarmType: '设备振动',
+ alarmContent: '设备异常振动',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 12:30:00',
+ processor: '王五',
+ },
+ {
+ key: '6',
+ id: '006',
+ alarmTime: '2024-01-15 13:25:15',
+ sensorName: 'LNG管道',
+ alarmType: '流量异常',
+ alarmContent: '管道流量异常波动',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '7',
+ id: '007',
+ alarmTime: '2024-01-15 14:10:30',
+ sensorName: 'LNG储罐',
+ alarmType: '温度异常',
+ alarmContent: '储罐温度异常升高',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 14:15:00',
+ processor: '赵六',
+ },
+ {
+ key: '8',
+ id: '008',
+ alarmTime: '2024-01-15 15:45:20',
+ sensorName: 'LNG管道',
+ alarmType: '压力超限',
+ alarmContent: '管道压力超过安全阈值',
+ priority: '高',
+ status: '已处理',
+ processTime: '2024-01-15 16:00:00',
+ processor: '孙七',
+ },
+ {
+ key: '9',
+ id: '009',
+ alarmTime: '2024-01-15 16:30:45',
+ sensorName: 'LNG储罐',
+ alarmType: '液位超限',
+ alarmContent: '储罐液位超过警戒线',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ {
+ key: '10',
+ id: '010',
+ alarmTime: '2024-01-15 17:15:10',
+ sensorName: 'LNG管道',
+ alarmType: '泄漏检测',
+ alarmContent: '检测到轻微气体泄漏',
+ priority: '低',
+ status: '已处理',
+ processTime: '2024-01-15 17:30:00',
+ processor: '周八',
+ },
+ {
+ key: '11',
+ id: '011',
+ alarmTime: '2024-01-15 18:20:35',
+ sensorName: 'LNG储罐',
+ alarmType: '设备故障',
+ alarmContent: '储罐阀门异常关闭',
+ priority: '高',
+ status: '处理中',
+ processTime: '2024-01-15 18:25:00',
+ processor: '吴九',
+ },
+ {
+ key: '12',
+ id: '012',
+ alarmTime: '2024-01-15 19:05:50',
+ sensorName: 'LNG管道',
+ alarmType: '温度异常',
+ alarmContent: '管道温度异常下降',
+ priority: '中',
+ status: '未处理',
+ processTime: '-',
+ processor: '-',
+ },
+ ];
+
+ // 初始化数据
+ useEffect(() => {
+ setPagination(prev => ({ ...prev, total: mockData.length }));
+ }, []);
+
+ // 根据分页获取当前页数据
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const startIndex = (current - 1) * pageSize;
+ const endIndex = startIndex + pageSize;
+ return mockData.slice(startIndex, endIndex);
+ };
+
+ // 表格选择变化
+ const onSelectChange = (newSelectedRowKeys, newSelectedRows) => {
+ setSelectedRowKeys(newSelectedRowKeys);
+ setSelectedRows(newSelectedRows);
+ };
+
+ // 分页变化处理
+ const handleTableChange = (pagination) => {
+ setPagination(prev => ({
+ ...prev,
+ current: pagination.current,
+ pageSize: pagination.pageSize,
+ }));
+ };
+
+ // 导出功能
+ const handleExport = () => {
+ console.log('导出数据');
+ // 这里可以添加导出逻辑
+ };
+
+ // 批量删除功能
+ const handleBatchDelete = () => {
+ if (selectedRowKeys.length === 0) {
+ console.log('没有选中任何行');
+ // 可以在这里添加提示用户选择行的逻辑
+ return;
+ }
+ console.log('批量删除', selectedRowKeys);
+ // 这里可以添加批量删除逻辑
+ };
+
+ return (
+
+
+
+
+
+
+

+
+
+
+
总报警
+
1456
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
一级报警
+
357
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
二级报警
+
401
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+

+
+
+
三级报警
+
556
+
+
+ 未处理 6
+
+
+ 处理中 10
+
+
+
+
+
+
+
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+
储罐液化装置区
+
R值: 1765
+
编号:XXXXXXXX
+
+
+
+
+
+ {/* 表格 */}
+
+ {/* 首行 左侧标题左对齐 右侧按钮右对齐 */}
+
+
+
+
+
+
+
+
+
+ {/* 表格 5行10列 带页码 每页5条数据 */}
+
+
+ `共 ${total} 条`,
+ }}
+ scroll={{ x: 1200 }}
+ />
+
+
+
+ );
+};
+
+export default OnlineMonitoring;
\ No newline at end of file
diff --git a/src/pages/business_plan/components/OnlineMonitoring.less b/src/pages/business_plan/components/OnlineMonitoring.less
new file mode 100644
index 0000000..283ce83
--- /dev/null
+++ b/src/pages/business_plan/components/OnlineMonitoring.less
@@ -0,0 +1,919 @@
+.Ocontainer {
+ padding: 8px 6px 0px 6px;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .OcontainerTop {
+ display: flex;
+
+ height: 50%;
+ margin-bottom: 5px;
+
+ .OcontainerTopLeft {
+ width: 72%;
+ height: 100%;
+ // background-color: pink;
+ margin-right: 10px;
+ // display: flex;
+
+ .OcontainerTopLeftTop {
+ width: 100%;
+ height: 35%;
+ display: flex;
+ gap: 12px;
+
+ .alarmO {
+ flex: 1;
+ height: 100%;
+ background-color: #F4F7FF;
+ border: 1px solid #AED3FF;
+ border-bottom: 0px solid #AED3FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #5382FE33 inset;
+ display: flex;
+
+ .alarmOLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmORight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmORightText1 {
+ margin-top: 15px;
+ }
+
+
+ .alarmORightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmORightText3 {
+ display: flex;
+ gap: 22px;
+ }
+
+ }
+
+
+
+ }
+
+ .alarmTw {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF5f4;
+ border: 1px solid #FFC5BC;
+ border-bottom: 0px solid #FFC5BC;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FE5F4C33 inset;
+ display: flex;
+
+ .alarmTwLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmTwRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmTwRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmTwRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmTwRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmTh {
+ flex: 1;
+ height: 100%;
+ background-color: #FFF7F2;
+ border: 1px solid #FFD9B2;
+ border-bottom: 0px solid #FFD9B2;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #FD883C33 inset;
+ display: flex;
+
+ .alarmThLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmThRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmThRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmThRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmThRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+
+ .alarmF {
+ flex: 1;
+ height: 100%;
+ background-color: #EFF9FF;
+ border: 1px solid #89E1FF;
+ border-bottom: 0px solid #89E1FF;
+ border-radius: 4px;
+ box-shadow: 0px 2px 31px 0px #22A4FD33 inset;
+ display: flex;
+
+ .alarmFLeft {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .alarmFRight {
+ flex: 1;
+ width: 35%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ margin-left: 2px;
+ gap: 18px;
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-style: Regular;
+ font-size: 12px;
+ line-height: 100%;
+ letter-spacing: 0%;
+ color: #333333;
+
+ .alarmFRightText1 {
+ margin-top: 15px;
+ }
+
+ .alarmFRightText2 {
+ font-weight: 700;
+ font-size: 16px;
+ }
+
+ .alarmFRightText3 {
+ display: flex;
+ gap: 22px;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottom {
+ margin-top: 12px;
+ background-color: #fff;
+ width: 100%;
+ height: 60%;
+
+ .OcontainerTopLeftBottomTitle {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // padding: 8px 15px;
+ padding: 8px 15px 0px 15px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .titleRight {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ font-family: PingFang SC;
+ font-style: Medium;
+ font-size: 13px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+
+ .selectBox {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ background-color: #fff;
+ font-size: 12px;
+ color: #333;
+ outline: none;
+
+ &:focus {
+ border-color: #2E4CD4;
+ }
+ }
+ }
+ }
+
+ .OcontainerTopLeftBottomChart {
+ flex: 1;
+ width: 100%;
+ height: 75%;
+ }
+ }
+ }
+
+ .OcontainerTopRight {
+ flex: 1;
+ height: calc(100% - 3.3px);
+ background-color: #fff;
+ background-image: url('@/assets/safe_majorHazard/online_monitoring/backTopRight.png');
+ background-size: 100% auto;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+
+ .realTimeDataHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 15px;
+ margin-bottom: 10px;
+
+ .titleLeft {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-style: Medium;
+ font-size: 14px;
+ line-height: 100%;
+ letter-spacing: 0%;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .totalCount {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ }
+ }
+
+ .dataItem {
+ height: 23%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 2px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: PingFang SC;
+ font-size: 14px;
+ // color: #666;
+ background-color: #EFF9FF;
+
+ &:last-child {
+ // margin-bottom: 1px;
+ }
+ }
+
+ .dataItem1 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1; // 强制宽高比1:1
+
+ .outerCircle {
+
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem2 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 197, 188, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fff5f4;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(254, 214, 209, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(253, 41, 14, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem3 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid rgba(255, 217, 178, 1);
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #fef6f1;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 234, 218, 1);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(252, 103, 18, 1);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .dataItem4 {
+ height: 25%;
+ flex-shrink: 0;
+ border: 1px solid #89E1FF;
+ border-radius: 4px;
+ margin: 0 15px;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+ padding: 0px 15px;
+ background-color: #EFF9FF;
+
+ .dataItemLeft {
+ width: 65%;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .areaName {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 13px;
+ color: #333333;
+ line-height: 2.2;
+ }
+
+ .rValue {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 14px;
+ color: #666666;
+ line-height: 0.2;
+ }
+
+ .codeNumber {
+ font-family: PingFang SC;
+ font-weight: 400;
+ font-size: 12px;
+ color: #666666;
+ }
+ }
+
+ .dataItemRight {
+ width: 35%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .circleContainer {
+ position: relative;
+ height: 80%;
+ aspect-ratio: 1;
+
+ .outerCircle {
+ width: 100%;
+ height: 100%;
+ background-color: rgba(51, 176, 253, 0.3);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .innerCircle {
+ width: 70%;
+ height: 70%;
+ background-color: rgba(4, 128, 251, 0.8);
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .levelText {
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 11px;
+ color: #FFFFFF;
+ line-height: 1.4;
+ margin-top: -4px;
+ }
+
+ .riskText {
+ font-family: PingFang SC;
+ font-weight: 300;
+ font-size: 8px;
+ color: #FFFFFF;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ .OcontainerBottom {
+ background-color: #fff;
+ flex: 1;
+ padding: 8px 15px 5px 15px;
+ display: flex;
+ flex-direction: column;
+
+ .tableHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // margin-bottom: 15px;
+ padding-bottom: 5px;
+ // border-bottom: 1px solid #f0f0f0;
+
+ .tableTitle {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-family: PingFang SC;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+
+ .titleIcon {
+ width: 3px;
+ height: 16px;
+ background-color: #2E4CD4;
+ }
+ }
+
+ .tableActions {
+ display: flex;
+ gap: 8px;
+
+ // 自定义按钮样式
+ :global(.ant-btn) {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ // 主要按钮样式
+ &.ant-btn-primary {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 危险按钮样式
+ &.ant-btn-dangerous {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+
+ &:hover {
+ background-color: #f5f5f5 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:focus {
+ background-color: #ffffff !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+
+ &:active {
+ background-color: #e6e6e6 !important;
+ border-color: #DFE4F6 !important;
+ color: #333333 !important;
+ box-shadow: none !important;
+ }
+ }
+
+ // 禁用状态
+ &:disabled {
+ background-color: #f5f5f5 !important;
+ border-color: #d9d9d9 !important;
+ color: #bfbfbf !important;
+ box-shadow: none !important;
+ }
+ }
+ }
+ }
+
+ .tableContainer {
+ flex: 1;
+ overflow: hidden;
+
+ :global(.ant-table) {
+ font-size: 12px;
+ }
+
+ :global(.ant-table-thead > tr > th) {
+ background-color: #f5f5fa;
+ font-weight: 500;
+ font-size: 14px;
+ color: #333333;
+ border-bottom: 1px solid #f0f0f0;
+ padding: 8px 12px;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ padding: 8px 12px;
+ border-bottom: 1px solid #f0f0f0;
+ text-align: center;
+ }
+
+ :global(.ant-table-tbody > tr:hover > td) {
+ background-color: #f5f5f5;
+ }
+
+ :global(.ant-pagination) {
+ margin-top: 16px;
+ text-align: right;
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/PollutionSourceManagement.js b/src/pages/business_plan/components/PollutionSourceManagement.js
new file mode 100644
index 0000000..40494a0
--- /dev/null
+++ b/src/pages/business_plan/components/PollutionSourceManagement.js
@@ -0,0 +1,656 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { Select, Button, Table, Input, Space, Tooltip, message } from 'antd';
+import { SearchOutlined, PlusOutlined, FileTextOutlined, DeleteOutlined, EditOutlined, MoreOutlined, RobotOutlined } from '@ant-design/icons';
+import ReactECharts from 'echarts-for-react';
+import { history } from 'umi';
+import StandardTable from '@/components/StandardTable';
+import styles from './PollutionSourceManagement.less';
+import icon_water from '@/assets/business_envinformation/icon_water.svg';
+import icon_soil from '@/assets/business_envinformation/icon_soil.svg';
+import icon_factory from '@/assets/business_envinformation/icon_atmosphere.svg';
+
+
+
+const { Option } = Select;
+
+const PollutionSourceManagement = () => {
+ const [loading, setLoading] = useState(false);
+ const [chartReady, setChartReady] = useState(false);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [tableData, setTableData] = useState({
+ list: [],
+ pagination: {
+ current: 1,
+ pageSize: 5,
+ total: 85
+ }
+ });
+
+ // 确保DOM准备好后再渲染图表
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setChartReady(true);
+ }, 100);
+ return () => clearTimeout(timer);
+ }, []);
+
+ // 污染物排放统计图表配置 - 闭合环图+进度饼图
+ const pollutantEmissionOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F6F1E8',
+ shadowBlur: 4,
+ shadowColor: '#FFF5F0',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: 'rgba(255, 227, 208, 0.6)', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 62,
+ name: '超标污染物数量',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 1, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#FFF4B3' },
+ { offset: 0.5, color: '#FF8351' },
+ { offset: 1, color: '#FF7125' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 38,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标污染物种类统计图表配置 - 闭合环图+进度饼图
+ const pollutantTypeOption = {
+ tooltip: {
+ show: false
+ },
+ series: [
+ // 外层闭合环图
+ {
+ name: '外层环',
+ type: 'pie',
+ radius: ['58%', '80%'],
+ center: ['50%', '50%'],
+ data: [{ value: 100, name: '外层环' }],
+ itemStyle: {
+ color: '#F2F0FF',
+ shadowBlur: 4,
+ shadowColor: '#F2F0FF',
+ shadowOffsetY: 4,
+ borderRadius: 10,
+ borderColor: '#E4E1FB', // 外边框颜色
+ borderWidth: 2
+ },
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ },
+ // 内层进度饼图
+ {
+ name: '进度饼图',
+ type: 'pie',
+ radius: ['61%', '77%'],
+ center: ['50%', '50%'],
+ data: [
+ {
+ value: 25,
+ name: '超标污染物种类',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0, y: 0, x2: 0, y2: 1,
+ colorStops: [
+ { offset: 0, color: '#B3D6FF' },
+ { offset: 0.476, color: '#9E7DFF' },
+ { offset: 1, color: '#2549FF' }
+ ]
+ },
+ borderRadius: 10
+ }
+ },
+ {
+ value: 75,
+ name: '剩余',
+ itemStyle: { color: 'transparent' }
+ }
+ ],
+ label: { show: false },
+ labelLine: { show: false },
+ silent: true
+ }
+ ]
+ };
+
+ // 超标排放统计图表配置
+ const exceedanceOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ },
+ formatter: function (params) {
+ const data = params[0];
+ const exceedanceData = [
+ { name: '污染物1', status: '轻微超标', exceedance: '15%' },
+ { name: '污染物2', status: '严重超标', exceedance: '66%' },
+ { name: '污染物3', status: '轻微超标', exceedance: '8%' },
+ { name: '污染物4', status: '正常', exceedance: '0%' },
+ { name: '污染物5', status: '轻微超标', exceedance: '12%' }
+ ];
+ const item = exceedanceData[data.dataIndex];
+ return `
+
+
${data.name}
+
${item.status}
+
超标 ${item.exceedance}
+
大气环境特征污染物
+
+ `;
+ }
+ },
+ grid: {
+ left: '12%',
+ right: '5%',
+ top: '5%',
+ bottom: '12%'
+ },
+ xAxis: {
+ type: 'value',
+ max: 100,
+ min: 0,
+ interval: 10,
+ splitNumber: 10,
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6',
+ width: 1
+ }
+ },
+ axisTick: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisLabel: {
+ color: '#666',
+ formatter: function (value) {
+ return value;
+ }
+ },
+ splitLine: {
+ show: true,
+ lineStyle: {
+ color: '#f0f0f0',
+ type: 'dashed'
+ }
+ }
+ },
+ yAxis: {
+ type: 'category',
+ data: ['污染物1', '污染物2', '污染物3', '污染物4', '污染物5'],
+ axisLine: {
+ show: true,
+ lineStyle: {
+ color: '#D7D6D6'
+ }
+ },
+ axisTick: {
+ show: false
+ },
+ axisLabel: {
+ color: '#666',
+ fontSize: 12
+ }
+ },
+ series: [{
+ type: 'bar',
+ data: [45, 66, 32, 28, 38],
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 1,
+ y2: 0,
+ colorStops: [{
+ offset: 0, color: '#FFEBD9'
+ }, {
+ offset: 1, color: '#FF0000'
+ }]
+ },
+ // borderRadius: [0, 4, 0, 0]
+ },
+ barWidth: '60%',
+ barCategoryGap: '20px'
+ }]
+ };
+
+ // 表格列定义
+ const columns = [
+ {
+ title: '生产工艺设备',
+ dataIndex: 'equipment',
+ key: 'equipment',
+ width: 120,
+ },
+ {
+ title: '原材料产品',
+ dataIndex: 'material',
+ key: 'material',
+ width: 150,
+ },
+ {
+ title: '污染物排放处理设施',
+ dataIndex: 'facility',
+ key: 'facility',
+ width: 180,
+ },
+ {
+ title: '污染物排放种类',
+ dataIndex: 'type',
+ key: 'type',
+ width: 150,
+ render: (text) => (
+
+ {text}
+ {/* */}
+
+ ),
+ },
+ {
+ title: '排放数量',
+ dataIndex: 'quantity',
+ key: 'quantity',
+ width: 100,
+ },
+ {
+ title: '数量单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ },
+ {
+ title: '排放方式',
+ dataIndex: 'method',
+ key: 'method',
+ width: 100,
+ },
+ {
+ title: '趋向',
+ dataIndex: 'trend',
+ key: 'trend',
+ width: 200,
+ ellipsis: true,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 80,
+ render: (_, record) => (
+
+
+ handleDelete(record)}
+ />
+
+
+ ),
+ },
+ ];
+
+ // 模拟表格数据
+ const mockTableData = [
+ {
+ key: '1',
+ equipment: '比亚迪',
+ material: '丁硼乳膏(雅皓)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 47,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '2',
+ equipment: '荣威',
+ material: '东方活血膏(明仁)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 34,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近3年下达中央预算内投'
+ },
+ {
+ key: '3',
+ equipment: '现代',
+ material: '骨友灵搽剂(太极)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 45,
+ unit: 'm³',
+ method: '方式1',
+ trend: '刘某及同伴三人前往该射'
+ },
+ {
+ key: '4',
+ equipment: '日产',
+ material: '对乙酰氨基酚栓',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 55,
+ unit: 'm³',
+ method: '方式1',
+ trend: '一到假期,大量"xx暑假'
+ },
+ {
+ key: '5',
+ equipment: '北汽',
+ material: '对乙酰氨基酚片(必理通)',
+ facility: '净水设备234',
+ type: '种类1',
+ quantity: 22,
+ unit: 'm³',
+ method: '方式1',
+ trend: '近日,陕西延安培文实验'
+ },
+ {
+ key: '6',
+ equipment: '吉利',
+ material: '阿莫西林胶囊(联邦)',
+ facility: '污水处理设备001',
+ type: '种类2',
+ quantity: 38,
+ unit: 'kg',
+ method: '方式2',
+ trend: '环保部门加强监管力度,排放标准逐步提高'
+ },
+ {
+ key: '7',
+ equipment: '长城',
+ material: '布洛芬缓释胶囊(芬必得)',
+ facility: '废气处理设备002',
+ type: '种类3',
+ quantity: 29,
+ unit: 't',
+ method: '方式3',
+ trend: '企业积极响应绿色生产号召,投入环保设施'
+ },
+ {
+ key: '8',
+ equipment: '奇瑞',
+ material: '复方甘草片(太极)',
+ facility: '固废处理设备003',
+ type: '种类4',
+ quantity: 15,
+ unit: 'm³',
+ method: '方式4',
+ trend: '定期进行环境监测,确保排放达标'
+ }
+ ];
+
+ useEffect(() => {
+ setTableData({
+ list: mockTableData,
+ pagination: {
+ current: 6,
+ pageSize: 5,
+ total: 85
+ }
+ });
+ }, []);
+
+ // 处理删除操作
+ const handleDelete = (record) => {
+ message.success(`删除 ${record.equipment} 成功`);
+ };
+
+ // 处理新增操作
+ const handleAdd = () => {
+ message.info('新增功能开发中');
+ };
+
+ // 处理生成报表操作
+ const handleGenerateReport = () => {
+ message.info('生成报表功能开发中');
+ };
+
+ // 处理表格变化
+ const handleTableChange = (pagination) => {
+ setTableData(prev => ({
+ ...prev,
+ pagination: {
+ ...prev.pagination,
+ current: pagination.current,
+ pageSize: pagination.pageSize
+ }
+ }));
+ };
+
+ // 处理大气环境点击
+ const handleAtmosphereCardClick = () => {
+ history.push('/topnavbar00/business/atmospherePollutantLibrary');
+ };
+
+
+ return (
+
+ {/* 顶部统计区域 */}
+
+ {/* 污染物排放统计 */}
+
+
+
污染物排放统计
+
+
+
+
+
+
+
+ {/*
超标污染物数量
*/}
+ {chartReady && (
+
+ )}
+
+
+
+ {/*
超标污染物种类
*/}
+ {chartReady && (
+
+ )}
+
+
+
+
+
+ {/* 超标排放统计 */}
+
+
+
超标排放统计
+
+
+
+
+
+
+ {chartReady && (
+
+ )}
+
+
+
+ {/* 环境分类卡片 */}
+
+
+
+
AIR POLLUSION
+
+
+

+
+
+
+
WATER POLLUSION
+
+
+

+
+
+
+
SOILPOLLUSION
+
+
+

+
+
+
+
+
+
+ {/* 污染源管理表格区域 */}
+
+
+
污染源管理
+
+ }
+ onClick={handleAdd}
+ className={styles.titleAddButton}
+ >
+ 新增
+
+ }
+ onClick={handleGenerateReport}
+ className={styles.titleReportButton}
+ >
+ 生成报表
+
+
+
+
+
({
+ name: record.name,
+ }),
+ }}
+ pagination={{
+ showTotal: (total, range) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ pageSizeOptions: ['5', '10', '20', '50', '100'],
+ defaultPageSize: 5,
+ size: 'small',
+ }}
+ />
+
+
+ );
+};
+
+export default PollutionSourceManagement;
+
diff --git a/src/pages/business_plan/components/PollutionSourceManagement.less b/src/pages/business_plan/components/PollutionSourceManagement.less
new file mode 100644
index 0000000..7f48f4c
--- /dev/null
+++ b/src/pages/business_plan/components/PollutionSourceManagement.less
@@ -0,0 +1,590 @@
+.pollutionDashboard {
+ width: 100%;
+ min-height: 75vh;
+ // background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding: 15px;
+ box-sizing: border-box;
+
+ // 顶部统计区域
+ .statsSection {
+ display: flex;
+ gap: 15px;
+ margin-bottom: 15px;
+ height: 35vh;
+ align-items: stretch;
+
+ // 污染物排放统计卡片
+ .pollutantStatsCard {
+ width: 37%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background7.svg'),
+ linear-gradient(180deg, #E2FFF5 0%, rgba(255, 255, 255, 0.6) 51.44%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+ }
+
+ // 超标排放统计卡片
+ .exceedanceStatsCard {
+ width: 40%;
+ height: 100%;
+ background: url('@/assets/business_envinformation/background8.svg'),
+ linear-gradient(180.21deg, rgba(255, 227, 227, 0.58) 0.18%, #FFFFFF 53.1%),
+ linear-gradient(0deg, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));
+ background-repeat: no-repeat;
+ border-radius: 2px;
+ padding: 10px 20px;
+ display: flex;
+ flex-direction: column;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0 0 15px 0;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .exceedanceTimeFilter,
+ .exceedanceCategoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #FFC3C3;
+ background: #FFDEDEB2;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 卡片头部筛选器
+ .cardHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 0;
+
+ .cardTitle {
+ background: transparent;
+ color: #000000;
+ font-weight: 500;
+ font-size: 16px;
+ padding: 0;
+ margin: 0;
+ border: none;
+ flex-shrink: 0;
+ }
+
+ .filterGroup {
+ display: flex;
+ gap: 10px;
+ }
+
+ .timeFilter,
+ .categoryFilter {
+ width: 100px;
+ flex-shrink: 0;
+
+ :global(.ant-select-selector) {
+ border-radius: 2px;
+ border: 1px solid #73E9C6;
+ background: #C0FFE9AB;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+
+ // 图表容器
+ .chartsContainer {
+ display: flex;
+ gap: 20px;
+ justify-content: space-between;
+ background: transparent;
+ flex: 1;
+
+ .pieChartContainer {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ background: transparent;
+ height: 100%;
+ min-height: 200px;
+
+ .chartTitle {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 10px;
+ font-weight: 500;
+ background: transparent;
+ }
+
+ .chartCenterContent {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ z-index: 10;
+ background: transparent;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .chartValue {
+ font-size: 18px;
+ font-weight: bold;
+ color: #FF2F2F;
+ background: transparent;
+ margin: 0;
+ line-height: 1;
+ }
+
+ .chartLabel {
+ font-size: 12px;
+ font-weight: 500;
+ color: #000000;
+ background: transparent;
+ margin: 0;
+ margin-top: 2px;
+ line-height: 1;
+ }
+ }
+ }
+
+ // 条形图容器
+ .barChartContainer {
+ flex: 1;
+ margin-top: 10px;
+ }
+
+ // 环境分类卡片区域
+ .environmentalCategories {
+ flex: 1; // 撑满剩余宽度
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ // background-color: pink;
+
+ .categoryCard1 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(27, 201, 181, 0.2) 0%, rgba(58, 255, 216, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .airPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 255, 217, 0.1) 2.62%, rgba(0, 153, 131, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard2 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(36, 149, 255, 0.2) 0%, rgba(85, 164, 255, 0) 100%);
+ position: relative;
+ padding: 5px 15px;
+
+ .waterPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 170, 255, 0.1) 2.62%, rgba(89, 186, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryCard3 {
+ flex: 1;
+ background: linear-gradient(90deg, rgba(25, 60, 234, 0.2) 0%, rgba(139, 193, 255, 0) 100%);
+ position: relative;
+ cursor: pointer;
+ padding: 5px 15px;
+
+ .soilPollutionText {
+ position: absolute;
+ top: 2px;
+ left: 12px;
+ background: linear-gradient(183.17deg, rgba(0, 89, 255, 0.1) 2.62%, rgba(89, 117, 255, 0.1) 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 600;
+ font-style: normal;
+ font-size: 22px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ z-index: 1;
+ pointer-events: none;
+ }
+ }
+
+ .categoryContent {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .categoryInfo {
+ flex: 1;
+
+ .titleContainer {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 5px;
+ }
+
+ .categoryTitle {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 0px;
+
+ &.atmosphereGradient {
+ background: linear-gradient(183.17deg, #0EE5C5 2.62%, #08C2C2 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.atmosphereMirror {
+ background: linear-gradient(183.17deg, rgba(168, 255, 242, 0) 2.62%, rgba(86, 237, 214, 0) 65.7%, #00D9B9 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.waterGradient {
+ background: linear-gradient(183.17deg, #40AFFF 2.62%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.waterMirror {
+ background: linear-gradient(183.17deg, rgba(64, 175, 255, 0) 2.62%, rgba(0, 179, 255, 0) 65.7%, #00B3FF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+
+ &.soilGradient {
+ background: linear-gradient(183.17deg, #6E90FF 2.62%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 10px;
+ }
+
+ &.soilMirror {
+ background: linear-gradient(183.17deg, rgba(110, 144, 255, 0) 2.62%, rgba(61, 144, 239, 0) 65.7%, #3D90EF 132.53%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ font-family: 'Alimama ShuHeiTi', sans-serif;
+ font-weight: 700;
+ font-size: 24px;
+ line-height: 22px;
+ letter-spacing: 0%;
+ margin-top: 0px;
+ transform: scaleY(-1);
+ }
+ }
+
+ .categorySubtitle {
+ font-size: 12px;
+ color: #666;
+
+ &.pollutantSubtitle {
+ color: rgba(51, 51, 51, 1);
+ font-family: 'Alibaba PuHuiTi', sans-serif;
+ font-weight: 500;
+ font-size: 14px;
+ line-height: 22px;
+ letter-spacing: 4%;
+ margin-top: -20px;
+ }
+ }
+ }
+
+ .categoryIcon {
+ width: 40px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 5px;
+ // border-radius: 50%;
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+
+ .factoryIcon,
+ .waterIcon,
+ .soilIcon {
+ font-size: 20px;
+ filter: grayscale(0);
+ }
+ }
+ }
+ }
+ }
+
+ // 表格卡片
+ .tableCard {
+ background: #fff;
+ border-radius: 2px;
+ // box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+ // border: 1px solid rgba(255, 255, 255, 0.2);
+ // backdrop-filter: blur(10px);
+ padding: 20px;
+
+ .cardTitle {
+ // background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
+ color: rgba(0, 0, 0, 1);
+ font-weight: 500;
+ font-size: 16px;
+ padding: 12px 16px;
+ margin: -20px -20px 10px -20px;
+ // border-radius: 12px 12px 0 0;
+ // border-bottom: 2px solid #e8f4fd;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .titleButtons {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+
+ .titleAddButton {
+ background: rgba(0, 212, 138, 1);
+ border: none;
+ border-radius: 4px;
+ color: #fff;
+ font-weight: 500;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+ }
+ }
+
+ .titleReportButton {
+ border-radius: 4px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #666;
+ transition: all 0.3s ease;
+ height: 32px;
+ padding: 4px 15px;
+ font-size: 14px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ transform: translateY(-1px);
+ }
+ }
+ }
+ }
+ }
+
+
+ // 自定义Tooltip样式
+ .customTooltip {
+ background: rgba(0, 0, 0, 0.8);
+ border-radius: 8px;
+ padding: 10px;
+ color: white;
+ font-size: 12px;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+
+ .tooltipLabel {
+ font-weight: 600;
+ margin-bottom: 5px;
+ color: #fff;
+ }
+
+ .tooltipStatus {
+ color: #ff6b6b;
+ margin-bottom: 3px;
+ }
+
+ .tooltipExceedance {
+ color: #ffd93d;
+ margin-bottom: 3px;
+ }
+
+ .tooltipType {
+ color: #a8e6cf;
+ font-size: 11px;
+ }
+ }
+
+ // 响应式设计
+ @media (max-width: 1200px) {
+ .statsSection {
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: auto auto;
+
+ .environmentalCategories {
+ grid-column: 1 / -1;
+ flex-direction: row;
+ gap: 15px;
+
+ .categoryCard {
+ flex: 1;
+ }
+ }
+ }
+ }
+
+ @media (max-width: 768px) {
+ padding: 10px;
+
+ .statsSection {
+ grid-template-columns: 1fr;
+ gap: 15px;
+
+ .environmentalCategories {
+ flex-direction: column;
+ }
+ }
+
+ }
+
+ // 表格样式优化
+ :global(.ant-table) {
+ // border-radius: 8px;
+ overflow: hidden;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ font-size: 12px;
+ color: rgba(0, 0, 0, 0.85);
+
+ :global(.ant-table-thead > tr > th) {
+ // background: linear-gradient(90deg, #f8f9fa 0%, #e9ecef 100%);
+ // border-bottom: 2px solid #dee2e6;
+ font-weight: 400;
+
+ }
+
+ :global(.ant-table-tbody > tr) {
+ // transition: all 0.3s ease;
+ }
+
+ :global(.ant-table-tbody > tr > td) {
+ // border-bottom: 1px solid #f0f0f0;
+ }
+ }
+
+ // 分页器样式
+ // :global(.ant-pagination) {
+ // margin-top: 20px;
+ // text-align: center;
+
+ // :global(.ant-pagination-item) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+
+ // &.ant-pagination-item-active {
+ // background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ // border-color: #667eea;
+ // color: white;
+ // }
+ // }
+
+ // :global(.ant-pagination-prev),
+ // :global(.ant-pagination-next) {
+ // border-radius: 6px;
+ // border: 1px solid #d9d9d9;
+ // transition: all 0.3s ease;
+ // }
+ // }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.js b/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.js
new file mode 100644
index 0000000..765d995
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.js
@@ -0,0 +1,345 @@
+import React, { useState } from 'react';
+import { Button, Input, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, UploadOutlined, DownloadOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './DischargePermitManagement.less';
+// import attachment from '@/assets/business_envinformation/attachment.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+
+const DischargePermitManagement = () => {
+ const [activeTab, setActiveTab] = useState('actual');
+
+ // 实际排放数据
+ const actualEmissionData = [
+ { key: 1, emissionType: '前林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 3, emissionType: '长家界市', pollutant: '12345678', outletType: '环境设计', outletName: '上海环境科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 4, emissionType: '北京市', pollutant: '87654321', outletType: '污染治理', outletName: '北京环保科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 5, emissionType: '上海市', pollutant: '11223344', outletType: '排放监测', outletName: '上海监测技术有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 6, emissionType: '广州市', pollutant: '55667788', outletType: '工业废水', outletName: '广州环保科技股份有限公司', permittedEmission: '3年', annualTotal: '2025-09-10' },
+ { key: 7, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 8, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' },
+ { key: 9, emissionType: '南京市', pollutant: '77889900', outletType: '工业废气', outletName: '南京工业集团股份有限公司', permittedEmission: '6年', annualTotal: '2025-06-15' },
+ { key: 10, emissionType: '武汉市', pollutant: '11223355', outletType: '交通污染', outletName: '武汉交通发展有限公司', permittedEmission: '3年', annualTotal: '2025-11-20' },
+ { key: 11, emissionType: '成都市', pollutant: '66778899', outletType: '建筑扬尘', outletName: '成都建筑工程有限公司', permittedEmission: '5年', annualTotal: '2025-05-30' },
+ { key: 12, emissionType: '西安市', pollutant: '44556677', outletType: '餐饮油烟', outletName: '西安餐饮管理有限公司', permittedEmission: '4年', annualTotal: '2025-12-10' }
+ ];
+
+ // 超标排放数据
+ const excessiveEmissionData = [
+ { key: 1, emissionType: '俞林市', pollutant: '51669811', outletType: '信用风险管理与法律防', outletName: '北京那蓝国际贸易有限公司', permittedEmission: '5年', annualTotal: '2025-08-15' },
+ { key: 2, emissionType: '拉萨市', pollutant: '34887875', outletType: '涉外警务', outletName: '中瀚石林企业咨询(上海)有限公司', permittedEmission: '5年', annualTotal: '2025-08-09' },
+ { key: 3, emissionType: '长家界市', pollutant: '1716652546', outletType: '环境设计', outletName: '水木晨曦(北京)科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 4, emissionType: '潭市', pollutant: '384654762', outletType: '电子竞技运动与管理', outletName: '亚商桥(北京)咨询有限公司', permittedEmission: '5年', annualTotal: '2025-08-18' },
+ { key: 5, emissionType: '次州市', pollutant: '34669295254', outletType: '精算学', outletName: '中讯通讯科技有限公司', permittedEmission: '5年', annualTotal: '2025-08-13' },
+ { key: 6, emissionType: '驻马店市', pollutant: '4347052411', outletType: '数字媒体艺术', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-21' },
+ { key: 7, emissionType: '三亚市', pollutant: '388946891', outletType: '技术侦察学', outletName: '中大国际文化有限公司', permittedEmission: '5年', annualTotal: '2025-08-17' },
+ { key: 8, emissionType: '巢湖市', pollutant: '7190228566', outletType: '财政学', outletName: '嘉实瑞沃德(北京)商贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-20' },
+ { key: 9, emissionType: '东营市', pollutant: '6656363924', outletType: '保险学', outletName: '北京济丰国际医院管理有限公司', permittedEmission: '5年', annualTotal: '2025-08-27' },
+ { key: 10, emissionType: '九龙', pollutant: '622145211', outletType: '英语', outletName: '北京庆奔科贸有限公司', permittedEmission: '5年', annualTotal: '2025-08-28' },
+ { key: 11, emissionType: '深圳市', pollutant: '99887766', outletType: '生活污水', outletName: '深圳水务集团有限公司', permittedEmission: '4年', annualTotal: '2025-07-20' },
+ { key: 12, emissionType: '杭州市', pollutant: '33445566', outletType: '农业面源', outletName: '杭州农业科技有限公司', permittedEmission: '2年', annualTotal: '2025-10-05' }
+ ];
+
+ // 污染治理设备异常情况数据
+ const equipmentAbnormalData = [
+ { key: 1, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 2, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 3, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 4, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 5, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 6, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 7, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 8, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 9, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 10, emissionType: '类型1', pollutant: '10:15:10—10:50:10', outletType: '管道', outletName: '老化', permittedEmission: '因子名称', annualTotal: '管口5m内' },
+ { key: 11, emissionType: '类型2', pollutant: '11:20:15—11:45:30', outletType: '风机', outletName: '磨损', permittedEmission: '因子名称2', annualTotal: '风机10m内' },
+ { key: 12, emissionType: '类型3', pollutant: '14:30:20—15:10:40', outletType: '泵站', outletName: '堵塞', permittedEmission: '因子名称3', annualTotal: '泵站15m内' }
+ ];
+
+ // 实际排放和超标排放的表格列定义
+ const normalColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '排放物类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '污染物',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 100,
+ },
+ {
+ title: '排放口类型',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 160,
+ },
+ {
+ title: '排放口编号/排放口名称',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 220,
+ },
+ {
+ title: '许可排放量(吨)',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 120,
+ },
+ {
+ title: '年度合计',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '第一季度',
+ key: 'q1',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '二季度',
+ key: 'q2',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '三季度',
+ key: 'q3',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '四季度',
+ key: 'q4',
+ width: 80,
+ render: () => 附件,
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 污染治理设备异常情况的表格列定义
+ const equipmentColumns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '故障类型',
+ dataIndex: 'emissionType',
+ key: 'emissionType',
+ width: 100,
+ },
+ {
+ title: '超标时段(开始时段—结束时段)',
+ dataIndex: 'pollutant',
+ key: 'pollutant',
+ width: 200,
+ },
+ {
+ title: '故障设施',
+ dataIndex: 'outletType',
+ key: 'outletType',
+ width: 100,
+ },
+ {
+ title: '故障原因',
+ dataIndex: 'outletName',
+ key: 'outletName',
+ width: 100,
+ },
+ {
+ title: '排放因子',
+ dataIndex: 'permittedEmission',
+ key: 'permittedEmission',
+ width: 100,
+ },
+ {
+ title: '排放范围',
+ dataIndex: 'annualTotal',
+ key: 'annualTotal',
+ width: 120,
+ },
+ {
+ title: '排放因子浓度(mg/m³或dB(A))',
+ key: 'concentration',
+ width: 200,
+ render: () => '2025-08-15',
+ },
+ {
+ title: '应对',
+ key: 'response',
+ width: 80,
+ render: () => '—',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 120,
+ render: (_, record) => (
+
+

+

+
+ ),
+ },
+ ];
+
+ // 获取当前标签页的数据
+ const getCurrentData = () => {
+ switch (activeTab) {
+ case 'actual':
+ return actualEmissionData;
+ case 'excessive':
+ return excessiveEmissionData;
+ case 'equipment':
+ return equipmentAbnormalData;
+ default:
+ return actualEmissionData;
+ }
+ };
+
+ // 获取当前标签页的列定义
+ const getCurrentColumns = () => {
+ switch (activeTab) {
+ case 'actual':
+ case 'excessive':
+ return normalColumns;
+ case 'equipment':
+ return equipmentColumns;
+ default:
+ return normalColumns;
+ }
+ };
+
+ // 分页配置
+ const pagination = {
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ showTotal: (total) => `共 ${total} 条`,
+ showSizeChanger: true,
+ showQuickJumper: true,
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ 筛选条件
+
+
+ }
+ className={styles.queryBtn}
+ >
+ 查询
+
+ }
+ className={styles.resetBtn}
+ >
+ 重置
+
+ }
+ className={styles.uploadBtn}
+ >
+ 上传
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DischargePermitManagement;
\ No newline at end of file
diff --git a/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.less b/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.less
new file mode 100644
index 0000000..6bb0c75
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/DischargePermitManagement.less
@@ -0,0 +1,160 @@
+.dischargePermitManagement {
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ padding: 20px;
+
+ .tabContainer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 15px;
+ padding: 0 ;
+ // border-bottom: 1px solid #e8e8e8;
+
+ .tabButtons {
+ display: flex;
+ gap: 0;
+ background-color: #F4F4F4;
+ border-radius: 4px;
+ padding: 4px 8px;
+ align-items: center;
+
+ .tabButton {
+ padding: 8px 20px;
+ border: none;
+ background-color: transparent;
+ color: #666;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ border-radius: 4px;
+ transition: all 0.3s ease;
+ height: auto;
+ line-height: 1.4;
+
+ &:hover {
+ color: #1890ff;
+ background-color: rgba(24, 144, 255, 0.1);
+ }
+
+ &.active {
+ background-color: #03C598;
+ color: #fff;
+ }
+ }
+ }
+
+ .filterSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ border-radius: 4px;
+
+ .filterLabel {
+ font-size: 14px;
+ color: #333;
+ }
+
+ .filterSelect {
+ min-width: 120px;
+ }
+
+ .filterInput {
+ min-width: 200px;
+ border-radius: 4px;
+ }
+
+ .queryBtn {
+ background-color: #00D48A;
+ border-color: #00D48A;
+ border-radius: 4px;
+
+ &:hover {
+ background-color: #389e0d;
+ border-color: #389e0d;
+ }
+ }
+
+ .resetBtn, .uploadBtn {
+ background-color: #fff;
+ color: #666;
+ border-color: #d9d9d9;
+ border-radius: 4px;
+
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+ }
+ }
+ }
+
+ .tableContent {
+ width: 100%;
+
+ // 覆盖表头样式
+ :global {
+ .ant-table-thead > tr > th {
+ font-weight: 400 !important;
+ font-size: 12px !important;
+ color: #333 !important;
+ text-align: center !important;
+ background-color: #FAFAFA !important;
+ }
+
+ .ant-table-tbody > tr > td {
+ font-size: 12px;
+ color: #333;
+ text-align: center;
+ }
+
+ .ant-table-wrapper {
+ width: 100%;
+ max-width: 100%;
+ }
+ }
+
+ .attachmentLink {
+ color: #1890ff;
+ text-decoration: none;
+ font-size: 12px;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+
+ .actionButtons {
+ display: flex;
+ gap: 20px;
+ justify-content: center;
+ align-items: center;
+
+ .downloadIcon, .deleteIcon {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: scale(1.1);
+ opacity: 0.8;
+ }
+ }
+
+ .downloadIcon {
+ &:hover {
+ filter: brightness(1.2);
+ }
+ }
+
+ .deleteIcon {
+ &:hover {
+ filter: brightness(1.2) saturate(1.5);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.js b/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.js
new file mode 100644
index 0000000..f4e6367
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import styles from './EnvironmentalTaskList.less';
+
+const EnvironmentalTaskList = () => {
+ return (
+
+
+
+
2) 环保管理任务清单
+
依据排污许可证副本中的环保要求,提供生成环保管理要求任务清单;
+
环保任务清单包括:大气排放口信息,大气污染物有组织排放许可年限值,大气污染物无组织排放年限制、企业大气排放总许可量;废水排放口、废水污染物排放许可限制;固体废物排放信息、自行贮存和自行利用/处置设施信息;工业噪声排放信息;
+
环境管理要求包括:自行检测及记录表、环境管理台账记录。
+
+
+
+
+ 共85条
+
+
+
+
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+
+ );
+};
+
+export default EnvironmentalTaskList;
diff --git a/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.less b/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.less
new file mode 100644
index 0000000..c9f43c6
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/EnvironmentalTaskList.less
@@ -0,0 +1,105 @@
+.environmentalTaskListContainer {
+ width: 100%;
+ height: 72vh;
+ display: flex;
+ flex-direction: column;
+ background-color: #fff;
+ position: relative;
+}
+
+.environmentalTaskListContent {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0px 20px;
+}
+
+.environmentalTaskListText {
+ max-width: 800px;
+ text-align: left;
+ line-height: 1.6;
+
+ h2 {
+ font-size: 20px;
+ color: #333;
+ margin-bottom: 20px;
+ font-weight: 600;
+ }
+
+ p {
+ font-size: 16px;
+ color: #333;
+ margin-bottom: 15px;
+ text-indent: 2em;
+ }
+}
+
+.environmentalTaskListPagination {
+ position: absolute;
+ bottom: 20px;
+ right: 20px;
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ background: #fff;
+ padding: 10px 20px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+
+.paginationInfo {
+ font-size: 14px;
+ color: #666;
+}
+
+.paginationControls {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.pageSizeSelect {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ font-size: 12px;
+ background: #fff;
+}
+
+.pageNumbers {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.pageButton, .pageNumber {
+ padding: 4px 8px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ border-radius: 4px;
+ font-size: 12px;
+ cursor: pointer;
+ min-width: 32px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ border-color: #1890ff;
+ color: #1890ff;
+ }
+}
+
+.pageNumber.active {
+ background: #1890ff;
+ color: #fff;
+ border-color: #1890ff;
+}
+
+.pageEllipsis {
+ padding: 4px 8px;
+ font-size: 12px;
+ color: #666;
+}
diff --git a/src/pages/business_plan/components/secondary_menu/InformationDisclosure.js b/src/pages/business_plan/components/secondary_menu/InformationDisclosure.js
new file mode 100644
index 0000000..4366372
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/InformationDisclosure.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './InformationDisclosure.less';
+
+const InformationDisclosure = () => {
+ return (
+
+ );
+};
+
+export default InformationDisclosure;
+
diff --git a/src/pages/business_plan/components/secondary_menu/InformationDisclosure.less b/src/pages/business_plan/components/secondary_menu/InformationDisclosure.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/InformationDisclosure.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_plan/components/secondary_menu/PermitManagement.js b/src/pages/business_plan/components/secondary_menu/PermitManagement.js
new file mode 100644
index 0000000..f8e20d1
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/PermitManagement.js
@@ -0,0 +1,286 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitManagement.less';
+import licence1 from '@/assets/business_envinformation/licence1.svg';
+import licence2 from '@/assets/business_envinformation/licence2.svg';
+
+const PermitManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ companyName: '北京某某环保有限公司',
+ permitNumber: 'PWX-BJ-2023-001',
+ issueOrg: '北京市生态环境局',
+ expireDate: '2025-12-31',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 2,
+ companyName: '上海某某化工有限公司',
+ permitNumber: 'PWX-SH-2023-002',
+ issueOrg: '上海市生态环境局',
+ expireDate: '2025-10-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 3,
+ companyName: '广州某某制造有限公司',
+ permitNumber: 'PWX-GZ-2023-003',
+ issueOrg: '广州市生态环境局',
+ expireDate: '2026-03-20',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 4,
+ companyName: '深圳某某电子有限公司',
+ permitNumber: 'PWX-SZ-2023-004',
+ issueOrg: '深圳市生态环境局',
+ expireDate: '2025-08-10',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 5,
+ companyName: '成都某某科技有限公司',
+ permitNumber: 'PWX-CD-2023-005',
+ issueOrg: '成都市生态环境局',
+ expireDate: '2026-01-25',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 6,
+ companyName: '武汉某某工业有限公司',
+ permitNumber: 'PWX-WH-2023-006',
+ issueOrg: '武汉市生态环境局',
+ expireDate: '2025-11-30',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 7,
+ companyName: '杭州某某环保有限公司',
+ permitNumber: 'PWX-HZ-2023-007',
+ issueOrg: '杭州市生态环境局',
+ expireDate: '2026-05-15',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 8,
+ companyName: '南京某某化学有限公司',
+ permitNumber: 'PWX-NJ-2023-008',
+ issueOrg: '南京市生态环境局',
+ expireDate: '2025-09-20',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 9,
+ companyName: '重庆某某重工有限公司',
+ permitNumber: 'PWX-CQ-2023-009',
+ issueOrg: '重庆市生态环境局',
+ expireDate: '2026-02-28',
+ original: '已上传',
+ duplicate: '未上传',
+ },
+ {
+ key: 10,
+ companyName: '天津某某制药有限公司',
+ permitNumber: 'PWX-TJ-2023-010',
+ issueOrg: '天津市生态环境局',
+ expireDate: '2025-07-10',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 11,
+ companyName: '西安某某材料有限公司',
+ permitNumber: 'PWX-XA-2023-011',
+ issueOrg: '西安市生态环境局',
+ expireDate: '2026-04-05',
+ original: '未上传',
+ duplicate: '已上传',
+ },
+ {
+ key: 12,
+ companyName: '青岛某某机械有限公司',
+ permitNumber: 'PWX-QD-2023-012',
+ issueOrg: '青岛市生态环境局',
+ expireDate: '2025-12-15',
+ original: '已上传',
+ duplicate: '已上传',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 200,
+ },
+ {
+ title: '排污许可证号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 180,
+ },
+ {
+ title: '颁发机构',
+ dataIndex: 'issueOrg',
+ key: 'issueOrg',
+ width: 180,
+ },
+ {
+ title: '到期时间',
+ dataIndex: 'expireDate',
+ key: 'expireDate',
+ width: 120,
+ sorter: (a, b) => new Date(a.expireDate) - new Date(b.expireDate),
+ showSorterTooltip: false,
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 100,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 150,
+ align: 'center',
+ render: (_, record) => (
+
+ handleView(record)}
+ />
+ handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ }
+ }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitManagement;
+
diff --git a/src/pages/business_plan/components/secondary_menu/PermitManagement.less b/src/pages/business_plan/components/secondary_menu/PermitManagement.less
new file mode 100644
index 0000000..b200e6c
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/PermitManagement.less
@@ -0,0 +1,137 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ // margin-bottom: 20px;
+ padding: 20px;
+ // background-color: #fafafa;
+ // border-radius: 2px;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
+
diff --git a/src/pages/business_plan/components/secondary_menu/PermitStatistics.js b/src/pages/business_plan/components/secondary_menu/PermitStatistics.js
new file mode 100644
index 0000000..fec1778
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/PermitStatistics.js
@@ -0,0 +1,421 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './PermitStatistics.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+
+
+const PermitStatistics = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 14,
+ });
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ administrativeRegion: '榆林市',
+ permitNumber: '51669811',
+ industryCategory: '信用风险管理与法律防',
+ companyName: '北京那蓝国际贸易有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 2,
+ administrativeRegion: '拉萨市',
+ permitNumber: '34887875',
+ industryCategory: '涉外警务',
+ companyName: '中潮石林企业咨询(上海)有限公司北京分公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-09',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 3,
+ administrativeRegion: '长家界市',
+ permitNumber: '1716652546',
+ industryCategory: '环境设计',
+ companyName: '水木晨曦(北京)科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 4,
+ administrativeRegion: '马潭市',
+ permitNumber: '384654762',
+ industryCategory: '电子竞技运动与管理',
+ companyName: '亚商桥(北京)咨询有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 5,
+ administrativeRegion: '交州市',
+ permitNumber: '34669295254',
+ industryCategory: '精算学',
+ companyName: '中讯通讯科技有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-13',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 6,
+ administrativeRegion: '驻马店市',
+ permitNumber: '4347052411',
+ industryCategory: '数字媒体艺术',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-21',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 7,
+ administrativeRegion: '三亚市',
+ permitNumber: '388946691',
+ industryCategory: '技术侦察学',
+ companyName: '中大国际文化有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-17',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 8,
+ administrativeRegion: '美湖市',
+ permitNumber: '7190228566',
+ industryCategory: '财政学',
+ companyName: '嘉实瑞沃德(北京)商贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-20',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 9,
+ administrativeRegion: '东营市',
+ permitNumber: '6656363924',
+ industryCategory: '保险学',
+ companyName: '北京清丰国际医院管理有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-06-27',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 10,
+ administrativeRegion: '九龙',
+ permitNumber: '622145211',
+ industryCategory: '英语',
+ companyName: '北京庆奔科贸有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-08-28',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 11,
+ administrativeRegion: '深圳市',
+ permitNumber: '755123456',
+ industryCategory: '计算机科学与技术',
+ companyName: '深圳创新科技有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-01',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 12,
+ administrativeRegion: '杭州市',
+ permitNumber: '571789012',
+ industryCategory: '电子商务',
+ companyName: '杭州数字贸易有限公司',
+ validityPeriod: '4年',
+ issueDate: '2025-09-05',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 13,
+ administrativeRegion: '成都市',
+ permitNumber: '028345678',
+ industryCategory: '生物技术',
+ companyName: '成都生物科技股份有限公司',
+ validityPeriod: '5年',
+ issueDate: '2025-09-10',
+ original: '附件',
+ duplicate: '附件',
+ },
+ {
+ key: 14,
+ administrativeRegion: '武汉市',
+ permitNumber: '027456789',
+ industryCategory: '机械工程',
+ companyName: '武汉智能制造有限公司',
+ validityPeriod: '3年',
+ issueDate: '2025-09-15',
+ original: '附件',
+ duplicate: '附件',
+ },
+ ]);
+
+ const columns = [
+ {
+ title: '序号',
+ dataIndex: 'key',
+ key: 'key',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '行政区',
+ dataIndex: 'administrativeRegion',
+ key: 'administrativeRegion',
+ width: 120,
+ },
+ {
+ title: '许可证编号',
+ dataIndex: 'permitNumber',
+ key: 'permitNumber',
+ width: 130,
+ },
+ {
+ title: '行业类别',
+ dataIndex: 'industryCategory',
+ key: 'industryCategory',
+ width: 200,
+ },
+ {
+ title: '企业名称',
+ dataIndex: 'companyName',
+ key: 'companyName',
+ width: 230,
+ },
+ {
+ title: '有效期限',
+ dataIndex: 'validityPeriod',
+ key: 'validityPeriod',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '发证日期',
+ dataIndex: 'issueDate',
+ key: 'issueDate',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '正本',
+ dataIndex: 'original',
+ key: 'original',
+ width: 80,
+ align: 'center',
+ render: () => { setCurrentImage(licence1); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '副本',
+ dataIndex: 'duplicate',
+ key: 'duplicate',
+ width: 120,
+ align: 'center',
+ render: () => { setCurrentImage(licence2); setIsModalVisible(true); }}>附件
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ render: (_, record) => (
+
+
handleView(record)}
+ />
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 导入
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default PermitStatistics;
diff --git a/src/pages/business_plan/components/secondary_menu/PermitStatistics.less b/src/pages/business_plan/components/secondary_menu/PermitStatistics.less
new file mode 100644
index 0000000..54aa30e
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/PermitStatistics.less
@@ -0,0 +1,187 @@
+.permitContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 0 20px 0;
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table {
+ flex: 1;
+ overflow: auto;
+ margin: 0;
+ }
+
+ .ant-table-pagination {
+ flex-shrink: 0;
+
+ }
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 70px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.js b/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.js
new file mode 100644
index 0000000..a83b5c2
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.js
@@ -0,0 +1,578 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './ProtectionFacilityMaintenance.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const ProtectionFacilityMaintenance = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 13,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ facilityCode: '35.236.217.212',
+ startTime: '2025-08-23 06:18',
+ endTime: '2025-08-23 06:18',
+ pollutantType: '123',
+ concentration: '39',
+ unit: 'm³/d',
+ dischargeDestination: '大气',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-23 06:18',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉骐',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ facilityCode: '65.177.48.116',
+ startTime: '2025-09-07 17:48',
+ endTime: '2025-09-07 17:48',
+ pollutantType: '大气污染物',
+ concentration: '52',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-07 17:48',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ facilityCode: '111.161.135.125',
+ startTime: '2025-09-04 13:08',
+ endTime: '2025-09-04 13:08',
+ pollutantType: '污水',
+ concentration: '28',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '从病虫害探测、土壤墒情监测智能...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-04 13:08',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-22',
+ recorder: '王佛瑶',
+ reviewer: '赵玉',
+ facilityName: '烧烫伤膏(茂祥)',
+ facilityCode: '162.208.135.147',
+ startTime: '2025-08-28 22:40',
+ endTime: '2025-08-28 22:40',
+ pollutantType: '污水',
+ concentration: '46',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近期,高铁"熊孩子"事件频出,...',
+ isReported: '已报告',
+ responseMeasures: '2025-08-28 22:40',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-31',
+ recorder: '吴子萱',
+ reviewer: '钱品妍',
+ facilityName: '云南白药(云南白药)',
+ facilityCode: '138.6.246.181',
+ startTime: '2025-09-17 19:48',
+ endTime: '2025-09-17 19:48',
+ pollutantType: '污水',
+ concentration: '37',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '刘某及同伴三人前往该射击俱乐部...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-17 19:48',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '何风景',
+ reviewer: '赵海洲',
+ facilityName: '麝香壮骨膏(修正)',
+ facilityCode: '134.80.173.128',
+ startTime: '2025-09-02 22:21',
+ endTime: '2025-09-02 22:21',
+ pollutantType: '污水',
+ concentration: '53',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '一位网友在社交平台发布的视频显...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-02 22:21',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-28',
+ recorder: '李琳颖',
+ reviewer: '李建刚',
+ facilityName: '复方醋酸甲羟孕酮胶囊(妇复春)',
+ facilityCode: '218.169.25.43',
+ startTime: '2025-09-06 16:27',
+ endTime: '2025-09-06 16:27',
+ pollutantType: '污水',
+ concentration: '24',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '盛夏时节,四川绵竹市汉旺镇一株...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-06 16:27',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-22',
+ recorder: '赵午光',
+ reviewer: '钱泽西',
+ facilityName: '桂龙药膏',
+ facilityCode: '54.218.80.84',
+ startTime: '2025-09-12 22:50',
+ endTime: '2025-09-12 22:50',
+ pollutantType: '污水',
+ concentration: '47',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '随着"热射病"这一高温疾病快速...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-12 22:50',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-21',
+ recorder: '王凤娇',
+ reviewer: '李金泽',
+ facilityName: '和兴白花油(和兴白花油)',
+ facilityCode: '222.1.18.173',
+ startTime: '2025-09-10 04:28',
+ endTime: '2025-09-10 04:28',
+ pollutantType: '污水',
+ concentration: '33',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '夏粮丰,全年稳。国家粮食和物资...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-10 04:28',
+ },
+ {
+ key: 10,
+ recordTime: '2025-09-09',
+ recorder: '赵涛',
+ reviewer: '何能',
+ facilityName: '茶苯海明含片(贻晗柠)',
+ facilityCode: '136.200.182.22',
+ startTime: '2025-08-30 07:15',
+ endTime: '2025-08-30 07:15',
+ pollutantType: '污水',
+ concentration: '34',
+ unit: 'm³/d',
+ dischargeDestination: '河流',
+ eventReason: '近日,一则"携程推出火车卧铺女...',
+ isReported: '未报告',
+ responseMeasures: '2025-08-30 07:15',
+ },
+ {
+ key: 11,
+ recordTime: '2025-09-15',
+ recorder: '李小明',
+ reviewer: '王建国',
+ facilityName: '阿莫西林胶囊(华北制药)',
+ facilityCode: '192.168.1.100',
+ startTime: '2025-09-15 14:30',
+ endTime: '2025-09-15 16:45',
+ pollutantType: '大气污染物',
+ concentration: '68',
+ unit: 'mg/m³',
+ dischargeDestination: '大气',
+ eventReason: '设备故障导致废气处理系统异常运行...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-15 16:45',
+ },
+ {
+ key: 12,
+ recordTime: '2025-09-18',
+ recorder: '张美丽',
+ reviewer: '刘德华',
+ facilityName: '布洛芬缓释胶囊(中美史克)',
+ facilityCode: '10.0.0.25',
+ startTime: '2025-09-18 09:20',
+ endTime: '2025-09-18 11:30',
+ pollutantType: '污水',
+ concentration: '42',
+ unit: 'mg/L',
+ dischargeDestination: '污水处理厂',
+ eventReason: '管道泄漏导致废水直接排放...',
+ isReported: '未报告',
+ responseMeasures: '2025-09-18 11:30',
+ },
+ {
+ key: 13,
+ recordTime: '2025-09-20',
+ recorder: '陈志强',
+ reviewer: '周杰伦',
+ facilityName: '头孢拉定胶囊(石药集团)',
+ facilityCode: '172.16.0.88',
+ startTime: '2025-09-20 20:15',
+ endTime: '2025-09-20 22:00',
+ pollutantType: '噪声',
+ concentration: '85',
+ unit: 'dB',
+ dischargeDestination: '环境',
+ eventReason: '夜间施工未采取降噪措施...',
+ isReported: '已报告',
+ responseMeasures: '2025-09-20 22:00',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编号',
+ dataIndex: 'facilityCode',
+ key: 'facilityCode',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '异常情况起始时刻',
+ dataIndex: 'startTime',
+ key: 'startTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '异常情况终止时刻',
+ dataIndex: 'endTime',
+ key: 'endTime',
+ width: 160,
+ align: 'center',
+ },
+ {
+ title: '污染物种类',
+ dataIndex: 'pollutantType',
+ key: 'pollutantType',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污染物排放浓度',
+ dataIndex: 'concentration',
+ key: 'concentration',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '浓度单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '事件原因',
+ dataIndex: 'eventReason',
+ key: 'eventReason',
+ width: 180,
+ },
+ {
+ title: '是否报告',
+ dataIndex: 'isReported',
+ key: 'isReported',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '应对措施',
+ dataIndex: 'responseMeasures',
+ key: 'responseMeasures',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 100,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+
+
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default ProtectionFacilityMaintenance;
diff --git a/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.less b/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.less
new file mode 100644
index 0000000..38c8a2e
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/ProtectionFacilityMaintenance.less
@@ -0,0 +1,205 @@
+.protectionFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_plan/components/secondary_menu/RegulationCompliance.js b/src/pages/business_plan/components/secondary_menu/RegulationCompliance.js
new file mode 100644
index 0000000..8dcaeff
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/RegulationCompliance.js
@@ -0,0 +1,592 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Select, Drawer, Descriptions, Tag } from 'antd';
+import styles from './RegulationCompliance.less';
+import stipulation1 from '@/assets/business_envinformation/stipulation1.svg';
+
+const RegulationCompliance = () => {
+ const [form] = Form.useForm();
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedRegulation, setSelectedRegulation] = useState(null);
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ // 显示抽屉详情
+ const showDrawer = (regulation) => {
+ setSelectedRegulation(regulation);
+ setDrawerVisible(true);
+ };
+
+ // 关闭抽屉
+ const onCloseDrawer = () => {
+ setDrawerVisible(false);
+ setSelectedRegulation(null);
+ };
+
+ // 模拟法规数据(实际应该从后端获取)
+ const mockRegulationDetail = {
+ name: '2025排污许可条例',
+ publishDate: '2025-08-24',
+ department: '环保部门名称',
+ content: '在此输入具体的法规内容...',
+ status: '有效',
+ category: '排污许可',
+ version: '1.0',
+ updateTime: '2025-08-24'
+ };
+
+
+ return (
+
+ {/* 第一块:搜索表单 */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* 第二块:表格区域 */}
+
+
+ {/* 法规合规管理块1 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-24
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块2 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-25
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块3 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-26
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块4 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-27
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块5 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-28
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块6 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-29
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块7 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-30
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块8 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-08-31
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块9 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-01
+
+
+ 发布部门 环保部门名称9
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块10 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-02
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块11 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-03
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+ {/* 法规合规管理块12 */}
+
+ {/* 第一行:法规名称 */}
+
+

+ 2025排污许可条例
+
+
+ {/* 第二行:发布时间和发布部门 */}
+
+
+ 发布时间 2025-09-04
+
+
+ 发布部门 环保部门名称
+
+
+
+ {/* 第三行:操作按钮 */}
+
+
showDrawer(mockRegulationDetail)}
+ style={{ cursor: 'pointer' }}
+ >
+
+
+
+
+
+
+
+
+ {/* 静态分页组件 */}
+
+
+ 共85条
+ {/* */}
+
+
+ ...
+
+
+
+
+
+ ...
+
+
+
+
+
+ {/* 抽屉详情 */}
+
+ {selectedRegulation && (
+
+
+ {selectedRegulation.name}
+
+
+ {selectedRegulation.publishDate}
+
+
+ {selectedRegulation.department}
+
+
+ {selectedRegulation.status}
+
+
+ {selectedRegulation.category}
+
+
+ {selectedRegulation.version}
+
+
+ {selectedRegulation.updateTime}
+
+
+
+ {selectedRegulation.content}
+
+
+
+ )}
+
+
+ );
+};
+
+export default RegulationCompliance;
+
diff --git a/src/pages/business_plan/components/secondary_menu/RegulationCompliance.less b/src/pages/business_plan/components/secondary_menu/RegulationCompliance.less
new file mode 100644
index 0000000..f26410a
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/RegulationCompliance.less
@@ -0,0 +1,204 @@
+.regulationContainer {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+
+ .searchSection {
+ padding: 20px;
+ background-color: #fff;
+
+ :global {
+ .ant-form-inline {
+ display: flex;
+
+ .ant-form-item {
+ margin-right: 16px;
+ margin-bottom: 0;
+ }
+
+ .ant-form-item:nth-last-child(2) {
+ margin-left: auto;
+ }
+
+ .ant-form-item:last-child {
+ margin-right: 0;
+ }
+ }
+
+ .ant-form-item-label {
+ font-weight: 500;
+
+ label {
+ color: #666666;
+ font-size: 13px;
+ }
+ }
+
+ .ant-input::placeholder,
+ .ant-picker-input input::placeholder {
+ color: #00000040;
+ font-size: 13px;
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 20px;
+
+ .blocksContainer {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: repeat(3, 1fr);
+ gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .regulationBlock {
+ background-color: #fff;
+ // border: 1px solid #EEEEEE;
+ border-radius: 2px;
+ // padding: 8px 16px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ min-height: 120px;
+ }
+
+
+ .regulationTitle {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333333;
+ padding: 8px 16px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ display: flex;
+ align-items: center;
+ }
+
+ .regulationInfo {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 15px;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ margin-bottom: 0;
+ }
+
+ .publishDate {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+ margin-bottom: 6px;
+
+ }
+
+ .publishDepartment {
+ font-size: 12px;
+ color: #666666;
+ font-weight: 400;
+
+ }
+
+ .actionButtons {
+ display: flex;
+
+ justify-content: center;
+ gap: 8px;
+ width: 100%;
+ // margin-bottom: 0;
+ border: 1px solid #EEEEEE;
+ border-bottom: none;
+ // padding-top: 4px;
+ }
+
+ .actionButton {
+ width: calc(50% - 4px);
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ border-radius: 2px;
+ transition: background-color 0.2s;
+
+ &:hover {
+ background-color: #f5f5f5;
+ }
+ }
+
+ }
+
+ .paginationContainer {
+ position: fixed;
+ bottom: 10px;
+ right: 10px;
+ z-index: 1000;
+ }
+
+ .pagination {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ // background: #fff;
+ padding: 8px 30px;
+ border-radius: 4px;
+ // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .totalItems {
+ font-size: 12px;
+ color: #666;
+ margin-right: 8px;
+ }
+
+ .pageSizeSelect {
+ font-size: 12px;
+ border: 1px solid #d9d9d9;
+ border-radius: 2px;
+ padding: 2px 6px;
+ margin-right: 8px;
+ background: #fff;
+ }
+
+ .pageButton {
+ width: 28px;
+ height: 28px;
+ border: 1px solid #d9d9d9;
+ background: #fff;
+ color: #333;
+ font-size: 12px;
+ border-radius: 2px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s;
+
+ &:hover {
+ border-color: #00D48A;
+ color: #00D48A;
+ }
+
+ &.active {
+ background: #00D48A;
+ border-color: #00D48A;
+ color: #fff;
+ }
+ }
+
+ .ellipsis {
+ font-size: 12px;
+ color: #999;
+ padding: 0 4px;
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_plan/components/secondary_menu/SupervisionInspection.js b/src/pages/business_plan/components/secondary_menu/SupervisionInspection.js
new file mode 100644
index 0000000..da0cca8
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/SupervisionInspection.js
@@ -0,0 +1,13 @@
+import React from 'react';
+import styles from './SupervisionInspection.less';
+
+const SupervisionInspection = () => {
+ return (
+
+ );
+};
+
+export default SupervisionInspection;
+
diff --git a/src/pages/business_plan/components/secondary_menu/SupervisionInspection.less b/src/pages/business_plan/components/secondary_menu/SupervisionInspection.less
new file mode 100644
index 0000000..022f9de
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/SupervisionInspection.less
@@ -0,0 +1,15 @@
+.container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #fff;
+
+ .content {
+ font-size: 24px;
+ color: #999999;
+ font-weight: 400;
+ }
+}
+
diff --git a/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.js b/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.js
new file mode 100644
index 0000000..4c079d0
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.js
@@ -0,0 +1,803 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WasteGasPollutionControl.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WasteGasPollutionControl = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉琪',
+ reviewer: '赵子能',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ equipmentModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.12',
+ pressure: '95',
+ emissionTime: '100',
+ powerConsumption: '34',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ equipmentModel: '19b89E82-ae94-6bF7-2355-8DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantFlueGasVolume: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '59.95',
+ pressure: '90',
+ emissionTime: '95',
+ powerConsumption: '55',
+ byproductName: '二氧化碳',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵喜行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ equipmentModel: '6Ddb888D-3d7A-305E-3372-109F7154Ad3A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantFlueGasVolume: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ exhaustStackHeight: '2',
+ exhaustTemperature: '50.48',
+ pressure: '100',
+ emissionTime: '115',
+ powerConsumption: '39',
+ byproductName: '氮气',
+ byproductProduction: '2',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设备型号',
+ dataIndex: 'equipmentModel',
+ key: 'equipmentModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物烟气量(m³/h)',
+ dataIndex: 'pollutantFlueGasVolume',
+ key: 'pollutantFlueGasVolume',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排气筒高度(m)',
+ dataIndex: 'exhaustStackHeight',
+ key: 'exhaustStackHeight',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '排气温度(℃)',
+ dataIndex: 'exhaustTemperature',
+ key: 'exhaustTemperature',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '压力(kpa)',
+ dataIndex: 'pressure',
+ key: 'pressure',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '排放时间(h)',
+ dataIndex: 'emissionTime',
+ key: 'emissionTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物名称',
+ dataIndex: 'byproductName',
+ key: 'byproductName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '副产物产生量(t)',
+ dataIndex: 'byproductProduction',
+ key: 'byproductProduction',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WasteGasPollutionControl;
diff --git a/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.less b/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.less
new file mode 100644
index 0000000..7b23dad
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/WasteGasPollutionControl.less
@@ -0,0 +1,205 @@
+.wasteGasContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #FAFAFA;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #FAFAFA;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
diff --git a/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.js b/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.js
new file mode 100644
index 0000000..b830f24
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.js
@@ -0,0 +1,746 @@
+import React, { useState } from 'react';
+import { Form, Input, Button, DatePicker, Space, Modal, Select } from 'antd';
+import { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import styles from './WastewaterFacilityManagement.less';
+import licence1 from '@/assets/business_envinformation/image1.svg';
+import licence2 from '@/assets/business_envinformation/image2.svg';
+import viewicon from '@/assets/business_envinformation/viewicon.svg';
+import editicon from '@/assets/business_envinformation/editicon.svg';
+import downloadicon from '@/assets/business_envinformation/downloadicon.svg';
+import deleteicon from '@/assets/business_envinformation/deleteicon.svg';
+
+const WastewaterFacilityManagement = () => {
+ const [form] = Form.useForm();
+ const [isModalVisible, setIsModalVisible] = useState(false);
+ const [currentImage, setCurrentImage] = useState(null);
+ const [pagination, setPagination] = useState({
+ current: 1,
+ pageSize: 10,
+ total: 12,
+ });
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
+ const [dataSource, setDataSource] = useState([
+ {
+ key: 1,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 2,
+ recordTime: '2025-09-02',
+ recorder: '王嘉祺',
+ reviewer: '赵子峰',
+ facilityName: '复方水杨酸甲酯乳膏(曼秀雷敦)',
+ code: '65.177.48.116',
+ facilityModel: '3D8d4ffa-bD7e-AffF-ED68-839DAFe74c27',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '14:10',
+ endRunTime: '03:06',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘2',
+ treatmentEfficiency: '93.81',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.12',
+ treatmentMethod: '95',
+ powerConsumption: '34',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-24 05:16',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 3,
+ recordTime: '2025-09-06',
+ recorder: '王嘉琪',
+ reviewer: '郑清予',
+ facilityName: '口炎清颗粒(大神)',
+ code: '111.161.135.125',
+ facilityModel: '19b89EB2-ae94-6bF7-2355-6DBC2d6a6009',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '12:26',
+ endRunTime: '03:26',
+ isNormal: '异常',
+ pollutantOutletFlow: '2',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '91.40',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '59.95',
+ treatmentMethod: '90',
+ powerConsumption: '56',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-08-30 18:34',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 4,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 5,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 6,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 7,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 8,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 9,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 10,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 11,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ {
+ key: 12,
+ recordTime: '2025-08-29',
+ recorder: '赵吾行',
+ reviewer: '郑叶飞',
+ facilityName: '塞隆风湿酒(同仁堂)',
+ code: '35.236.217.212',
+ facilityModel: '6Ddb888D-3d7A-3e5E-3372-109F7154A03A',
+ parameterName: '重量',
+ designValue: '2',
+ unit: 't',
+ startRunTime: '00:46',
+ endRunTime: '03:55',
+ isNormal: '正常',
+ pollutantOutletFlow: '1',
+ pollutantFactor: '烟尘',
+ treatmentEfficiency: '95.32',
+ dataSource: '实时采集',
+ dischargeDestination: '2',
+ sludgeProduction: '50.48',
+ treatmentMethod: '100',
+ powerConsumption: '39',
+ reagentName: '乳酸钠葡萄糖',
+ reagentAdditionTime: '2025-09-01 07:53',
+ reagentAdditionAmount: '2',
+ },
+ ]);
+
+ const getCurrentPageData = () => {
+ const { current, pageSize } = pagination;
+ const start = (current - 1) * pageSize;
+ const end = start + pageSize;
+ return dataSource.slice(start, end);
+ };
+
+ const columns = [
+ {
+ title: (
+ 0}
+ onChange={(e) => handleSelectAll(e.target.checked)}
+ />
+ ),
+ key: 'selection',
+ width: 60,
+ align: 'center',
+ fixed: 'left',
+ render: (_, record) => (
+ {
+ if (e.target.checked) {
+ setSelectedRowKeys([...selectedRowKeys, record.key]);
+ } else {
+ setSelectedRowKeys(selectedRowKeys.filter(key => key !== record.key));
+ }
+ }}
+ />
+ ),
+ },
+ {
+ title: '记录时间',
+ dataIndex: 'recordTime',
+ key: 'recordTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '记录人',
+ dataIndex: 'recorder',
+ key: 'recorder',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '审核人',
+ dataIndex: 'reviewer',
+ key: 'reviewer',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '设施名称',
+ dataIndex: 'facilityName',
+ key: 'facilityName',
+ width: 200,
+ },
+ {
+ title: '编码',
+ dataIndex: 'code',
+ key: 'code',
+ width: 150,
+ },
+ {
+ title: '设施型号',
+ dataIndex: 'facilityModel',
+ key: 'facilityModel',
+ width: 200,
+ },
+ {
+ title: '参数名称',
+ dataIndex: 'parameterName',
+ key: 'parameterName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '设计值',
+ dataIndex: 'designValue',
+ key: 'designValue',
+ width: 100,
+ align: 'center',
+ },
+ {
+ title: '单位',
+ dataIndex: 'unit',
+ key: 'unit',
+ width: 80,
+ align: 'center',
+ },
+ {
+ title: '开始运行时间',
+ dataIndex: 'startRunTime',
+ key: 'startRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '结束运行时间',
+ dataIndex: 'endRunTime',
+ key: 'endRunTime',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '是否正常',
+ dataIndex: 'isNormal',
+ key: 'isNormal',
+ width: 100,
+ align: 'center',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: '污染物出口流量(m³/h)',
+ dataIndex: 'pollutantOutletFlow',
+ key: 'pollutantOutletFlow',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '污染因子',
+ dataIndex: 'pollutantFactor',
+ key: 'pollutantFactor',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '治理效率(%)',
+ dataIndex: 'treatmentEfficiency',
+ key: 'treatmentEfficiency',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '数据来源',
+ dataIndex: 'dataSource',
+ key: 'dataSource',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '排放去向',
+ dataIndex: 'dischargeDestination',
+ key: 'dischargeDestination',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '污泥产生量(t)',
+ dataIndex: 'sludgeProduction',
+ key: 'sludgeProduction',
+ width: 130,
+ align: 'center',
+ },
+ {
+ title: '处理方式',
+ dataIndex: 'treatmentMethod',
+ key: 'treatmentMethod',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '耗电量(kWh)',
+ dataIndex: 'powerConsumption',
+ key: 'powerConsumption',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂名称',
+ dataIndex: 'reagentName',
+ key: 'reagentName',
+ width: 120,
+ align: 'center',
+ },
+ {
+ title: '药剂添加时间',
+ dataIndex: 'reagentAdditionTime',
+ key: 'reagentAdditionTime',
+ width: 150,
+ align: 'center',
+ },
+ {
+ title: '药剂添加量(t)',
+ dataIndex: 'reagentAdditionAmount',
+ key: 'reagentAdditionAmount',
+ width: 140,
+ align: 'center',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ width: 140,
+ align: 'center',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {/*
handleView(record)}
+ /> */}
+
handleEdit(record)}
+ />
+
handleDownload(record)}
+ />
+
handleDelete(record)}
+ />
+
+ ),
+ },
+ ];
+
+ const handleSearch = (values) => {
+ console.log('搜索参数:', values);
+ // TODO: 实现搜索功能
+ };
+
+ const handleReset = () => {
+ form.resetFields();
+ // TODO: 重置搜索
+ };
+
+ const handleView = (record) => {
+ console.log('查看:', record);
+ // TODO: 实现查看功能
+ };
+
+ const handleEdit = (record) => {
+ console.log('编辑:', record);
+ // TODO: 实现编辑功能
+ };
+
+ const handleDownload = (record) => {
+ console.log('下载:', record);
+ // TODO: 实现下载功能
+ };
+
+ const handleDelete = (record) => {
+ console.log('删除:', record);
+ // TODO: 实现删除功能
+ };
+
+ const handleAdd = () => {
+ console.log('新增');
+ // TODO: 实现新增功能
+ };
+
+ const handleImport = () => {
+ console.log('导入');
+ // TODO: 实现导入功能
+ };
+
+ const handleQuery = () => {
+ console.log('查询');
+ // TODO: 实现查询功能
+ };
+
+ const handleTableChange = (pagination) => {
+ setPagination(pagination);
+ };
+
+ // 全选功能
+ const handleSelectAll = (checked) => {
+ if (checked) {
+ const allKeys = getCurrentPageData().map(item => item.key);
+ setSelectedRowKeys(allKeys);
+ } else {
+ setSelectedRowKeys([]);
+ }
+ };
+
+ // 批量操作
+ const handleBatchOperation = (operation) => {
+ console.log(`批量${operation}:`, selectedRowKeys);
+ // TODO: 实现批量操作功能
+ };
+
+ return (
+
+ {/* 第一块:操作按钮和筛选条件 */}
+
+
+ }
+ onClick={handleAdd}
+ className={styles.addButton}
+ >
+ 新增
+
+ }
+ onClick={handleImport}
+ className={styles.importButton}
+ >
+ 上传
+
+ }
+ onClick={() => handleBatchOperation('下载')}
+ className={styles.importButton}
+ disabled={selectedRowKeys.length === 0}
+ >
+ 批量下载
+
+ {/* */}
+
+
+
+ 筛选条件
+
+
+
+
+
+
+
+
+ {/* 第二块:表格 */}
+
+ `共 ${total} 条`,
+ showSizeChanger: false,
+ }
+ }}
+ onChange={handleTableChange}
+ scroll={{ x: 3000 }}
+ />
+
+
+ {/* 图片弹窗 */}
+
setIsModalVisible(false)}
+ footer={null}
+ closeIcon={}
+ width="auto"
+ centered
+ styles={{
+ mask: { backgroundColor: '#10101080' },
+ content: { padding: 0, background: 'transparent', boxShadow: 'none' }
+ }}
+ >
+ {currentImage &&
}
+
+
+ );
+};
+
+export default WastewaterFacilityManagement;
\ No newline at end of file
diff --git a/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.less b/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.less
new file mode 100644
index 0000000..6d2aaec
--- /dev/null
+++ b/src/pages/business_plan/components/secondary_menu/WastewaterFacilityManagement.less
@@ -0,0 +1,206 @@
+.wastewaterFacilityContainer {
+ width: 100%;
+ height: 100%;
+ // padding: 20px;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .searchSection {
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+
+ .leftButtons {
+ display: flex;
+ gap: 12px;
+
+ .addButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 32px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .importButton {
+ background-color: white;
+ border-color: #d9d9d9;
+ color: #333;
+ height: 32px;
+ border-radius: 4px;
+
+ &:hover {
+ border-color: #40a9ff;
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .rightControls {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+
+ .queryButton {
+ background-color: #52c41a;
+ border-color: #52c41a;
+ color: white;
+ height: 28px;
+ border-radius: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:hover {
+ background-color: #73d13d;
+ border-color: #73d13d;
+ }
+ }
+
+ .selectInput {
+ :global {
+ .ant-select-selector {
+ display: flex;
+ align-items: center;
+ height: 28px !important;
+ }
+
+ .ant-select-selection-item {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+
+ .ant-select-selection-placeholder {
+ display: flex;
+ align-items: center;
+ line-height: 1;
+ }
+ }
+ }
+ }
+ }
+
+ .tableSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 20px 0;
+ overflow: hidden; // 只设置垂直隐藏
+ min-width: 0; // 确保可以收缩
+
+
+ :global {
+ .ant-spin-nested-loading {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-spin-container {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+
+ .ant-table-wrapper {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+ }
+ }
+ }
+
+ .ant-table {
+ font-size: 12px;
+
+ .ant-table-thead > tr > th {
+ background-color: #fafafa;
+ font-weight: 400;
+ color: #000000D9;
+ border-right: none;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr > td {
+ border-right: none;
+ color: #000000D9;
+ font-weight: 400;
+ text-align: center;
+ white-space: nowrap; // 防止换行
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .ant-table-tbody > tr:hover > td {
+ background-color: #f5f5f5;
+ }
+
+ // 固定列样式
+ .ant-table-thead > tr > th.ant-table-cell-fix-left,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-left {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ .ant-table-thead > tr > th.ant-table-cell-fix-right,
+ .ant-table-tbody > tr > td.ant-table-cell-fix-right {
+ background-color: #fafafa;
+ z-index: 1;
+ }
+
+ // 固定列阴影效果
+ .ant-table-cell-fix-left {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ .ant-table-cell-fix-right {
+ // box-shadow: 0px 0 4px 0px #00000040;
+ }
+
+ a {
+ color: #1890ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #40a9ff;
+ }
+ }
+ }
+
+ .ant-pagination {
+ text-align: right;
+ margin-top: 25px !important;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/nav_system_content/SystemContentList.js b/src/pages/nav_system_content/SystemContentList.js
index f69f790..28c82f7 100644
--- a/src/pages/nav_system_content/SystemContentList.js
+++ b/src/pages/nav_system_content/SystemContentList.js
@@ -12,7 +12,7 @@ import menuTitle from '@/assets/img/智能管控平台.svg'
import menuTitle1 from '@/assets/img/智能管控平台-1.svg'
import fireHydrant from '@/assets/img/fireHydrant.svg'
import fireHydrant1 from '@/assets/img/fireHydrant1.svg'
-import trouble from '@/assets/img/trouble.svg'
+import menuicon1 from '@/assets/img/menuicon1.svg'
import book from '@/assets/img/book.svg'
import danger from '@/assets/img/danger.svg'
import danger1 from '@/assets/img/danger1.svg'
@@ -37,10 +37,18 @@ const CustomMenuItem = ({ item, selectedKeys }) => {
const renderIcon = () => {
if (item.icon && typeof item.icon === 'object' && item.icon.props && item.icon.props.src) {
const iconSrc = isActive ? getActiveIcon(item.icon.props.src) : item.icon.props.src;
+
+ const baseStyle = item.icon.props.style || { width: '16px', height: '16px' };
+
+ const dynamicStyle = {
+ ...baseStyle,
+ opacity: isActive ? 1 : 0.6
+ };
+
return
}
return item.icon;
@@ -87,6 +95,12 @@ const SystemContentList = (props) => {
setMenuItems(newList)
const fixedMenuItems = [
+ {
+ "path": "/topnavbar00/business/emergencyResource",
+ icon:
,
+ "key": "/topnavbar00/business/emergencyResource",
+ "label": "应急资源管理"
+ },
{
"path": "/topnavbar00/business/basicinformation",
icon:
,
@@ -191,6 +205,7 @@ const SystemContentList = (props) => {