blob: ea5b06346c34aa17d4d18725d5a2f8bd617a3b96 [file] [log] [blame]
86133aaa3f5d2025-04-20 21:33:29 +08001
2import React, { useState, useRef, useEffect } from 'react';
3import { useIntl, FormattedMessage, useAccess } from '@umijs/max';
4import type { FormInstance } from 'antd';
5import { Button, message, Modal } from 'antd';
6import { ActionType, FooterToolbar, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components';
7import { PlusOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons';
8import { getNoticeList, removeNotice, addNotice, updateNotice } from '@/services/system/notice';
9import UpdateForm from './edit';
10import { getDictValueEnum } from '@/services/system/dict';
11import DictTag from '@/components/DictTag';
12
13/**
14 * 添加节点
15 *
16 * @param fields
17 */
18const handleAdd = async (fields: API.System.Notice) => {
19 const hide = message.loading('正在添加');
20 try {
21 const resp = await addNotice({ ...fields });
22 hide();
23 if (resp.code === 200) {
24 message.success('添加成功');
25 } else {
26 message.error(resp.msg);
27 }
28 return true;
29 } catch (error) {
30 hide();
31 message.error('添加失败请重试!');
32 return false;
33 }
34};
35
36/**
37 * 更新节点
38 *
39 * @param fields
40 */
41const handleUpdate = async (fields: API.System.Notice) => {
42 const hide = message.loading('正在更新');
43 try {
44 const resp = await updateNotice(fields);
45 hide();
46 if (resp.code === 200) {
47 message.success('更新成功');
48 } else {
49 message.error(resp.msg);
50 }
51 return true;
52 } catch (error) {
53 hide();
54 message.error('配置失败请重试!');
55 return false;
56 }
57};
58
59/**
60 * 删除节点
61 *
62 * @param selectedRows
63 */
64const handleRemove = async (selectedRows: API.System.Notice[]) => {
65 const hide = message.loading('正在删除');
66 if (!selectedRows) return true;
67 try {
68 const resp = await removeNotice(selectedRows.map((row) => row.noticeId).join(','));
69 hide();
70 if (resp.code === 200) {
71 message.success('删除成功,即将刷新');
72 } else {
73 message.error(resp.msg);
74 }
75 return true;
76 } catch (error) {
77 hide();
78 message.error('删除失败,请重试');
79 return false;
80 }
81};
82
83const handleRemoveOne = async (selectedRow: API.System.Notice) => {
84 const hide = message.loading('正在删除');
85 if (!selectedRow) return true;
86 try {
87 const params = [selectedRow.noticeId];
88 const resp = await removeNotice(params.join(','));
89 hide();
90 if (resp.code === 200) {
91 message.success('删除成功,即将刷新');
92 } else {
93 message.error(resp.msg);
94 }
95 return true;
96 } catch (error) {
97 hide();
98 message.error('删除失败,请重试');
99 return false;
100 }
101};
102
103
104
105const NoticeTableList: React.FC = () => {
106 const formTableRef = useRef<FormInstance>();
107
108 const [modalVisible, setModalVisible] = useState<boolean>(false);
109
110 const actionRef = useRef<ActionType>();
111 const [currentRow, setCurrentRow] = useState<API.System.Notice>();
112 const [selectedRows, setSelectedRows] = useState<API.System.Notice[]>([]);
113
114 const [noticeTypeOptions, setNoticeTypeOptions] = useState<any>([]);
115 const [statusOptions, setStatusOptions] = useState<any>([]);
116
117 const access = useAccess();
118
119 /** 国际化配置 */
120 const intl = useIntl();
121
122 useEffect(() => {
123 getDictValueEnum('sys_notice_type').then((data) => {
124 setNoticeTypeOptions(data);
125 });
126 getDictValueEnum('sys_notice_status').then((data) => {
127 setStatusOptions(data);
128 });
129 }, []);
130
131 const columns: ProColumns<API.System.Notice>[] = [
132 {
133 title: <FormattedMessage id="system.notice.notice_id" defaultMessage="公告编号" />,
134 dataIndex: 'noticeId',
135 valueType: 'text',
136 hideInSearch: true,
137 },
138 {
139 title: <FormattedMessage id="system.notice.notice_title" defaultMessage="公告标题" />,
140 dataIndex: 'noticeTitle',
141 valueType: 'text',
142 },
143 {
144 title: <FormattedMessage id="system.notice.notice_type" defaultMessage="公告类型" />,
145 dataIndex: 'noticeType',
146 valueType: 'select',
147 valueEnum: noticeTypeOptions,
148 },
149 {
150 title: <FormattedMessage id="system.notice.notice_content" defaultMessage="公告内容" />,
151 dataIndex: 'noticeContent',
152 valueType: 'text',
153 hideInTable: true,
154 },
155 {
156 title: <FormattedMessage id="system.notice.status" defaultMessage="公告状态" />,
157 dataIndex: 'status',
158 valueType: 'select',
159 valueEnum: statusOptions,
160 render: (_, record) => {
161 return (<DictTag enums={statusOptions} value={record.status} />);
162 },
163 },
164 {
165 title: <FormattedMessage id="system.notice.remark" defaultMessage="备注" />,
166 dataIndex: 'remark',
167 valueType: 'text',
168 hideInSearch: true,
169 },
170 {
171 title: <FormattedMessage id="system.notice.create_time" defaultMessage="创建时间" />,
172 dataIndex: 'createTime',
173 valueType: 'dateRange',
174 render: (_, record) => {
175 return (<span>{record.createTime.toString()} </span>);
176 },
177 search: {
178 transform: (value) => {
179 return {
180 'params[beginTime]': value[0],
181 'params[endTime]': value[1],
182 };
183 },
184 },
185 },
186 {
187 title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
188 dataIndex: 'option',
189 width: '120px',
190 valueType: 'option',
191 render: (_, record) => [
192 <Button
193 type="link"
194 size="small"
195 key="edit"
196 hidden={!access.hasPerms('system:notice:edit')}
197 onClick={() => {
198 setModalVisible(true);
199 setCurrentRow(record);
200 }}
201 >
202 编辑
203 </Button>,
204 <Button
205 type="link"
206 size="small"
207 danger
208 key="batchRemove"
209 hidden={!access.hasPerms('system:notice:remove')}
210 onClick={async () => {
211 Modal.confirm({
212 title: '删除',
213 content: '确定删除该项吗?',
214 okText: '确认',
215 cancelText: '取消',
216 onOk: async () => {
217 const success = await handleRemoveOne(record);
218 if (success) {
219 if (actionRef.current) {
220 actionRef.current.reload();
221 }
222 }
223 },
224 });
225 }}
226 >
227 删除
228 </Button>,
229 ],
230 },
231 ];
232
233 return (
234 <PageContainer>
235 <div style={{ width: '100%', float: 'right' }}>
236 <ProTable<API.System.Notice>
237 headerTitle={intl.formatMessage({
238 id: 'pages.searchTable.title',
239 defaultMessage: '信息',
240 })}
241 actionRef={actionRef}
242 formRef={formTableRef}
243 rowKey="noticeId"
244 key="noticeList"
245 search={{
246 labelWidth: 120,
247 }}
248 toolBarRender={() => [
249 <Button
250 type="primary"
251 key="add"
252 hidden={!access.hasPerms('system:notice:add')}
253 onClick={async () => {
254 setCurrentRow(undefined);
255 setModalVisible(true);
256 }}
257 >
258 <PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="新建" />
259 </Button>,
260 <Button
261 type="primary"
262 key="remove"
263 danger
264 hidden={selectedRows?.length === 0 || !access.hasPerms('system:notice:remove')}
265 onClick={async () => {
266 Modal.confirm({
267 title: '是否确认删除所选数据项?',
268 icon: <ExclamationCircleOutlined />,
269 content: '请谨慎操作',
270 async onOk() {
271 const success = await handleRemove(selectedRows);
272 if (success) {
273 setSelectedRows([]);
274 actionRef.current?.reloadAndRest?.();
275 }
276 },
277 onCancel() {},
278 });
279 }}
280 >
281 <DeleteOutlined />
282 <FormattedMessage id="pages.searchTable.delete" defaultMessage="删除" />
283 </Button>,
284 ]}
285 request={(params) =>
286 getNoticeList({ ...params } as API.System.NoticeListParams).then((res) => {
287 const result = {
288 data: res.rows,
289 total: res.total,
290 success: true,
291 };
292 return result;
293 })
294 }
295 columns={columns}
296 rowSelection={{
297 onChange: (_, selectedRows) => {
298 setSelectedRows(selectedRows);
299 },
300 }}
301 />
302 </div>
303 {selectedRows?.length > 0 && (
304 <FooterToolbar
305 extra={
306 <div>
307 <FormattedMessage id="pages.searchTable.chosen" defaultMessage="已选择" />
308 <a style={{ fontWeight: 600 }}>{selectedRows.length}</a>
309 <FormattedMessage id="pages.searchTable.item" defaultMessage="项" />
310 </div>
311 }
312 >
313 <Button
314 key="remove"
315 danger
316 hidden={!access.hasPerms('system:notice:del')}
317 onClick={async () => {
318 Modal.confirm({
319 title: '删除',
320 content: '确定删除该项吗?',
321 okText: '确认',
322 cancelText: '取消',
323 onOk: async () => {
324 const success = await handleRemove(selectedRows);
325 if (success) {
326 setSelectedRows([]);
327 actionRef.current?.reloadAndRest?.();
328 }
329 },
330 });
331 }}
332 >
333 <FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="批量删除" />
334 </Button>
335 </FooterToolbar>
336 )}
337 <UpdateForm
338 onSubmit={async (values) => {
339 let success = false;
340 if (values.noticeId) {
341 success = await handleUpdate({ ...values } as API.System.Notice);
342 } else {
343 success = await handleAdd({ ...values } as API.System.Notice);
344 }
345 if (success) {
346 setModalVisible(false);
347 setCurrentRow(undefined);
348 if (actionRef.current) {
349 actionRef.current.reload();
350 }
351 }
352 }}
353 onCancel={() => {
354 setModalVisible(false);
355 setCurrentRow(undefined);
356 }}
357 open={modalVisible}
358 values={currentRow || {}}
359 noticeTypeOptions={noticeTypeOptions}
360 statusOptions={statusOptions}
361 />
362 </PageContainer>
363 );
364};
365
366export default NoticeTableList;