diff --git a/src/assets/images/card/resperson.png b/src/assets/images/card/resperson.png
new file mode 100644
index 0000000..6e00602
Binary files /dev/null and b/src/assets/images/card/resperson.png differ
diff --git a/src/components/ant_override.less b/src/components/ant_override.less
index eab0edf..3e43860 100644
--- a/src/components/ant_override.less
+++ b/src/components/ant_override.less
@@ -337,6 +337,13 @@ input:-webkit-autofill:active {
color: #fff;
}
}
+ .ant-picker-cell-disabled {
+ pointer-events: none;
+ .ant-picker-cell-inner {
+ color: rgba(255, 255, 255, 0.25) !important;
+ background-color: rgba(255, 255, 255, 0.1) !important;
+ }
+ }
// Footer/Ranges
.ant-picker-footer {
diff --git a/src/service/apiurl.js b/src/service/apiurl.js
index c847038..58ec3cd 100644
--- a/src/service/apiurl.js
+++ b/src/service/apiurl.js
@@ -71,6 +71,16 @@ const apiurl = {
manageInfo: service + '/screen/mechanisms/equipment',
managePic: service + '/screen/manageHouseImg/get',
wzPage:service + '/rescue/goods/page/query'
+ },
+ qhfz: {
+ lawPage: service + '/SzRuleByLaw/page',
+ systemPage: service + '/SzRegulatoryFramework/page',
+ caseSta:service + '/szCase/statistics/1'
+ },
+ zrz: {
+ respPerson: service + '/screen/responsibility/getPerson',
+ floodPerson: service + '/screen/responsibility/getFxPerson',
+ train:service + '/screen/responsibility/getTraining'
}
}
}
diff --git a/src/utils/tools.js b/src/utils/tools.js
index e17cbf1..55be9a6 100644
--- a/src/utils/tools.js
+++ b/src/utils/tools.js
@@ -3,7 +3,7 @@ import centerOfMass from '@turf/center-of-mass';
import bbox from '@turf/bbox';
import turfLength from '@turf/length';
import along from '@turf/along';
-
+import { config } from '@/config';
const class2type = {};
const { toString } = class2type;
'Boolean Number String Function Array Date RegExp Object Error'.split(' ').forEach((name) => {
@@ -596,4 +596,17 @@ export const myFiltrate = (data,params)=>{
return query.substring(iStart);
return query.substring(iStart, iEnd);
+}
+
+export const download = (url) => {
+ let downloadLink = document.createElement("a");
+ // downloadLink.href = `${process.env.REACT_APP_API_URL}/gunshiApp/ss/personnelPlan/file/download/${params}`;
+ downloadLink.href = config.ip +url;
+ // downloadLink.download = `${params.fileName}`;
+ downloadLink.style.display = "none";
+ // 将链接添加到页面中
+ document.body.appendChild(downloadLink);
+
+ // 模拟点击事件,开始下载
+ downloadLink.click();
}
\ No newline at end of file
diff --git a/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js b/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js
index 683d2cf..25aa698 100644
--- a/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js
+++ b/src/views/Home/components/Business/SiQuan/components/ModalComponents/VideoList/index.js
@@ -6,6 +6,7 @@ import { treeList, srcData, videoList, ysyToken } from './http'
import VideoControler from "@/components/VideoCom/VideoControler"
import { httppost } from "@/utils/request"
import apiurl from "@/service/apiurl"
+import { Spin } from "antd"
const VideoList = () => {
@@ -15,6 +16,7 @@ const VideoList = () => {
const [size, setSize] = useState(1)
const [treeListData, setTreeData] = useState([])
const [selectList, setSelectList] = useState()
+ const [loading, setLoading] = useState(true)
const selectedKeys = async (list, node) => {
console.log(node, 'node');
@@ -74,18 +76,24 @@ const VideoList = () => {
}
const getTreeData = async () => {
- const res = await treeList()
- const res1 = await videoList()
- const arr = res1.data.filter(item => item.menuId).map((item, index) => {
- item.parentId = item.menuId
- item.id = 999 + index
- item.isLeaf = true
- // item.icon=
- return item
- })
- const arr1 = [...arr, ...res.data]
- console.log("before", arr1);
- setTreeData(buildTree(arr1))
+ try {
+ const res = await treeList()
+ const res1 = await videoList()
+ const arr = res1.data.filter(item => item.menuId).map((item, index) => {
+ item.parentId = item.menuId
+ item.id = 999 + index
+ item.isLeaf = true
+ // item.icon=
+ return item
+ })
+ const arr1 = [...arr, ...res.data]
+ console.log("before", arr1);
+ setTreeData(buildTree(arr1))
+ } catch (error) {
+ console.error(error)
+ } finally {
+ setLoading(false)
+ }
}
function buildTree(data, parentId = "0") {
const tree = [];
@@ -137,20 +145,28 @@ const VideoList = () => {
}, [])
return (
-
-
- {
- selectList && selectList.type == 1 ?
-
-
-
- : null
- }
-
-
+ {loading ? (
+
+
+
+ ) : (
+ <>
+
+
+ {
+ selectList && selectList.type == 1 ?
+
+
+
+ : null
+ }
+
+
+ >
+ )}
)
}
diff --git a/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js
new file mode 100644
index 0000000..9b16992
--- /dev/null
+++ b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.js
@@ -0,0 +1,212 @@
+import React, { useState,useEffect } from 'react';
+import { Image } from 'antd';
+import arrowIcon from '@/assets/images/card/arrow.png';
+import selectedBg from '@/assets/images/modal/selected.png';
+import resperson from '@/assets/images/card/resperson.png';
+import smallCard from '@/assets/images/card/smallCard.png';
+import qys from '@/assets/images/business/qys.png';
+import PdfView from '@/views/Home/components/UI/PdfView';
+import apiurl from '@/service/apiurl';
+import { httpget } from '@/utils/request';
+import { download } from '@/utils/tools';
+import './index.less';
+
+const ImplementResponsibility = () => {
+ const types = {
+ 1:"行政责任人",
+ 2:"主管部门责任人",
+ 3:"管理单位责任人",
+ 4:"巡查责任人",
+ 5:"技术责任人",
+ }
+ const [activeTab, setActiveTab] = useState('dam'); // 'dam' or 'flood'
+ const [pdfInfo, setPdfInfo] = useState({ visible: false, title: '', fileId: '' });
+ const [imagePreview, setImagePreview] = useState({ visible: false, src: '' });
+ const [respData, setRespData] = useState([])
+ const [floodData, setFloodData] = useState([])
+ const [trainData, setTrainData] = useState({})
+ const [trainFileData, setTrainFileData] = useState({})
+
+ // 获取大坝安全责任人
+ const getRespData = async () => {
+ try {
+ const { code, data } = await httpget(apiurl.sz.zrz.respPerson)
+ if (code == 200 && data.length > 0) {
+ const list = data.map(item => ({name:item.name,phone:item.contactInfo,role:types[item.type]}))
+ setRespData(list)
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+// 获取防汛安全责任人
+ const getFloodData = async () => {
+ try {
+ const { code, data } = await httpget(apiurl.sz.zrz.floodPerson)
+ if (code == 200 && data.length > 0) {
+ const list = data.map(item => ({name:item.name,phone:item.contactInfo,role:types[item.type]}))
+ setFloodData(list)
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 获取岗位培训
+ const getTrainData = async () => {
+ try {
+ const { code, data } = await httpget(apiurl.sz.zrz.train)
+ if (code == 200) {
+ setTrainData(data)
+ setTrainFileData(data?.latestPersonnelPlan?.files[0])
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+ const {trainingCount,hasTraining,hasNoTraining,totalTraining,latestPersonnelPlan} = trainData||{}
+ const trainingStats = [
+ { label: '培训计划', value: trainingCount??'-' },
+ { label: '已开展', value: hasTraining??'-' },
+ { label: '未开展', value: hasNoTraining??'-' },
+ { label: '参训总人次', value: totalTraining??'-' }
+ ];
+
+ const handleTrainingClick = () => {
+ if (!trainFileData || !trainFileData.fileName) return;
+
+ const fileName = trainFileData.fileName;
+ const fileId = trainFileData.fileId;
+ const extension = fileName.split('.').pop().toLowerCase();
+ const downloadUrl = `/gunshiApp/ss/personnelPlan/file/download/${fileId}`;
+
+ if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(extension)) {
+ setImagePreview({
+ visible: true,
+ src: downloadUrl
+ });
+ } else if (extension === 'pdf') {
+ setPdfInfo({
+ visible: true,
+ title: fileName,
+ fileId: fileId
+ });
+ } else {
+ download(downloadUrl)
+ // window.location.href = downloadUrl;
+ }
+ };
+
+ const currentPersonList = activeTab === 'dam' ? respData : floodData;
+
+ useEffect(() => {
+ if (activeTab === 'dam') {
+ getRespData()
+ } else {
+ getFloodData()
+ }
+ }, [activeTab])
+
+ useEffect(() => {
+ getTrainData()
+ }, [])
+
+
+ return (
+
+ {/* Top Tabs */}
+
+
setActiveTab('dam')}
+ style={activeTab === 'dam' ? { backgroundImage: `url(${selectedBg})` } : {}}
+ >
+ 大坝安全责任人
+
+
setActiveTab('flood')}
+ style={activeTab === 'flood' ? { backgroundImage: `url(${selectedBg})` } : {}}
+ >
+ 防汛 “三个责任人”
+
+
+
+ {/* Person List */}
+
+ {currentPersonList.map((person, index) => (
+
+

+
{person.name}
+
{person.phone}
+
+ {person.role}
+
+
+ ))}
+
+
+ {/* Job Training Section */}
+
+
+

+
岗位培训
+
+
+
+ {/* Training Stats */}
+
+ {trainingStats.map((stat, index) => (
+
+
{stat.value}
+

+
{stat.label}
+
+ ))}
+
+
+ {/* Latest Training Content */}
+
+
最新培训内容:
+
+ {trainFileData.fileName?.replace(/\.[^/.]+$/, '')}
+
+
+
+ {/* PDF Viewer */}
+ {pdfInfo.visible && (
+
setPdfInfo({ ...pdfInfo, visible: false })}
+ title={pdfInfo.title}
+ fileId={pdfInfo.fileId}
+ url="/gunshiApp/ss/personnelPlan/file/download/"
+ />
+ )}
+
+ {/* Image Preview */}
+
+ {
+ setImagePreview({ ...imagePreview, visible: value });
+ },
+ }}
+ />
+
+
+ );
+};
+
+export default ImplementResponsibility;
diff --git a/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less
new file mode 100644
index 0000000..2f02202
--- /dev/null
+++ b/src/views/Home/components/Business/SiZhi/components/ImplementResponsibility/index.less
@@ -0,0 +1,173 @@
+.implement-responsibility {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ box-sizing: border-box;
+
+ .tabs-container {
+ display: flex;
+ justify-content: space-around;
+ margin-bottom: 10px;
+
+ .tab-item {
+ flex: 1;
+ text-align: center;
+ padding: 3px 0;
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.6);
+ cursor: pointer;
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ transition: all 0.3s;
+
+ &.active {
+ color: #fff;
+ text-shadow: 0 0 10px #00a0e9;
+ }
+
+ &:hover {
+ color: #fff;
+ }
+ }
+ }
+
+ .person-list {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 10px;
+ margin-bottom: 10px;
+
+ .person-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 30%;
+
+ .avatar {
+ width: 40px;
+ height: 45px;
+ margin-bottom: 5px;
+ }
+
+ .name {
+ font-size: 14px;
+ color: #fff;
+ margin-bottom: 2px;
+ }
+
+ .phone {
+ font-size: 14px;
+ color: #fff;
+ margin-bottom: 5px;
+ }
+
+ .role-label {
+ width: 100%;
+ height: 24px;
+ line-height: 24px;
+ text-align: center;
+ color: #fff;
+ font-size: 14px;
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+ }
+
+ .section-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+
+ .title-wrapper {
+ display: flex;
+ align-items: center;
+
+ .arrow-icon {
+ width: 20px;
+ height: 18px;
+ margin-right: 8px;
+ object-fit: contain;
+ }
+
+ span {
+ font-size: 14px;
+ color: #fff;
+ text-shadow: 0 0 5px rgba(0, 160, 233, 0.5);
+ }
+ }
+ }
+
+ .training-stats {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 10px;
+ margin-bottom: 15px;
+
+ .stat-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+
+ .stat-value {
+ font-size: 18px;
+ color: #00eaff;
+ font-weight: bold;
+ margin-bottom: -5px;
+ z-index: 1;
+ }
+
+ .stat-icon {
+ width: 100px;
+ height: 60px;
+ margin-bottom: 5px;
+ }
+
+ .stat-label {
+ font-size: 14px;
+ color: rgba(255, 255, 255);
+ }
+ }
+ }
+
+ .latest-training {
+ display: flex;
+ align-items: center;
+ padding: 0 10px;
+ margin-top: auto;
+ margin-bottom: 10px;
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ .label {
+ font-size: 14px;
+ color: #fff;
+ margin-right: 10px;
+ white-space: nowrap;
+ }
+
+ .value-box {
+ flex: 1;
+ height: 30px;
+ line-height: 30px;
+ padding: 0 10px;
+ color: #00eaff;
+ font-size: 14px;
+
+ cursor: pointer;
+ text-decoration: underline;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ &:hover {
+ color: #fff;
+ }
+ }
+ }
+}
diff --git a/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js
new file mode 100644
index 0000000..395c1da
--- /dev/null
+++ b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.js
@@ -0,0 +1,362 @@
+import React, { useState,useEffect } from 'react';
+import ReactEcharts from 'echarts-for-react';
+import arrowIcon from '@/assets/images/card/arrow.png';
+import selectedBg from '@/assets/images/modal/selected.png';
+import YearSelect from '@/views/Home/components/UI/YearSelect';
+import PdfView from '@/views/Home/components/UI/PdfView';
+import { FileTextOutlined } from '@ant-design/icons';
+import apiurl from '@/service/apiurl';
+import { httppost, httpget } from '@/utils/request';
+import { Empty } from 'antd';
+import './index.less';
+import moment from 'moment';
+
+const StrengthenRuleOfLaw = () => {
+ const params = {
+ pageSo:{ pageSize: 9999, pageNumber: 1 }
+ }
+ const [activeTab, setActiveTab] = useState('laws');
+ const [lawData, setLawData] = useState([]);
+ const [systemData, setSystemData] = useState([]);
+ const [year, setYear] = useState(moment().format('YYYY'));
+ const [pdfInfo, setPdfInfo] = useState({ visible: false, title: '', fileId: '' });
+
+ // 获取法律法规文件
+ const lawsFiles = async () => {
+ try {
+ const { code, data } = await httppost(apiurl.sz.qhfz.lawPage, params)
+ if (code == 200) {
+ const list = data?.records.map(item => {
+ if (item?.files?.length === 0) {
+ return []
+ }
+ return { name: item?.files[0]?.fileName?.replace(/\.pdf$/i, ''), fileId: item?.files[0]?.fileId }
+ }).flat()
+ setLawData(list)
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ // 获取系统文件
+ const systemFiles = async () => {
+ try {
+ const { code, data } = await httppost(apiurl.sz.qhfz.systemPage, params)
+ if (code == 200) {
+ const list = data?.records.map(item => {
+ if (item?.files?.length === 0) {
+ return []
+ }
+ return { name: item?.files[0]?.fileName?.replace(/\.pdf$/i, ''), fileId: item?.files[0]?.fileId }
+ }).flat()
+
+ setSystemData(list)
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ const [chartData, setChartData] = useState([]);
+ const [selectedPieItem, setSelectedPieItem] = useState(null);
+ const [startAngle, setStartAngle] = useState(90);
+
+ const typeMapping = {
+ 0: { name: '违建', color: '#1890ff' },
+ 1: { name: '毁林垦荒', color: '#00eaff' },
+ 2: { name: '筑坝拦汊', color: '#3155fb' },
+ 3: { name: '填占库容', color: '#bcebf7' },
+ 4: { name: '违法取水', color: '#00d085' },
+ 5: { name: '其他', color: '#1890ff' },
+ };
+
+ // 获取水政执法数据 0:违建,1:毀林垦荒,2:筑坝拦汊,3:填占库容,4:违法取水,5:其他
+ const caseList = async (params) => {
+ try {
+ const { code, data } = await httppost(apiurl.sz.qhfz.caseSta, params)
+ if (code == 200) {
+ if (!data || data.length === 0) {
+ setChartData([]);
+ return;
+ }
+
+ const newChartData = data.map(item => {
+ const typeInfo = typeMapping[item.type] || { name: '未知', color: '#ccc' };
+ return {
+ name: typeInfo.name,
+ value: item.count,
+ color: typeInfo.color
+ };
+ });
+ setChartData(newChartData);
+ }
+ } catch (error) {
+ console.log(error);
+ }
+ }
+
+ const total = chartData.reduce((acc, cur) => acc + cur.value, 0);
+
+ const getOption = () => {
+ let centerName = '案件总数';
+ let centerValue = total;
+ let centerPercent = '100%';
+
+ if (selectedPieItem) {
+ centerName = selectedPieItem.name;
+ centerValue = selectedPieItem.value;
+ centerPercent = selectedPieItem.percent;
+ } else if (chartData.length === 1) {
+ centerName = chartData[0].name;
+ }
+
+ return {
+ tooltip: {
+ trigger: 'item',
+ formatter: '{b}: {c} ({d}%)'
+ },
+ series: [
+ {
+ name: '水政执法-外圈',
+ type: 'pie',
+ radius: ['48%', '82%'],
+ center: ['34%', '50%'],
+ startAngle: startAngle,
+ avoidLabelOverlap: false,
+ label: {
+ show: true,
+ position: 'inside',
+ formatter: '{b}',
+ color: '#fff',
+ fontSize: 10
+ },
+ itemStyle: {
+ opacity: 0.4
+ },
+ data: chartData.map(item => ({
+ value: item.value,
+ name: item.name,
+ itemStyle: { color: item.color }
+ }))
+ },
+ {
+ name: '水政执法-内圈',
+ type: 'pie',
+ radius: ['50%', '56%'],
+ center: ['34%', '50%'],
+ startAngle: startAngle,
+ avoidLabelOverlap: false,
+ label: {
+ show: true,
+ position: 'center',
+ formatter: () => `{name|${centerName}}\n{value|${centerValue}}\n{percent|${centerPercent}}`,
+ rich: {
+ name: {
+ fontSize: 12,
+ color: 'rgba(255,255,255,0.6)',
+ lineHeight: 16
+ },
+ value: {
+ fontSize: 14,
+ color: '#fff',
+ fontWeight: 'bold',
+ lineHeight: 20
+ },
+ percent: {
+ fontSize: 12,
+ color: '#fff',
+ lineHeight: 16
+ }
+ }
+ },
+ emphasis: {
+ label: {
+ show: true,
+ fontSize: '14',
+ fontWeight: 'bold'
+ }
+ },
+ labelLine: {
+ show: false
+ },
+ data: chartData.map(item => ({
+ value: item.value,
+ name: item.name,
+ itemStyle: { color: item.color }
+ }))
+ }
+ ]
+ }};
+
+ const onChartClick = (params) => {
+ if (params.componentType !== 'series') return;
+
+ const { name, value, dataIndex } = params;
+
+ // Toggle selection
+ if (selectedPieItem && selectedPieItem.name === name) {
+ setSelectedPieItem(null);
+ setStartAngle(90);
+ return;
+ }
+
+ let sumBefore = 0;
+ for (let i = 0; i < dataIndex; i++) {
+ sumBefore += chartData[i].value;
+ }
+
+ const offset = (sumBefore + value / 2) / total * 360;
+ const newStartAngle = 90 + offset;
+
+ setStartAngle(newStartAngle);
+ setSelectedPieItem({
+ name,
+ value,
+ percent: ((value / total) * 100).toFixed(0) + '%'
+ });
+ };
+
+ const handleItemClick = (item) => {
+ setPdfInfo({
+ visible: true,
+ title: item.name,
+ fileId: item.fileId
+ });
+ };
+
+ useEffect(() => {
+ if (chartData && chartData.length > 0) {
+ const totalVal = chartData.reduce((acc, cur) => acc + cur.value, 0);
+ const firstItem = chartData[0];
+ const value = firstItem.value;
+
+ const offset = (value / 2) / totalVal * 360;
+ const newStartAngle = 90 + offset;
+
+ setStartAngle(newStartAngle);
+ setSelectedPieItem({
+ name: firstItem.name,
+ value: value,
+ percent: ((value / totalVal) * 100).toFixed(0) + '%'
+ });
+ } else {
+ setSelectedPieItem(null);
+ setStartAngle(90);
+ }
+ }, [chartData]);
+
+ useEffect(() => {
+ if (activeTab == 'laws') {
+ lawsFiles()
+ } else {
+ systemFiles()
+ }
+ }, [activeTab])
+ useEffect(() => {
+ if (year) {
+ const params = {
+ stm: moment(year).format('YYYY-01-01 00:00:00'),
+ etm: moment(year).format('YYYY-12-31 23:59:59'),
+ }
+ caseList(params)
+ }
+ }, [year])
+ return (
+
+ {/* Top Tabs */}
+
+
setActiveTab('laws')}
+ style={activeTab === 'laws' ? { backgroundImage: `url(${selectedBg})` } : {}}
+ >
+ 法律法规
+
+
setActiveTab('system')}
+ style={activeTab === 'system' ? { backgroundImage: `url(${selectedBg})` } : {}}
+ >
+ 制度管理
+
+
+
+ {/* List Content */}
+
+ {(activeTab === 'laws' ? lawData : systemData).length > 0 ? (
+ (activeTab === 'laws' ? lawData : systemData).map((item, index) => (
+
handleItemClick(item)}>
+
+
+
+
{item.name}
+
+ ))
+ ) : (
+
+ 暂无数据} />
+
+ )}
+
+
+ {/* Water Administration Law Enforcement */}
+
+
+
+

+
水政执法
+
+
+
+
+
+ {chartData.length > 0 ? (
+ <>
+
+
+
+
+ {chartData.map((item, index) => (
+
+
+ {item.name}
+ {item.value}
+
+ ))}
+
+ >
+ ) : (
+
+ 暂无数据} />
+
+ )}
+
+
+
+ {/* PDF Viewer */}
+ {pdfInfo.visible && (
+
setPdfInfo({ ...pdfInfo, visible: false })}
+ title={pdfInfo.title}
+ fileId={pdfInfo.fileId}
+ url="/gunshiApp/ss/projectEvents/file/download/"
+ />
+ )}
+
+ );
+};
+
+export default StrengthenRuleOfLaw;
diff --git a/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less
new file mode 100644
index 0000000..17e01c9
--- /dev/null
+++ b/src/views/Home/components/Business/SiZhi/components/StrengthenRuleOfLaw/index.less
@@ -0,0 +1,148 @@
+.strengthen-rule-of-law {
+ width: 100%;
+ height: 100%;
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+
+ .tabs-container {
+ display: flex;
+ justify-content: space-between;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+
+ .tab-item {
+ flex: 1;
+ text-align: center;
+ padding: 3px 0;
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.6);
+ cursor: pointer;
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+ transition: all 0.3s;
+
+ &.active {
+ color: #fff;
+ text-shadow: 0 0 10px #00a0e9;
+ }
+
+ &:hover {
+ color: #fff;
+ }
+ }
+ }
+
+ .list-content {
+ flex: 1;
+ overflow-y: auto;
+ margin-bottom: 15px;
+ max-height: 120px; /* Limit height to show scroll if needed, though items are few */
+
+ .list-item {
+ display: flex;
+ align-items: center;
+ padding: 8px 0;
+ cursor: pointer;
+ transition: background-color 0.3s;
+
+ &:hover {
+ background-color: rgba(255, 255, 255, 0.05);
+ .text {
+ color: #00a0e9;
+ text-decoration: underline;
+ }
+ }
+
+ .icon-wrapper {
+ width: 24px;
+ height: 24px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 10px;
+ background: rgba(24, 144, 255, 0.1);
+ border-radius: 4px;
+ }
+
+ .text {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.9);
+ }
+ }
+ }
+
+ .enforcement-section {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+
+ .section-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+
+ .title-wrapper {
+ display: flex;
+ align-items: center;
+
+ .arrow-icon {
+ width: 20px;
+ height: 18px;
+ margin-right: 8px;
+ object-fit: contain;
+ }
+
+ span {
+ font-size: 14px;
+ color: #fff;
+ text-shadow: 0 0 5px rgba(0, 160, 233, 0.5);
+ }
+ }
+ }
+
+ .chart-legend-container {
+ flex: 1;
+ display: flex;
+ align-items: center;
+
+ .chart-wrapper {
+ flex: 1;
+ height: 100%;
+ min-height: 140px;
+ }
+
+ .legend-wrapper {
+ width: 140px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ padding-left: 10px;
+
+ .legend-item {
+ display: flex;
+ align-items: center;
+ margin-bottom: 6px;
+ font-size: 12px;
+
+ .color-dot {
+ width: 8px;
+ height: 8px;
+ margin-right: 8px;
+ border-radius: 2px;
+ }
+
+ .name {
+ flex: 1;
+ color: rgba(255, 255, 255, 0.8);
+ }
+
+ .value {
+ color: #fff;
+ font-weight: bold;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/views/Home/components/Business/SiZhi/index.js b/src/views/Home/components/Business/SiZhi/index.js
index 2a391ce..5802b82 100644
--- a/src/views/Home/components/Business/SiZhi/index.js
+++ b/src/views/Home/components/Business/SiZhi/index.js
@@ -2,6 +2,8 @@ import React, { useState, useEffect } from 'react';
import CommonCard from '../../UI/CommonCard';
import PerfectSystem from './components/PerfectSystem';
import SoundMechanism from './components/SoundMechanism';
+import StrengthenRuleOfLaw from './components/StrengthenRuleOfLaw';
+import ImplementResponsibility from './components/ImplementResponsibility';
import { httppost } from '@/utils/request';
import apiurl from '@/service/apiurl';
import './index.less';
@@ -36,10 +38,10 @@ const SiZhi = () => {
diff --git a/src/views/Home/components/UI/PdfView/index.js b/src/views/Home/components/UI/PdfView/index.js
index d17ba7d..4c98805 100644
--- a/src/views/Home/components/UI/PdfView/index.js
+++ b/src/views/Home/components/UI/PdfView/index.js
@@ -7,7 +7,7 @@ const PdfView = ({ visible, title, onClose, url, fileId }) => {
return (
{
onChange(dateString);
}
};
+ const disabledDate = (current) => {
+ return current && current > moment().endOf('day');
+};
return (