easy.jsx 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  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(false);
  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. unit: res?.data?.[0]?.unit,
  346. });
  347. }
  348. setDeferUnit(res?.data?.[0]?.defer_unit);
  349. }
  350. }
  351. };
  352. run();
  353. }, [data, props.pointId]);
  354. const onChange = (e) => {
  355. // console.log(`selected ${e}`);
  356. console.log(e);
  357. setIsDisabled(false);
  358. setDeferUnit(Number(e.value.split("<==>")[1]));
  359. form.setFieldsValue({
  360. name: e.value.split("<==>")[0],
  361. point_id: e.key,
  362. unit: e.value.split("<==>")[3],
  363. });
  364. };
  365. const [pointList, setPointList] = useState([]);
  366. const onSearch = async (value) => {
  367. const res = await API2.searchPoint({
  368. key_word: value ?? "",
  369. count: 50,
  370. type: 1,
  371. no_child: true,
  372. });
  373. if (res.state === 0) {
  374. setPointList(res.data || []);
  375. return;
  376. }
  377. setPointList([]);
  378. };
  379. const onModalCancel = () => {
  380. props.onConfirm();
  381. form.resetFields();
  382. };
  383. const onValuesChange = (changedValues, allValues) => {
  384. console.log(changedValues, allValues, "changedValues, allValues");
  385. if (changedValues.hasOwnProperty("sub_type")) {
  386. setSubType(changedValues?.sub_type);
  387. if (
  388. changedValues?.sub_type === 14 &&
  389. allValues.hasOwnProperty("ahh_enable") === false &&
  390. allValues.hasOwnProperty("ah_enable") === false &&
  391. allValues.hasOwnProperty("al_enable") === false &&
  392. allValues.hasOwnProperty("all_enable") === false
  393. ) {
  394. setAllEnable(true);
  395. setAlEnable(true);
  396. setAhEnable(true);
  397. setAhhEnable(true);
  398. form.setFieldsValue({
  399. ahh_enable: true,
  400. ah_enable: true,
  401. al_enable: true,
  402. all_enable: true,
  403. });
  404. }
  405. }
  406. if (changedValues.hasOwnProperty("all_enable")) {
  407. setAllEnable(changedValues?.all_enable);
  408. }
  409. if (changedValues.hasOwnProperty("al_enable")) {
  410. setAlEnable(changedValues?.al_enable);
  411. }
  412. if (changedValues.hasOwnProperty("ah_enable")) {
  413. setAhEnable(changedValues?.ah_enable);
  414. }
  415. if (changedValues.hasOwnProperty("ahh_enable")) {
  416. setAhhEnable(changedValues?.ahh_enable);
  417. }
  418. };
  419. return (
  420. <Form
  421. className={styles.wrapper}
  422. name="basic"
  423. autoComplete="off"
  424. form={form}
  425. // requiredMark={false}
  426. labelAlign="right"
  427. colon={false}
  428. labelCol={{
  429. span: 7,
  430. }}
  431. onValuesChange={onValuesChange}
  432. wrapperCol={{
  433. span: 17,
  434. }}
  435. >
  436. <Form.Item label={TranslateText(["告警类型", "Mode"])} name={"sub_type"}>
  437. <Radio.Group disabled={alarmId !== -1}>
  438. <Radio value={14}>限值报警</Radio>
  439. <Radio value={13}>离散报警</Radio>
  440. </Radio.Group>
  441. </Form.Item>
  442. <Form.Item
  443. label={TranslateText(["点位名称", "Point name"])}
  444. name="point_name"
  445. rules={[
  446. {
  447. required: true,
  448. message: TranslateText(["请输入点位名称", "Please input"]),
  449. },
  450. ]}
  451. getValueFromEvent={(e) => e.value}
  452. >
  453. <Select
  454. showSearch
  455. disabled={alarmId !== -1 || props.readonly}
  456. filterOption={false}
  457. dropdownMatchSelectWidth={400}
  458. labelInValue={true}
  459. onChange={(e) => {
  460. onChange(e);
  461. }}
  462. onSearch={onSearch}
  463. placeholder={TranslateText(["请输入点位名称", "Please input"])}
  464. style={{ width: "240px" }}
  465. >
  466. {pointList.map((item, index) => {
  467. return (
  468. <Select.Option
  469. value={
  470. item.name +
  471. "<==>" +
  472. item.defer_unit +
  473. "<==>" +
  474. item.point_id +
  475. "<==>" +
  476. item.unit || ""
  477. }
  478. key={item.point_id}
  479. >
  480. {item.name}({item.point_id})(
  481. {item.defer_unit === 1 ? "秒级" : "分钟级"})
  482. </Select.Option>
  483. );
  484. })}
  485. </Select>
  486. </Form.Item>
  487. <Form.Item
  488. label={TranslateText(["点位编号", "Point id"])}
  489. name="point_id"
  490. style={{ display: alarmId === -1 && !props.readonly ? "none" : "" }}
  491. >
  492. <Input
  493. placeholder={TranslateText(["请输入point_id", "Please input"])}
  494. disabled={alarmId !== -1 || props.readonly}
  495. style={{ width: "240px" }}
  496. />
  497. </Form.Item>
  498. <Form.Item
  499. label={TranslateText(["告警名称", "Alarm name"])}
  500. name="name"
  501. rules={[
  502. {
  503. required: true,
  504. message: TranslateText(["请输入告警名称", "Please input"]),
  505. },
  506. ]}
  507. >
  508. <Input
  509. placeholder={TranslateText(["请输入告警名称", "Please input"])}
  510. style={{ width: "240px" }}
  511. />
  512. </Form.Item>
  513. {subType === 13 && (
  514. <Form.Item
  515. label={TranslateText(["告警值", "Alarm value"])}
  516. name="alarm_value"
  517. required={true}
  518. rules={[
  519. {
  520. required: true,
  521. message: TranslateText(["请输入告警值", "Please input"]),
  522. },
  523. () => ({
  524. validator(rule, value) {
  525. let regPos =
  526. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  527. let regNeg =
  528. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  529. if (regPos.test(value) || regNeg.test(value)) {
  530. //if中是正则表达是,判断是否是6位数字
  531. return Promise.resolve();
  532. } else {
  533. if (!Boolean(value)) return Promise.resolve();
  534. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  535. }
  536. },
  537. }),
  538. ]}
  539. >
  540. <Input
  541. placeholder={TranslateText(["请输入告警值", "Please input"])}
  542. style={{ width: "240px" }}
  543. />
  544. </Form.Item>
  545. )}
  546. {subType === 14 && (
  547. <>
  548. <Form.Item label={TranslateText(["上上限", "Ultra upper limit"])}>
  549. <Space size={20}>
  550. <Form.Item
  551. name="ahh_value"
  552. key={ahhEnable}
  553. noStyle
  554. rules={[
  555. {
  556. required: ahhEnable,
  557. message: TranslateText(["请输入上上限", "Please input"]),
  558. },
  559. () => ({
  560. validator(rule, value) {
  561. let regPos =
  562. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  563. let regNeg =
  564. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  565. if (regPos.test(value) || regNeg.test(value)) {
  566. //if中是正则表达是,判断是否是6位数字
  567. return Promise.resolve();
  568. } else {
  569. if (!Boolean(value)) return Promise.resolve();
  570. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  571. }
  572. },
  573. }),
  574. ]}
  575. >
  576. <Input
  577. placeholder={TranslateText(["请输入", "Please input"])}
  578. style={{ width: "240px" }}
  579. />
  580. </Form.Item>
  581. <Form.Item
  582. label={""}
  583. name="ahh_enable"
  584. valuePropName="checked"
  585. noStyle
  586. >
  587. <Switch size={"small"} />
  588. </Form.Item>
  589. </Space>
  590. </Form.Item>
  591. <Form.Item label={TranslateText(["上限", "Upper limit"])}>
  592. <Space size={20}>
  593. <Form.Item
  594. name="ah_value"
  595. key={ahEnable}
  596. noStyle
  597. rules={[
  598. {
  599. required: ahEnable,
  600. message: TranslateText(["请输入上限", "Please input"]),
  601. },
  602. () => ({
  603. validator(rule, value) {
  604. let regPos =
  605. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  606. let regNeg =
  607. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  608. if (regPos.test(value) || regNeg.test(value)) {
  609. //if中是正则表达是,判断是否是6位数字
  610. return Promise.resolve();
  611. } else {
  612. if (!Boolean(value)) return Promise.resolve();
  613. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  614. }
  615. },
  616. }),
  617. ]}
  618. >
  619. <Input
  620. placeholder={TranslateText(["请输入", "Please input"])}
  621. style={{ width: "240px" }}
  622. />
  623. </Form.Item>
  624. <Form.Item name="ah_enable" valuePropName="checked" noStyle>
  625. <Switch size={"small"} />
  626. </Form.Item>
  627. </Space>
  628. </Form.Item>
  629. <Form.Item label={TranslateText(["下限", "Lower limit"])}>
  630. <Space size={20}>
  631. <Form.Item
  632. name="al_value"
  633. key={alEnable}
  634. noStyle
  635. rules={[
  636. {
  637. required: alEnable,
  638. message: TranslateText(["请输入下限", "Please input"]),
  639. },
  640. () => ({
  641. validator(rule, value) {
  642. let regPos =
  643. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  644. let regNeg =
  645. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  646. if (regPos.test(value) || regNeg.test(value)) {
  647. //if中是正则表达是,判断是否是6位数字
  648. return Promise.resolve();
  649. } else {
  650. if (!Boolean(value)) return Promise.resolve();
  651. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  652. }
  653. },
  654. }),
  655. ]}
  656. >
  657. <Input
  658. placeholder={TranslateText(["请输入", "Please input"])}
  659. style={{ width: "240px" }}
  660. />
  661. </Form.Item>
  662. <Form.Item name="al_enable" valuePropName="checked" noStyle>
  663. <Switch size={"small"} />
  664. </Form.Item>
  665. </Space>
  666. </Form.Item>
  667. <Form.Item label={TranslateText(["下下限", "Ultra lower limit"])}>
  668. <Space size={20}>
  669. <Form.Item
  670. name="all_value"
  671. key={allEnable}
  672. noStyle
  673. rules={[
  674. {
  675. required: allEnable,
  676. message: TranslateText(["请输入下下限", "Please input"]),
  677. },
  678. () => ({
  679. validator(rule, value) {
  680. let regPos =
  681. /^(([^0][0-9]+|0)\.([0-9])$)|^(([^0][0-9]+|0)$)|^(([1-9]+)\.([0-9])$)|^(([1-9]+)$)/;
  682. let regNeg =
  683. /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  684. if (regPos.test(value) || regNeg.test(value)) {
  685. //if中是正则表达是,判断是否是6位数字
  686. return Promise.resolve();
  687. } else {
  688. if (!Boolean(value)) return Promise.resolve();
  689. return Promise.reject("只能输入整数、小数或负数"); //如果违反规则,就会给出提示
  690. }
  691. },
  692. }),
  693. ]}
  694. >
  695. <Input
  696. placeholder={TranslateText(["请输入", "Please input"])}
  697. style={{ width: "240px" }}
  698. />
  699. </Form.Item>
  700. <Form.Item name="all_enable" valuePropName="checked" noStyle>
  701. <Switch size={"small"} />
  702. </Form.Item>
  703. </Space>
  704. </Form.Item>
  705. </>
  706. )}
  707. <Form.Item
  708. label={TranslateText(["告警级别", "Level"])}
  709. required={false}
  710. name="alarm_level"
  711. rules={[
  712. {
  713. required: true,
  714. message: TranslateText(["请输入告警级别", "Please input"]),
  715. },
  716. ]}
  717. >
  718. <Select
  719. placeholder={TranslateText(["请选择", "Please choose"])}
  720. style={{ width: "240px" }}
  721. >
  722. <Select.Option value={1}>
  723. {TranslateText(["低", "Low"])}
  724. </Select.Option>
  725. <Select.Option value={2}>
  726. {TranslateText(["中", "Medium"])}
  727. </Select.Option>
  728. <Select.Option value={3}>
  729. {TranslateText(["高", "High"])}
  730. </Select.Option>
  731. </Select>
  732. </Form.Item>
  733. <Form.Item label="告警开关" name="status">
  734. <Switch size={"small"} />
  735. </Form.Item>
  736. {!showMore && (
  737. <Form.Item
  738. label={
  739. <Button
  740. type="link"
  741. onClick={() => {
  742. setShowMore(true);
  743. }}
  744. >
  745. 更多
  746. <DownOutlined></DownOutlined>
  747. </Button>
  748. }
  749. ></Form.Item>
  750. )}
  751. {showMore && (
  752. <>
  753. <Form.Item
  754. label={TranslateText(["单位", "Unit"])}
  755. name="unit"
  756. rules={[
  757. {
  758. required: false,
  759. message: TranslateText(["请输入单位", "Please input"]),
  760. },
  761. ]}
  762. >
  763. <Input
  764. placeholder={TranslateText(["请输入", "Please input"])}
  765. style={{ width: "240px" }}
  766. />
  767. </Form.Item>
  768. <Form.Item
  769. label={TranslateText(["告警组", "Group"])}
  770. name={"group_id"}
  771. >
  772. <Select
  773. style={{ width: 240 }}
  774. options={[
  775. ...[
  776. {
  777. label: "未分组",
  778. value: 0,
  779. },
  780. ],
  781. ...(groupList?.map((item) => {
  782. return {
  783. label: item?.name,
  784. value: item?.id,
  785. };
  786. }) ?? []),
  787. ]}
  788. placeholder={TranslateText(["请选择", "Please choose"])}
  789. />
  790. </Form.Item>
  791. <Form.Item
  792. name={isDisabled ? "" : "defer_seconds"}
  793. disabled={isDisabled}
  794. required={true}
  795. label={TranslateText(["延时告警", "Delayed alarm"])}
  796. >
  797. <div style={{ marginTop: 6 }}>
  798. <Radio.Group
  799. value={status}
  800. disabled={isDisabled}
  801. onChange={(e) => {
  802. setStatus(e.target.value);
  803. if (e.target.value === 1) {
  804. setDateTime(null);
  805. } else {
  806. setDateTime(0);
  807. }
  808. }}
  809. >
  810. <Radio value={1}>{TranslateText(["开启", "on"])}</Radio>
  811. <Radio value={2}>{TranslateText(["关闭", "off"])}</Radio>
  812. </Radio.Group>
  813. <div
  814. style={{
  815. display: "flex",
  816. marginTop: 10,
  817. gap: 8,
  818. alignItems: "center",
  819. }}
  820. >
  821. <span
  822. style={{
  823. color: "var(--dt-text-color1)",
  824. fontWeight: 400,
  825. fontSize: 14,
  826. }}
  827. >
  828. {TranslateText(["持续", "Alarm after"])}
  829. </span>
  830. <Input
  831. disabled={status !== 1 || isDisabled}
  832. value={dateTime}
  833. onChange={(e) => {
  834. console.log(e.target.value);
  835. setDateTime(e.target.value?.replace(/\D/g, ""));
  836. }}
  837. placeholder={TranslateText(["请输入", "Please input"])}
  838. style={{ width: 100 }}
  839. />
  840. <span
  841. style={{
  842. color: "var(--dt-text-color1)",
  843. fontWeight: 400,
  844. fontSize: 14,
  845. }}
  846. >
  847. {deferUnit === 1
  848. ? TranslateText(["秒", "seconds"])
  849. : TranslateText(["分钟", "minutes"])}{" "}
  850. {TranslateText(["后报警", "of duration"])}
  851. </span>
  852. </div>
  853. {dateTime !== null &&
  854. ["", undefined, null].indexOf(dateTime) !== -1 &&
  855. status === 1 &&
  856. !isDisabled && (
  857. <div style={{ color: "var(--dt-error-color1)" }}>
  858. 请输入数字
  859. </div>
  860. )}
  861. </div>
  862. </Form.Item>
  863. </>
  864. )}
  865. {showMore && (
  866. <Form.Item
  867. label={
  868. <Button
  869. type="link"
  870. onClick={() => {
  871. setShowMore(false);
  872. }}
  873. >
  874. 收起<UpOutlined></UpOutlined>
  875. </Button>
  876. }
  877. ></Form.Item>
  878. )}
  879. </Form>
  880. );
  881. };
  882. export default forwardRef(Easy);