easy.jsx 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. import React, {
  2. useEffect,
  3. useState,
  4. forwardRef,
  5. useImperativeHandle,
  6. } from "react";
  7. import { Form, Input, Select, message, Switch, Space, Col } from "antd";
  8. import { Modal, Button, Radio } from "antd";
  9. import styles from "./easy.module.less";
  10. import API2 from "../../../api/alarm";
  11. import { useMemoizedFn } from "ahooks";
  12. function TranslateText(arr) {
  13. const dtLanguage = localStorage.getItem("dtLanguage");
  14. if (!Array.isArray(arr)) {
  15. return arr;
  16. }
  17. if (arr.length < 2 && arr.length > 0) {
  18. return arr?.[0];
  19. }
  20. if (dtLanguage === "en") {
  21. return arr?.[1];
  22. }
  23. return arr?.[0];
  24. }
  25. const Easy = (props, ref) => {
  26. const { editId, groupList = [], pointId = null } = props;
  27. const [form] = Form.useForm();
  28. // const [alarmId, setAlarmId] = useState(searchParams.get('alarm_id'))
  29. // const [token, setToken] = useState(searchParams.get('token'))
  30. // const [apiUrl, setApiUrl] = useState(decodeURIComponent(searchParams.get('api_url')) + '/')
  31. const [data, setData] = useState();
  32. const [deferUnit, setDeferUnit] = useState();
  33. const [status, setStatus] = useState(2);
  34. const [dateTime, setDateTime] = useState(null);
  35. const [subType, setSubType] = useState();
  36. const [isDisabled, setIsDisabled] = useState(true);
  37. const [loading, setLoading] = useState(false);
  38. const [ahhEnable, setAhhEnable] = useState(false);
  39. const [ahEnable, setAhEnable] = useState(false);
  40. const [alEnable, setAlEnable] = useState(false);
  41. const [allEnable, setAllEnable] = useState(false);
  42. const [showMore, setShowMore] = useState(false);
  43. const [alarmId, setAlarmId] = useState(null);
  44. const onModalOk = useMemoizedFn(async () => {
  45. const isNull = (val, bool) => {
  46. if (bool) {
  47. return Number(val);
  48. } else {
  49. return ["", undefined, null].indexOf(val) === -1 ? Number(val) : -9999;
  50. }
  51. };
  52. const isBool = (bool) => {
  53. return bool ? bool : false;
  54. };
  55. if (alarmId == -1) {
  56. let bool = false;
  57. if (["", undefined, null].indexOf(dateTime) !== -1 && status === 1) {
  58. setDateTime(undefined);
  59. bool = true;
  60. }
  61. const value = await form.validateFields();
  62. if (bool) {
  63. return;
  64. }
  65. if (
  66. (value?.ahh_enable && value?.ahh_value === "-9999") ||
  67. (value?.ah_enable && value?.ah_value === "-9999") ||
  68. (value?.al_enable && value?.al_value === "-9999") ||
  69. (value?.all_enable && value?.all_value === "-9999")
  70. ) {
  71. message.error(`${
  72. value?.ahh_enable && value?.ahh_value === "-9999" ? "上上限;" : ""
  73. }
  74. ${value?.ah_enable && value?.ah_value === "-9999" ? "上限;" : ""}
  75. ${value?.al_enable && value?.al_value === "-9999" ? "下限;" : ""}
  76. ${value?.all_enable && value?.all_value === "-9999" ? "下下限;" : ""}
  77. 禁止输入-9999`);
  78. return;
  79. }
  80. setLoading(true);
  81. let details = {};
  82. if (value?.sub_type === 13) {
  83. details = {
  84. alarm_value: isNull(value?.alarm_value),
  85. };
  86. } else {
  87. details = {
  88. ahh_value: isNull(value?.ahh_value, isBool(value?.ahh_enable)),
  89. ahh_enable: isBool(value?.ahh_enable),
  90. ah_value: isNull(value?.ah_value, isBool(value?.ah_enable)),
  91. ah_enable: isBool(value?.ah_enable),
  92. al_value: isNull(value?.al_value, isBool(value?.al_enable)),
  93. al_enable: isBool(value?.al_enable),
  94. all_value: isNull(value?.all_value, isBool(value?.all_enable)),
  95. all_enable: isBool(value?.all_enable),
  96. };
  97. }
  98. delete value.alarm_value;
  99. delete value?.ahh_value;
  100. delete value?.ahh_enable;
  101. delete value?.ah_value;
  102. delete value?.ah_enable;
  103. delete value?.al_value;
  104. delete value?.al_enable;
  105. delete value?.all_value;
  106. delete value?.all_enable;
  107. const obj = {
  108. ...value,
  109. point_name: value?.point_name?.split("<==>")[0],
  110. threshold_high: value.threshold_high?.toString().trim()
  111. ? Number(value.threshold_high?.toString().trim())
  112. : null,
  113. threshold_low: value.threshold_low?.toString().trim()
  114. ? Number(value.threshold_low?.toString().trim())
  115. : null,
  116. ext_notify_list: [],
  117. high_enabled: value.threshold_high?.toString().trim() ? true : false,
  118. low_enabled: value.threshold_low?.toString().trim() ? true : false,
  119. status: 1,
  120. defer_unit: deferUnit,
  121. defer_seconds: Number(dateTime) ?? 0,
  122. type: 1,
  123. sub_type: value?.sub_type,
  124. group_id: value?.group_id ?? 0,
  125. details,
  126. };
  127. API2.addRule(obj)
  128. .then((res) => {
  129. if (res?.state === 0) {
  130. message.success("保存成功");
  131. form.resetFields();
  132. props.onConfirm();
  133. }
  134. })
  135. .finally(() => {
  136. setLoading(false);
  137. });
  138. } else {
  139. let bool = false;
  140. if (["", undefined, null].indexOf(dateTime) !== -1 && status === 1) {
  141. setDateTime(undefined);
  142. bool = true;
  143. }
  144. const value = await form.validateFields();
  145. if (bool) {
  146. return;
  147. }
  148. if (
  149. (value?.ahh_enable && value?.ahh_value === "-9999") ||
  150. (value?.ah_enable && value?.ah_value === "-9999") ||
  151. (value?.al_enable && value?.al_value === "-9999") ||
  152. (value?.all_enable && value?.all_value === "-9999")
  153. ) {
  154. message.error(`${
  155. value?.ahh_enable && value?.ahh_value === "-9999" ? "上上限;" : ""
  156. }
  157. ${value?.ah_enable && value?.ah_value === "-9999" ? "上限;" : ""}
  158. ${value?.al_enable && value?.al_value === "-9999" ? "下限;" : ""}
  159. ${value?.all_enable && value?.all_value === "-9999" ? "下下限;" : ""}
  160. 禁止输入-9999`);
  161. return;
  162. }
  163. setLoading(true);
  164. let details = {};
  165. if (value?.sub_type === 13) {
  166. console.log(value?.alarm_value);
  167. details = {
  168. alarm_value: isNull(value?.alarm_value),
  169. };
  170. } else {
  171. details = {
  172. ahh_value: isNull(value?.ahh_value, isBool(value?.ahh_enable)),
  173. ahh_enable: isBool(value?.ahh_enable),
  174. ah_value: isNull(value?.ah_value, isBool(value?.ah_enable)),
  175. ah_enable: isBool(value?.ah_enable),
  176. al_value: isNull(value?.al_value, isBool(value?.al_enable)),
  177. al_enable: isBool(value?.al_enable),
  178. all_value: isNull(value?.all_value, isBool(value?.all_enable)),
  179. all_enable: isBool(value?.all_enable),
  180. };
  181. }
  182. delete value.alarm_value;
  183. delete value?.ahh_value;
  184. delete value?.ahh_enable;
  185. delete value?.ah_value;
  186. delete value?.ah_enable;
  187. delete value?.al_value;
  188. delete value?.al_enable;
  189. delete value?.all_value;
  190. delete value?.all_enable;
  191. delete data?.Details;
  192. const obj = {
  193. ...data,
  194. ...value,
  195. point_name: value?.point_name?.split("<==>")[0],
  196. threshold_high: value.threshold_high?.toString().trim()
  197. ? Number(value.threshold_high?.toString().trim())
  198. : null,
  199. threshold_low: value.threshold_low?.toString().trim()
  200. ? Number(value.threshold_low?.toString().trim())
  201. : null,
  202. high_enabled: value.threshold_high?.toString().trim() ? true : false,
  203. low_enabled: value.threshold_low?.toString().trim() ? true : false,
  204. defer_unit: deferUnit,
  205. defer_seconds: dateTime ? Number(dateTime) : 0,
  206. type: 1,
  207. sub_type: value?.sub_type,
  208. group_id: value?.group_id ?? 0,
  209. details,
  210. };
  211. API2.editRule(obj)
  212. .then((res) => {
  213. if (res?.state === 0) {
  214. message.success("保存成功");
  215. form.resetFields();
  216. props.onConfirm();
  217. }
  218. })
  219. .finally(() => {
  220. setLoading(false);
  221. });
  222. }
  223. });
  224. useImperativeHandle(ref, () => {
  225. return {
  226. ok: onModalOk,
  227. };
  228. });
  229. useEffect(() => {
  230. onSearch("");
  231. }, []);
  232. useEffect(() => {
  233. async function run() {
  234. if (alarmId && alarmId !== -1) {
  235. const { state, data } = await API2.detailAlarm(Number(alarmId));
  236. setData(data);
  237. setDeferUnit(data?.defer_unit);
  238. setStatus(data.defer_seconds > 0 ? 1 : 2);
  239. setDateTime(data?.defer_seconds);
  240. }
  241. }
  242. run();
  243. }, [alarmId]);
  244. useEffect(() => {
  245. async function run() {
  246. if (editId && editId !== -1) {
  247. setAlarmId(editId);
  248. } else if (pointId && pointId !== -1) {
  249. const res = await API2.getRuleIdByPointId(pointId);
  250. setAlarmId(res?.data?.[0]?.id);
  251. }
  252. }
  253. run();
  254. }, [editId, pointId]);
  255. useEffect(() => {
  256. if (data) {
  257. setSubType(data.sub_type);
  258. setDeferUnit(data?.defer_unit);
  259. setStatus(data.defer_seconds > 0 ? 1 : 2);
  260. setDateTime(data.defer_seconds);
  261. setIsDisabled(false);
  262. setAllEnable(data?.Details.all_enable);
  263. setAlEnable(data?.Details.al_enable);
  264. setAhEnable(data?.Details.ah_enable);
  265. setAhhEnable(data?.Details.ahh_enable);
  266. form.setFieldsValue({
  267. threshold_high: data.threshold_high,
  268. threshold_low: data.threshold_low,
  269. point_name: data.point_name,
  270. point_id: data.point_id,
  271. name: data.name,
  272. unit: data.unit,
  273. alarm_level: data.alarm_level,
  274. sub_type: data.sub_type,
  275. group_id: data.group_id,
  276. defer_unit: data.defer_unit ? data.defer_unit : undefined,
  277. defer_seconds: data.defer_seconds,
  278. ...(data.sub_type === 13
  279. ? {
  280. alarm_value: data?.Details.alarm_value,
  281. }
  282. : {
  283. ahh_value:
  284. data?.Details.ahh_value !== -9999
  285. ? data?.Details.ahh_value
  286. : null,
  287. ahh_enable: data?.Details.ahh_enable,
  288. ah_value:
  289. data?.Details.ah_value !== -9999
  290. ? data?.Details.ah_value
  291. : null,
  292. ah_enable: data?.Details.ah_enable,
  293. al_value:
  294. data?.Details.al_value !== -9999
  295. ? data?.Details.al_value
  296. : null,
  297. al_enable: data?.Details.al_enable,
  298. all_value:
  299. data?.Details.all_value !== -9999
  300. ? data?.Details.all_value
  301. : null,
  302. all_enable: data?.Details.all_enable,
  303. }),
  304. });
  305. } else {
  306. form.setFieldsValue({
  307. alarm_level: 1,
  308. sub_type: 13,
  309. });
  310. setSubType(13);
  311. }
  312. }, [data]);
  313. const onChange = (e) => {
  314. // console.log(`selected ${e}`);
  315. console.log(e);
  316. setIsDisabled(false);
  317. setDeferUnit(Number(e.value.split("<==>")[1]));
  318. form.setFieldsValue({
  319. name: e.value.split("<==>")[0],
  320. point_id: e.key,
  321. });
  322. };
  323. const [pointList, setPointList] = useState([]);
  324. const onSearch = async (value) => {
  325. const res = await API2.searchPoint({
  326. key_word: value ?? "",
  327. count: 50,
  328. type: 1,
  329. no_child: true,
  330. });
  331. if (res.state === 0) {
  332. setPointList(res.data || []);
  333. return;
  334. }
  335. setPointList([]);
  336. };
  337. const onModalCancel = () => {
  338. props.onConfirm();
  339. form.resetFields();
  340. };
  341. const onValuesChange = (changedValues, allValues) => {
  342. console.log(changedValues, allValues, "changedValues, allValues");
  343. if (changedValues.hasOwnProperty("sub_type")) {
  344. setSubType(changedValues?.sub_type);
  345. if (
  346. changedValues?.sub_type === 14 &&
  347. allValues.hasOwnProperty("ahh_enable") === false &&
  348. allValues.hasOwnProperty("ah_enable") === false &&
  349. allValues.hasOwnProperty("al_enable") === false &&
  350. allValues.hasOwnProperty("all_enable") === false
  351. ) {
  352. setAllEnable(true);
  353. setAlEnable(true);
  354. setAhEnable(true);
  355. setAhhEnable(true);
  356. form.setFieldsValue({
  357. ahh_enable: true,
  358. ah_enable: true,
  359. al_enable: true,
  360. all_enable: true,
  361. });
  362. }
  363. }
  364. if (changedValues.hasOwnProperty("all_enable")) {
  365. setAllEnable(changedValues?.all_enable);
  366. }
  367. if (changedValues.hasOwnProperty("al_enable")) {
  368. setAlEnable(changedValues?.al_enable);
  369. }
  370. if (changedValues.hasOwnProperty("ah_enable")) {
  371. setAhEnable(changedValues?.ah_enable);
  372. }
  373. if (changedValues.hasOwnProperty("ahh_enable")) {
  374. setAhhEnable(changedValues?.ahh_enable);
  375. }
  376. };
  377. return (
  378. <Form
  379. className={styles.wrapper}
  380. name="basic"
  381. autoComplete="off"
  382. form={form}
  383. // requiredMark={false}
  384. labelAlign="right"
  385. colon={false}
  386. labelCol={{
  387. span: 7,
  388. }}
  389. onValuesChange={onValuesChange}
  390. wrapperCol={{
  391. span: 17,
  392. }}
  393. >
  394. <Form.Item label={TranslateText(["告警类型", "Mode"])} name={"sub_type"}>
  395. <Radio.Group disabled={alarmId !== -1}>
  396. <Radio value={13}>离散报警</Radio>
  397. <Radio value={14}>限值报警</Radio>
  398. </Radio.Group>
  399. </Form.Item>
  400. <Form.Item
  401. label={TranslateText(["点位名称", "Point name"])}
  402. name="point_name"
  403. rules={[
  404. {
  405. required: true,
  406. message: TranslateText(["请输入点位名称", "Please input"]),
  407. },
  408. ]}
  409. getValueFromEvent={(e) => e.value}
  410. >
  411. <Select
  412. showSearch
  413. disabled={alarmId !== -1}
  414. filterOption={false}
  415. dropdownMatchSelectWidth={400}
  416. labelInValue={true}
  417. onChange={(e) => {
  418. onChange(e);
  419. }}
  420. onSearch={onSearch}
  421. placeholder={TranslateText(["请输入点位名称", "Please input"])}
  422. style={{ width: "240px" }}
  423. >
  424. {pointList.map((item, index) => {
  425. return (
  426. <Select.Option
  427. value={
  428. item.name + "<==>" + item.defer_unit + "<==>" + item.point_id
  429. }
  430. key={item.point_id}
  431. >
  432. {item.name}({item.point_id})(
  433. {item.defer_unit === 1 ? "秒级" : "分钟级"})
  434. </Select.Option>
  435. );
  436. })}
  437. </Select>
  438. </Form.Item>
  439. <Form.Item
  440. label={TranslateText(["点位编号", "Point id"])}
  441. name="point_id"
  442. style={{ display: alarmId === -1 ? "none" : "" }}
  443. >
  444. <Input
  445. placeholder={TranslateText(["请输入point_id", "Please input"])}
  446. disabled={alarmId !== -1}
  447. style={{ width: "240px" }}
  448. />
  449. </Form.Item>
  450. <Form.Item
  451. label={TranslateText(["告警名称", "Alarm name"])}
  452. name="name"
  453. rules={[
  454. {
  455. required: true,
  456. message: TranslateText(["请输入告警名称", "Please input"]),
  457. },
  458. ]}
  459. >
  460. <Input
  461. placeholder={TranslateText(["请输入告警名称", "Please input"])}
  462. style={{ width: "240px" }}
  463. />
  464. </Form.Item>
  465. {subType === 13 && (
  466. <Form.Item
  467. label={TranslateText(["告警值", "Alarm value"])}
  468. name="alarm_value"
  469. required={false}
  470. rules={[
  471. {
  472. required: true,
  473. message: TranslateText(["请输入告警值", "Please input"]),
  474. },
  475. () => ({
  476. validator(rule, value) {
  477. let regPos =
  478. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  479. let regNeg =
  480. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  481. if (regPos.test(value) || regNeg.test(value)) {
  482. //if中是正则表达是,判断是否是6位数字
  483. return Promise.resolve();
  484. } else {
  485. if (!Boolean(value)) return Promise.resolve();
  486. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  487. }
  488. },
  489. }),
  490. ]}
  491. >
  492. <Input
  493. placeholder={TranslateText(["请输入告警值", "Please input"])}
  494. style={{ width: "240px" }}
  495. />
  496. </Form.Item>
  497. )}
  498. {subType === 14 && (
  499. <>
  500. <Form.Item label={TranslateText(["上上限", "Ultra upper limit"])}>
  501. <Space size={20}>
  502. <Form.Item
  503. name="ahh_value"
  504. key={ahhEnable}
  505. noStyle
  506. rules={[
  507. {
  508. required: ahhEnable,
  509. message: TranslateText(["请输入上上限", "Please input"]),
  510. },
  511. () => ({
  512. validator(rule, value) {
  513. let regPos =
  514. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  515. let regNeg =
  516. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  517. if (regPos.test(value) || regNeg.test(value)) {
  518. //if中是正则表达是,判断是否是6位数字
  519. return Promise.resolve();
  520. } else {
  521. if (!Boolean(value)) return Promise.resolve();
  522. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  523. }
  524. },
  525. }),
  526. ]}
  527. >
  528. <Input
  529. placeholder={TranslateText(["请输入", "Please input"])}
  530. style={{ width: "240px" }}
  531. />
  532. </Form.Item>
  533. <Form.Item
  534. label={""}
  535. name="ahh_enable"
  536. valuePropName="checked"
  537. noStyle
  538. >
  539. <Switch size={"small"} />
  540. </Form.Item>
  541. </Space>
  542. </Form.Item>
  543. <Form.Item label={TranslateText(["上限", "Upper limit"])}>
  544. <Space size={20}>
  545. <Form.Item
  546. name="ah_value"
  547. key={ahEnable}
  548. noStyle
  549. rules={[
  550. {
  551. required: ahEnable,
  552. message: TranslateText(["请输入上限", "Please input"]),
  553. },
  554. () => ({
  555. validator(rule, value) {
  556. let regPos =
  557. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  558. let regNeg =
  559. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  560. if (regPos.test(value) || regNeg.test(value)) {
  561. //if中是正则表达是,判断是否是6位数字
  562. return Promise.resolve();
  563. } else {
  564. if (!Boolean(value)) return Promise.resolve();
  565. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  566. }
  567. },
  568. }),
  569. ]}
  570. >
  571. <Input
  572. placeholder={TranslateText(["请输入", "Please input"])}
  573. style={{ width: "240px" }}
  574. />
  575. </Form.Item>
  576. <Form.Item name="ah_enable" valuePropName="checked" noStyle>
  577. <Switch size={"small"} />
  578. </Form.Item>
  579. </Space>
  580. </Form.Item>
  581. <Form.Item label={TranslateText(["下限", "Lower limit"])}>
  582. <Space size={20}>
  583. <Form.Item
  584. name="al_value"
  585. key={alEnable}
  586. noStyle
  587. rules={[
  588. {
  589. required: alEnable,
  590. message: TranslateText(["请输入下限", "Please input"]),
  591. },
  592. () => ({
  593. validator(rule, value) {
  594. let regPos =
  595. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  596. let regNeg =
  597. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  598. if (regPos.test(value) || regNeg.test(value)) {
  599. //if中是正则表达是,判断是否是6位数字
  600. return Promise.resolve();
  601. } else {
  602. if (!Boolean(value)) return Promise.resolve();
  603. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  604. }
  605. },
  606. }),
  607. ]}
  608. >
  609. <Input
  610. placeholder={TranslateText(["请输入", "Please input"])}
  611. style={{ width: "240px" }}
  612. />
  613. </Form.Item>
  614. <Form.Item name="al_enable" valuePropName="checked" noStyle>
  615. <Switch size={"small"} />
  616. </Form.Item>
  617. </Space>
  618. </Form.Item>
  619. <Form.Item label={TranslateText(["下下限", "Ultra lower limit"])}>
  620. <Space size={20}>
  621. <Form.Item
  622. name="all_value"
  623. key={allEnable}
  624. noStyle
  625. rules={[
  626. {
  627. required: allEnable,
  628. message: TranslateText(["请输入下下限", "Please input"]),
  629. },
  630. () => ({
  631. validator(rule, value) {
  632. let regPos =
  633. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  634. let regNeg =
  635. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  636. if (regPos.test(value) || regNeg.test(value)) {
  637. //if中是正则表达是,判断是否是6位数字
  638. return Promise.resolve();
  639. } else {
  640. if (!Boolean(value)) return Promise.resolve();
  641. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  642. }
  643. },
  644. }),
  645. ]}
  646. >
  647. <Input
  648. placeholder={TranslateText(["请输入", "Please input"])}
  649. style={{ width: "240px" }}
  650. />
  651. </Form.Item>
  652. <Form.Item name="all_enable" valuePropName="checked" noStyle>
  653. <Switch size={"small"} />
  654. </Form.Item>
  655. </Space>
  656. </Form.Item>
  657. </>
  658. )}
  659. <Form.Item
  660. label={TranslateText(["告警级别", "Level"])}
  661. required={false}
  662. name="alarm_level"
  663. rules={[
  664. {
  665. required: true,
  666. message: TranslateText(["请输入告警级别", "Please input"]),
  667. },
  668. ]}
  669. >
  670. <Select
  671. placeholder={TranslateText(["请选择", "Please choose"])}
  672. style={{ width: "240px" }}
  673. >
  674. <Select.Option value={1}>
  675. {TranslateText(["低", "Low"])}
  676. </Select.Option>
  677. <Select.Option value={2}>
  678. {TranslateText(["中", "Medium"])}
  679. </Select.Option>
  680. <Select.Option value={3}>
  681. {TranslateText(["高", "High"])}
  682. </Select.Option>
  683. </Select>
  684. </Form.Item>
  685. {!showMore && (
  686. <Form.Item
  687. label={
  688. <Button
  689. type="link"
  690. onClick={() => {
  691. setShowMore(true);
  692. }}
  693. >
  694. 更多
  695. </Button>
  696. }
  697. ></Form.Item>
  698. )}
  699. {showMore && (
  700. <>
  701. <Form.Item
  702. label={TranslateText(["单位", "Unit"])}
  703. name="unit"
  704. rules={[
  705. {
  706. required: false,
  707. message: TranslateText(["请输入单位", "Please input"]),
  708. },
  709. ]}
  710. >
  711. <Input
  712. placeholder={TranslateText(["请输入", "Please input"])}
  713. style={{ width: "240px" }}
  714. />
  715. </Form.Item>
  716. <Form.Item
  717. label={TranslateText(["告警组", "Group"])}
  718. name={"group_id"}
  719. >
  720. <Select
  721. style={{ width: 240 }}
  722. options={[
  723. ...[
  724. {
  725. label: "未分组",
  726. value: 0,
  727. },
  728. ],
  729. ...(groupList?.map((item) => {
  730. return {
  731. label: item?.name,
  732. value: item?.id,
  733. };
  734. }) ?? []),
  735. ]}
  736. placeholder={TranslateText(["请选择", "Please choose"])}
  737. />
  738. </Form.Item>
  739. <Form.Item
  740. name={isDisabled ? "" : "defer_seconds"}
  741. disabled={isDisabled}
  742. required={true}
  743. label={TranslateText(["延时告警", "Delayed alarm"])}
  744. >
  745. <div style={{ marginTop: 6 }}>
  746. <Radio.Group
  747. defaultValue={2}
  748. disabled={isDisabled}
  749. onChange={(e) => {
  750. setStatus(e.target.value);
  751. if (e.target.value === 1) {
  752. setDateTime(null);
  753. } else {
  754. setDateTime(0);
  755. }
  756. }}
  757. >
  758. <Radio value={1}>{TranslateText(["开启", "on"])}</Radio>
  759. <Radio value={2}>{TranslateText(["关闭", "off"])}</Radio>
  760. </Radio.Group>
  761. <div
  762. style={{
  763. display: "flex",
  764. marginTop: 10,
  765. gap: 8,
  766. alignItems: "center",
  767. }}
  768. >
  769. <span
  770. style={{
  771. color: "var(--dt-text-color1)",
  772. fontWeight: 400,
  773. fontSize: 14,
  774. }}
  775. >
  776. {TranslateText(["持续", "Alarm after"])}
  777. </span>
  778. <Input
  779. disabled={status !== 1 || isDisabled}
  780. value={dateTime}
  781. onChange={(e) => {
  782. console.log(e.target.value);
  783. setDateTime(e.target.value?.replace(/\D/g, ""));
  784. }}
  785. placeholder={TranslateText(["请输入", "Please input"])}
  786. style={{ width: 100 }}
  787. />
  788. <span
  789. style={{
  790. color: "var(--dt-text-color1)",
  791. fontWeight: 400,
  792. fontSize: 14,
  793. }}
  794. >
  795. {deferUnit === 1
  796. ? TranslateText(["秒", "seconds"])
  797. : TranslateText(["分钟", "minutes"])}{" "}
  798. {TranslateText(["后报警", "of duration"])}
  799. </span>
  800. </div>
  801. {dateTime !== null &&
  802. ["", undefined, null].indexOf(dateTime) !== -1 &&
  803. status === 1 &&
  804. !isDisabled && (
  805. <div style={{ color: "var(--dt-error-color1)" }}>
  806. 请输入数字
  807. </div>
  808. )}
  809. </div>
  810. </Form.Item>
  811. </>
  812. )}
  813. </Form>
  814. );
  815. };
  816. export default forwardRef(Easy);