From 66bf130b492a4d19f01eac6bd5cd601031cad66e Mon Sep 17 00:00:00 2001
From: JINGYJ <1458671527@qq.com>
Date: Mon, 1 Apr 2024 10:39:33 +0800
Subject: [PATCH] =?UTF-8?q?fect:=20=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 config/routes.ts                              |  12 +-
 src/app.tsx                                   |  24 +-
 src/pages/Alarm/InvolvedList/index.tsx        |  36 ++-
 .../components/UpdateForm.tsx                 | 200 +++++++++++++
 .../components/UpdateMultiForm.tsx            | 234 +++++++++++++++
 .../components/UpdateTimeForm.tsx             | 223 ++++++++++++++
 .../components/updateForm.less                |   8 +
 src/pages/Alarm/OfflineAlarmRules/index.tsx   | 277 ++++++++++++++++++
 src/pages/User/Login/index1.tsx               |  24 +-
 9 files changed, 1006 insertions(+), 32 deletions(-)
 create mode 100644 src/pages/Alarm/OfflineAlarmRules/components/UpdateForm.tsx
 create mode 100644 src/pages/Alarm/OfflineAlarmRules/components/UpdateMultiForm.tsx
 create mode 100644 src/pages/Alarm/OfflineAlarmRules/components/UpdateTimeForm.tsx
 create mode 100644 src/pages/Alarm/OfflineAlarmRules/components/updateForm.less
 create mode 100644 src/pages/Alarm/OfflineAlarmRules/index.tsx

diff --git a/config/routes.ts b/config/routes.ts
index a7aa996..c751f1a 100644
--- a/config/routes.ts
+++ b/config/routes.ts
@@ -412,12 +412,12 @@ export default [
         path: '/offline/videoAnalysis',
         component: 'VideoAnalysis',
       },
-      // {
-      //   name: 'alarm-list',
-      //   path: '/offline/alarm-list',
-      //   component: 'Alarm/AlarmList',
-      //   access: 'canReadMenu',
-      // },
+      {
+        name: 'OfflineAlarmRules',
+        path: '/offline/OfflineAlarmRules',
+        component: 'Alarm/OfflineAlarmRules',
+        access: 'canReadMenu',
+      },
       {
         name: 'involved-list-upload',
         path: '/offline/involved-list-upload',
diff --git a/src/app.tsx b/src/app.tsx
index b3092b7..f9afe31 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -98,7 +98,7 @@ export async function getInitialState(): Promise<{
                     "name": "involved-list",
                     "path": "/realTime/involved-list",
                     "routes": [],
-                    "title": "重点关注",
+                    "title": "告警汇总",
                   }
                 ]
               },
@@ -151,16 +151,16 @@ export async function getInitialState(): Promise<{
                     "routes": [],
                     "title": "视频分析",
                   },
-                  // {
-                  //   "access": "",
-                  //   "component": "Alarm/AlarmRules",
-                  //   "icon": "",
-                  //   "key": "",
-                  //   "name": "alarm_rules",
-                  //   "path": "/offline/alarm_rules",
-                  //   "routes": [],
-                  //   "title": "告警规则",
-                  // },
+                  {
+                    "access": "",
+                    "component": "Alarm/OfflineAlarmRules",
+                    "icon": "",
+                    "key": "",
+                    "name": "OfflineAlarmRules",
+                    "path": "/offline/OfflineAlarmRules",
+                    "routes": [],
+                    "title": "告警规则",
+                  },
                   {
                     "access": "",
                     "component": "Alarm/InvolvedListUpload",
@@ -169,7 +169,7 @@ export async function getInitialState(): Promise<{
                     "name": "involved-list-upload",
                     "path": "/offline/involved-list-upload",
                     "routes": [],
-                    "title": "重点关注(上传)",
+                    "title": "告警汇总",
                   }
                 ]
               },
diff --git a/src/pages/Alarm/InvolvedList/index.tsx b/src/pages/Alarm/InvolvedList/index.tsx
index 1491163..47a7295 100644
--- a/src/pages/Alarm/InvolvedList/index.tsx
+++ b/src/pages/Alarm/InvolvedList/index.tsx
@@ -1,6 +1,6 @@
 import { alarmRulesEnums } from '@/enums/status';
 import { ActionType, PageContainer, ProCard, ProList, useIntl } from '@ant-design/pro-components';
-import { Image, Modal, Tabs } from 'antd';
+import { Button, DatePicker, Image, Modal, Tabs } from 'antd';
 import React, { useEffect, useRef, useState } from 'react';
 import { proTablePaginationOptions } from '../../../../config/defaultTable';
 // import DeviceStatusCard from './components/DeviceStatusCard';
@@ -10,6 +10,7 @@ import { QuestionCircleFilled } from '@ant-design/icons';
 import InvolvedDetails from './components/InvolvedDetails';
 import moment from 'moment';
 import ImageWithPopover from './components/ImageWithPopover';
