develop
JINGYJ 1 year ago
commit c807eb7123

@ -45,7 +45,6 @@ export default [
],
},
{
path: '/system',
@ -99,133 +98,151 @@ export default [
{
name: 'device',
path: '/device',
routes: [{
'name': 'device-list',
'path': '/device/device-list',
'component': 'Device/DeviceList',
'access': 'canReadMenu'
}, {
'name': 'device-category-list',
'path': '/device/device-category-list',
'component': 'Device/DeviceCategoryList',
'access': 'canReadMenu'
}, {
'name': 'device-group-list',
'path': '/device/device-group-list',
'component': 'Device/DeviceGroupList',
'access': 'canReadMenu'
}, {
'name': 'device-relation-list',
'path': '/device/device-relation-list',
'component': 'Device/DeviceRelationList',
'access': 'canReadMenu'
}],
routes: [
{
name: 'device-list',
path: '/device/device-list',
component: 'Device/DeviceList',
access: 'canReadMenu',
},
{
name: 'device-category-list',
path: '/device/device-category-list',
component: 'Device/DeviceCategoryList',
access: 'canReadMenu',
},
{
name: 'device-group-list',
path: '/device/device-group-list',
component: 'Device/DeviceGroupList',
access: 'canReadMenu',
},
{
name: 'device-relation-list',
path: '/device/device-relation-list',
component: 'Device/DeviceRelationList',
access: 'canReadMenu',
},
],
},
{
name: 'DCSDevice',
path: '/DCSDevice',
routes: [{
'name': 'DCSDevice-device-group-list',
'path': '/DCSDevice/device-group-list',
'component': 'DCSDevice/DeviceGroupList',
'access': 'canReadMenu'
},{
'name': 'DCSDevice-device-category-list',
'path': '/DCSDevice/device-category-list',
'component': 'DCSDevice/DeviceCategoryList',
'access': 'canReadMenu'
},{
'name': 'DCSDevice-device-list',
'path': '/DCSDevice/device-list',
'component': 'DCSDevice/DeviceList',
'access': 'canReadMenu'
}, {
'name': 'DCSDevice-device-status',
'path': '/DCSDevice/device-status',
'component': 'DCSDevice/DeviceStatus',
'access': 'canReadMenu'
}],
routes: [
{
name: 'DCSDevice-device-group-list',
path: '/DCSDevice/device-group-list',
component: 'DCSDevice/DeviceGroupList',
access: 'canReadMenu',
},
{
name: 'DCSDevice-device-category-list',
path: '/DCSDevice/device-category-list',
component: 'DCSDevice/DeviceCategoryList',
access: 'canReadMenu',
},
{
name: 'DCSDevice-device-list',
path: '/DCSDevice/device-list',
component: 'DCSDevice/DeviceList',
access: 'canReadMenu',
},
{
name: 'DCSDevice-device-status',
path: '/DCSDevice/device-status',
component: 'DCSDevice/DeviceStatus',
access: 'canReadMenu',
},
],
},
{
name: 'resource',
path: '/resource',
routes: [{
'name': 'algorithm-model-list',
routes: [
{
name: 'algorithm-model-list',
'path': '/resource/algorithm-model-list',
'component': 'Resource/AlgorithmModelList',
'access': 'canReadMenu',
}, {
'name': 'algorithm-model-detail',
'path': '/resource/algorithm-model-detail/:id',
'component': 'Resource/AlgorithmModelList/detail',
'access': 'canReadMenu',
"isHideTab": true,
}, {
'name': 'business-image-list',
path: '/resource/algorithm-model-list',
component: 'Resource/AlgorithmModelList',
access: 'canReadMenu',
},
{
name: 'algorithm-model-detail',
path: '/resource/algorithm-model-detail/:id',
component: 'Resource/AlgorithmModelList/detail',
access: 'canReadMenu',
isHideTab: true,
},
{
name: 'business-image-list',
'path': '/resource/business-image-list',
'component': 'Resource/BusinessImageList',
'access': 'canReadMenu'
}, {
'name': 'model-category-list',
path: '/resource/business-image-list',
component: 'Resource/BusinessImageList',
access: 'canReadMenu',
},
{
name: 'model-category-list',
'path': '/resource/model-category-list',
'component': 'Resource/ModelCategoryList',
'access': 'canReadMenu'
}, {
'name': 'model-image-list',
'path': '/resource/model-image-list',
'component': 'Resource/ModelImageList',
'access': 'canReadMenu'
}, {
'name': 'model-version-list',
'path': '/resource/model-version-list',
'component': 'Resource/ModelVersionList',
'access': 'canReadMenu'
},{
'name': 'resource-device-status', // 2
'path': '/resource/resource-device-status',
'component': 'Resource/ResourceDeviceStatus',
'access': 'canReadMenu'
}]
path: '/resource/model-category-list',
component: 'Resource/ModelCategoryList',
access: 'canReadMenu',
},
{
name: 'model-image-list',
path: '/resource/model-image-list',
component: 'Resource/ModelImageList',
access: 'canReadMenu',
},
{
name: 'model-version-list',
path: '/resource/model-version-list',
component: 'Resource/ModelVersionList',
access: 'canReadMenu',
},
{
name: 'resource-device-status',
path: '/resource/resource-device-status',
component: 'Resource/ResourceDeviceStatus',
access: 'canReadMenu',
},
],
},
{
name: 'analysis',
path: '/analysis',
routes: [
{
'name': 'action-detection-list',
'path': '/analysis/action-detection-list',
'component': 'Analysis/ActionDetectionList',
'access': 'canReadMenu'
}
]
name: 'action-detection-list',
path: '/analysis/action-detection-list',
component: 'Analysis/ActionDetectionList',
access: 'canReadMenu',
},
],
},
{
name: 'project',
path: '/project',
routes: [{
'name': 'project-list',
routes: [
{
name: 'project-list',
'path': '/project/project-list',
'component': 'Project/ProjectList',
'access': 'canReadMenu'
}]
path: '/project/project-list',
component: 'Project/ProjectList',
access: 'canReadMenu',
},
],
},
{
name: 'Contact',
path: '/Contact',
routes: [{
'name': 'Contact-contact-list',
'path': '/Contact/contact-list',
'component': 'Contact/ContactList',
'access': 'canReadMenu'
}],
routes: [
{
name: 'Contact-contact-list',
path: '/Contact/contact-list',
component: 'Contact/ContactList',
access: 'canReadMenu',
},
],
},
{
name: 'task',
@ -249,7 +266,20 @@ export default [
{
name: 'alarm',
path: '/alarm',
component: 'Hidden',
routes: [
{
name: 'alarm-list',
path: '/alarm/alarm-list',
component: 'Alarm/AlarmList',
access: 'canReadMenu',
},
{
name: 'alarm-setting',
path: '/alarm/alarm-setting',
component: 'Alarm/AlarmSetting',
access: 'canReadMenu',
},
],
},
{
name: 'logging',
@ -267,11 +297,13 @@ export default [
{
name: 'fabricView',
path: '/fabricView',
routes: [{
'name': 'fabricView-room',
'path': '/fabricView/room',
'component': 'FabricView/Room',
'access': 'canReadMenu'
}]
routes: [
{
name: 'fabricView-room',
path: '/fabricView/room',
component: 'FabricView/Room',
access: 'canReadMenu',
},
],
},
];

@ -2,12 +2,13 @@
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-08 16:03:40
* @LastEditTime: 2023-12-18 16:38:59
* @FilePath: \general-ai-platform-web\src\locales\zh-CN.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import * as contactZh from '@/locales/zh-CN/contact';
import * as DCSDevice from '@/locales/zh-CN/DCSDevice';
import * as alarmLangs from '@/locales/zh-CN/alarm';
import * as analysisZh from '@/locales/zh-CN/analysis';
import * as deviceZh from '@/locales/zh-CN/device';
import * as errorTypesZh from '@/locales/zh-CN/errorTypes';
@ -67,4 +68,5 @@ export default {
...Object.assign({}, ...Object.values(projectZh)),
...Object.assign({}, ...Object.values(DCSDevice)),
...Object.assign({}, ...Object.values(contactZh)),
...Object.assign({}, ...Object.values(alarmLangs)),
};

@ -0,0 +1,29 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-12-18 16:36:36
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-18 17:46:05
* @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
*/
// 设备列表
export const alarm_list: { [key: string]: string } = {
'alarm.list.table.list.id': 'ID',
}
// 设备状态
export const alarm_setting: { [key: string]: string } = {
'alarm.setting.table.list.name': '告警名称',
'alarm.setting.table.list.code': '告警代码',
'alarm.setting.table.list.category': '告警分类',
'alarm.setting.table.list.level': '告警级别',
'alarm.setting.table.list.createTime': '创建时间',
'alarm.setting.table.list.remark': '备注',
'alarm.setting.table.list.setting': '告警等级设置',
'alarm.setting.table.list.add': '新建告警项',
'alarm.setting.table.model.title': '告警等级',
'alarm.setting.table.list.update': '编辑告警项',
'alarm.setting.table.rule.required.code': '类别代码为必填项',
}

@ -0,0 +1,41 @@
import React from "react";
import {Drawer} from "antd";
import {ProColumns, ProDescriptions, ProDescriptionsItemProps} from "@ant-design/pro-components";
export type ColumnDrawProps = {
handleDrawer: (id?: any)=>void;
isShowDetail: boolean;
columns: ProColumns<API.DeviceCategory>[];
currentRow: API.DeviceCategory | undefined;
};
const ColumnDrawer: React.FC<ColumnDrawProps> = (props) => {
return (
<Drawer
width={500}
open={props.isShowDetail}
onClose={() => {
props.handleDrawer();
}}
closable={true}
>
{props.currentRow?.id && (
<ProDescriptions<API.DeviceCategory>
column={2}
title={props.currentRow?.id}
request={async () => ({
data: props.currentRow || {},
})}
params={{
id: props.currentRow?.id,
}}
columns={props.columns as ProDescriptionsItemProps<API.DeviceCategory>[]}
/>
)}
</Drawer>
)
}
export {ColumnDrawer}

@ -0,0 +1,32 @@
import { FormattedMessage} from '@umijs/max';
export const DeviceCategoryColumns = [{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.id"
defaultMessage="$$$"/>),
dataIndex: "id",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.name"
defaultMessage="$$$"/>),
dataIndex: "name",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.code"
defaultMessage="$$$"/>),
dataIndex: "code",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.remark"
defaultMessage="$$$"/>),
dataIndex: "remark",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.createTime"
defaultMessage="$$$"/>),
dataIndex: "create_time",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.updateTime"
defaultMessage="$$$"/>),
dataIndex: "update_time",
},]

