easy.jsx 31 KB

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