feat: 告警设置完善,告警列表完成

develop
zhoux 1 year ago
parent 1ed2ce6800
commit d106371d4c

@ -365,3 +365,6 @@ a.ant-dropdown-trigger {
.rectProgress_box .ant-progress .ant-progress-bg { .rectProgress_box .ant-progress .ant-progress-bg {
border-radius: 2px; border-radius: 2px;
} }
.innerFormList_box .ant-form-item {
margin-bottom: 12px;
}

@ -483,9 +483,12 @@ a.ant-dropdown-trigger{
} }
// .p1{ // 内部表单样式
.innerFormList_box{
// } .ant-form-item {
margin-bottom: 12px;
}
}

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd * @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-12-18 16:36:36 * @Date: 2023-12-18 16:36:36
* @LastEditors: zhoux zhouxia@supervision.ltd * @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-19 13:48:54 * @LastEditTime: 2023-12-22 13:38:41
* @FilePath: \general-ai-platform-web\src\locales\zh-CN\alarm.ts * @FilePath: \general-ai-platform-web\src\locales\zh-CN\alarm.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -17,7 +17,7 @@ export const alarm_setting: { [key: string]: string } = {
'alarm.setting.table.list.name': '告警名称', 'alarm.setting.table.list.name': '告警名称',
'alarm.setting.table.list.code': '告警代码', 'alarm.setting.table.list.code': '告警代码',
'alarm.setting.table.list.category': '告警分类', 'alarm.setting.table.list.category': '告警分类',
'alarm.setting.table.list.level': '告警', 'alarm.setting.table.list.level': '告警级',
'alarm.setting.table.list.createTime': '创建时间', 'alarm.setting.table.list.createTime': '创建时间',
'alarm.setting.table.list.remark': '备注', 'alarm.setting.table.list.remark': '备注',
'alarm.setting.table.list.setting': '告警等级设置', 'alarm.setting.table.list.setting': '告警等级设置',
@ -25,5 +25,7 @@ export const alarm_setting: { [key: string]: string } = {
'alarm.setting.table.model.title': '告警等级', 'alarm.setting.table.model.title': '告警等级',
'alarm.setting.table.list.update': '编辑告警项', 'alarm.setting.table.list.update': '编辑告警项',
'alarm.setting.table.rule.required.code': '类别代码为必填项', 'alarm.setting.table.rule.required.code': '类别代码为必填项',
'alarm.setting.table.model.alarmStatusSetting': '告警等级' 'alarm.setting.table.model.alarmStatusSetting': '告警等级',
'alarm.list.table.list.alarmTime': '告警时间',
} }

