selectDevice.js 6.02 KB
import React, { memo, useMemo, useEffect, useState, useCallback } from 'react';
import { useRequest, useModel } from 'umi';
import { connent } from 'dva';
import { Table, Input, Button, TreeSelect, Select, Form, Row, Col, Tag, Modal } from 'antd';
import omit from 'omit.js';
import useFormTable from '@/useHooks/useFormTable';
import { fetchOrganization, fetchBranchTree } from '@/services/dict';
import { systemNodeTree } from '@/pages/Ops/DeviceMonitor/Configuration/service';
import { createSystemTree, batchDicData } from '@/utils/utils';
import { device_service_meter_post } from '@/sdk/api/device';

const SelectDevice = (props) => {

  const [expandedKeys, setExpandedKeys] = useState([]);
  const [selectedAttr, setSelectedAttr] = useState([]);
  const [selectedMeter, setSelectedMeter] = useState({});

  const [selectedMeters, setSelectedMeters] = useState({}); 

  const { initialState } = useModel('@@initialState');
  const { deviceType } = batchDicData(
    ['deviceType'], initialState.dicTotalsList
  )
  const [form] = Form.useForm();
  const { data } = useRequest(systemNodeTree); // 系统树
  const fetchList = useRequest(param => {
    return device_service_meter_post(param);
    // return device_service_meter_post({...fetchData.data, layoutEx: stringify(canvas.data) })  
  }, {
    manual: true,
    formatResult: res => res
  });

  const [selectedKeys, setSelectedKeys] = useState([]);

  const systemTreeData = useMemo(() => {

    return data && createSystemTree(data, 'systemNodeList') || [];
  }, [data]);

  const handleOnExpand = useCallback((key, item) => {
    setExpandedKeys(key ? [item.id] : [])
  }, []);

  const getListItems = (payload = {}) => {
    fetchList.run(payload);
  }

  // 查询表单
  const { tableProps, search } = useFormTable(getListItems, {
    form,
    pageSize: 6
  });

  const formLayout = {
    labelCol: { span: 8 },
    wrapperCol: { span: 15 }
  };

  const columns = [
    { title: '仪表编号', dataIndex: ['device', 'code'] },
    { title: '仪表名称', dataIndex: ['device', 'name'] },
    { title: '类型', dataIndex: ['device', 'typeName'] },
    { title: '采集来源', dataIndex: 'collectionSourceName' },
    // { title: '所属设备系统', dataIndex: 'creator' }
  ];

  const expandedRowRender = (data) => {

    const rowSelection = {
      selectedRowKeys: selectedMeters[data.id]?.attr?.map(item => `${data.id}_${item.id}`) || [],
      onChange: (keys, records) => {

        if (keys.length === 0) {
          setSelectedMeters(omit(selectedMeters, [data.id]));
        } else {

          setSelectedMeters({...(props.multiple !== false ? selectedMeters : {}), [data.id]: {
            attr: records.map(item => ({ ...item, wsType: 'event' })), // external: {type:"event"}
            meter: omit(data, ["meterAttrList", "highestPriorityDeviceStatus", 'meterEventList', 'meterModel'] || {})
          } });
        }
        // setSelectedKeys(keys || [])
        // setSelectedAttr(records || []);
        // setSelectedMeter(omit(data, ["meterAttrList", "highestPriorityDeviceStatus"]) || {});
      },
    };

    const columns = [
      { title: '事件名', dataIndex: 'name' },
      { title: '事件编号', dataIndex: 'id' },
      { title: '说明', dataIndex: 'description' }
    ];

    return <Table size="small" rowSelection={rowSelection} rowKey={(item) => `${data.id}_${item.id}` } columns={columns} dataSource={data.meterEventList} pagination={false} />;
  };

  const handleOk = useCallback(() => {


    console.log('selectedMeters =====', selectedMeters)

    props.onChange(selectedMeters);
    props.onClose();
  }, [selectedMeters]);


  const handleValuesChange = (value, values) => {

    console.log('values ========= ', values)


    // if(values.systemNodeIdLike.toString().indexOf('parent-') === 0) {
    //   values.systemId = values.systemNodeIdLike.replace('parent-', '')
    //   values.systemNodeIdLike = null
    // }
    search.submit(values)
  }
  // console.log(111); search.submit()

  return (
    <Modal visible={ props.visible } width={1000} onCancel={ props.onClose } onOk={ handleOk } >
      <div style={{ padding: '10px 0 20px 10px' }}>
        已选事件:
        {
          Object.keys(selectedMeters).map(element => <div style={{ margin: '5px 0' }} key={element}>
            <Tag>{selectedMeters[element]['meter'].name || selectedMeters[element]['meter'].device?.name}</Tag>
            {
              selectedMeters[element]['attr'].map(item => <Tag key={item.id} color="processing">{item.name}</Tag>)
            }
          </div>)
        }
      </div>
      <div>
        <Form form={form} {...formLayout} onValuesChange={ handleValuesChange }>
          <Row>
            <Col span={8}>
              <Form.Item label='所属设备系统' name='systemNodeIdLike'>
                <TreeSelect
                    treeData={systemTreeData}
                    showSearch={true}
                    placeholder='请选择'
                    allowClear
                />
              </Form.Item>
            </Col>
            <Col span={5}>
              <Form.Item label='类型' name='typeIdLike'>
                <Select allowClear>
                  {
                    (deviceType?.selectData || []).map(item => <Select.Option key={item.value} value={item.value}>{item.title}</Select.Option>)
                  }
                </Select>
              </Form.Item>
            </Col>
            <Col span={10}>
              <Form.Item label='查询' name='blurQuery'>
                <Input.Search />
              </Form.Item>
            </Col>
          </Row>
        </Form>
      </div>
      <Table
        size="small"
        rowKey={(record) => record.id}
        columns={columns}
        dataSource={fetchList.data?.data}
        expandable={{ expandedRowRender }}
        expandedRowKeys={expandedKeys}
        onExpand={handleOnExpand}
        pagination={{ 
          total: fetchList.data?.totalElements,
          pageSize: fetchList.data?.size,
          current: fetchList.data?.number }}
        {...tableProps}
      />
    </Modal>
  )
}

export default memo(SelectDevice);