easy.jsx 27 KB

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