+import locale from 'antd/es/date-picker/locale/zh_CN';
 
 /**
  * @交互说明
@@ -65,6 +66,9 @@ const InvolvedList: React.FC = () => {
 
   const [tab, setTab] = useState<string>(alarmRulesEnums[0].key);
   const [tabs, setTabs] = useState<any>([]);
+  
+  const [importDate, setImportDate] = useState<any>(null);
+  const [innerDate, setInnerDate] = useState<any>(null);
   // const changeProjectTab = (key: string) => {
   //   setTab(key);
   //   console.log(key);
@@ -223,12 +227,13 @@ const InvolvedList: React.FC = () => {
   }
 
   // 初始化加载
-  async function initList(tabId:string = '1') {
+  async function initList(tabId:string = '1',date: any = null) {
     const reqParams = {
       page: currentPage,
       pageSize: currentPageSize,
       // desc: false,
       classify: tabId,
+      analyse_time: date
       // ...rest,
     };
     const resp = await getInvolvedList({ ...reqParams });
@@ -264,6 +269,12 @@ const InvolvedList: React.FC = () => {
     //   // };
     // }}
   }
+  const onChange: DatePickerProps['onChange'] = (date, dateString) => {
+    console.log(dateString);
+    setImportDate(date)
+    setInnerDate(dateString)
+    console.log(importDate,'importDate');
+  };
   useEffect(() => {
     getTabs();
     initList();
@@ -300,6 +311,27 @@ const InvolvedList: React.FC = () => {
             changeProjectTab(key);
           }}
         ></Tabs> */}
+        <div style={{ padding: '16px 16px 0'}}>
+          选择导入时间:<DatePicker locale={locale} value={importDate} onChange={onChange} allowClear />
+          <Button type="primary"
+            style={{ margin: '0 16px' }}
+              onClick={() => {
+                  // setCreateModalOpen(true);
+                  setImportDate(null);
+                  initList(tab, null)
+              }}
+            >
+              重置
+          </Button>
+          <Button type="primary"
+            onClick={() => {
+                // setCreateModalOpen(true);
+                initList(tab, innerDate)
+            }}
+          >
+            确定
+          </Button>
+        </div>
         <ProList<any>
           className="gn"
           ghost={true}
