edit.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import React, { useEffect, useState } from 'react';
  2. import { Col, Form, Input, message, Modal, Row, TreeSelect, Upload } from 'antd';
  3. import { InboxOutlined } from '@ant-design/icons';
  4. import type { UploadProps } from 'antd';
  5. import { createOta, editOta, queryDeviceList } from '@/services/ota';
  6. const { Dragger } = Upload;
  7. interface editPros {
  8. visible: boolean;
  9. editCallback: () => void;
  10. params: any;
  11. }
  12. /**
  13. * ota管理 - 编辑
  14. * @param props
  15. * @constructor
  16. */
  17. const Edit: React.FC<editPros> = (props) => {
  18. const { params, visible, editCallback } = props;
  19. const [form] = Form.useForm();
  20. const [deviceList, setDeviceList] = useState([]);
  21. const [fileData, setFileData]: any = useState(
  22. params && params.url
  23. ? [
  24. {
  25. url: params.url,
  26. md5: params.md5,
  27. size: params.file_size,
  28. name: params.file_name,
  29. },
  30. ]
  31. : [],
  32. );
  33. /**
  34. * 获取设备类型列表
  35. */
  36. const getDeviceList = () => {
  37. queryDeviceList({ q: 'tree' }).then((res) => {
  38. if (res && res.code === 0) {
  39. setDeviceList(res.data.list);
  40. }
  41. });
  42. };
  43. useEffect(() => {
  44. getDeviceList();
  45. }, []);
  46. // 提交
  47. const onOk = () => {
  48. form.validateFields().then((values) => {
  49. if (values) {
  50. const data = { ...values };
  51. data.url = fileData[0].url;
  52. data.md5 = fileData[0].md5;
  53. data.file_size = fileData[0].size;
  54. data.file_name = fileData[0].name;
  55. if (params) {
  56. // 编辑
  57. data.record_id = params.record_id;
  58. editOta(data)
  59. .then((res) => {
  60. if (res && res.code === 0) {
  61. message.success('编辑成功');
  62. editCallback();
  63. } else {
  64. message.error(res?.message);
  65. editCallback();
  66. }
  67. })
  68. .catch((e) => {
  69. message.error(e?.message);
  70. editCallback();
  71. });
  72. } else {
  73. // 新增
  74. createOta(data)
  75. .then((res) => {
  76. if (res && res.code === 0) {
  77. message.success('新增成功');
  78. editCallback();
  79. } else {
  80. message.error(res?.message);
  81. editCallback();
  82. }
  83. })
  84. .catch((e) => {
  85. message.error(e?.message);
  86. editCallback();
  87. });
  88. }
  89. }
  90. });
  91. };
  92. // 取消
  93. const onCancel = () => {
  94. editCallback();
  95. };
  96. // 上级菜单 树选择
  97. const toTreeSelect = (data: any) => {
  98. if (!data) {
  99. return [];
  100. }
  101. const newData = [];
  102. for (let i = 0; i < data.length; i += 1) {
  103. const item = {
  104. ...data[i],
  105. title: data[i].name,
  106. value: data[i].record_id,
  107. };
  108. if (item.children && item.children.length > 0) {
  109. item.children = toTreeSelect(item.children);
  110. item.disabled = true;
  111. }
  112. newData.push(item);
  113. }
  114. return newData;
  115. };
  116. const uploadProps: UploadProps = {
  117. name: 'file',
  118. action: '/web/v1/files',
  119. maxCount: 1,
  120. headers: {
  121. authorization: 'authorization-text',
  122. },
  123. defaultFileList: fileData,
  124. onChange(info) {
  125. const { status, response } = info.file;
  126. if (status === 'done') {
  127. //判断上传状态
  128. if (response.code === 0) {
  129. message.success(`上传成功!`);
  130. setFileData([response.data]);
  131. form.setFieldValue('remote_map', response.data.name);
  132. } else {
  133. message.error(response.resultMsg);
  134. }
  135. } else if (status === 'error') {
  136. message.error(`${info.file.name} 文件上传失败`);
  137. }
  138. },
  139. };
  140. const normFile = (e: any) => {
  141. if (Array.isArray(e)) {
  142. return e;
  143. }
  144. return e && e.fileList;
  145. };
  146. const formItemLayout = {
  147. labelCol: {
  148. span: 4,
  149. },
  150. wrapperCol: {
  151. span: 19,
  152. },
  153. };
  154. return (
  155. <Modal
  156. title={`${params ? '编辑' : '新增'}`}
  157. open={visible}
  158. onOk={onOk}
  159. onCancel={onCancel}
  160. width={800}
  161. >
  162. <Form form={form}>
  163. <Row>
  164. <Col span={24}>
  165. <Form.Item
  166. {...formItemLayout}
  167. name="version"
  168. label="版本号"
  169. rules={[{ required: true, message: '请输入版本号' }]}
  170. initialValue={params?.version || ''}
  171. >
  172. <Input placeholder="请输入版本号" />
  173. </Form.Item>
  174. </Col>
  175. <Col span={24}>
  176. <Form.Item
  177. {...formItemLayout}
  178. name="device_type_id"
  179. label="设备类型"
  180. rules={[{ required: true, message: '请选择设备类型' }]}
  181. initialValue={params?.device_type_id || undefined}
  182. >
  183. <TreeSelect
  184. allowClear
  185. showSearch
  186. treeDefaultExpandAll
  187. treeNodeFilterProp="title"
  188. style={{ width: '100%' }}
  189. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  190. treeData={toTreeSelect(deviceList)}
  191. placeholder="请选择"
  192. />
  193. </Form.Item>
  194. </Col>
  195. <Col span={24}>
  196. <Form.Item
  197. {...formItemLayout}
  198. name="content"
  199. label="更新内容"
  200. rules={[{ required: true, message: '请输入更新内容' }]}
  201. initialValue={params?.content || ''}
  202. >
  203. <Input placeholder="请输入更新内容" />
  204. </Form.Item>
  205. </Col>
  206. <Col span={24}>
  207. <Form.Item
  208. {...formItemLayout}
  209. name="url"
  210. getValueFromEvent={normFile}
  211. label="文件地址"
  212. rules={[{ required: true, message: '请选择文件' }]}
  213. initialValue={params?.url || ''}
  214. >
  215. <Dragger {...uploadProps}>
  216. <p className="ant-upload-drag-icon">
  217. <InboxOutlined />
  218. </p>
  219. <p className="ant-upload-text">单击或拖动文件到此区域进行上传</p>
  220. </Dragger>
  221. </Form.Item>
  222. </Col>
  223. </Row>
  224. </Form>
  225. </Modal>
  226. );
  227. };
  228. export default Edit;