blob: 2bf1069a6d5c30329bbf9714652b0960f022aae3 [file] [log] [blame]
Jiarenxiang38dcb052025-03-13 16:40:09 +08001
2import React, { useState, useRef, useEffect } from 'react';
3import { useIntl, FormattedMessage, useAccess, history, useParams } 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 { getDictDataList, removeDictData, addDictData, updateDictData, exportDictData } from '@/services/system/dictdata';
9import UpdateForm from './edit';
10import { getDictValueEnum, getDictType, getDictTypeOptionSelect } from '@/services/system/dict';
11import DictTag from '@/components/DictTag';
12
13/**
14 * 添加节点
15 *
16 * @param fields
17 */
18const handleAdd = async (fields: API.System.DictData) => {
19 const hide = message.loading('正在添加');
20 try {
21 const resp = await addDictData({ ...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.DictData) => {
42 const hide = message.loading('正在更新');
43 try {
44 const resp = await updateDictData(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.DictData[]) => {
65 const hide = message.loading('正在删除');
66 if (!selectedRows) return true;
67 try {
68 const resp = await removeDictData(selectedRows.map((row) => row.dictCode).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.DictData) => {
84 const hide = message.loading('正在删除');
85 if (!selectedRow) return true;
86 try {
87 const params = [selectedRow.dictCode];
88 const resp = await removeDictData(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 * 导出数据
105 *
106 *
107 */
108const handleExport = async () => {
109 const hide = message.loading('正在导出');
110 try {
111 await exportDictData();
112 hide();
113 message.success('导出成功');
114 return true;
115 } catch (error) {
116 hide();
117 message.error('导出失败,请重试');
118 return false;
119 }
120};
121
122export type DictTypeArgs = {
123 id: string;
124};
125
126
127const DictDataTableList: React.FC = () => {
128
129 const formTableRef = useRef<FormInstance>();
130
131 const [dictId, setDictId] = useState<string>('');
132 const [dictType, setDictType] = useState<string>('');
133
134 const [modalVisible, setModalVisible] = useState<boolean>(false);
135
136 const actionRef = useRef<ActionType>();
137 const [currentRow, setCurrentRow] = useState<API.System.DictData>();
138 const [selectedRows, setSelectedRows] = useState<API.System.DictData[]>([]);
139
140 const [dictTypeOptions, setDictTypeOptions] = useState<any>([]);
141 const [statusOptions, setStatusOptions] = useState<any>([]);
142
143 const access = useAccess();
144
145 /** 国际化配置 */
146 const intl = useIntl();
147
148 const params = useParams();
149 if (params.id === undefined) {
150 history.push('/system/dict');
151 }
152 const id = params.id || '0';
153
154 useEffect(() => {
155 if (dictId !== id) {
156 setDictId(id);
157 getDictTypeOptionSelect().then((res) => {
158 if (res.code === 200) {
159 const opts: any = {};
160 res.data.forEach((item: any) => {
161 opts[item.dictType] = item.dictName;
162 });
163 setDictTypeOptions(opts);
164 }
165 });
166 getDictValueEnum('sys_normal_disable').then((data) => {
167 setStatusOptions(data);
168 });
169 getDictType(id).then((res) => {
170 if (res.code === 200) {
171 setDictType(res.data.dictType);
172 formTableRef.current?.setFieldsValue({
173 dictType: res.data.dictType,
174 });
175 actionRef.current?.reloadAndRest?.();
176 } else {
177 message.error(res.msg);
178 }
179 });
180 }
181 }, [dictId, dictType, params]);
182
183 const columns: ProColumns<API.System.DictData>[] = [
184 {
185 title: <FormattedMessage id="system.dict.data.dict_code" defaultMessage="字典编码" />,
186 dataIndex: 'dictCode',
187 valueType: 'text',
188 hideInSearch: true,
189 },
190 {
191 title: <FormattedMessage id="system.dict.data.dict_label" defaultMessage="字典标签" />,
192 dataIndex: 'dictLabel',
193 valueType: 'text',
194 },
195 {
196 title: <FormattedMessage id="system.dict.data.dict_type" defaultMessage="字典类型" />,
197 dataIndex: 'dictType',
198 valueType: 'select',
199 hideInTable: true,
200 valueEnum: dictTypeOptions,
201 search: {
202 transform: (value) => {
203 setDictType(value);
204 return value;
205 },
206 },
207 },
208 {
209 title: <FormattedMessage id="system.dict.data.dict_value" defaultMessage="字典键值" />,
210 dataIndex: 'dictValue',
211 valueType: 'text',
212 },
213 {
214 title: <FormattedMessage id="system.dict.data.dict_sort" defaultMessage="字典排序" />,
215 dataIndex: 'dictSort',
216 valueType: 'text',
217 },
218 {
219 title: <FormattedMessage id="system.dict.data.status" defaultMessage="状态" />,
220 dataIndex: 'status',
221 valueType: 'select',
222 valueEnum: statusOptions,
223 render: (_, record) => {
224 return (<DictTag enums={statusOptions} value={record.status} />);
225 },
226 },
227 {
228 title: <FormattedMessage id="system.dict.data.remark" defaultMessage="备注" />,
229 dataIndex: 'remark',
230 valueType: 'textarea',
231 hideInSearch: true,
232 },
233 {
234 title: <FormattedMessage id="system.dict.data.create_time" defaultMessage="创建时间" />,
235 dataIndex: 'createTime',
236 valueType: 'dateRange',
237 render: (_, record) => {
238 return (<span>{record.createTime.toString()} </span>);
239 },
240 search: {
241 transform: (value) => {
242 return {
243 'params[beginTime]': value[0],
244 'params[endTime]': value[1],
245 };
246 },
247 },
248 },
249 {
250 title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
251 dataIndex: 'option',
252 width: '120px',
253 valueType: 'option',
254 render: (_, record) => [
255 <Button
256 type="link"
257 size="small"
258 key="edit"
259 hidden={!access.hasPerms('system:data:edit')}
260 onClick={() => {
261 setModalVisible(true);
262 setCurrentRow(record);
263 }}
264 >
265 编辑
266 </Button>,
267 <Button
268 type="link"
269 size="small"
270 danger
271 key="batchRemove"
272 hidden={!access.hasPerms('system:data:remove')}
273 onClick={async () => {
274 Modal.confirm({
275 title: '删除',
276 content: '确定删除该项吗?',
277 okText: '确认',
278 cancelText: '取消',
279 onOk: async () => {
280 const success = await handleRemoveOne(record);
281 if (success) {
282 if (actionRef.current) {
283 actionRef.current.reload();
284 }
285 }
286 },
287 });
288 }}
289 >
290 删除
291 </Button>,
292 ],
293 },
294 ];
295
296 return (
297 <PageContainer>
298 <div style={{ width: '100%', float: 'right' }}>
299 <ProTable<API.System.DictData>
300 headerTitle={intl.formatMessage({
301 id: 'pages.searchTable.title',
302 defaultMessage: '信息',
303 })}
304 actionRef={actionRef}
305 formRef={formTableRef}
306 rowKey="dictCode"
307 key="dataList"
308 search={{
309 labelWidth: 120,
310 }}
311 toolBarRender={() => [
312 <Button
313 type="primary"
314 key="add"
315 hidden={!access.hasPerms('system:data:add')}
316 onClick={async () => {
317 setCurrentRow({ dictType: dictType, isDefault: 'N', status: '0' } as API.System.DictData);
318 setModalVisible(true);
319 }}
320 >
321 <PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="新建" />
322 </Button>,
323 <Button
324 type="primary"
325 key="remove"
326 danger
327 hidden={selectedRows?.length === 0 || !access.hasPerms('system:data:remove')}
328 onClick={async () => {
329 Modal.confirm({
330 title: '是否确认删除所选数据项?',
331 icon: <ExclamationCircleOutlined />,
332 content: '请谨慎操作',
333 async onOk() {
334 const success = await handleRemove(selectedRows);
335 if (success) {
336 setSelectedRows([]);
337 actionRef.current?.reloadAndRest?.();
338 }
339 },
340 onCancel() { },
341 });
342 }}
343 >
344 <DeleteOutlined />
345 <FormattedMessage id="pages.searchTable.delete" defaultMessage="删除" />
346 </Button>,
347 <Button
348 type="primary"
349 key="export"
350 hidden={!access.hasPerms('system:data:export')}
351 onClick={async () => {
352 handleExport();
353 }}
354 >
355 <PlusOutlined />
356 <FormattedMessage id="pages.searchTable.export" defaultMessage="导出" />
357 </Button>,
358 ]}
359 request={(params) =>
360 getDictDataList({ ...params, dictType } as API.System.DictDataListParams).then((res) => {
361 const result = {
362 data: res.rows,
363 total: res.total,
364 success: true,
365 };
366 return result;
367 })
368 }
369 columns={columns}
370 rowSelection={{
371 onChange: (_, selectedRows) => {
372 setSelectedRows(selectedRows);
373 },
374 }}
375 />
376 </div>
377 {selectedRows?.length > 0 && (
378 <FooterToolbar
379 extra={
380 <div>
381 <FormattedMessage id="pages.searchTable.chosen" defaultMessage="已选择" />
382 <a style={{ fontWeight: 600 }}>{selectedRows.length}</a>
383 <FormattedMessage id="pages.searchTable.item" defaultMessage="项" />
384 </div>
385 }
386 >
387 <Button
388 key="remove"
389 danger
390 hidden={!access.hasPerms('system:data:del')}
391 onClick={async () => {
392 Modal.confirm({
393 title: '删除',
394 content: '确定删除该项吗?',
395 okText: '确认',
396 cancelText: '取消',
397 onOk: async () => {
398 const success = await handleRemove(selectedRows);
399 if (success) {
400 setSelectedRows([]);
401 actionRef.current?.reloadAndRest?.();
402 }
403 },
404 });
405 }}
406 >
407 <FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="批量删除" />
408 </Button>
409 </FooterToolbar>
410 )}
411 <UpdateForm
412 onSubmit={async (values) => {
413 let success = false;
414 if (values.dictCode) {
415 success = await handleUpdate({ ...values } as API.System.DictData);
416 } else {
417 success = await handleAdd({ ...values } as API.System.DictData);
418 }
419 if (success) {
420 setModalVisible(false);
421 setCurrentRow(undefined);
422 if (actionRef.current) {
423 actionRef.current.reload();
424 }
425 }
426 }}
427 onCancel={() => {
428 setModalVisible(false);
429 setCurrentRow(undefined);
430 }}
431 open={modalVisible}
432 values={currentRow || {}}
433 statusOptions={statusOptions}
434 />
435 </PageContainer>
436 );
437};
438
439export default DictDataTableList;