easy.jsx 32 KB

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