@ -1,69 +1,27 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete'; import AlarmLevelBox from '@/components/DictionaryBox/alarmLevel';
import TableActionCard from '@/components/TableActionCard'; import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete'; import IsDelete from '@/components/TableActionCard/isDelete';
import { alarmLevelStatusEnum } from '@/enums/status';
import { import {
deleteDeviceCategoryDeleteDeviceCategory, deleteDeviceCategoryDeleteDeviceCategory,
deleteDeviceCategoryDeleteDeviceCategoryByIds,
postDeviceCategoryGetDeviceCategoryList, postDeviceCategoryGetDeviceCategoryList,
} from '@/services/device/DeviceCategory'; } from '@/services/device/DeviceCategory';
import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { PageContainer, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { FormattedMessage, useIntl } from '@umijs/max';
import { Button, message } from 'antd'; import { Space, message } from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable'; import { proTablePaginationOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
const DeviceCategoryList: React.FC = () => { const DeviceCategoryList: React.FC = () => {
/**
* @en-US Pop-up window of new window
* @zh-CN
* */
const [createModalOpen, setCreateModalOpen] = useState<boolean>(false);
/**
* @en-US The pop-up window of the distribution update window
* @zh-CN
* */
const [updateModalOpen, setUpdateModalOpen] = useState<boolean>(false);
const [showDetail, setShowDetail] = useState<boolean>(false);
/** /**
* @en-US International configuration * @en-US International configuration
* @zh-CN * @zh-CN
* */ * */
const access = useAccess();
const intl = useIntl(); const intl = useIntl();
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
// 动态设置每页数量 // 动态设置每页数量
const [currentPageSize, setCurrentPageSize] = useState<number>(10); const [currentPageSize, setCurrentPageSize] = useState<number>(10);
const [currentRow, setCurrentRow] = useState<API.DeviceCategory>();
const [selectedRowsState, setSelectedRows] = useState<API.DeviceCategory[]>([]);
const handleUpdateModal = () => {
if (updateModalOpen) {
setUpdateModalOpen(false);
setCurrentRow(undefined);
} else {
setUpdateModalOpen(true);
}
};
const handleCreateModal = () => {
if (createModalOpen) {
setCreateModalOpen(false);
setCurrentRow(undefined);
} else {
setCreateModalOpen(true);
}
};
const handleColumnDrawer = () => {
if (showDetail) {
setShowDetail(false);
setCurrentRow(undefined);
} else {
setShowDetail(true);
}
};
const handleDestroy = async (selectedRow: API.DeviceCategory) => { const handleDestroy = async (selectedRow: API.DeviceCategory) => {
deleteDeviceCategoryDeleteDeviceCategory({ id: selectedRow.id }) deleteDeviceCategoryDeleteDeviceCategory({ id: selectedRow.id })
.then(() => { .then(() => {
@ -76,64 +34,40 @@ const DeviceCategoryList: React.FC = () => {
}; };
const columns: ProColumns<API.DeviceCategory>[] = [ const columns: ProColumns<API.DeviceCategory>[] = [
// {
// title: <FormattedMessage id="DCSDeviceList.device_category.table.list.id" defaultMessage="id" />,
// dataIndex: 'id',
// sorter: true,
// render: (dom, entity) => {
// return (
// <a
// onClick={() => {
// setCurrentRow(entity);
// setShowDetail(true);
// }}
// >
// {dom}
// </a>
// );
// },
// },
{ {
title: <FormattedMessage id="DCSDeviceList.device_category.table.list.name" defaultMessage="$$$" />, title: <FormattedMessage id="alarm.setting.table.list.name" defaultMessage="$$$" />,
dataIndex: 'name', dataIndex: 'name',
hideInSearch: false, hideInSearch: true,
}, },
{ {
title: <FormattedMessage id="DCSDeviceList.device_category.table.list.code" defaultMessage="$$$" />, title: <FormattedMessage id="alarm.setting.table.list.code" defaultMessage="$$$" />,
dataIndex: 'code', dataIndex: 'code',
hideInSearch: true, hideInSearch: true,
}, },
{ {
title: ( title: <FormattedMessage id="alarm.setting.table.list.level" defaultMessage="$$$" />,
<FormattedMessage id="DCSDeviceList.device_category.table.list.remark" defaultMessage="$$$" /> dataIndex: 'level',
),
dataIndex: 'remark',
hideInSearch: true, hideInSearch: true,
render: (text, record, index) => {
console.log(text, record, index, 'level_record');
const currVal = index % 6;
const currLevel = alarmLevelStatusEnum[currVal];
return (
<Space>
<AlarmLevelBox {...currLevel}></AlarmLevelBox>
<span style={{ color: currLevel.color }}>{currLevel.defaultLabel}</span>
</Space>
);
},
}, },
{ {
title: ( title: <FormattedMessage id="alarm.list.table.list.alarmTime" defaultMessage="$$$" />,
<FormattedMessage id="DCSDeviceList.device_category.table.list.createTime" defaultMessage="$$$" />
),
dataIndex: 'createTime', dataIndex: 'createTime',
sorter: true, sorter: true,
hideInSearch: true, hideInSearch: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{
title: (
<FormattedMessage id="DCSDeviceList.device_category.table.list.updateTime" defaultMessage="$$$" />
),
dataIndex: 'updateTime',
sorter: true,
hideInSearch: true,
valueType: 'dateTime',
},
{ {
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="Operating" />, title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="Operating" />,
dataIndex: 'option', dataIndex: 'option',
@ -143,26 +77,11 @@ const DeviceCategoryList: React.FC = () => {
<TableActionCard <TableActionCard
key="TableActionCardRef" key="TableActionCardRef"
renderActions={[ renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="DCSDeviceList.device_category.table.list.editor" defaultMessage="Update" />
</Button>
),
},
{ {
key: 'destroy', key: 'destroy',
renderDom: ( renderDom: (
<IsDelete <IsDelete
buttonType="deleteIcon"
deleteApi={() => { deleteApi={() => {
handleDestroy(record).then(() => {}); handleDestroy(record).then(() => {});
}} }}
@ -184,10 +103,7 @@ const DeviceCategoryList: React.FC = () => {
options={{ fullScreen: true, setting: true, density: true, reload: true }} options={{ fullScreen: true, setting: true, density: true, reload: true }}
actionRef={actionRef} actionRef={actionRef}
rowKey="key" rowKey="key"
search={{ search={false}
labelWidth: proTableCommonOptions.searchLabelWidth,
}}
onDataSourceChange={(data) => {}}
pagination={{ pagination={{
...proTablePaginationOptions, ...proTablePaginationOptions,
pageSize: currentPageSize, pageSize: currentPageSize,
@ -197,42 +113,6 @@ const DeviceCategoryList: React.FC = () => {
persistenceKey: 'device_category_list', persistenceKey: 'device_category_list',
persistenceType: 'localStorage', persistenceType: 'localStorage',
}} }}
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
// TODO 需要;联调删除接口
deleteDeviceCategoryDeleteDeviceCategoryByIds({
ids: selectedRowsState.map((v: API.DeviceCategory) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
/>
)}
</>
);
}}
toolBarRender={() => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<Button
type="primary"
key="primary"
onClick={() => {
setCreateModalOpen(true);
}}
>
<PlusOutlined /> <FormattedMessage id="pages.searchTable.new" defaultMessage="New" />
</Button>
</Access>,
]}
request={async (params = {}, sort) => { request={async (params = {}, sort) => {
const { current, ...rest } = params; const { current, ...rest } = params;
const reqParams = { const reqParams = {
@ -258,31 +138,6 @@ const DeviceCategoryList: React.FC = () => {
}; };
}} }}
columns={columns} columns={columns}
rowSelection={{
onChange: (_, selectedRows) => {
setSelectedRows(selectedRows);
},
}}
/>
<CreateForm
createModalOpen={createModalOpen}
values={currentRow || {}}
handleModal={handleCreateModal}
reload={actionRef.current?.reload}
/>
<UpdateForm
updateModalOpen={updateModalOpen}
values={currentRow || {}}
handleModal={handleUpdateModal}
reload={actionRef.current?.reload}
/>
<ColumnDrawer
handleDrawer={handleColumnDrawer}
isShowDetail={showDetail}
columns={columns}
currentRow={currentRow}
/> />
</PageContainer> </PageContainer>
); );

@ -4,7 +4,7 @@ import { localStorageKeyEnums } from '@/enums/storage';
import { DeleteOutlined, ExclamationCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { DeleteOutlined, ExclamationCircleOutlined, PlusCircleOutlined } from '@ant-design/icons';
import { ModalForm, ProFormText } from '@ant-design/pro-components'; import { ModalForm, ProFormText } from '@ant-design/pro-components';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Form } from 'antd'; import { Form, message } from 'antd';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { proFormSmallModelWidth } from '../../../../../config/defaultForm'; import { proFormSmallModelWidth } from '../../../../../config/defaultForm';
// TODO 需要根据接口替换API.DeviceCategory // TODO 需要根据接口替换API.DeviceCategory
@ -57,12 +57,19 @@ const AlarmStatusForm: React.FC<CreateFormProps> = (props) => {
localStorageKeyEnums.alarmSetting_model_alarmStatusSetting, localStorageKeyEnums.alarmSetting_model_alarmStatusSetting,
); );
if (currData) { if (currData) {
const finalData = alarmLevelStatusEnum.filter((item) => const currFormData = JSON.parse(currData);
Object.keys(JSON.parse(currData)).includes(item.id), // eslint-disable-next-line array-callback-return
); const finalData = alarmLevelStatusEnum.filter((item) => {
if (Object.keys(currFormData).includes(item.id)) {
item.defaultLabel = currFormData[item.id];
return item;
}
});
setAlarmDict(finalData); setAlarmDict(finalData);
form.setFieldsValue(currFormData);
console.log(currFormData, 'falarmStatusModalOpen_inalData', finalData);
} }
}, []); }, [props.alarmStatusModalOpen]);
return ( return (
<ModalForm<API.DeviceCategory> <ModalForm<API.DeviceCategory>
@ -80,8 +87,20 @@ const AlarmStatusForm: React.FC<CreateFormProps> = (props) => {
onCancel: () => props.handleModal(), onCancel: () => props.handleModal(),
}} }}
submitTimeout={2000} submitTimeout={2000}
onFinish={async (values) => { onFinish={async (values: Record<string, any>) => {
console.log(values, 'values'); console.log(values, 'values');
let isFlag = true;
for (let key in values) {
if (!values[key]) {
isFlag = false;
break;
}
}
if (!isFlag) {
message.warning('请将告警等级信息完善');
return false;
}
localStorage.setItem( localStorage.setItem(
localStorageKeyEnums.alarmSetting_model_alarmStatusSetting, localStorageKeyEnums.alarmSetting_model_alarmStatusSetting,
JSON.stringify(values), JSON.stringify(values),

@ -226,9 +226,9 @@ const OccupyProportion: React.FC<{
className="occupy_up" className="occupy_up"
style={{ marginTop: 24, marginBottom: 20, padding: 0, position: 'relative', width: '100%' }} style={{ marginTop: 24, marginBottom: 20, padding: 0, position: 'relative', width: '100%' }}
> >
{/* <canvas ref={canvasRef} {...clipPathData} style={{ border: '1px dashed red' }}></canvas> */} <canvas ref={canvasRef} {...clipPathData} style={{ border: '1px dashed red' }}></canvas>
<ul {/* <ul
className="occupy_progress" className="occupy_progress"
style={{ style={{
width: '100%', width: '100%',
@ -284,7 +284,7 @@ const OccupyProportion: React.FC<{
preview={false} preview={false}
></Image> ></Image>
</li> </li>
</ul> </ul> */}
</div> </div>
<div className="occupy_des"> <div className="occupy_des">

@ -284,6 +284,7 @@ const AlgorithmSetting: React.FC = () => {
activeKey={tab} activeKey={tab}
items={tabs} items={tabs}
onChange={(key) => { onChange={(key) => {
setActiveMode('1'); // 重置到项目详情
changeProjectTab(key); changeProjectTab(key);
}} }}
></Tabs> ></Tabs>
@ -361,8 +362,23 @@ const AlgorithmSetting: React.FC = () => {
</> </>
) : ( ) : (
<div style={{ padding: 16 }}> <div style={{ padding: 16 }}>
{' '} <AlarmSetForm
<AlarmSetForm></AlarmSetForm> currentRow={{
type: '2',
ways: [
{
label: '短信',
value: [],
isChecked: [],
},
{
label: '邮件',
value: [],
isChecked: [],
},
],
}}
></AlarmSetForm>
</div> </div>
)} )}
</ProCard> </ProCard>

@ -6,68 +6,96 @@ import {
ProFormList, ProFormList,
ProFormRadio, ProFormRadio,
ProFormSelect, ProFormSelect,
ProFormSwitch,
} from '@ant-design/pro-components'; } from '@ant-design/pro-components';
import { Form } from 'antd'; import { Form } from 'antd';
import type { NamePath } from 'antd/lib/form/interface'; import { useEffect, useState } from 'react';
import { useEffect } from 'react';
type AlarmSetFormProps = { type AlarmSetFormProps = {
values?: Record<string, any>; currentRow: Record<string, any>;
}; };
const AlarmSetForm: React.FC<AlarmSetFormProps> = (props) => { const AlarmSetForm: React.FC<AlarmSetFormProps> = (props) => {
const [form] = Form.useForm<API.DeviceCategory>(); const [form] = Form.useForm<API.DeviceCategory>();
const initialValues = { // const [initialValues, setInitialValues] = useState<Record<string, any>>({});
label: 1,
value: 2,
};
const depName1: NamePath[] = [['ways']];
function fetchInitialValues() {
// setInitialValues({
// type: '2',
// ways: [
// {
// label: '短信',
// value: [],
// isChecked: [],
// },
// {
// label: '邮件',
// value: [],
// isChecked: [],
// },
// ]
// });
}
useEffect(() => { useEffect(() => {
form.setFieldValue('ways', [ fetchInitialValues()
{
label: '短信',
value: [],
isChecked: true,
},
{
label: '邮件',
value: [],
isChecked: false,
},
]);
}, []); }, []);
return ( return (
// TODO 模拟提交告警设置 // TODO 模拟提交告警设置
<ProForm form={form} initialValues={initialValues} > <ProForm
style={{paddingBottom: 70}}
submitter={{
searchConfig: {
submitText: '保存', // 在这里设置提交按钮文案
},
}}
form={form}
initialValues={props.currentRow}
onFinish={async (values) => {
console.log('onFinish_values', values);
// postProjectCreateProject(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;
}}
>
<ProFormGroup> <ProFormGroup>
<ProFormGroup title="通知方式"> <ProFormGroup title="通知方式" titleStyle={{margin: "0 0 8px"}}>
<ProFormList <ProFormList
className='innerFormList_box'
name={['ways']} name={['ways']}
creatorButtonProps={false} creatorButtonProps={false}
copyIconProps={false} copyIconProps={false}
deleteIconProps={false} deleteIconProps={false}
style={{padding: 0, margin: 0}}
> >
{(f, index, action) => { {(f, index, action) => {
console.log('isChecked_value', f, index, action); console.log('isChecked_value', f, index, action);
return ( return (
<ProFormGroup key="group"> <ProFormGroup key="group">
{/* <Checkbox checked={false}> <ProFormCheckbox.Group
{form.getFieldValue('ways')[index].label}{' '} name="isChecked"
</Checkbox> */} options={[
{
<ProFormSwitch name="isChecked"></ProFormSwitch> label: form.getFieldValue('ways')[index].label,
<ProFormCheckbox.Group name="isChecked"> value: '1',
{form.getFieldValue('ways')[index].label} },
</ProFormCheckbox.Group> ]}
></ProFormCheckbox.Group>
<ProFormDependency name={['isChecked']}> <ProFormDependency name={['isChecked']}>
{({ isChecked }) => { {({ isChecked }) => {
console.log(isChecked, 'isChecked');
return ( return (
<ProFormSelect <ProFormSelect
width={'lg'}
mode="multiple" mode="multiple"
name="value" name="value"
debounceTime={1000} debounceTime={1000}
disabled={!isChecked} disabled={!isChecked?.length}
request={async () => { request={async () => {
// const resp = await postCurrentIP(); // const resp = await postCurrentIP();
const resp = ['test001', 'test002', 'test003']; const resp = ['test001', 'test002', 'test003'];
@ -82,27 +110,13 @@ const AlarmSetForm: React.FC<AlarmSetFormProps> = (props) => {
); );
}} }}
</ProFormDependency> </ProFormDependency>
{/* <ProFormText
name="value"
/> */}
</ProFormGroup> </ProFormGroup>
); );
}} }}
</ProFormList> </ProFormList>
</ProFormGroup> </ProFormGroup>
</ProFormGroup> </ProFormGroup>
{/* <ProFormGroup <ProFormGroup title="通知频次" titleStyle={{margin: "0 0 8px"}}>
title={`收集依赖值情形1) <ProFormDependency name={${JSON.stringify(depName1)}}>`}
>
<ProFormDependency name={depName1}>
{(depValues) => (
<pre>
<code>{JSON.stringify(depValues)}</code>
</pre>
)}
</ProFormDependency>
</ProFormGroup> */}
<ProFormGroup title="通知频次">
<ProFormRadio.Group <ProFormRadio.Group
name="type" name="type"
initialValue={props.values?.type || '0'} initialValue={props.values?.type || '0'}

Loading…
Cancel
Save