@ -0,0 +1,143 @@
import { postDeviceCategoryCreateDeviceCategory } from '@/services/device/DeviceCategory';
import { ModalForm, ProForm, ProFormText } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, Switch, message } from 'antd';
import React, { useState } from 'react';
import {
proFormSmallItemStyleProps,
proFormSmallModelWidth,
} from '../../../../../config/defaultForm';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.DeviceCategory>;
export type CreateFormProps = {
createModalOpen: boolean;
handleModal: () => void;
values: Partial<API.DeviceCategory>;
reload: any;
};
const CreateForm: React.FC<CreateFormProps> = (props) => {
const intl = useIntl();
const [isAuto, setIsAuto] = useState(true);
const [form] = Form.useForm<API.DeviceCategory>();
return (
<ModalForm<API.DeviceCategory>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.add',
defaultMessage: '$$$',
})}
open={props.createModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
postDeviceCategoryCreateDeviceCategory(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="DCSDeviceList.device_category.table.list.name" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.name',
defaultMessage: '$$$',
})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width="lg"
name="code"
label={
<FormattedMessage id="DCSDeviceList.device_category.table.list.code" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.code',
defaultMessage: '$$$',
})}`}
required={!isAuto}
initialValue=""
disabled={isAuto}
rules={
isAuto
? []
: [
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.code"
defaultMessage="code is required"
/>
),
},
]
}
addonAfter={
<Switch
checked={isAuto}
checkedChildren={<FormattedMessage id="common.auto" defaultMessage="$$$" />}
unCheckedChildren={<FormattedMessage id="common.edit" defaultMessage="$$$" />}
onChange={setIsAuto}
/>
}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="remark"
label={
<FormattedMessage id="DCSDeviceList.device_category.table.list.remark" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.remark',
defaultMessage: '$$$',
})}`}
required={false}
/>
</ProForm.Group>
</ModalForm>
);
};
export default CreateForm;

