easy.jsx 30 KB

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