savePoint.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import { Col, Form, Input, InputNumber, Modal, Row, Select } from 'antd';
  2. import { useEffect, useState } from 'react';
  3. import { service } from '@/pages/link/Channel/Opcua';
  4. import { onlyMessage } from '@/utils/util';
  5. interface Props {
  6. data: any;
  7. close: Function;
  8. opcId: string;
  9. }
  10. const SavePoint = (props: Props) => {
  11. const [form] = Form.useForm();
  12. const [dataMode, setDataMode] = useState<any>('');
  13. const handleSave = async () => {
  14. const formData = await form.validateFields();
  15. if (props.data.id) {
  16. service
  17. .editPoint(props.data.id, {
  18. opcUaId: props.opcId,
  19. ...formData,
  20. })
  21. .then((res) => {
  22. if (res.status === 200) {
  23. onlyMessage('保存成功');
  24. props.close();
  25. }
  26. });
  27. } else {
  28. service
  29. .addPoint({
  30. opcUaId: props.opcId,
  31. ...formData,
  32. })
  33. .then((res) => {
  34. if (res.status === 200) {
  35. onlyMessage('保存成功');
  36. props.close();
  37. }
  38. });
  39. }
  40. };
  41. useEffect(() => {
  42. console.log(props.data);
  43. if (props.data.id) {
  44. setDataMode(props.data.dataMode?.value);
  45. }
  46. }, []);
  47. return (
  48. <Modal
  49. title={props.data.id ? '编辑点位' : '新增点位'}
  50. visible
  51. width="40vw"
  52. destroyOnClose
  53. onOk={handleSave}
  54. onCancel={() => {
  55. props.close();
  56. }}
  57. >
  58. <Form
  59. form={form}
  60. layout="vertical"
  61. initialValues={{
  62. ...props.data,
  63. }}
  64. >
  65. <Row gutter={[24, 24]}>
  66. <Col span={24}>
  67. <Form.Item
  68. label="名称"
  69. name="name"
  70. required
  71. rules={[{ required: true, message: '名称必填' }]}
  72. >
  73. <Input placeholder="请输入名称" />
  74. </Form.Item>
  75. </Col>
  76. </Row>
  77. <Row gutter={[24, 24]}>
  78. <Col span={24}>
  79. <Form.Item
  80. label="点位ID"
  81. name="opcPointId"
  82. required
  83. rules={[
  84. { required: true, message: '点位ID必填' },
  85. ({}) => ({
  86. validator(_, value) {
  87. const item = value.substring(0, 2);
  88. if (item === 'i=' || item === 's=' || item === 'g=' || item === 'b=') {
  89. return Promise.resolve();
  90. }
  91. return Promise.reject(new Error('前两个字符必须为i=、s=、g=、b=中的一个'));
  92. },
  93. }),
  94. ]}
  95. >
  96. <Input placeholder="请输入点位ID" />
  97. </Form.Item>
  98. </Col>
  99. </Row>
  100. <Row gutter={[24, 24]}>
  101. <Col span={24}>
  102. <Form.Item
  103. label="数据类型"
  104. name="type"
  105. required
  106. rules={[{ required: true, message: '数据类型必选' }]}
  107. >
  108. <Select
  109. placeholder="请选择数据模式"
  110. onChange={(value) => {
  111. setDataMode(value);
  112. form.setFieldsValue({
  113. interval: '',
  114. });
  115. }}
  116. >
  117. <Select.Option value="Boolean" key={'Boolean'}>
  118. Boolean
  119. </Select.Option>
  120. <Select.Option value="Byte" key={'Byte'}>
  121. Byte
  122. </Select.Option>
  123. <Select.Option value="Short" key={'Short'}>
  124. Short
  125. </Select.Option>
  126. <Select.Option value="Integer" key={'Integer'}>
  127. Boolean
  128. </Select.Option>
  129. <Select.Option value="Long" key={'Long'}>
  130. Long
  131. </Select.Option>
  132. <Select.Option value="LLong" key={'LLong'}>
  133. LLong
  134. </Select.Option>
  135. <Select.Option value="Double" key={'Double'}>
  136. Double
  137. </Select.Option>
  138. <Select.Option value="String" key={'String'}>
  139. String
  140. </Select.Option>
  141. <Select.Option value="DateTime" key={'DateTime'}>
  142. DateTime
  143. </Select.Option>
  144. </Select>
  145. </Form.Item>
  146. </Col>
  147. </Row>
  148. <Row gutter={[24, 24]}>
  149. <Col span={12}>
  150. <Form.Item
  151. label="数据模式"
  152. name="dataMode"
  153. tooltip={
  154. <>
  155. <div>订阅:订阅OPC UA点位数据发生变化后的值</div>
  156. <div>拉取:拉取OPC UA点位数据值</div>
  157. <div>拉取变更值:拉取OPC UA点位数据值,并丢弃处理未发生变化的数据值</div>
  158. <div>
  159. 被动读取:不会定时读取OPC UA点位数据值,仅由平台发起读取点位数据命令时返回数据
  160. </div>
  161. </>
  162. }
  163. required
  164. rules={[{ required: true, message: '数据模式必选' }]}
  165. >
  166. <Select
  167. placeholder="请选择数据模式"
  168. onChange={(value) => {
  169. setDataMode(value);
  170. form.setFieldsValue({
  171. interval: '',
  172. });
  173. }}
  174. >
  175. <Select.Option value="sub" key={'sub'}>
  176. 订阅
  177. </Select.Option>
  178. <Select.Option value="pull" key={'pull'}>
  179. 拉取
  180. </Select.Option>
  181. <Select.Option value="pullChange" key={'pullChange'}>
  182. 拉取变更值
  183. </Select.Option>
  184. <Select.Option value="pullPassive" key={'pullPassive'}>
  185. 被动读取
  186. </Select.Option>
  187. </Select>
  188. </Form.Item>
  189. </Col>
  190. {dataMode !== 'pullPassive' && (
  191. <Col span={12}>
  192. {dataMode === 'sub' && (
  193. <Form.Item
  194. label="采集频率"
  195. name="interval"
  196. tooltip="OPC UA服务器采样点位数据发生变化的频率"
  197. rules={[
  198. ({}) => ({
  199. validator(_, value) {
  200. if (value !== 0 || /(^[1-9]\d*$)/.test(value)) {
  201. return Promise.resolve();
  202. }
  203. return Promise.reject(new Error('请输入正整数'));
  204. },
  205. }),
  206. ]}
  207. >
  208. <InputNumber
  209. style={{ width: '100%' }}
  210. placeholder="请输入"
  211. addonAfter={<>ms</>}
  212. />
  213. </Form.Item>
  214. )}
  215. {(dataMode === 'pullChange' || dataMode === 'pull') && (
  216. <Form.Item
  217. label="拉取频率"
  218. name="interval"
  219. rules={[
  220. ({}) => ({
  221. validator(_, value) {
  222. if (value !== 0 || /(^[1-9]\d*$)/.test(value)) {
  223. return Promise.resolve();
  224. }
  225. return Promise.reject(new Error('请输入正整数'));
  226. },
  227. }),
  228. ]}
  229. >
  230. <InputNumber
  231. style={{ width: '100%' }}
  232. placeholder="请输入"
  233. addonAfter={<>ms</>}
  234. />
  235. </Form.Item>
  236. )}
  237. </Col>
  238. )}
  239. </Row>
  240. </Form>
  241. </Modal>
  242. );
  243. };
  244. export default SavePoint;