@ -0,0 +1,187 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-17 10:12:53
* @FilePath: \general-ai-platform-web\src\pages\Device\DeviceCategoryList\components\UpdateForm.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
import { ModalForm, ProForm, ProFormDateTimePicker, ProFormText } from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, message } from 'antd';
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
import React from 'react';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.DeviceCategory>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.DeviceCategory>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.DeviceCategory>();
return (
<ModalForm<API.DeviceCategory>
width={proFormModelWidth}
title={intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.update',
defaultMessage: '$$$',
})}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
putDeviceCategoryUpdateDeviceCategory(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={proFormItemStyleProps.column2Width}
name="id"
label="id"
disabled={true}
initialValue={props.values.id}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="name"
label={
<FormattedMessage id="DCSDeviceList.device_category.table.list.name" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.name',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.name}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="code"
label={
<FormattedMessage id="DCSDeviceList.device_category.table.list.code" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.code',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.code}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.code"
defaultMessage="code is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="remark"
label={
<FormattedMessage id="DCSDeviceList.device_category.table.list.remark" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.remark',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.remark}
disabled={false}
/>
<ProFormDateTimePicker
width={proFormItemStyleProps.column2Width}
name="createTime"
label={
<FormattedMessage
id="DCSDeviceList.device_category.table.list.createTime"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.createTime',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.createTime}
disabled={true}
/>
<ProFormDateTimePicker
width={proFormItemStyleProps.column2Width}
name="updateTime"
label={
<FormattedMessage
id="DCSDeviceList.device_category.table.list.updateTime"
defaultMessage="$$$"
/>
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'DCSDeviceList.device_category.table.list.updateTime',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.updateTime}
disabled={true}
/>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateForm;

@ -0,0 +1,291 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import {
deleteDeviceCategoryDeleteDeviceCategory,
deleteDeviceCategoryDeleteDeviceCategoryByIds,
postDeviceCategoryGetDeviceCategoryList,
} from '@/services/device/DeviceCategory';
import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
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
* @zh-CN
* */
const access = useAccess();
const intl = useIntl();
const actionRef = useRef<ActionType>();
// 动态设置每页数量
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) => {
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 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="$$$" />,
dataIndex: 'name',
hideInSearch: false,
},
{
title: <FormattedMessage id="DCSDeviceList.device_category.table.list.code" defaultMessage="$$$" />,
dataIndex: 'code',
hideInSearch: true,
},
{
title: (
<FormattedMessage id="DCSDeviceList.device_category.table.list.remark" defaultMessage="$$$" />
),
dataIndex: 'remark',
hideInSearch: true,
},
{
title: (
<FormattedMessage id="DCSDeviceList.device_category.table.list.createTime" defaultMessage="$$$" />
),
dataIndex: 'createTime',
sorter: true,
hideInSearch: true,
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" />,
dataIndex: 'option',
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<TableActionCard
key="TableActionCardRef"
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',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
return (
<PageContainer>
<ProTable<API.DeviceCategory>
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
defaultMessage: '$$$',
})}
options={{ fullScreen: true, setting: true, density: true, reload: true }}
actionRef={actionRef}
rowKey="key"
search={{
labelWidth: proTableCommonOptions.searchLabelWidth,
}}
onDataSourceChange={(data) => {}}
pagination={{
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize),
}}
columnsState={{
persistenceKey: 'device_category_list',
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) => {
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 });
return {
data: resp.data.list.map((v: API.DeviceCategory) => {
return { ...v, key: v.id };
}),
success: resp.success,
total: resp.data.total,
current: resp.data.page,
pageSize: resp.data.pageSize,
};
}}
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>
);
};
export default DeviceCategoryList;

