|
@@ -12,23 +12,11 @@ import {
|
|
|
queryMembraneList,
|
|
|
queryProjectConfig,
|
|
|
} from '@/services/SmartOps';
|
|
|
-import { history, useParams, useRequest } from '@umijs/max';
|
|
|
-import {
|
|
|
- Button,
|
|
|
- Col,
|
|
|
- DatePicker,
|
|
|
- Empty,
|
|
|
- Form,
|
|
|
- Icon,
|
|
|
- List,
|
|
|
- Modal,
|
|
|
- Row,
|
|
|
- Spin,
|
|
|
-} from 'antd';
|
|
|
-import * as echarts from 'echarts';
|
|
|
+import { useRequest } from '@umijs/max';
|
|
|
+import { DatePicker, Icon, Modal, Select, Spin } from 'antd';
|
|
|
import dayjs from 'dayjs';
|
|
|
+import * as echarts from 'echarts';
|
|
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
|
-import Panel from './Panel';
|
|
|
import styles from './SimulateDetail.less';
|
|
|
|
|
|
const { RangePicker } = DatePicker;
|
|
@@ -106,110 +94,58 @@ const SimulateDetail = (props) => {
|
|
|
};
|
|
|
|
|
|
return (
|
|
|
- <Panel
|
|
|
- title={'模拟记录'}
|
|
|
- style={{ width: '100%' }}
|
|
|
- btns={
|
|
|
- <div className={styles.tabs}>
|
|
|
- <div className={styles.left} onClick={onLeftClick}></div>
|
|
|
- <div id="content" className={styles.content}>
|
|
|
- {data?.map((item) => (
|
|
|
- <div
|
|
|
- key={item}
|
|
|
- className={`${styles.item} ${
|
|
|
- active == item ? styles.active : ''
|
|
|
- }`}
|
|
|
- onClick={() => {
|
|
|
- setActive(item);
|
|
|
- setCurrent(null);
|
|
|
- }}
|
|
|
- >
|
|
|
- {TYPE[item]?.name}
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- <div className={styles.right} onClick={onRightClick}></div>
|
|
|
+ <div>
|
|
|
+ <div className={styles.tabs}>
|
|
|
+ <div className={styles.left} onClick={onLeftClick}></div>
|
|
|
+ <div id="content" className={styles.content}>
|
|
|
+ {data?.map((item) => (
|
|
|
+ <div
|
|
|
+ key={item}
|
|
|
+ className={`${styles.item} ${
|
|
|
+ active == item ? styles.active : ''
|
|
|
+ }`}
|
|
|
+ onClick={() => {
|
|
|
+ setActive(item);
|
|
|
+ setCurrent(null);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {TYPE[item]?.name}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
</div>
|
|
|
- }
|
|
|
- >
|
|
|
- <div className={styles.box}>
|
|
|
- <ListContent
|
|
|
+ <div className={styles.right} onClick={onRightClick}></div>
|
|
|
+ </div>
|
|
|
+ <div className={`${styles.box} card-box`}>
|
|
|
+ <ChartContent
|
|
|
active={active}
|
|
|
projectId={projectId}
|
|
|
current={current}
|
|
|
- onClick={setCurrent}
|
|
|
+ setCurrent={setCurrent}
|
|
|
/>
|
|
|
- <ChartContent active={active} projectId={projectId} current={current} />
|
|
|
</div>
|
|
|
- </Panel>
|
|
|
- );
|
|
|
-};
|
|
|
-
|
|
|
-const ListContent = (props) => {
|
|
|
- const { current, onClick, projectId, active } = props;
|
|
|
-
|
|
|
- const { data, loading, run } = useRequest(
|
|
|
- () => {
|
|
|
- let params = {
|
|
|
- page: 1,
|
|
|
- page_size: 99999,
|
|
|
- project_id: projectId,
|
|
|
- };
|
|
|
- return TYPE[active]?.device(params);
|
|
|
- },
|
|
|
- {
|
|
|
- manual: true,
|
|
|
- onSuccess(data) {
|
|
|
- if (data.list?.[0]) {
|
|
|
- onClick(data.list[0]);
|
|
|
- } else {
|
|
|
- onClick(null);
|
|
|
- }
|
|
|
- },
|
|
|
- },
|
|
|
- );
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- if (active) run();
|
|
|
- }, [active]);
|
|
|
-
|
|
|
- return (
|
|
|
- <div className={styles.listBox}>
|
|
|
- <div className={styles.title}>设备列表</div>
|
|
|
- <List
|
|
|
- split={false}
|
|
|
- className={styles.list}
|
|
|
- dataSource={data?.list || []}
|
|
|
- renderItem={(item, idx) => (
|
|
|
- <List.Item
|
|
|
- className={
|
|
|
- item == current ? styles.listItemActive : styles.listItem
|
|
|
- }
|
|
|
- style={
|
|
|
- idx % 2 == 0
|
|
|
- ? {
|
|
|
- background:
|
|
|
- 'linear-gradient(to right, rgba(153, 231, 255, 0.1), rgba(96, 168, 255, 0.1))',
|
|
|
- }
|
|
|
- : {
|
|
|
- background:
|
|
|
- 'linear-gradient(to right, rgba(153, 231, 255, 0.2), rgba(96, 168, 255, 0.2))',
|
|
|
- }
|
|
|
- }
|
|
|
- onClick={() => onClick(item)}
|
|
|
- >
|
|
|
- {item.device_code}
|
|
|
- </List.Item>
|
|
|
- )}
|
|
|
- />
|
|
|
</div>
|
|
|
);
|
|
|
};
|
|
|
|
|
|
+const DateTab = [
|
|
|
+ {
|
|
|
+ value: 'day',
|
|
|
+ label: '今日',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 'week',
|
|
|
+ label: '本周',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 'month',
|
|
|
+ label: '本月',
|
|
|
+ },
|
|
|
+];
|
|
|
const ChartContent = (props) => {
|
|
|
- const { current, projectId, active } = props;
|
|
|
+ const { current, projectId, active, setCurrent } = props;
|
|
|
const [visible, setVisible] = useState(false);
|
|
|
const [params, setParams] = useState(null);
|
|
|
+ const [dateActive, setDateActive] = useState('day');
|
|
|
const [time, setTime] = useState([dayjs().startOf('day'), dayjs()]);
|
|
|
const timerRef = useRef({
|
|
|
s_time: time[0].format('YYYY-MM-DD HH:mm:ss'),
|
|
@@ -218,7 +154,7 @@ const ChartContent = (props) => {
|
|
|
const domRef = useRef(null);
|
|
|
const chartRef = useRef(null);
|
|
|
|
|
|
- const { data, loading, run } = useRequest(
|
|
|
+ const { data, run } = useRequest(
|
|
|
() => {
|
|
|
let params = {
|
|
|
device_code: current.device_code,
|
|
@@ -227,6 +163,7 @@ const ChartContent = (props) => {
|
|
|
project_id: projectId,
|
|
|
...timerRef.current,
|
|
|
};
|
|
|
+ setParams(params);
|
|
|
return TYPE[active].chart(params);
|
|
|
},
|
|
|
{
|
|
@@ -254,6 +191,7 @@ const ChartContent = (props) => {
|
|
|
}, [data]);
|
|
|
|
|
|
const searchTime = (type) => {
|
|
|
+ setDateActive(type);
|
|
|
let time = [dayjs().startOf(type), dayjs()];
|
|
|
onSearch?.(time);
|
|
|
};
|
|
@@ -288,62 +226,45 @@ const ChartContent = (props) => {
|
|
|
|
|
|
return (
|
|
|
<div className={styles.chartBox}>
|
|
|
- <div className={styles.title}>
|
|
|
- 优化建议
|
|
|
- {active == 1 && (
|
|
|
- <Icon
|
|
|
- type="area-chart"
|
|
|
- style={{ float: 'right', lineHeight: '56px', marginRight: 20 }}
|
|
|
- onClick={() => setVisible(true)}
|
|
|
- />
|
|
|
- )}
|
|
|
- </div>
|
|
|
- {/* <SearchModule style={{ margin: '20px 0' }} onSearch={onSearch} type={2} /> */}
|
|
|
- <Form layout="inline" style={{ margin: '10px 0' }}>
|
|
|
- <Row gutter={24}>
|
|
|
- <Col span={14}>
|
|
|
- <Form.Item
|
|
|
- label="时间"
|
|
|
- labelCol={{ span: 4 }}
|
|
|
- wrapperCol={{ span: 20 }}
|
|
|
- >
|
|
|
- <RangePicker
|
|
|
- allowClear={false}
|
|
|
- value={time}
|
|
|
- onChange={onSearch}
|
|
|
- ></RangePicker>
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={10}>
|
|
|
- <div>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- onClick={() => searchTime('day')}
|
|
|
- style={{ marginRight: 10 }}
|
|
|
- >
|
|
|
- 今日
|
|
|
- </Button>
|
|
|
- <Button
|
|
|
- type="primary"
|
|
|
- onClick={() => searchTime('week')}
|
|
|
- style={{ marginRight: 10 }}
|
|
|
+ <div className={styles.chartBoxTop}>
|
|
|
+ <DeviceList
|
|
|
+ active={active}
|
|
|
+ projectId={projectId}
|
|
|
+ current={current}
|
|
|
+ onClick={setCurrent}
|
|
|
+ />
|
|
|
+
|
|
|
+ <div style={{ display: 'flex' }}>
|
|
|
+ <div className={styles.dateTabs}>
|
|
|
+ {DateTab.map((item) => (
|
|
|
+ <div
|
|
|
+ key={item.value}
|
|
|
+ className={`${styles.dateTabsItem} ${
|
|
|
+ item.value == dateActive ? styles.active : ''
|
|
|
+ }`}
|
|
|
+ onClick={() => searchTime(item.value)}
|
|
|
>
|
|
|
- 本周
|
|
|
- </Button>
|
|
|
- <Button type="primary" onClick={() => searchTime('month')}>
|
|
|
- 本月
|
|
|
- </Button>
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </Form>
|
|
|
- <Spin spinning={loading}>
|
|
|
+ {item.label}
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ {active == 1 && (
|
|
|
+ <Icon
|
|
|
+ type="area-chart"
|
|
|
+ style={{ float: 'right', lineHeight: '56px', marginRight: 20 }}
|
|
|
+ onClick={() => setVisible(true)}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* <Spin spinning={loading} wrapperClassName={styles.loadingBox}>
|
|
|
{!loading && !data?.list && <Empty style={{ height: 195 }} />}
|
|
|
- <div
|
|
|
- ref={domRef}
|
|
|
- style={{ height: '100%', display: !data?.list ? 'none' : 'block' }}
|
|
|
- />
|
|
|
- </Spin>
|
|
|
+ </Spin> */}
|
|
|
+ <div
|
|
|
+ ref={domRef}
|
|
|
+ style={{ height: '100%', display: !data?.list ? 'none' : 'block' }}
|
|
|
+ />
|
|
|
{optimization && (
|
|
|
<div
|
|
|
style={{
|
|
@@ -367,6 +288,51 @@ const ChartContent = (props) => {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
+const DeviceList = (props) => {
|
|
|
+ const { current, onClick, projectId, active } = props;
|
|
|
+
|
|
|
+ const { data, loading, run } = useRequest(
|
|
|
+ () => {
|
|
|
+ let params = {
|
|
|
+ page: 1,
|
|
|
+ page_size: 99999,
|
|
|
+ project_id: projectId,
|
|
|
+ };
|
|
|
+ return TYPE[active]?.device(params);
|
|
|
+ },
|
|
|
+ {
|
|
|
+ manual: true,
|
|
|
+ onSuccess(data) {
|
|
|
+ if (data.list?.[0]) {
|
|
|
+ onClick(data.list[0]);
|
|
|
+ } else {
|
|
|
+ onClick(null);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ const handleChange = (value) => {
|
|
|
+ let current = data.list.find((item) => item.device_code == value);
|
|
|
+ onClick(current);
|
|
|
+ };
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (active) run();
|
|
|
+ }, [active]);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Select
|
|
|
+ style={{ width: 200 }}
|
|
|
+ onChange={handleChange}
|
|
|
+ value={current?.device_code}
|
|
|
+ >
|
|
|
+ {data?.list.map((item) => (
|
|
|
+ <Option key={item.device_code}>{item.device_code}</Option>
|
|
|
+ ))}
|
|
|
+ </Select>
|
|
|
+ );
|
|
|
+};
|
|
|
function getOption(data = [], active) {
|
|
|
let formatter,
|
|
|
yAxisName = '',
|