);
};
diff --git a/src/pages/business_environmental_activities/components/ActivityManagement.less b/src/pages/business_environmental_activities/components/ActivityManagement.less
index 95c7170..83aae31 100644
--- a/src/pages/business_environmental_activities/components/ActivityManagement.less
+++ b/src/pages/business_environmental_activities/components/ActivityManagement.less
@@ -1,8 +1,193 @@
-.placeholder {
+.container {
+ background: #f6f8fb;
+ border-radius: 10px;
+ padding: 14px 16px 16px;
+ height: 100%;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+
+.createButton {
+ background: linear-gradient(98deg, #12d49c 0%, #0ec9c9 100%);
+ border: none;
+ border-radius: 8px;
+ padding: 6px 16px;
+ height: 34px;
+ box-shadow: 0 6px 14px rgba(18, 212, 156, 0.25);
+
+ &:hover,
+ &:focus {
+ background: linear-gradient(98deg, #0fcf94 0%, #0cbcbc 100%);
+ }
+}
+
+.filters {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+}
+
+.filterGroup {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color: #666;
+ font-size: 13px;
+}
+
+.filterLabel {
+ color: #888;
+ min-width: 64px;
+ text-align: right;
+}
+
+.statusGroup {
+ :global(.ant-checkbox-wrapper) {
+ margin-right: 10px;
+ }
+
+ :global(.ant-checkbox-inner) {
+ border-radius: 4px;
+ }
+}
+
+.creatorSelect {
+ width: 120px;
+
+ :global(.ant-select-selector) {
+ border-radius: 6px !important;
+ height: 34px;
+ box-shadow: none !important;
+ }
+}
+
+.grid {
+ flex: 1;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
+ gap: 12px;
+ overflow-y: auto;
+ padding-right: 4px;
+}
+
+.card {
+ position: relative;
background: #fff;
- border-radius: 4px;
- padding: 24px;
- min-height: 72vh;
+ border: 1px solid #eef2f7;
+ border-radius: 10px;
+ box-shadow: 0 6px 14px rgba(0, 0, 0, 0.04);
+ display: flex;
+ flex-direction: column;
+ height: 214px;
+ overflow: hidden;
+}
+
+.ribbon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ color: #fff;
+ font-size: 12px;
+ padding: 8px 14px;
+ transform: translate(26px, -6px) rotate(45deg);
+ width: 92px;
+ text-align: center;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12);
+}
+
+.cardBody {
+ padding: 16px 16px 8px;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.titleRow {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.title {
font-size: 16px;
+ font-weight: 600;
+ color: #333;
+}
+
+.metaRow {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
color: #666;
+ font-size: 13px;
+
+ &:last-of-type {
+ grid-template-columns: 1fr;
+ }
+}
+
+.emphasis {
+ color: #333;
+ font-weight: 600;
+ margin-left: 6px;
+}
+
+.muted {
+ color: #999;
+ margin-left: 6px;
+}
+
+.files {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(86px, 1fr));
+ gap: 8px;
+}
+
+.fileChip {
+ background: #f6f8fb;
+ border-radius: 8px;
+ padding: 8px 10px;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ color: #4a5560;
+ font-size: 12px;
+}
+
+.actions {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ align-items: center;
+ border-top: 1px solid #f0f2f5;
+ background: #fbfbfb;
+}
+
+.actions :global(.ant-btn) {
+ border: none;
+ height: 44px;
+ border-radius: 0;
+ box-shadow: none;
+ font-size: 14px;
+}
+
+.view {
+ color: #14b981;
+}
+
+.copy {
+ color: #3e7aff;
+}
+
+.archive {
+ color: #999;
}
diff --git a/src/pages/business_environmental_activities/components/EventReport.js b/src/pages/business_environmental_activities/components/EventReport.js
index 9f83e63..1fe472f 100644
--- a/src/pages/business_environmental_activities/components/EventReport.js
+++ b/src/pages/business_environmental_activities/components/EventReport.js
@@ -1,10 +1,157 @@
-import React from 'react';
+import React, { useMemo, useState } from 'react';
+import { Button, Checkbox, Select } from 'antd';
+import {
+ PlusOutlined,
+} from '@ant-design/icons';
import styles from './EventReport.less';
+const statusMeta = {
+ pending: { label: '待处理', ribbon: '#12c48b', action: '立案', actionColor: '#12c48b' },
+ awaiting: { label: '待接收', ribbon: '#fa8c16', action: '催办', actionColor: '#fa8c16' },
+ processing: { label: '处理中', ribbon: '#8aa4beff', action: '不予立案', actionColor: '#3b9cff' },
+ finished: { label: '已结束', ribbon: '#9a7bff', action: '查看报告', actionColor: '#3b82f6' },
+};
+
+const stats = [
+ { title: '事件总数', value: 163, time: '2025-09-11 07:35' },
+ { title: '待处理', value: 13, time: '2025-09-11 07:35' },
+ { title: '处理中', value: 13, time: '2025-09-11 07:35' },
+ { title: '待接收', value: 63, time: '2025-09-11 07:35' },
+ { title: '已结束', value: 16, time: '2025-09-11 07:35' },
+];
+
+const events = [
+ {
+ id: 'e1',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'pending',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+ {
+ id: 'e2',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'awaiting',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+ {
+ id: 'e3',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'finished',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+ {
+ id: 'e4',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'pending',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+ {
+ id: 'e5',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'awaiting',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+ {
+ id: 'e6',
+ code: 'EVT-006 废水排放异常 (06-05)',
+ status: 'finished',
+ reporter: '98',
+ assignTo: 'xxxxxxxxxx',
+ response: 'xxxxxxxxxx',
+ description: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
+ },
+];
+
const EventReport = () => {
+ const [selectedStatuses, setSelectedStatuses] = useState(Object.keys(statusMeta));
+ const [reporterFilter, setReporterFilter] = useState('全部');
+
+ const statusOptions = useMemo(
+ () => Object.keys(statusMeta).map((key) => ({ label: statusMeta[key].label, value: key })),
+ []
+ );
+
+ const filteredEvents = useMemo(
+ () => events.filter((item) => selectedStatuses.includes(item.status)),
+ [selectedStatuses]
+ );
+
return (
-
- 事件上报 待开发
+
+
+ {stats.map((item) => (
+
+
{item.title}
+
{item.value}
+
{item.time}
+
+ ))}
+
+
+
+
} className={styles.reportButton}>
+ 上报事件
+
+
+
事件状态
+
+
+ 举报类型
+
+
+
+
+
+ {filteredEvents.map((item) => {
+ const meta = statusMeta[item.status];
+ return (
+
+
+ {meta.label}
+
+
+ {item.code}
+
+
+
事件地点 {item.reporter} 报警时间 2025-02-05
+
报警人 {item.assignTo}
+
报警方式 {item.response}
+
事件描述 {item.description}
+
+
+
+
+
+
+ );
+ })}
+
);
};
diff --git a/src/pages/business_environmental_activities/components/EventReport.less b/src/pages/business_environmental_activities/components/EventReport.less
index 95c7170..93ee3a8 100644
--- a/src/pages/business_environmental_activities/components/EventReport.less
+++ b/src/pages/business_environmental_activities/components/EventReport.less
@@ -1,8 +1,192 @@
-.placeholder {
+
+.container {
+ background: #f6f8fb;
+ border-radius: 10px;
+ padding: 14px 14px 18px;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ min-height: 100%;
+}
+
+.statsRow {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 12px;
+}
+
+.statCard {
+ background: #fff;
+ border-radius: 10px;
+ padding: 12px 16px;
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05);
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.statTitle {
+ color: #6c7681;
+ font-size: 12px;
+}
+
+.statValue {
+ font-size: 28px;
+ font-weight: 700;
+ color: #222;
+}
+
+.statTime {
+ color: #9fa6ad;
+ font-size: 12px;
+}
+
+.filterRow {
background: #fff;
- border-radius: 4px;
- padding: 24px;
- min-height: 72vh;
- font-size: 16px;
+ border-radius: 10px;
+ padding: 10px 12px;
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.04);
+}
+
+.reportButton {
+ background: linear-gradient(98deg, #12d49c 0%, #0ec9c9 100%);
+ border: none;
+ border-radius: 8px;
+ padding: 0 16px;
+ height: 34px;
+ box-shadow: 0 6px 14px rgba(18, 212, 156, 0.25);
+}
+
+.filters {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 10px 14px;
+}
+
+.filterTitle {
color: #666;
+ font-size: 13px;
+ margin-right: 6px;
+}
+
+.statusGroup {
+ :global(.ant-checkbox-wrapper) {
+ margin-right: 12px;
+ font-size: 13px;
+ color: #555;
+ }
+
+ :global(.ant-checkbox-inner) {
+ border-radius: 4px;
+ }
+}
+
+.rightFilters {
+ margin-left: auto;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.filterLabel {
+ color: #888;
+ font-size: 13px;
+}
+
+.select {
+ width: 120px;
+
+ :global(.ant-select-selector) {
+ border-radius: 6px !important;
+ height: 34px;
+ box-shadow: none !important;
+ }
+}
+
+.grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+}
+
+.card {
+ position: relative;
+ background: #fff;
+ border-radius: 10px;
+ border: 1px solid #eef1f6;
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.04);
+ overflow: hidden;
+ min-height: 170px;
+ display: flex;
+ flex-direction: column;
+}
+
+.ribbon {
+ position: absolute;
+ top: 0;
+ right: 0;
+ color: #fff;
+ font-size: 12px;
+ padding: 8px 14px;
+ transform: translate(26px, -6px) rotate(45deg);
+ width: 92px;
+ text-align: center;
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12);
+}
+
+.cardHeader {
+ padding: 14px 16px 6px;
+}
+
+.cardTitle {
+ font-size: 14px;
+ font-weight: 600;
+ color: #333;
+}
+
+.cardBody {
+ padding: 0 16px 10px;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ color: #555;
+ font-size: 12px;
+}
+
+.row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.emphasis {
+ color: #12c48b;
+ font-weight: 600;
+}
+
+.muted {
+ color: #888;
+}
+
+.description {
+ color: #555;
+}
+
+.cardFooter {
+ margin-top: auto;
+ border-top: 1px solid #f0f2f5;
+ padding: 8px 12px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.secondaryAction {
+ color: #3e7aff;
}
diff --git a/src/pages/business_environmental_activities/components/StatisticsAnalysis.js b/src/pages/business_environmental_activities/components/StatisticsAnalysis.js
index 19a39bd..fd72fca 100644
--- a/src/pages/business_environmental_activities/components/StatisticsAnalysis.js
+++ b/src/pages/business_environmental_activities/components/StatisticsAnalysis.js
@@ -1,10 +1,175 @@
-import React from 'react';
+import React, { useMemo } from 'react';
+import { Button, Checkbox, Select } from 'antd';
+import ReactECharts from 'echarts-for-react';
import styles from './StatisticsAnalysis.less';
+const statusOptions = [
+ { label: '环保活动', value: 'env' },
+ { label: '环保事件', value: 'event' },
+ { label: '环保事件', value: 'incident' },
+];
+
const StatisticsAnalysis = () => {
+ const activityTypeOption = useMemo(
+ () => ({
+ color: ['#6abdfc', '#a585ff', '#fa8c16', '#ff6b6b'],
+ tooltip: { trigger: 'item' },
+ legend: { orient: 'vertical', left: '70%' },
+ series: [
+ {
+ type: 'pie',
+ radius: ['30%', '60%'],
+ center: ['35%', '50%'],
+ label: { formatter: '{b}: {d}%' },
+ data: [
+ { value: 30, name: '培训' },
+ { value: 15, name: '演练' },
+ { value: 10, name: '其他' },
+ { value: 45, name: '宣传' },
+ ],
+ },
+ ],
+ }),
+ []
+ );
+
+ const participationOption = useMemo(
+ () => ({
+ color: ['#6ee7d8', '#8fd0ff'],
+ tooltip: { trigger: 'axis' },
+ grid: { left: 80, right: 30, top: 30, bottom: 30 },
+ xAxis: {
+ type: 'value',
+ boundaryGap: [0, 0.1],
+ axisLine: { lineStyle: { color: '#d8dfe6' } },
+ },
+ yAxis: {
+ type: 'category',
+ data: ['xxx部门', 'xxx部门', 'xxx部门', 'xxx部门', 'xxx部门', 'xxx部门'],
+ axisLine: { lineStyle: { color: '#d8dfe6' } },
+ },
+ series: [
+ {
+ name: '参与率',
+ type: 'bar',
+ barWidth: 16,
+ data: [92, 88, 74, 56, 48, 30],
+ label: { show: false },
+ },
+ ],
+ }),
+ []
+ );
+
+ const incidentTypeOption = useMemo(
+ () => ({
+ color: ['#4b7bff', '#5fd6f1', '#2fd192', '#ff9f7f', '#e85d8b', '#5e6ce6'],
+ tooltip: { trigger: 'item' },
+ legend: { orient: 'vertical', right: 10, top: 'middle' },
+ series: [
+ {
+ type: 'pie',
+ radius: ['40%', '65%'],
+ center: ['40%', '50%'],
+ label: { formatter: '{b} {d}%' },
+ data: [
+ { value: 45, name: 'xxx2' },
+ { value: 10, name: 'xxx3' },
+ { value: 9, name: 'xxx5' },
+ { value: 13, name: 'xxx4' },
+ { value: 15, name: 'xxx3' },
+ { value: 8, name: 'xxx6' },
+ ],
+ },
+ ],
+ }),
+ []
+ );
+
+ const trendOption = useMemo(
+ () => ({
+ color: ['#6abdfc', '#f7a35c'],
+ tooltip: { trigger: 'axis' },
+ grid: { left: 50, right: 50, top: 30, bottom: 40 },
+ xAxis: [{ type: 'category', data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'] }],
+ yAxis: [
+ { type: 'value', name: '活动数', axisLine: { lineStyle: { color: '#d8dfe6' } } },
+ { type: 'value', name: '参与率', axisLine: { lineStyle: { color: '#d8dfe6' } } },
+ ],
+ series: [
+ {
+ name: '活动数',
+ type: 'bar',
+ data: [8, 18, 12, 10, 13, 9, 11, 10, 12, 16, 9, 14],
+ barWidth: 14,
+ },
+ {
+ name: '参与率',
+ type: 'line',
+ yAxisIndex: 1,
+ data: [55, 60, 58, 63, 60, 62, 65, 63, 64, 68, 66, 70],
+ smooth: true,
+ },
+ ],
+ }),
+ []
+ );
+
+ const departmentOption = useMemo(
+ () => ({
+ color: ['#6abdfc', '#63e2b7'],
+ tooltip: { trigger: 'axis' },
+ legend: { top: 0 },
+ grid: { left: 50, right: 20, top: 40, bottom: 30 },
+ xAxis: [{ type: 'category', data: ['生产部', '运营部', '安全部', '后勤部', '质检部', '供应部'] }],
+ yAxis: [{ type: 'value' }],
+ series: [
+ { name: '事件总数', type: 'bar', barWidth: 12, data: [35, 22, 28, 18, 20, 25] },
+ { name: '处置完成', type: 'bar', barWidth: 12, data: [28, 18, 20, 14, 16, 19] },
+ ],
+ }),
+ []
+ );
+
return (
-
- 统计分析 待开发
+
+
+
+
+ 事件状态
+ item.value)} />
+ 统计周期
+
+ 对比周期
+
+
+
+
+
+
+
);
};
diff --git a/src/pages/business_environmental_activities/components/StatisticsAnalysis.less b/src/pages/business_environmental_activities/components/StatisticsAnalysis.less
index 95c7170..9774599 100644
--- a/src/pages/business_environmental_activities/components/StatisticsAnalysis.less
+++ b/src/pages/business_environmental_activities/components/StatisticsAnalysis.less
@@ -1,8 +1,72 @@
-.placeholder {
+.container {
+ background: #f6f8fb;
+ border-radius: 10px;
+ padding: 14px 14px 18px;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ min-height: 100%;
+}
+
+.toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
background: #fff;
- border-radius: 4px;
- padding: 24px;
- min-height: 72vh;
- font-size: 16px;
+ border-radius: 10px;
+ padding: 10px 12px;
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.04);
+}
+
+.toolbarFilters {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+}
+
+.filterLabel {
color: #666;
+ font-size: 13px;
+}
+
+.select {
+ width: 120px;
+
+ :global(.ant-select-selector) {
+ border-radius: 6px !important;
+ height: 34px;
+ box-shadow: none !important;
+ }
+}
+
+.rowThree {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+}
+
+.rowTwo {
+ display: grid;
+ grid-template-columns: 2fr 1fr;
+ gap: 12px;
+}
+
+.card,
+.cardWide {
+ background: #fff;
+ border-radius: 10px;
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.04);
+ padding: 10px 12px 6px;
+ display: flex;
+ flex-direction: column;
+}
+
+.cardTitle {
+ font-size: 14px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 4px;
}