@ -0,0 +1,41 @@
import React from "react";
import {Drawer} from "antd";
import {ProColumns, ProDescriptions, ProDescriptionsItemProps} from "@ant-design/pro-components";
export type ColumnDrawProps = {
handleDrawer: (id?: any)=>void;
isShowDetail: boolean;
columns: ProColumns<API.DeviceCategory>[];
currentRow: API.DeviceCategory | undefined;
};
const ColumnDrawer: React.FC<ColumnDrawProps> = (props) => {
return (
<Drawer
width={500}
open={props.isShowDetail}
onClose={() => {
props.handleDrawer();
}}
closable={true}
>
{props.currentRow?.id && (
<ProDescriptions<API.DeviceCategory>
column={2}
title={props.currentRow?.id}
request={async () => ({
data: props.currentRow || {},
})}
params={{
id: props.currentRow?.id,
}}
columns={props.columns as ProDescriptionsItemProps<API.DeviceCategory>[]}
/>
)}
</Drawer>
)
}
export {ColumnDrawer}

@ -0,0 +1,32 @@
import { FormattedMessage} from '@umijs/max';
export const DeviceCategoryColumns = [{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.id"
defaultMessage="$$$"/>),
dataIndex: "id",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.name"
defaultMessage="$$$"/>),
dataIndex: "name",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.code"
defaultMessage="$$$"/>),
dataIndex: "code",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.remark"
defaultMessage="$$$"/>),
dataIndex: "remark",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.createTime"
defaultMessage="$$$"/>),
dataIndex: "create_time",
},{
title: (<FormattedMessage
id="DCSDeviceList.device_category.table.list.updateTime"
defaultMessage="$$$"/>),
dataIndex: "update_time",
},]