diff --git a/src/pages/Alarm/OfflineAlarmRules/components/UpdateForm.tsx b/src/pages/Alarm/OfflineAlarmRules/components/UpdateForm.tsx
new file mode 100644
index 0000000..1417e52
--- /dev/null
+++ b/src/pages/Alarm/OfflineAlarmRules/components/UpdateForm.tsx
@@ -0,0 +1,200 @@
+import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
+import { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
+import { postAlarmRules } from '@/services/alarm/AlarmRules';
+import { ModalForm, ProForm, ProFormFieldSet, ProFormSelect, ProFormSwitch, ProFormText } from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { Form, message } from 'antd';
+import React, { useState } from 'react';
+import {
+  proFormSmallItemStyleProps,
+  proFormSmallModelWidth,
+} from '../../../../../config/defaultForm';
+import styles from './updateForm.less'
+export type FormValueType = {
+  target?: string;
+  template?: string;
+  type?: string;
+  time?: string;
+  frequency?: string;
+} & Partial<API.UpdateAlarmRulesForm>;
+
+export type UpdateFormProps = {
+  updateModalOpen: boolean;
+  handleModal: () => void;
+  values: Partial<API.UpdateAlarmRulesForm>;
+  reload: any;
+};
+const UpdateForm: React.FC<UpdateFormProps> = (props) => {
+  const intl = useIntl();
+  const [form] = Form.useForm<API.UpdateAlarmRulesForm>();
+
+  return (
+    <ModalForm<any>
+      width={proFormSmallModelWidth}
+      title={intl.formatMessage({
+        id: 'alarm_rules.page.form.title',
+        defaultMessage: `编辑单人徘徊告警`,
+      })}
+      open={props.updateModalOpen}
+      form={form}
+      autoFocusFirstInput
+      modalProps={{
+        destroyOnClose: true,
+        onCancel: () => props.handleModal(),
+        okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '确认' }),
+        cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '取消' }),
+      }}
+      submitTimeout={2000}
+      onFinish={async (values) => {
+        values.id = props.values.id
+        values.is_use = values.is_use ? 1 : 0
+        // console.log(values);
+        await postAlarmRules(values)
+          .then(() => {
+            message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '成功' }));
+            props.reload();
+          })
+          .catch(() => {
+            message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
+          });
+
+        props.handleModal();
+        return true;
+      }}
+    >
+      <ProForm.Group>
+        <ProFormSwitch
+          width={proFormSmallItemStyleProps.column2Width}
+          name="is_use"
+          label={
+            <FormattedMessage
+              id="alarm_rules.page.form.isEnabled"
+              defaultMessage="启用告警"
+            />
+          }
+          checkedChildren="启用"
+          unCheckedChildren="关闭"
+          initialValue={props.values.is_use}
+          disabled={false}
+        />
+        <ProFormText
+          width={proFormSmallItemStyleProps.width}
+          name="warning_name"
+          label={<FormattedMessage id="alarm_rules.page.form.name" defaultMessage="告警名称" />}
+          placeholder={`${intl.formatMessage({
+            id: 'common.please_input',
+            defaultMessage: '请输入',
+          })}${intl.formatMessage({
+            id: 'alarm_rules.page.form.name',
+            defaultMessage: '告警名称',
+          })}`}
+          required={true}
+          initialValue={props.values.warning_name}
+          disabled={false}
+          rules={[
+            {
+              required: true,
+              message: (
+                <FormattedMessage
+                  id="alarm_rules.page.rule.required.name"
+                  defaultMessage="请填写告警名称"
+                />
+              ),
+            },
+          ]}
+        />
+        <div>触发条件</div>
+          <div style={{
+            display: 'flex',
+            flexWrap: 'wrap',
+            justifyContent: 'flex-start',
+            alignItems: 'baseline'
+          }}>
+            <span style={{ marginRight: 6 }}>当检测到风险人员单人,于</span>
+            <ProFormText
+              width={100}
+              name="time_period"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '请输入',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '触发条件',
+              })}`}
+              required={true}
+              initialValue={props.values.time_period}
+              disabled={false}
+              rules={[
+                {
+                  required: true,
+                  message: (
+                    <FormattedMessage
+                      id="alarm_rules.page.rule.required.time_interval"
+                      defaultMessage="请填写时间"
+                    />
+                  ),
+                },
+              ]}
+            />
+            <span style={{ margin: '0 6px' }}>小时内,间隔</span>
+            <ProFormText
+              width={100}
+              name="time_interval"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '请输入',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '触发条件',
+              })}`}
+              required={true}
+              initialValue={props.values.time_interval}
+              disabled={false}
+              rules={[
+                {
+                  required: true,
+                  message: (
+                    <FormattedMessage
+                      id="alarm_rules.page.rule.required.time_interval"
+                      defaultMessage="请填写时间"
+                    />
+                  ),
+                },
+              ]}
+            />
+            <span style={{ marginRight: 6 }}>小时,重复出现</span>
+            <ProFormText
+              width={100}
+              name="appear_number"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '请输入',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '触发条件',
+              })}`}
+              required={true}
+              initialValue={props.values.appear_number}
+              disabled={false}
+              rules={[
+                {
+                  required: true,
+                  message: (
+                    <FormattedMessage
+                      id="alarm_rules.page.rule.required.appear_number"
+                      defaultMessage="请填写次数"
+                    />
+                  ),
+                },
+              ]}
+            />
+            <span style={{ marginLeft: 6 }}>次,则触发警告。</span>
+        </div>
+      </ProForm.Group>
+    </ModalForm>
+  );
+};
+export default UpdateForm;
diff --git a/src/pages/Alarm/OfflineAlarmRules/components/UpdateMultiForm.tsx b/src/pages/Alarm/OfflineAlarmRules/components/UpdateMultiForm.tsx
new file mode 100644
index 0000000..7bcc5d8
--- /dev/null
+++ b/src/pages/Alarm/OfflineAlarmRules/components/UpdateMultiForm.tsx
@@ -0,0 +1,234 @@
+import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
+import { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
+import { postAlarmRules } from '@/services/alarm/AlarmRules';
+import { ModalForm, ProForm, ProFormFieldSet, ProFormSelect, ProFormSwitch, ProFormText } from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { Form, message } from 'antd';
+import React, { useState } from 'react';
+import {
+  proFormSmallItemStyleProps,
+  proFormSmallModelWidth,
+} from '../../../../../config/defaultForm';
+import styles from './updateForm.less'
+export type FormValueType = {
+  target?: string;
+  template?: string;
+  type?: string;
+  time?: string;
+  frequency?: string;
+} & Partial<API.UpdateAlarmRulesForm>;
+
+export type UpdateFormProps = {
+  updateModalOpen: boolean;
+  handleModal: () => void;
+  values: Partial<API.UpdateAlarmRulesForm>;
+  reload: any;
+};
+const UpdateMultiForm: React.FC<UpdateFormProps> = (props) => {
+  const intl = useIntl();
+  const [form] = Form.useForm<API.UpdateAlarmRulesForm>();
+
+  return (
+    <ModalForm<any>
+      width={proFormSmallModelWidth}
+      title={intl.formatMessage({
+        id: 'alarm_rules.page.form.multiTitle',
+        defaultMessage: `编辑${props.values.warning_name}`,
+      })}
+      open={props.updateModalOpen}
+      form={form}
+      autoFocusFirstInput
+      modalProps={{
+        destroyOnClose: true,
+        onCancel: () => props.handleModal(),
+        okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '确认' }),
+        cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '取消' }),
+      }}
+      submitTimeout={2000}
+      onFinish={async (values) => {
+        values.id = props.values.id
+        values.is_use = values.is_use ? 1 : 0
+        // console.log(values);
+        await postAlarmRules(values)
+          .then(() => {
+            message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '成功' }));
+            props.reload();
+          })
+          .catch(() => {
+            message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
+          });
+
+        props.handleModal();
+        return true;
+      }}
+    >
+      <ProForm.Group>
+        {/* <ProFormText
+          width={proFormSmallItemStyleProps.width}
+          name="name"
+          label={<FormattedMessage id="alarm_rules.page.form.enabled" defaultMessage="$$$" />}
+          placeholder={`${intl.formatMessage({
+            id: 'common.please_input',
+            defaultMessage: '$$$',
+          })}${intl.formatMessage({
+            id: 'alarm_rules.page.form.enabled',
+            defaultMessage: '$$$',
+          })}`}
+          required={false}
+          initialValue={props.values.enabled}
+          disabled={false}
+        /> */}
+        <ProFormSwitch
+          width={proFormSmallItemStyleProps.column2Width}
+          name="is_use"
+          label={
+            <FormattedMessage
+              id="alarm_rules.page.form.isEnabled"
+              defaultMessage="启用告警"
+            />
+          }
+          checkedChildren="启用"
+          unCheckedChildren="关闭"
+          initialValue={props.values.is_use}
+          disabled={false}
+        />
+        <ProFormText
+          width={proFormSmallItemStyleProps.width}
+          name="warning_name"
+          label={<FormattedMessage id="alarm_rules.page.form.name" defaultMessage="告警名称" />}
+          placeholder={`${intl.formatMessage({
+            id: 'common.please_input',
+            defaultMessage: '请输入',
+          })}${intl.formatMessage({
+            id: 'alarm_rules.page.form.name',
+            defaultMessage: '告警名称',
+          })}`}
+          required={true}
+          initialValue={props.values.warning_name}
+          disabled={false}
+          rules={[
+            {
+              required: true,
+              message: (
+                <FormattedMessage
+                  id="alarm_rules.page.rule.required.name"
+                  defaultMessage="请填写告警名称"
+                />
+              ),
+            },
+          ]}
+        />
+        <div>触发条件</div>
+          <div style={{
+            display: 'flex',
+            flexWrap: 'wrap',
+            justifyContent: 'flex-start',
+            alignItems: 'baseline'
+          }}>
+            <span style={{ marginRight: 6 }}>当检测到风险人员人数大于</span>
+            <ProFormText
+              width={100}
+              name="person_number"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '请输入',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '触发条件',
+              })}`}
+              required={true}
+              initialValue={props.values.person_number}
+              disabled={false}
+              rules={[
+                {
+                  required: true,
+                  message: (
+                    <FormattedMessage
+                      id="alarm_rules.page.rule.required.person_number"
+                      defaultMessage="请填写人数"
+                    />
+                  ),
+                },
+              ]}
+            />
+            <span style={{ margin: '0 6px' }}>人时,则触发告警,触发间隔</span>
+            <ProFormText
+              width={100}
+              name="time_interval"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '请输入',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.time_interval',
+                defaultMessage: '时间',
+              })}`}
+              required={true}
+              initialValue={props.values.time_interval}
+              disabled={false}
+              rules={[
+                {
+                  required: true,
+                  message: (
+                    <FormattedMessage
+                      id="alarm_rules.page.rule.required.time_interval"
+                      defaultMessage="请填写时间"
+                    />
+                  ),
+                },
+              ]}
+            />
+            <span style={{ marginLeft: 6 }}>分钟。</span>
+          </div>
+          {/* { timeStatus && 
+          <ProFormFieldSet
+            name="list"
+            label="触发条件"
+            type='space'
+            transform={(value: any) => ({
+              // list: value,
+              // startTime: value[0],
+              // endTime: value[1],
+              time_period: value[0],
+              time_interval: value[1],
+              appear_number: value[2],
+            })}
+            className={styles}
+          >
+            当处于<ProFormText
+            width={100}
+            name="trigger_start_time"
+            label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+            placeholder={`${intl.formatMessage({
+              id: 'common.please_input',
+              defaultMessage: '$$$',
+            })}${intl.formatMessage({
+              id: 'alarm_rules.page.form.triggerConditions',
+              defaultMessage: '$$$',
+            })}`}
+            required={false}
+            initialValue={props.values.trigger_start_time}
+            disabled={false}
+          />至
+          <ProFormText
+            width={100}
+            name="trigger_end_time"
+            label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+            placeholder={`${intl.formatMessage({
+              id: 'common.please_input',
+              defaultMessage: '$$$',
+            })}${intl.formatMessage({
+              id: 'alarm_rules.page.form.triggerConditions',
+              defaultMessage: '$$$',
+            })}`}
+            required={false}
+            initialValue={props.values.trigger_end_time}
+            disabled={false}
+          />时间内,发现风险人员立即告警。
+          </ProFormFieldSet>}  */}
+      </ProForm.Group>
+    </ModalForm>
+  );
+};
+export default UpdateMultiForm;
diff --git a/src/pages/Alarm/OfflineAlarmRules/components/UpdateTimeForm.tsx b/src/pages/Alarm/OfflineAlarmRules/components/UpdateTimeForm.tsx
new file mode 100644
index 0000000..d719e68
--- /dev/null
+++ b/src/pages/Alarm/OfflineAlarmRules/components/UpdateTimeForm.tsx
@@ -0,0 +1,223 @@
+import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
+import { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
+import { postAlarmRules } from '@/services/alarm/AlarmRules';
+import { ModalForm, ProForm, ProFormFieldSet, ProFormSelect, ProFormSwitch, ProFormText, ProFormTimePicker } from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { Form, message } from 'antd';
+import React, { useState } from 'react';
+import {
+  proFormSmallItemStyleProps,
+  proFormSmallModelWidth,
+} from '../../../../../config/defaultForm';
+import styles from './updateForm.less'
+export type FormValueType = {
+  target?: string;
+  template?: string;
+  type?: string;
+  time?: string;
+  frequency?: string;
+} & Partial<API.UpdateAlarmRulesForm>;
+
+export type UpdateFormProps = {
+  updateModalOpen: boolean;
+  handleModal: () => void;
+  values: Partial<API.UpdateAlarmRulesForm>;
+  reload: any;
+};
+const UpdateTimeForm: React.FC<UpdateFormProps> = (props) => {
+  const intl = useIntl();
+  const [form] = Form.useForm<API.UpdateAlarmRulesForm>();
+
+  return (
+    <ModalForm<any>
+      width={proFormSmallModelWidth}
+      title={intl.formatMessage({
+        id: 'alarm_rules.page.form.timeTitle',
+        defaultMessage: `编辑${props.values.warning_name}`,
+      })}
+      open={props.updateModalOpen}
+      form={form}
+      autoFocusFirstInput
+      modalProps={{
+        destroyOnClose: true,
+        onCancel: () => props.handleModal(),
+        okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '确认' }),
+        cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '取消' }),
+      }}
+      submitTimeout={2000}
+      onFinish={async (values) => {
+        values.id = props.values.id
+        values.is_use = values.is_use ? 1 : 0
+        // console.log(values);
+        await postAlarmRules(values)
+          .then(() => {
+            message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '成功' }));
+            props.reload();
+          })
+          .catch(() => {
+            message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
+          });
+
+        props.handleModal();
+        return true;
+      }}
+    >
+      <ProForm.Group>
+        {/* <ProFormText
+          width={proFormSmallItemStyleProps.width}
+          name="name"
+          label={<FormattedMessage id="alarm_rules.page.form.enabled" defaultMessage="$$$" />}
+          placeholder={`${intl.formatMessage({
+            id: 'common.please_input',
+            defaultMessage: '$$$',
+          })}${intl.formatMessage({
+            id: 'alarm_rules.page.form.enabled',
+            defaultMessage: '$$$',
+          })}`}
+          required={false}
+          initialValue={props.values.enabled}
+          disabled={false}
+        /> */}
+        <ProFormSwitch
+          width={proFormSmallItemStyleProps.column2Width}
+          name="is_use"
+          label={
+            <FormattedMessage
+              id="alarm_rules.page.form.isEnabled"
+              defaultMessage="启用告警"
+            />
+          }
+          checkedChildren="启用"
+          unCheckedChildren="关闭"
+          initialValue={props.values.is_use}
+          disabled={false}
+        />
+        <ProFormText
+          width={proFormSmallItemStyleProps.width}
+          name="warning_name"
+          label={<FormattedMessage id="alarm_rules.page.form.name" defaultMessage="告警名称" />}
+          placeholder={`${intl.formatMessage({
+            id: 'common.please_input',
+            defaultMessage: '请输入',
+          })}${intl.formatMessage({
+            id: 'alarm_rules.page.form.name',
+            defaultMessage: '告警名称',
+          })}`}
+          required={true}
+          initialValue={props.values.warning_name}
+          disabled={false}
+          rules={[
+            {
+              required: true,
+              message: (
+                <FormattedMessage
+                  id="alarm_rules.page.rule.required.name"
+                  defaultMessage="请填写告警名称"
+                />
+              ),
+            },
+          ]}
+        />
+          <div style={{
+            marginBottom: 6
+          }}>触发条件</div>
+          <div style={{
+            display: 'flex',
+            flexWrap: 'wrap',
+            justifyContent: 'flex-start',
+            alignItems: 'baseline'
+          }}>
+            <span style={{marginRight: 6}}>当处于</span>
+            <ProFormTimePicker
+              style={{
+                padding: '0 6px'
+              }}
+             width={100} 
+             name="trigger_start_time"
+             placeholder={`${intl.formatMessage({
+              id: 'common.please_input',
+              defaultMessage: '请输入',
+            })}${intl.formatMessage({
+              id: 'alarm_rules.page.form.trigger_start_time',
+              defaultMessage: '敏感开始时间',
+            })}`}
+            required={true}
+            initialValue={props.values.trigger_start_time}
+            disabled={false}
+            rules={[
+              {
+                required: true,
+                message: (
+                  <FormattedMessage
+                    id="alarm_rules.page.rule.required.trigger_start_time"
+                    defaultMessage="请填写时间"
+                  />
+                ),
+              },
+            ]}
+              />
+            {/* <ProFormText
+              width={100}
+              name="trigger_start_time"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '$$$',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '$$$',
+              })}`}
+              required={false}
+              initialValue={props.values.trigger_start_time}
+              disabled={false}
+            /> */}
+            <span style={{ margin: '0 6px' }}>至</span>
+            <ProFormTimePicker
+             width={100}
+             name="trigger_end_time"
+             // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+             placeholder={`${intl.formatMessage({
+               id: 'common.please_input',
+               defaultMessage: '请输入',
+             })}${intl.formatMessage({
+               id: 'alarm_rules.page.form.triggerConditions',
+               defaultMessage: '触发条件',
+             })}`}
+             required={true}
+             initialValue={props.values.trigger_end_time}
+             disabled={false}
+             rules={[
+              {
+                required: true,
+                message: (
+                  <FormattedMessage
+                    id="alarm_rules.page.rule.required.trigger_start_time"
+                    defaultMessage="请填写时间"
+                  />
+                ),
+              },
+            ]}
+              />
+            {/* <ProFormText
+              width={100}
+              name="trigger_end_time"
+              // label={<FormattedMessage id="alarm_rules.page.form.triggerConditions" defaultMessage="$$$" />}
+              placeholder={`${intl.formatMessage({
+                id: 'common.please_input',
+                defaultMessage: '$$$',
+              })}${intl.formatMessage({
+                id: 'alarm_rules.page.form.triggerConditions',
+                defaultMessage: '$$$',
+              })}`}
+              required={false}
+              initialValue={props.values.trigger_end_time}
+              disabled={false}
+            /> */}
+            <span style={{marginLeft: 6}}>时间内,发现风险人员立即告警。</span>
+            {/* <span style={{ marginLeft: 6 }}></span> */}
+          </div>
+      </ProForm.Group>
+    </ModalForm>
+  );
+};
+export default UpdateTimeForm;
diff --git a/src/pages/Alarm/OfflineAlarmRules/components/updateForm.less b/src/pages/Alarm/OfflineAlarmRules/components/updateForm.less
new file mode 100644
index 0000000..8152d29
--- /dev/null
+++ b/src/pages/Alarm/OfflineAlarmRules/components/updateForm.less
@@ -0,0 +1,8 @@
+:global {
+    .ant-form-item-control-input-content {
+        .ant-space-gap-col-small {
+            align-items: center;
+        }
+        
+    }
+}
diff --git a/src/pages/Alarm/OfflineAlarmRules/index.tsx b/src/pages/Alarm/OfflineAlarmRules/index.tsx
new file mode 100644
index 0000000..2620e48
--- /dev/null
+++ b/src/pages/Alarm/OfflineAlarmRules/index.tsx
@@ -0,0 +1,277 @@
+import AlarmLevelBox from '@/components/DictionaryBox/alarmLevel';
+import TableActionCard from '@/components/TableActionCard';
+import IsDelete from '@/components/TableActionCard/isDelete';
+import { alarmLevelStatusEnum } from '@/enums/status';
+import {
+  deleteDeviceCategoryDeleteDeviceCategory,
+  postDeviceCategoryGetDeviceCategoryList,
+} from '@/services/device/DeviceCategory';
+import {getAlarmRules} from '@/services/alarm/AlarmRules'
+import type { ActionType, ProColumns } from '@ant-design/pro-components';
+import { PageContainer, ProTable } from '@ant-design/pro-components';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import { Button, Space, Tag, message } from 'antd';
+import React, { useRef, useState } from 'react';
+import { proTablePaginationOptions } from '../../../../config/defaultTable';
+import { proIconForTableActionStyle } from '../../../../config/defaultIcon';
+import { EditOutlined } from '@ant-design/icons';
+import UpdateForm from './components/UpdateForm';
+import UpdateMultiForm from './components/UpdateMultiForm';
+import UpdateTimeForm from './components/UpdateTimeForm';
+const OfflineAlarmRulesList: React.FC = () => {
+  /**
+   * @en-US International configuration
+   * @zh-CN 国际化配置
+   * */
+  const intl = useIntl();
+  const actionRef = useRef<ActionType>();
+  //  动态设置每页数量
+  const [currentPageSize, setCurrentPageSize] = useState<number>(10);
+
+  const handleDestroy = async (selectedRow: API.DeviceCategory) => {
+    deleteDeviceCategoryDeleteDeviceCategory({ id: selectedRow.id })
+      .then(() => {
+        message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '成功' }));
+        actionRef.current?.reload();
+      })
+      .catch(() => {
+        message.error(intl.formatMessage({ id: 'common.failure', defaultMessage: '失败' }));
+      });
+  };
+
+  const [currentRow, setCurrentRow] = useState<API.DeviceCategory>();
+  // 编辑弹框
+  const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
+  const [updateMultiModalOpen, setUpdateMultiModalOpen] = useState<boolean>(false);
+  const [updateTimeModalOpen, setUpdateTimeModalOpen] = useState<boolean>(false);
+
+  const handleUpdateModal = () => {
+    if (updateModalOpen) {
+      setUpdateModalOpen(false);
+      setCurrentRow(undefined);
+    } else {
+      setUpdateModalOpen(true);
+    }
+  };
+  const handleUpdateMultiModal = () => {
+    if (updateMultiModalOpen) {
+      setUpdateMultiModalOpen(false);
+      setCurrentRow(undefined);
+    } else {
+      setUpdateMultiModalOpen(true);
+    }
+  };
+  const handleUpdateTimeModal = () => {
+    setCurrentRow(undefined);
+
+    if (updateTimeModalOpen) {
+      setUpdateTimeModalOpen(false);
+    } else {
+      setUpdateTimeModalOpen(true);
+    }
+  };
+
+  const getAlarmRulesList = async () => {
+    return {
+        code: 0,
+        success: true,
+        data: {
+            "list": [
+                {
+                    "id": 1,
+                    "createTime": "2023-10-17T02:35:41.14308Z",
+                    "updateTime": "2023-10-17T02:35:41.14308Z",
+                    "name": "单人徘徊告警",
+                    "status": "已启用",
+                    "isEnabled": true,
+                    "remark": ""
+                },
+                {
+                    "id": 2,
+                    "createTime": "2023-10-17T02:40:28.292883Z",
+                    "updateTime": "2023-10-26T03:02:51.356036Z",
+                    "name": "多人聚集告警",
+                    "status": "未启用",
+                    "isEnabled": false,
+                    "remark": ""
+                },
+                {
+                    "id": 4,
+                    "createTime": "2023-12-12T02:54:52.204957Z",
+                    "updateTime": "2023-12-12T02:54:52.204957Z",
+                    "name": "敏感时间段告警",
+                    "status": "未启用",
+                    "isEnabled": false,
+                    "remark": ""
+                }
+            ],
+            "total": 3,
+            "page": 1,
+            "pageSize": 10
+        },
+        msg: "获取成功"
+    }
+  }
+
+  const columns: ProColumns<API.DeviceCategory>[] = [
+    {
+      title: <FormattedMessage id="alarm_rules.page.name" defaultMessage="告警规则" />,
+      dataIndex: 'warning_name',
+      hideInSearch: true,
+    },
+
+    {
+      title: <FormattedMessage id="alarm_rules.page.id" defaultMessage="规则ID" />,
+      dataIndex: 'id',
+      hideInSearch: true,
+    },
+    {
+        title: <FormattedMessage id="alarm_rules.page.status" defaultMessage="规则状态" />,
+        dataIndex: 'is_use',
+        hideInSearch: true,
+        render: (dom) => {
+            return (
+              <Tag bordered={false} color={dom === 1? "success": ""} style={{
+                // fontSize:14,
+                color: dom === 1? '#52C41A': "#999"
+              }}>
+                {dom === 1 ? '已启用' : '未启用'}
+              </Tag>
+            );
+        },
+    },
+    {
+      title: <FormattedMessage id="alarm_rules.page.updateTime" defaultMessage="修改时间" />,
+      dataIndex: 'update_time',
+      sorter: true,
+      hideInSearch: true,
+      valueType: 'dateTime',
+    },
+
+    {
+      title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
+      dataIndex: 'option',
+      valueType: 'option',
+      fixed: 'right',
+      render: (_, record) => [
+        <TableActionCard
+          key="TableActionCardRef"
+          renderActions={[
+            {
+                key: 'update',
+                renderDom: (
+                  <Button
+                    key="update"
+                    type="link"
+                    size="small"
+                    style={{
+                        color:"#081FA8",
+                        
+                    }}
+                    icon={<EditOutlined style={{
+                        marginRight: 3
+                    }} />}
+                    onClick={() => {
+                      console.log(record);
+                      if(record.id === 1) {
+                        setUpdateModalOpen(true);
+                      }else if(record.id === 2) {
+                        setUpdateMultiModalOpen(true);
+                      }else {
+                        setUpdateTimeModalOpen(true);
+                      }
+                      setCurrentRow(record);
+                    }}
+                  >
+                    <FormattedMessage id="common.edit" defaultMessage="编辑" />
+                  </Button>
+                ),
+              },
+            // {
+            //   key: 'destroy',
+            //   renderDom: (
+            //     <IsDelete
+            //       deleteApi={() => {
+            //         handleDestroy(record).then(() => {});
+            //       }}
+            //     ></IsDelete>
+            //   ),
+            // },
+          ]}
+        ></TableActionCard>,
+      ],
+    },
+  ];
+  return (
+    <PageContainer>
+      <ProTable<API.DeviceCategory>
+        cardProps={{
+          bodyStyle: {
+            padding: 20
+          }
+        }}
+        options={{ fullScreen: false, setting: false, density: false, reload: false }}
+        actionRef={actionRef}
+        rowKey="key"
+        search={false}
+        showSorterTooltip={false}
+        pagination={{
+          ...proTablePaginationOptions,
+          pageSize: currentPageSize,
+          onChange: (page, pageSize) => setCurrentPageSize(pageSize),
+        }}
+        columnsState={{
+          persistenceKey: 'device_category_list',
+          persistenceType: 'localStorage',
+        }}
+        request={async (params = {}, sort) => {
+          const { current, ...rest } = params;
+          const reqParams = {
+            page: current,
+            desc: false,
+            orderKey: '',
+            ...rest,
+          };
+          if (sort && Object.keys(sort).length) {
+            reqParams.orderKey = Object.keys(sort)[0];
+            let sort_select = sort[reqParams.orderKey];
+            reqParams.desc = sort_select === 'descend';
+          }
+        //   let resp = await postDeviceCategoryGetDeviceCategoryList({ ...reqParams });
+          let resp = await getAlarmRules(reqParams);
+          console.log(resp);
+          return {
+            data: resp.data.results.map((v: API.DeviceCategory) => {
+              return { ...v, key: v.id };
+            }),
+            success: resp.success,
+            total: resp.data.count,
+            current: resp.data.page,
+            pageSize: resp.data.pageSize,
+          };
+        }}
+        columns={columns}
+      />
+      <UpdateForm
+        updateModalOpen={updateModalOpen}
+        values={currentRow || {}}
+        handleModal={handleUpdateModal}
+        reload={actionRef.current?.reload}
+      />
+      <UpdateMultiForm
+        updateModalOpen={updateMultiModalOpen}
+        values={currentRow || {}}
+        handleModal={handleUpdateMultiModal}
+        reload={actionRef.current?.reload}
+      />
+      <UpdateTimeForm
+        updateModalOpen={updateTimeModalOpen}
+        values={currentRow || {}}
+        handleModal={handleUpdateTimeModal}
+        reload={actionRef.current?.reload}
+      />
+    </PageContainer>
+  );
+};
+
+export default OfflineAlarmRulesList;
diff --git a/src/pages/User/Login/index1.tsx b/src/pages/User/Login/index1.tsx
index 9459eba..6a9329c 100644
--- a/src/pages/User/Login/index1.tsx
+++ b/src/pages/User/Login/index1.tsx
@@ -182,7 +182,7 @@ const Login: React.FC = () => {
                     "name": "involved-list",
                     "path": "/realTime/involved-list",
                     "routes": [],
-                    "title": "重点关注",
+                    "title": "告警汇总",
                   }
                 ]
               },
@@ -235,16 +235,16 @@ const Login: React.FC = () => {
                     "routes": [],
                     "title": "视频分析",
                   },
-                  // {
-                  //   "access": "",
-                  //   "component": "Alarm/AlarmRules",
-                  //   "icon": "",
-                  //   "key": "",
-                  //   "name": "alarm_rules",
-                  //   "path": "/offline/alarm_rules",
-                  //   "routes": [],
-                  //   "title": "告警规则",
-                  // },
+                  {
+                    "access": "",
+                    "component": "Alarm/OfflineAlarmRules",
+                    "icon": "",
+                    "key": "",
+                    "name": "OfflineAlarmRules",
+                    "path": "/offline/OfflineAlarmRules",
+                    "routes": [],
+                    "title": "告警规则",
+                  },
                   {
                     "access": "",
                     "component": "Alarm/InvolvedListUpload",
@@ -253,7 +253,7 @@ const Login: React.FC = () => {
                     "name": "involved-list-upload",
                     "path": "/offline/involved-list-upload",
                     "routes": [],
-                    "title": "重点关注(上传)",
+                    "title": "告警汇总",
                   }
                 ]
               },