easy.jsx 26 KB

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