@ -0,0 +1,159 @@
import { postDeviceCategoryCreateDeviceCategory } from '@/services/device/DeviceCategory';
import { ModalForm, ProForm, ProFormSelect, 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 { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
// TODO 需要根据接口替换API.DeviceCategory
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.DeviceCategory>;
export type CreateFormProps = {
createModalOpen: boolean;
handleModal: () => void;
values: Partial<API.DeviceCategory>;
reload: any;
};
const CreateForm: React.FC<CreateFormProps> = (props) => {
const intl = useIntl();
const [isAuto, setIsAuto] = useState(true);
const [form] = Form.useForm<API.DeviceCategory>();
return (
<ModalForm<API.DeviceCategory>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'alarm.setting.table.list.add',
defaultMessage: '$$$',
})}
open={props.createModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
postDeviceCategoryCreateDeviceCategory(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.setting.table.list.name" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.name',
defaultMessage: '$$$',
})}`}
required={true}
rules={[
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="code"
label={<FormattedMessage id="alarm.setting.table.list.code" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.code',
defaultMessage: '$$$',
})}`}
required={!isAuto}
initialValue=""
rules={[
{
required: true,
message: (
<FormattedMessage
id="alarm.setting.table.rule.required.code"
defaultMessage="code is required"
/>
),
},
]}
// addonAfter={
// <Switch
// checked={isAuto}
// checkedChildren={<FormattedMessage id="common.auto" defaultMessage="$$$" />}
// unCheckedChildren={<FormattedMessage id="common.edit" defaultMessage="$$$" />}
// onChange={setIsAuto}
// />
// }
/>
<ProFormSelect
width={proFormSmallItemStyleProps.width}
name="level"
label={<FormattedMessage id="alarm.setting.table.list.level" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.level',
defaultMessage: '$$$',
})}`}
required={false}
debounceTime={1000}
request={async (keyWord) => {
// TODO 此处需要使用告警级别接口联调
const resp = await postDeviceGroupGetDeviceGroupFkSelect({});
return resp.data.list.map((v: any) => {
return {
label: v.name,
value: v.id,
};
});
}}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="remark"
label={<FormattedMessage id="alarm.setting.table.list.remark" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.remark',
defaultMessage: '$$$',
})}`}
required={false}
/>
</ProForm.Group>
</ModalForm>
);
};
export default CreateForm;

