环保设备

main
wangyunfei 2 weeks ago
parent f24ad5e7f5
commit 9880ef1c57

@ -0,0 +1,3 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.2663 17.1003L17.0663 11.3003C17.2996 11.067 17.1329 10.6337 16.7996 10.6337H13.6663C13.4329 10.6337 13.2663 10.467 13.2663 10.2337V2.06699C13.2663 1.83367 13.0996 1.66699 12.8663 1.66699H9.16627C8.93295 1.66699 8.76627 1.83367 8.76627 2.06699V10.2337C8.76627 10.467 8.59961 10.6337 8.36627 10.6337H5.23295C4.86627 10.6337 4.69961 11.067 4.96627 11.3003L10.7329 17.1003C10.8663 17.2337 11.1329 17.2337 11.2663 17.1003ZM3.09961 20.3337H18.8996C19.2663 20.3337 19.5996 20.0337 19.5996 19.6337C19.5996 19.267 19.2996 18.9337 18.8996 18.9337H3.06627C2.69961 18.9337 2.36627 19.2337 2.36627 19.6337C2.39961 20.0337 2.69961 20.3337 3.09961 20.3337Z" fill="#A4A4A4"/>
</svg>

After

Width:  |  Height:  |  Size: 776 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 205 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 202 KiB

@ -1,12 +1,55 @@
import React from 'react'; import React, { useState } from 'react';
import { Tabs } from 'antd';
import styles from './EquipmentManagement.less'; 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 EquipmentManagement = () => {
const [activeTab, setActiveTab] = useState('waste-gas-control');
// 标签页配置
const tabItems = [
{
key: 'waste-gas-control',
label: '废气污染防治信息',
children: <WasteGasPollutionControl />
},
{
key: 'wastewater-facility',
label: '废水设置运行管理',
children: <WastewaterFacilityManagement />
},
{
key: 'protection-facility',
label: '防护设施检维修管理',
children: <ProtectionFacilityMaintenance />
}
];
// 标签页切换处理
const handleTabChange = (key) => {
setActiveTab(key);
};
return ( return (
<div className={styles.container}> <div className={styles.container}>
<Tabs
开发中 activeKey={activeTab}
onChange={handleTabChange}
items={tabItems}
className={styles.tabs}
style={{
'--ant-tabs-tab-color': '#AFAFAF',
'--ant-tabs-tab-active-color': '#009D6F',
'--ant-tabs-tab-active-bg': '#fff'
}}
tabBarStyle={{
'--ant-tabs-tab-active-color': '#009D6F'
}}
/>
</div> </div>
); );
}; };

@ -1,42 +1,119 @@
.container { .container {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; padding: 16px;
justify-content: center; // background-color: #f5f5f5;
align-items: center;
background-color: #fff; .tabs {
border-radius: 4px; height: 100%;
padding: 20px; background-color: transparent;
border-radius: 8px;
.developingBox { // box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column; :global(.ant-tabs-nav) {
align-items: center; margin: 0;
justify-content: center; padding: 0 0px;
padding: 60px 80px; background-color: transparent;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-bottom: none;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.3);
.developingText {
font-size: 32px;
font-weight: 600;
color: #ffffff;
letter-spacing: 4px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
animation: pulse 2s ease-in-out infinite;
} }
}
}
@keyframes pulse { :global(.ant-tabs-tab) {
0%, 100% { padding: 16px 24px !important;
opacity: 1; font-size: 14px !important;
transform: scale(1); font-weight: 400 !important;
} color: #AFAFAF !important;
50% { background: transparent !important;
opacity: 0.8; border: none !important;
transform: scale(1.05); 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%;
}
}
}
}
}

@ -19,7 +19,7 @@ const EvaluationReport = () => {
}, },
{ {
key: 'environmental-task-list', key: 'environmental-task-list',
label: '环保管理任务清单2', label: '环保管理任务清单',
children: <EnvironmentalTaskList /> children: <EnvironmentalTaskList />
}, },
{ {
@ -46,6 +46,9 @@ const EvaluationReport = () => {
'--ant-tabs-tab-active-color': '#009D6F', '--ant-tabs-tab-active-color': '#009D6F',
'--ant-tabs-tab-active-bg': '#fff' '--ant-tabs-tab-active-bg': '#fff'
}} }}
tabBarStyle={{
'--ant-tabs-tab-active-color': '#009D6F'
}}
/> />
</div> </div>
); );

