easy.jsx 28 KB

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