政策
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled

This commit is contained in:
2026-01-11 16:47:57 +08:00
parent b48d7ea7ad
commit a67946a1cb
6 changed files with 540 additions and 2 deletions

View File

@@ -0,0 +1,46 @@
import React from 'react';
import { Modal, Descriptions, Button } from 'antd';
interface DetailModalProps {
open: boolean;
data?: API.PolicyInfo.PolicyInfoItem;
onCancel: () => void;
}
const DetailModal: React.FC<DetailModalProps> = ({ open, data, onCancel }) => {
return (
<Modal
title="政策详情"
open={open}
onCancel={onCancel}
footer={<Button onClick={onCancel}></Button>}
width={800}
>
<Descriptions column={2} bordered size="small">
<Descriptions.Item label="政策名称" span={2}>{data?.zcmc}</Descriptions.Item>
<Descriptions.Item label="政策类型">{data?.zclx}</Descriptions.Item>
<Descriptions.Item label="政策级别">{data?.zcLevel}</Descriptions.Item>
<Descriptions.Item label="发文单位">{data?.sourceUnit}</Descriptions.Item>
<Descriptions.Item label="受理单位">{data?.acceptUnit}</Descriptions.Item>
<Descriptions.Item label="发文时间">{data?.publishTime}</Descriptions.Item>
<Descriptions.Item label="浏览数">{data?.viewNum}</Descriptions.Item>
<Descriptions.Item label="政策内容" span={2}>{data?.zcContent}</Descriptions.Item>
<Descriptions.Item label="补贴标准" span={2}>{data?.subsidyStandard}</Descriptions.Item>
<Descriptions.Item label="经办渠道" span={2}>{data?.handleChannel}</Descriptions.Item>
<Descriptions.Item label="申报条件" span={2}>{data?.applyCondition}</Descriptions.Item>
<Descriptions.Item label="政策文件" span={2}>
{data?.fileUrl && (
<a href={data.fileUrl} target="_blank" rel="noopener noreferrer">
{data.fileName || '查看文件'}
</a>
)}
</Descriptions.Item>
<Descriptions.Item label="创建时间">{data?.createTime}</Descriptions.Item>
<Descriptions.Item label="更新时间">{data?.updateTime}</Descriptions.Item>
<Descriptions.Item label="备注" span={2}>{data?.remark}</Descriptions.Item>
</Descriptions>
</Modal>
);
};
export default DetailModal;

View File

@@ -0,0 +1,171 @@
import React, { useEffect, useState } from 'react';
import { Modal, Form, Input, DatePicker, Upload, Button, message } from 'antd';
import { UploadOutlined, DeleteOutlined } from '@ant-design/icons';
import type { UploadFile } from 'antd/es/upload/interface';
import dayjs from 'dayjs';
import { uploadPolicyFile } from '@/services/cms/policyInfo';
const { TextArea } = Input;
interface EditModalProps {
open: boolean;
values?: API.PolicyInfo.PolicyInfoItem;
onCancel: () => void;
onSubmit: (values: Partial<API.PolicyInfo.PolicyInfoItem>) => void;
}
const EditModal: React.FC<EditModalProps> = ({ open, values, onCancel, onSubmit }) => {
const [form] = Form.useForm();
const [fileList, setFileList] = useState<UploadFile[]>([]);
const [uploading, setUploading] = useState(false);
useEffect(() => {
if (open) {
if (values) {
form.setFieldsValue({
...values,
publishTime: values.publishTime ? dayjs(values.publishTime) : undefined,
});
// 如果有已上传的文件,显示在列表中
if (values.fileUrl && values.fileName) {
setFileList([{
uid: '-1',
name: values.fileName,
status: 'done',
url: values.fileUrl,
}]);
} else {
setFileList([]);
}
} else {
form.resetFields();
setFileList([]);
}
}
}, [open, values, form]);
const handleUpload = async (file: File) => {
setUploading(true);
try {
const res = await uploadPolicyFile(file);
if (res.code === 200) {
form.setFieldsValue({
fileUrl: res.data.fileUrl,
fileName: res.data.fileName,
});
setFileList([{
uid: '-1',
name: res.data.fileName,
status: 'done',
url: res.data.fileUrl,
}]);
message.success('文件上传成功');
} else {
message.error(res.msg || '文件上传失败');
}
} catch {
message.error('文件上传失败');
} finally {
setUploading(false);
}
return false; // 阻止默认上传行为
};
const handleRemoveFile = () => {
setFileList([]);
form.setFieldsValue({
fileUrl: undefined,
fileName: undefined,
});
};
const handleOk = async () => {
const formValues = await form.validateFields();
onSubmit({
...formValues,
id: values?.id,
publishTime: formValues.publishTime?.format('YYYY-MM-DD'),
});
};
return (
<Modal
title={values ? '编辑政策' : '新增政策'}
open={open}
onCancel={onCancel}
onOk={handleOk}
width={700}
destroyOnClose
>
<Form form={form} layout="vertical">
<Form.Item name="zcmc" label="政策名称" rules={[{ required: true, message: '请输入政策名称' }]}>
<Input placeholder="请输入政策名称" />
</Form.Item>
<Form.Item name="zclx" label="政策类型">
<Input placeholder="请输入政策类型" />
</Form.Item>
<Form.Item name="zcLevel" label="政策级别">
<Input placeholder="请输入政策级别" />
</Form.Item>
<Form.Item name="sourceUnit" label="发文单位">
<Input placeholder="请输入发文单位" />
</Form.Item>
<Form.Item name="acceptUnit" label="受理单位">
<Input placeholder="请输入受理单位" />
</Form.Item>
<Form.Item name="publishTime" label="发文时间">
<DatePicker style={{ width: '100%' }} />
</Form.Item>
<Form.Item name="zcContent" label="政策内容">
<TextArea rows={4} placeholder="请输入政策内容" />
</Form.Item>
<Form.Item name="subsidyStandard" label="补贴标准">
<TextArea rows={2} placeholder="请输入补贴标准" />
</Form.Item>
<Form.Item name="handleChannel" label="经办渠道">
<Input placeholder="请输入经办渠道" />
</Form.Item>
<Form.Item name="applyCondition" label="申报条件">
<TextArea rows={2} placeholder="请输入申报条件" />
</Form.Item>
<Form.Item label="政策文件">
{fileList.length > 0 ? (
<div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
<a href={fileList[0].url} target="_blank" rel="noopener noreferrer">
{fileList[0].name}
</a>
<Button
type="text"
danger
size="small"
icon={<DeleteOutlined />}
onClick={handleRemoveFile}
/>
</div>
) : (
<Upload
beforeUpload={handleUpload}
showUploadList={false}
maxCount={1}
>
<Button icon={<UploadOutlined />} loading={uploading}>
</Button>
</Upload>
)}
</Form.Item>
<Form.Item name="fileUrl" hidden>
<Input />
</Form.Item>
<Form.Item name="fileName" hidden>
<Input />
</Form.Item>
<Form.Item name="remark" label="备注">
<TextArea rows={2} placeholder="请输入备注" />
</Form.Item>
</Form>
</Modal>
);
};
export default EditModal;