@ -0,0 +1,170 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-12-18 17:47:49
* @FilePath: \general-ai-platform-web\src\pages\Device\DeviceCategoryList\components\UpdateForm.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { putDeviceCategoryUpdateDeviceCategory } from '@/services/device/DeviceCategory';
import {
ModalForm,
ProForm,
ProFormDateTimePicker,
ProFormSelect,
ProFormText,
} from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, message } from 'antd';
import React from 'react';
import {
proFormSmallItemStyleProps,
proFormSmallModelWidth,
} from '../../../../../config/defaultForm';
import { postDeviceGroupGetDeviceGroupFkSelect } from '@/services/device/DeviceGroup';
export type FormValueType = {
target?: string;
template?: string;
type?: string;
time?: string;
frequency?: string;
} & Partial<API.DeviceCategory>;
export type UpdateFormProps = {
updateModalOpen: boolean;
handleModal: () => void;
values: Partial<API.DeviceCategory>;
reload: any;
};
const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm<API.DeviceCategory>();
return (
<ModalForm<API.DeviceCategory>
width={proFormSmallModelWidth}
title={intl.formatMessage({
id: 'alarm.setting.table.list.update',
defaultMessage: '$$$',
})}
open={props.updateModalOpen}
form={form}
autoFocusFirstInput
modalProps={{
destroyOnClose: true,
onCancel: () => props.handleModal(),
}}
submitTimeout={2000}
onFinish={async (values) => {
putDeviceCategoryUpdateDeviceCategory(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.setting.table.list.name" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.name',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.name}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="DCSDeviceList.device_category.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="code"
label={<FormattedMessage id="alarm.setting.table.list.code" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.code',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.code}
disabled={false}
rules={[
{
required: true,
message: (
<FormattedMessage
id="alarm.setting.table.rule.required.code"
defaultMessage="code is required"
/>
),
},
]}
/>
<ProFormSelect
width={proFormSmallItemStyleProps.width}
name="level"
label={<FormattedMessage id="alarm.setting.table.list.level" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.level',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.level}
debounceTime={1000}
request={async (keyWord) => {
// TODO 此处需要使用告警级别接口联调
const resp = await postDeviceGroupGetDeviceGroupFkSelect({});
return resp.data.list.map((v: any) => {
return {
label: v.name,
value: v.id,
};
});
}}
/>
<ProFormText
width={proFormSmallItemStyleProps.width}
name="remark"
label={<FormattedMessage id="alarm.setting.table.list.remark" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'alarm.setting.table.list.remark',
defaultMessage: '$$$',
})}`}
required={false}
initialValue={props.values.remark}
disabled={false}
/>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateForm;

@ -0,0 +1,284 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import {
deleteDeviceCategoryDeleteDeviceCategory,
deleteDeviceCategoryDeleteDeviceCategoryByIds,
postDeviceCategoryGetDeviceCategoryList,
} from '@/services/device/DeviceCategory';
import { PlusOutlined, SettingOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
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
* @zh-CN
* */
const access = useAccess();
const intl = useIntl();
const actionRef = useRef<ActionType>();
// 动态设置每页数量
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
const [currentRow, setCurrentRow] = useState<API.DeviceCategory>();
const [selectedRowsState, setSelectedRows] = useState<API.DeviceCategory[]>([]);
/**
// TODO
1.
2. -
3. -
*/
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) => {
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 columns: ProColumns<API.DeviceCategory>[] = [
{
title: <FormattedMessage id="alarm.setting.table.list.name" defaultMessage="$$$" />,
dataIndex: 'name',
hideInSearch: false,
},
{
title: <FormattedMessage id="alarm.setting.table.list.code" defaultMessage="$$$" />,
dataIndex: 'code',
hideInSearch: true,
},
{
title: (
<FormattedMessage id="alarm.setting.table.list.category" defaultMessage="$$$" />
),
dataIndex: 'category',
hideInSearch: true,
},
{
title: (
<FormattedMessage id="alarm.setting.table.list.level" defaultMessage="$$$" />
),
dataIndex: 'level',
hideInSearch: true,
},
{
title: (
<FormattedMessage id="alarm.setting.table.list.createTime" defaultMessage="$$$" />
),
dataIndex: 'createTime',
sorter: true,
hideInSearch: true,
valueType: 'dateTime',
},
{
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="Operating" />,
dataIndex: 'option',
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="common.edit" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
return (
<PageContainer>
<ProTable<API.DeviceCategory>
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
defaultMessage: '$$$',
})}
options={{ fullScreen: true, setting: true, density: true, reload: true }}
actionRef={actionRef}
rowKey="key"
search={{
labelWidth: proTableCommonOptions.searchLabelWidth,
}}
onDataSourceChange={() => {}}
pagination={{
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize),
}}
columnsState={{
persistenceKey: 'device_category_list',
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);
}}
>
<SettingOutlined /> <FormattedMessage id="alarm.setting.table.list.setting" defaultMessage="New" />
</Button>
<Button
type="primary"
key="primary"
onClick={() => {
setCreateModalOpen(true);
}}
>
<PlusOutlined /> <FormattedMessage id="alarm.setting.table.list.add" defaultMessage="New" />
</Button>
</Access>,
]}
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 });
return {
data: resp.data.list.map((v: API.DeviceCategory) => {
return { ...v, key: v.id };
}),
success: resp.success,
total: resp.data.total,
current: resp.data.page,
pageSize: resp.data.pageSize,
};
}}
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>
);
};
export default DeviceCategoryList;

@ -18,7 +18,9 @@
"paths": {
"@/*": ["./src/*"],
"@@/*": ["./src/.umi/*"],
"@@test/*": ["./src/.umi-test/*"]
"@@test/*": ["./src/.umi-test/*"],
"@umijs/max": ["./src/.umijs/max"],
}
},
"include": ["./**/*.d.ts", "./**/*.ts", "./**/*.tsx"]

Loading…
Cancel
Save