@ -36,18 +36,7 @@
background-color: #fff !important; background-color: #fff !important;
border-bottom: none !important; border-bottom: none !important;
&::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 38.36132812500014px;
height: 3.3613271713256965px;
background-color: #009D6F;
border-radius: 2px;
z-index: 1;
}
} }
} }
@ -72,9 +61,46 @@
border-bottom: none !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的默认下划线 // 覆盖Ant Design的默认下划线
:global(.ant-tabs-ink-bar) { :global(.ant-tabs-ink-bar) {
display: none !important; 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) { :global(.ant-tabs-content-holder) {

@ -1,25 +1,345 @@
import React from 'react'; 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 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 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: () => <a href="#" className={styles.attachmentLink}>附件</a>,
},
{
title: '二季度',
key: 'q2',
width: 80,
render: () => <a href="#" className={styles.attachmentLink}>附件</a>,
},
{
title: '三季度',
key: 'q3',
width: 80,
render: () => <a href="#" className={styles.attachmentLink}>附件</a>,
},
{
title: '四季度',
key: 'q4',
width: 80,
render: () => <a href="#" className={styles.attachmentLink}>附件</a>,
},
{
title: '操作',
key: 'action',
width: 100,
render: (_, record) => (
<div className={styles.actionButtons}>
<img
src={downloadicon}
alt="下载"
className={styles.downloadIcon}
title="下载"
/>
<img
src={deleteicon}
alt="删除"
className={styles.deleteIcon}
title="删除"
/>
</div>
),
},
];
// 污染治理设备异常情况的表格列定义
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) => (
<div className={styles.actionButtons}>
<img
src={downloadicon}
alt="下载"
className={styles.downloadIcon}
title="下载"
/>
<img
src={deleteicon}
alt="删除"
className={styles.deleteIcon}
title="删除"
/>
</div>
),
},
];
// 获取当前标签页的数据
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 ( return (
<div className={styles.container}> <div className={styles.dischargePermitManagement}>
<div className={styles.content}> <div className={styles.tabContainer}>
<h2>排污许可执行管理</h2> <div className={styles.tabButtons}>
<p>此页面用于展示和管理排污许可的执行情况</p> <Button
<p>此页面用于展示和管理排污许可的执行情况</p> className={`${styles.tabButton} ${activeTab === 'actual' ? styles.active : ''}`}
<p>此页面用于展示和管理排污许可的执行情况</p> onClick={() => setActiveTab('actual')}
<p>此页面用于展示和管理排污许可的执行情况</p> >
<p>此页面用于展示和管理排污许可的执行情况</p> 实际排放
<p>此页面用于展示和管理排污许可的执行情况</p> </Button>
<p>此页面用于展示和管理排污许可的执行情况</p> <Button
<p>此页面用于展示和管理排污许可的执行情况</p> className={`${styles.tabButton} ${activeTab === 'excessive' ? styles.active : ''}`}
<p>此页面用于展示和管理排污许可的执行情况</p> onClick={() => setActiveTab('excessive')}
<p>此页面用于展示和管理排污许可的执行情况</p> >
{/* 这里可以添加具体的排污许可管理表格和功能 */} 超标排放
</Button>
<Button
className={`${styles.tabButton} ${activeTab === 'equipment' ? styles.active : ''}`}
onClick={() => setActiveTab('equipment')}
>
污染治理设备异常情况
</Button>
</div>
<div className={styles.filterSection}>
<span className={styles.filterLabel}>筛选条件</span>
<Select
className={styles.filterSelect}
placeholder="请选择"
style={{ width: 120 }}
/>
<Input
className={styles.filterInput}
placeholder="请输入"
style={{ width: 200 }}
/>
<Button
type="primary"
// icon={<SearchOutlined />}
className={styles.queryBtn}
>
查询
</Button>
<Button
// icon={<RedoOutlined />}
className={styles.resetBtn}
>
重置
</Button>
<Button
// icon={<UploadOutlined />}
className={styles.uploadBtn}
>
上传
</Button>
</div>
</div>
<div className={styles.tableContent}>
<StandardTable
columns={getCurrentColumns()}
data={{
list: getCurrentData(),
pagination: pagination
}}
rowKey="key"
/>
</div> </div>
</div> </div>
); );
}; };
export default DischargePermitManagement; export default DischargePermitManagement;

