对接关于我们 ,正则法规,帮助中心 ,用户提问模块

This commit is contained in:
linxd
2025-06-18 20:14:11 +08:00
parent e8804d6140
commit 8176a9b3d0
32 changed files with 2094 additions and 506 deletions

View File

@ -1,66 +1,14 @@
import React, { useState, useEffect } from 'react';
import { Table, Typography } from 'antd';
import { history } from 'umi';
import { Table, Typography, message, ConfigProvider } from 'antd';
import { history, useIntl, formatMessage } from 'umi';
import styles from './policy.less';
import { getRegulationsList, RegulationsRecord } from '@/servers/api/policy';
const { Title } = Typography;
// 模拟政策法规数据
const mockPolicyData = [
{
id: '1',
title: '关于进一步规范招标采购活动的管理办法',
publishDate: '2023-08-15',
},
{
id: '2',
title: '中远海运集团供应商管理实施细则(2023年修订版)',
publishDate: '2023-07-20',
},
{
id: '3',
title: '关于加强采购合同履约管理的通知',
publishDate: '2023-06-10',
},
{
id: '4',
title: '中远海运集团招标采购管理办法',
publishDate: '2023-05-25',
},
{
id: '5',
title: '关于优化招标采购流程提高采购效率的实施意见',
publishDate: '2023-04-18',
},
{
id: '6',
title: '中远海运集团电子招标采购平台操作指南',
publishDate: '2023-03-30',
},
{
id: '7',
title: '关于进一步加强采购风险防控的指导意见',
publishDate: '2023-02-15',
},
{
id: '8',
title: '中远海运集团采购评审专家管理办法',
publishDate: '2023-01-10',
},
{
id: '9',
title: '关于推进绿色采购的实施方案',
publishDate: '2022-12-20',
},
{
id: '10',
title: '中远海运集团采购人员职业道德规范',
publishDate: '2022-11-05',
},
];
const PolicyPage: React.FC = () => {
const [policyData, setPolicyData] = useState<any[]>([]);
const intl = useIntl();
const [policyData, setPolicyData] = useState<RegulationsRecord[]>([]);
const [loading, setLoading] = useState<boolean>(true);
const [pagination, setPagination] = useState({
current: 1,
@ -68,33 +16,56 @@ const PolicyPage: React.FC = () => {
total: 0,
});
// 模拟获取政策法规数据
useEffect(() => {
// 实际项目中应该通过API获取数据
setTimeout(() => {
setPolicyData(mockPolicyData);
setPagination((prevPagination) => ({
...prevPagination,
total: mockPolicyData.length,
}));
// 获取政策法规数据
const fetchPolicyData = async (pageNo: number = 1, pageSize: number = 10) => {
setLoading(true);
try {
const response = await getRegulationsList({
basePageRequest: {
pageNo,
pageSize,
}
});
if (response.success) {
setPolicyData(response.data.records || []);
setPagination({
current: response.data.current,
pageSize: response.data.size,
total: response.data.total,
});
} else {
message.error(response.message || intl.formatMessage({ id: 'policy.message.getListFailed' }));
}
} catch (error) {
console.error('获取政策法规列表出错:', error);
message.error(intl.formatMessage({ id: 'policy.message.getListFailed' }));
} finally {
setLoading(false);
}, 500);
}
};
useEffect(() => {
fetchPolicyData();
}, []);
// 处理表格分页变化
const handleTableChange = (newPagination: any) => {
fetchPolicyData(newPagination.current, newPagination.pageSize);
setPagination(newPagination);
};
// 处理点击政策标题
const handlePolicyClick = (id: string) => {
history.push(`/policy/policyInfo?id=${id}`);
const handlePolicyClick = (id: string | undefined) => {
if (id) {
history.push(`/policy/policyInfo?id=${id}`);
}
};
// 定义表格列
const columns = [
{
title: '序号',
title: intl.formatMessage({ id: 'policy.list.column.index' }),
dataIndex: 'index',
key: 'index',
width: 80,
@ -103,20 +74,20 @@ const PolicyPage: React.FC = () => {
},
},
{
title: '标题',
title: intl.formatMessage({ id: 'policy.list.column.title' }),
dataIndex: 'title',
key: 'title',
render: (text: string, record: any) => (
render: (text: string, record: RegulationsRecord) => (
<a onClick={() => handlePolicyClick(record.id)} className={styles.policyTitle}>
{text}
</a>
),
},
{
title: '发布时间',
dataIndex: 'publishDate',
key: 'publishDate',
width: 150,
title: intl.formatMessage({ id: 'policy.list.column.publishTime' }),
dataIndex: 'createTime',
key: 'createTime',
width: 250,
align: 'center' as 'center',
},
];
@ -124,20 +95,29 @@ const PolicyPage: React.FC = () => {
return (
<div className={styles.policyContainer}>
<div className={styles.policyTable}>
<Table
columns={columns}
dataSource={policyData}
rowKey="id"
pagination={{
...pagination,
showTotal: (total) => `${total} 条记录`,
showSizeChanger: true,
showQuickJumper: true,
}}
loading={loading}
onChange={handleTableChange}
bordered
/>
<ConfigProvider
renderEmpty={() => (
<div className={styles.emptyData}>{intl.formatMessage({ id: 'policy.list.empty' })}</div>
)}
>
<Table
columns={columns}
dataSource={policyData}
rowKey="id"
pagination={{
...pagination,
showTotal: (total) => intl.formatMessage(
{ id: 'policy.list.total' },
{ total }
),
showSizeChanger: true,
showQuickJumper: true,
}}
loading={loading}
onChange={handleTableChange}
bordered
/>
</ConfigProvider>
</div>
</div>
);

View File

@ -1,8 +1,9 @@
import React, { useState, useEffect } from 'react';
import { useLocation } from 'umi';
import { useLocation, history, useIntl } from 'umi';
import { Typography, Button, Space, Divider, Row, Col, Spin, message } from 'antd';
import { DownloadOutlined, ArrowLeftOutlined, FilePdfOutlined, FileWordOutlined, FileExcelOutlined } from '@ant-design/icons';
import styles from './policyInfo.less';
import { getRegulationsInfo, RegulationsRecord } from '@/servers/api/policy';
const { Title, Text } = Typography;
@ -167,28 +168,43 @@ const mockPolicyDetails: PolicyDetails = {
};
const PolicyInfo: React.FC = () => {
const intl = useIntl();
const location = useLocation();
const id = new URLSearchParams(location.search).get("id");
const [policyDetail, setPolicyDetail] = useState<PolicyDetail | null>(null);
const [policyDetail, setPolicyDetail] = useState<RegulationsRecord | null>(null);
const [loading, setLoading] = useState<boolean>(true);
// 模拟获取政策法规详情数据
// 获取政策法规详情数据
useEffect(() => {
// 实际项目中应该通过API获取数据
setTimeout(() => {
if (id && mockPolicyDetails[id]) {
setPolicyDetail(mockPolicyDetails[id]);
} else {
// 处理ID不存在的情况
message.error('政策法规不存在');
const fetchPolicyDetail = async () => {
if (!id) {
message.error(intl.formatMessage({ id: 'policy.message.idNotExist' }));
setLoading(false);
return;
}
setLoading(false);
}, 500);
}, [id]);
try {
const response = await getRegulationsInfo({ id });
if (response.success) {
setPolicyDetail(response.data);
} else {
message.error(response.message || intl.formatMessage({ id: 'policy.message.getDetailFailed' }));
}
} catch (error) {
console.error('获取政策法规详情出错:', error);
message.error(intl.formatMessage({ id: 'policy.message.getDetailFailed' }));
} finally {
setLoading(false);
}
};
fetchPolicyDetail();
}, [id, intl]);
// 处理返回列表
const handleBack = () => {
window.history.back();
history.push('/policy');
};
// 处理下载附件
@ -216,7 +232,7 @@ const PolicyInfo: React.FC = () => {
if (loading) {
return (
<div className={styles.loadingContainer}>
<Spin size="large" />
<Spin size="large" tip={intl.formatMessage({ id: 'policy.detail.loading' })} />
</div>
);
}
@ -224,8 +240,10 @@ const PolicyInfo: React.FC = () => {
if (!policyDetail) {
return (
<div className={styles.notFoundContainer}>
<Title level={4}></Title>
<Button type="primary" onClick={handleBack}></Button>
<Title level={4}>{intl.formatMessage({ id: 'policy.detail.notFound' })}</Title>
<Button type="primary" onClick={handleBack}>
{intl.formatMessage({ id: 'policy.detail.back' })}
</Button>
</div>
);
}
@ -239,7 +257,7 @@ const PolicyInfo: React.FC = () => {
onClick={handleBack}
className={styles.backButton}
>
{intl.formatMessage({ id: 'policy.detail.back' })}
</Button>
</div>
@ -250,19 +268,28 @@ const PolicyInfo: React.FC = () => {
</Title>
</div>
<div className={styles.metaInfo}>
<div className={styles.metaLeft}>
<Text type="secondary">: {policyDetail.publishDate}</Text>
</div>
<div className={styles.metaRight}>
<Text type="secondary">: {policyDetail.publisher}</Text>
</div>
<div className={styles.metaContainer}>
<Row>
<Col span={12}>
<Text type="secondary">
{intl.formatMessage({ id: 'policy.detail.publishTime' })}: {policyDetail.createTime}
</Text>
</Col>
<Col span={12} style={{ textAlign: 'right' }}>
<Text type="secondary">
{intl.formatMessage({ id: 'policy.detail.publisher' })}: {policyDetail.createBy}
</Text>
</Col>
</Row>
</div>
<Divider className={styles.divider} />
<Divider />
<div className={styles.contentBody}>
<div dangerouslySetInnerHTML={{ __html: policyDetail.content }} />
<div className={styles.contentContainer}>
<div
className={styles.content}
dangerouslySetInnerHTML={{ __html: policyDetail.content || '' }}
/>
</div>
{policyDetail.attachments && policyDetail.attachments.length > 0 && (