You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

273 lines
8.0 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, { useEffect, useMemo, useState } from 'react';
import {
Button,
Card,
Checkbox,
Form,
Input,
InputNumber,
Radio,
Select,
Space,
Switch,
Table,
Tabs,
Typography,
} from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import styles from './Zdcj.less';
const { Text } = Typography;
const ruleTypeLabel = {
consistency: '一致性',
completeness: '完整性',
accuracy: '准确性',
other: '其他',
};
const Zdcj = () => {
const [activeTab, setActiveTab] = useState('rules');
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [selectedRuleId, setSelectedRuleId] = useState('r-4');
const [form] = Form.useForm();
const ruleList = useMemo(
() =>
new Array(9).fill(0).map((_, idx) => {
const id = `r-${idx + 1}`;
return {
id,
name: '电表漏电增值查',
type: 'consistency',
enabled: idx !== 1,
lastRun: '2025-10-15 14:30:00',
device: 'Lucy',
logic: '内容信息',
params: [
{ key: '告警阈值', value: 3 },
{ key: '检查周期', value: 3 },
{ key: '异常级别', value: 3 },
],
autoAction: 'lastValid',
notify: ['system'],
};
}),
[],
);
const currentRule = useMemo(
() => ruleList.find((r) => r.id === selectedRuleId) || ruleList[0],
[ruleList, selectedRuleId],
);
useEffect(() => {
if (!currentRule) return;
form.setFieldsValue({
ruleName: currentRule.name,
ruleType: currentRule.type,
applyDevice: currentRule.device,
checkLogic: currentRule.logic,
params: currentRule.params,
autoAction: currentRule.autoAction,
notify: currentRule.notify,
});
}, [currentRule, form]);
const columns = useMemo(
() => [
{
title: '规则名称',
dataIndex: 'name',
key: 'name',
ellipsis: true,
},
{
title: '类型',
dataIndex: 'type',
key: 'type',
width: 100,
render: (v) => ruleTypeLabel[v] || '--',
},
{
title: '状态',
dataIndex: 'enabled',
key: 'enabled',
width: 90,
align: 'center',
render: (v) => <Switch size="small" checked={!!v} onClick={(e) => e?.stopPropagation?.()} />,
},
{
title: '最后执行',
dataIndex: 'lastRun',
key: 'lastRun',
width: 170,
},
],
[],
);
const leftContent = useMemo(() => {
if (activeTab !== 'rules') {
return <div className={styles.placeholder}>该功能待接入接口/页面</div>;
}
return (
<>
<div className={styles.leftToolbar}>
<Space size={10} wrap>
<Button type="primary" icon={<PlusOutlined />}>
新增
</Button>
<Button>批量启用/禁用</Button>
<Button>规则模板</Button>
</Space>
<Text type="secondary">当前生效规则/总计12</Text>
</div>
<div className={styles.tableWrap}>
<Table
rowKey="id"
size="middle"
columns={columns}
dataSource={ruleList}
pagination={{ pageSize: 8, showSizeChanger: false }}
rowSelection={{
selectedRowKeys,
onChange: (keys) => setSelectedRowKeys(keys),
columnWidth: 44,
}}
rowClassName={(record) =>
record.id === selectedRuleId ? styles.selectedRow : ''
}
onRow={(record) => ({
onClick: () => setSelectedRuleId(record.id),
})}
/>
</div>
</>
);
}, [activeTab, columns, ruleList, selectedRowKeys, selectedRuleId]);
return (
<div className={styles.container}>
<div className={styles.layout}>
<div className={styles.leftPane}>
<Card
className={styles.panelCard}
bodyStyle={{ padding: 12 }}
title={
<Tabs
activeKey={activeTab}
onChange={setActiveTab}
items={[
{ key: 'rules', label: '校验规则' },
{ key: 'test', label: '测试规则' },
{ key: 'template', label: '规则模板' },
]}
/>
}
>
{leftContent}
</Card>
</div>
<div className={styles.rightPane}>
<Card
className={styles.panelCard}
title={<span className={styles.panelTitle}>详情</span>}
extra={
<Button type="link" className={styles.editLink}>
编辑
</Button>
}
bodyStyle={{ padding: 16 }}
>
<Form
form={form}
layout="horizontal"
labelCol={{ flex: '86px' }}
wrapperCol={{ flex: 1 }}
colon={false}
className={styles.detailForm}
>
<Form.Item label="规则名称" name="ruleName">
<Input placeholder="请输入" />
</Form.Item>
<Form.Item label="规则类型" name="ruleType">
<Radio.Group>
<Radio value="consistency">一致性</Radio>
<Radio value="completeness">完整性</Radio>
<Radio value="accuracy">准确性</Radio>
<Radio value="other">其他</Radio>
</Radio.Group>
</Form.Item>
<Form.Item label="适用设备" name="applyDevice">
<Select
options={[
{ value: 'Lucy', label: 'Lucy' },
{ value: 'Tom', label: 'Tom' },
{ value: 'A-01', label: 'A-01' },
]}
/>
</Form.Item>
<Form.Item label="校验逻辑" name="checkLogic">
<Input placeholder="内容信息" />
</Form.Item>
<div className={styles.sectionTitle}>参数设置</div>
{[0, 1, 2].map((idx) => (
<div className={styles.paramRow} key={idx}>
<div className={styles.paramLabel}>{`参数${idx + 1}`}</div>
<div className={styles.paramControl}>
<Space size={10}>
<Form.Item name={['params', idx, 'key']} noStyle>
<Select
style={{ width: 120 }}
placeholder="请选择"
options={[
{ value: '告警阈值', label: '告警阈值' },
{ value: '检查周期', label: '检查周期' },
{ value: '异常级别', label: '异常级别' },
]}
/>
</Form.Item>
<Form.Item name={['params', idx, 'value']} noStyle>
<InputNumber style={{ width: 72 }} min={0} />
</Form.Item>
</Space>
</div>
</div>
))}
<div className={styles.sectionTitle}>异常处理</div>
<Form.Item label="自动处理" name="autoAction">
<Radio.Group>
<Radio value="lastValid">使用上次有效值</Radio>
<Radio value="reset">重新设置</Radio>
</Radio.Group>
</Form.Item>
<Form.Item label="报警方式" name="notify">
<Checkbox.Group
options={[
{ label: '系统提示', value: 'system' },
{ label: '邮件', value: 'email' },
{ label: '短信', value: 'sms' },
{ label: 'APP推送', value: 'app' },
]}
/>
</Form.Item>
</Form>
</Card>
</div>
</div>
</div>
);
};
export default Zdcj;