@ -1,26 +1,159 @@
.container { .dischargePermitManagement {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: #fff; background-color: #fff;
padding: 20px; padding: 20px;
.content { .tabContainer {
text-align: center; display: flex;
justify-content: space-between;
h2 { align-items: center;
font-size: 24px; margin-bottom: 15px;
color: #333; padding: 0 ;
margin-bottom: 16px; // border-bottom: 1px solid #e8e8e8;
font-weight: 500;
.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%;
p { // 覆盖表头样式
font-size: 16px; :global {
color: #666; .ant-table-thead > tr > th {
margin: 0; font-weight: 400 !important;
font-size: 14px !important;
color: #333 !important;
text-align: center !important;
}
.ant-table-tbody > tr > td {
font-size: 14px;
color: #333;
text-align: center;
}
.ant-table-wrapper {
width: 100%;
max-width: 100%;
}
}
.attachmentLink {
color: #1890ff;
text-decoration: none;
font-size: 14px;
&: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);
}
}
} }
} }
} }

@ -3,11 +3,37 @@ import styles from './EnvironmentalTaskList.less';
const EnvironmentalTaskList = () => { const EnvironmentalTaskList = () => {
return ( return (
<div className={styles.container}> <div className={styles.environmentalTaskListContainer}>
<div className={styles.content}> <div className={styles.environmentalTaskListContent}>
<h2>环保管理任务清单</h2> <div className={styles.environmentalTaskListText}>
<p>此页面用于展示和管理环保相关的任务清单</p> <h2>2) 环保管理任务清单</h2>
{/* 这里可以添加具体的任务清单表格和功能 */} <p>依据排污许可证副本中的环保要求,提供生成环保管理要求任务清单;</p>
<p>环保任务清单包括:大气排放口信息,大气污染物有组织排放许可年限值,大气污染物无组织排放年限制企业大气排放总许可量;废水排放口废水污染物排放许可限制;固体废物排放信息自行贮存和自行利用/处置设施信息;工业噪声排放信息;</p>
<p>环境管理要求包括:自行检测及记录表环境管理台账记录</p>
</div>
</div>
<div className={styles.environmentalTaskListPagination}>
<div className={styles.paginationInfo}>
<span>共85条</span>
</div>
<div className={styles.paginationControls}>
<select className={styles.pageSizeSelect}>
<option value="5">5/page</option>
</select>
<div className={styles.pageNumbers}>
<button className={styles.pageButton}>&lt;</button>
<button className={styles.pageNumber}>1</button>
<span className={styles.pageEllipsis}>...</span>
<button className={styles.pageNumber}>4</button>
<button className={styles.pageNumber}>5</button>
<button className={`${styles.pageNumber} ${styles.active}`}>6</button>
<button className={styles.pageNumber}>7</button>
<button className={styles.pageNumber}>8</button>
<span className={styles.pageEllipsis}>...</span>
<button className={styles.pageNumber}>50</button>
<button className={styles.pageButton}>&gt;</button>
</div>
</div>
</div> </div>
</div> </div>
); );

@ -1,26 +1,105 @@
.container { .environmentalTaskListContainer {
width: 100%; width: 100%;
height: 100%; height: 72vh;
display: flex;
flex-direction: column;
background-color: #fff;
position: relative;
}
.environmentalTaskListContent {
flex: 1;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-color: #fff; padding: 0px 20px;
padding: 20px; }
.content { .environmentalTaskListText {
text-align: center; max-width: 800px;
text-align: left;
h2 { line-height: 1.6;
font-size: 24px;
color: #333; h2 {
margin-bottom: 16px; font-size: 20px;
font-weight: 500; color: #333;
} margin-bottom: 20px;
font-weight: 600;
p { }
font-size: 16px;
color: #666; p {
margin: 0; 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;
}

@ -3,13 +3,24 @@ 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 { SearchOutlined, RedoOutlined, CloseOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, UploadOutlined, EditOutlined, DownloadOutlined } from '@ant-design/icons';
import StandardTable from '@/components/StandardTable'; import StandardTable from '@/components/StandardTable';
import styles from './PermitStatistics.less'; import styles from './PermitStatistics.less';
import licence1 from '@/assets/business_envinformation/licence1.svg'; import licence1 from '@/assets/business_envinformation/image1.svg';
import licence2 from '@/assets/business_envinformation/licence2.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 PermitStatistics = () => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [isModalVisible, setIsModalVisible] = useState(false); const [isModalVisible, setIsModalVisible] = useState(false);
const [currentImage, setCurrentImage] = useState(null); const [currentImage, setCurrentImage] = useState(null);
const [pagination, setPagination] = useState({
current: 1,
pageSize: 10,
total: 14,
});
const [dataSource, setDataSource] = useState([ const [dataSource, setDataSource] = useState([
{ {
key: 1, key: 1,
@ -121,6 +132,50 @@ const PermitStatistics = () => {
original: '附件', original: '附件',
duplicate: '附件', 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 = [ const columns = [
@ -192,20 +247,28 @@ const PermitStatistics = () => {
align: 'center', align: 'center',
render: (_, record) => ( render: (_, record) => (
<Space size={13}> <Space size={13}>
<EyeOutlined <img
style={{ color: '#7ee370', fontSize: 16, cursor: 'pointer' }} src={viewicon}
alt="查看"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleView(record)} onClick={() => handleView(record)}
/> />
<EditOutlined <img
style={{ color: '#1890ff', fontSize: 16, cursor: 'pointer' }} src={editicon}
alt="编辑"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleEdit(record)} onClick={() => handleEdit(record)}
/> />
<DownloadOutlined <img
style={{ color: '#7ee370', fontSize: 16, cursor: 'pointer' }} src={downloadicon}
alt="下载"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleDownload(record)} onClick={() => handleDownload(record)}
/> />
<DeleteOutlined <img
style={{ color: '#ff7e72', fontSize: 16, cursor: 'pointer' }} src={deleteicon}
alt="删除"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleDelete(record)} onClick={() => handleDelete(record)}
/> />
</Space> </Space>
@ -233,6 +296,11 @@ const PermitStatistics = () => {
// TODO: 实现编辑功能 // TODO: 实现编辑功能
}; };
const handleDownload = (record) => {
console.log('下载:', record);
// TODO: 实现下载功能
};
const handleDelete = (record) => { const handleDelete = (record) => {
console.log('删除:', record); console.log('删除:', record);
// TODO: 实现删除功能 // TODO: 实现删除功能
@ -253,6 +321,17 @@ const PermitStatistics = () => {
// TODO: 实现查询功能 // 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 ( return (
<div className={styles.permitContainer}> <div className={styles.permitContainer}>
{/* 第一块:操作按钮和筛选条件 */} {/* 第一块:操作按钮和筛选条件 */}
@ -308,14 +387,15 @@ const PermitStatistics = () => {
<StandardTable <StandardTable
columns={columns} columns={columns}
data={{ data={{
list: dataSource, list: getCurrentPageData(),
pagination: { pagination: {
...pagination,
total: dataSource.length, total: dataSource.length,
pageSize: 10,
currentPage: 1,
showTotal: (total) => `${total}`, showTotal: (total) => `${total}`,
showSizeChanger: false,
} }
}} }}
onChange={handleTableChange}
/> />
</div> </div>

@ -0,0 +1,18 @@
import React from 'react';
import { Button } from 'antd';
import styles from './ProtectionFacilityMaintenance.less';
const ProtectionFacilityMaintenance = () => {
return (
<div className={styles.protectionFacilityMaintenance}>
<div className={styles.content}>
<Button type="primary" className={styles.button}>防护设施检维修管理</Button>
<div className={styles.status}>
待开发
</div>
</div>
</div>
);
};
export default ProtectionFacilityMaintenance;

@ -0,0 +1,49 @@
.protectionFacilityMaintenance {
width: 100%;
height: 100%;
background-color: #fff;
padding: 20px;
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #e8e8e8;
.title {
font-size: 18px;
font-weight: 600;
color: #333;
}
.actions {
display: flex;
gap: 12px;
align-items: center;
}
}
.content {
.placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 300px;
color: #666;
font-size: 16px;
}
.button {
margin-bottom: 20px;
}
.status {
font-size: 16px;
color: #666;
text-align: center;
}
}
}

@ -0,0 +1,802 @@
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: (
<input
type="checkbox"
checked={selectedRowKeys.length === getCurrentPageData().length && getCurrentPageData().length > 0}
onChange={(e) => handleSelectAll(e.target.checked)}
/>
),
key: 'selection',
width: 60,
align: 'center',
fixed: 'left',
render: (_, record) => (
<input
type="checkbox"
checked={selectedRowKeys.includes(record.key)}
onChange={(e) => {
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) => (
<span style={{
color: text === '异常' ? '#ff4d4f' : '#52c41a',
backgroundColor: text === '异常' ? '#FFF1F0' : '#F6FFED',
border: text === '异常' ? '1px solid #FFA39E' : '1px solid #B7EB8F',
padding: '2px 8px',
borderRadius: '4px',
display: 'inline-block'
}}>
{text}
</span>
),
},
{
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) => (
<Space size={13}>
<img
src={viewicon}
alt="查看"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleView(record)}
/>
<img
src={editicon}
alt="编辑"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleEdit(record)}
/>
<img
src={downloadicon}
alt="下载"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleDownload(record)}
/>
<img
src={deleteicon}
alt="删除"
style={{ width: 16, height: 16, cursor: 'pointer' }}
onClick={() => handleDelete(record)}
/>
</Space>
),
},
];
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 (
<div className={styles.wasteGasContainer}>
{/* 第一块:操作按钮和筛选条件 */}
<div className={styles.searchSection}>
<div className={styles.leftButtons}>
<Button
type="primary"
icon={<PlusOutlined />}
onClick={handleAdd}
className={styles.addButton}
>
新增
</Button>
<Button
// icon={<UploadOutlined />}
onClick={handleImport}
className={styles.importButton}
>
上传
</Button>
<Button
// icon={<UploadOutlined />}
onClick={() => handleBatchOperation('下载')}
className={styles.importButton}
disabled={selectedRowKeys.length === 0}
>
批量下载
</Button>
{/* <Button
onClick={() => handleBatchOperation('删除')}
className={styles.importButton}
disabled={selectedRowKeys.length === 0}
>
批量删除
</Button> */}
</div>
<div className={styles.rightControls}>
<span className={styles.filterLabel}>筛选条件</span>
<Select
placeholder="请选择"
style={{ width: 140, height: 28 }}
allowClear
className={styles.selectInput}
/>
<Input
placeholder="请输入"
style={{ width: 160, height: 28 }}
/>
<Button
onClick={handleQuery}
className={styles.queryButton}
>
查询
</Button>
<Button
onClick={handleReset}
className={styles.resetButton}
>
重置
</Button>
</div>
</div>
{/* 第二块:表格 */}
<div className={styles.tableSection}>
<StandardTable
columns={columns}
data={{
list: getCurrentPageData(),
pagination: {
...pagination,
total: dataSource.length,
showTotal: (total) => `${total}`,
showSizeChanger: false,
}
}}
onChange={handleTableChange}
/>
</div>
{/* 图片弹窗 */}
<Modal
open={isModalVisible}
onCancel={() => setIsModalVisible(false)}
footer={null}
closeIcon={<CloseOutlined style={{ color: '#fff', fontSize: 20 }} />}
width="auto"
centered
styles={{
mask: { backgroundColor: '#10101080' },
content: { padding: 0, background: 'transparent', boxShadow: 'none' }
}}
>
{currentImage && <img src={currentImage} alt="许可证" style={{ width: '100%', display: 'block' }} />}
</Modal>
</div>
);
};
export default WasteGasPollutionControl;

@ -0,0 +1,238 @@
.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;
overflow: hidden;
padding: 0 20px 0;
// 添加水平滚动条
overflow-x: auto;
overflow-y: 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;
overflow-x: auto; // 添加水平滚动
.ant-table {
flex: 1;
overflow: visible; // 改为visible让滚动条显示
margin: 0;
min-width: 3000px; // 增加最小宽度确保所有列都能显示
.ant-table-container {
overflow-x: auto;
min-width: 3000px;
}
.ant-table-content {
overflow-x: auto;
min-width: 3000px;
}
.ant-table-body {
overflow-x: auto;
min-width: 3000px;
}
}
.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;
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;
}
}
}
}

@ -0,0 +1,18 @@
import React from 'react';
import { Button } from 'antd';
import styles from './WastewaterFacilityManagement.less';
const WastewaterFacilityManagement = () => {
return (
<div className={styles.wastewaterFacilityManagement}>
<div className={styles.content}>
<Button type="primary" className={styles.button}>废水设置运行管理</Button>
<div className={styles.status}>
待开发
</div>
</div>
</div>
);
};
export default WastewaterFacilityManagement;

@ -0,0 +1,49 @@
.wastewaterFacilityManagement {
width: 100%;
height: 100%;
background-color: #fff;
padding: 20px;
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #e8e8e8;
.title {
font-size: 18px;
font-weight: 600;
color: #333;
}
.actions {
display: flex;
gap: 12px;
align-items: center;
}
}
.content {
.placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 300px;
color: #666;
font-size: 16px;
}
.button {
margin-bottom: 20px;
}
.status {
font-size: 16px;
color: #666;
text-align: center;
}
}
}
Loading…
Cancel
Save