AssociatedOptVolume.jsx 4.88 KB
import React, { useState, useEffect } from 'react'
import { Modal, Form, Table } from 'antd'
import useFormTable from '@/useHooks/useFormTable'
import { dispatchHandle } from '@/utils/publicHandle'
import { createSearchForm } from "@/utils/createForm";
import { batchDicData, createSystemTree } from "@/utils/utils";
import { connect } from 'umi'

const AssociatedOptVolume = (props) => {
    const {
        loading,
        dispatch,
        visible,
        setVisible,
        selectMeterArr,
        opsDevice: {
            meterList,
            systemNodeTree
        },
        dict: { dicTotalsList }
    } = props
    const [form] = Form.useForm()
    const [selectInfo, setSelectInfo] = useState({})
    const handleOk = () => {
        setVisible(false)
        selectMeterArr(selectInfo)
    }
    const handleCancel = () => {
        setVisible(false)
    }
    const systemListRequest = (payload = {}) => { dispatchHandle(dispatch, 'opsDevice/device_service_system_node_tree_post', payload) }
    const getListItem = (payload = {}) => {
        dispatchHandle(
            dispatch,
            'opsDevice/device_service_meter_post',
            payload
        )
    }
    const { tableProps, search } = useFormTable(getListItem, { form, manual: true })
    useEffect(() => {
        if (visible) {
            search.submit()
            systemListRequest({})
        }
    }, [visible])
    const { deviceType } = batchDicData(
        ['deviceType'],
        dicTotalsList || []
    )
    const typeData = deviceType?.selectData?.filter(item => item.dictKey === 'Meter')
    const [typeChildren] = typeData
    const systemTreeData = systemNodeTree && createSystemTree(systemNodeTree, 'subList') || []
    const allFormData = [
        { autoLayout: {}, label: '设备系统', name: 'systemNodeIdLike', type: 'treeSelect', selectData: systemTreeData },
        { autoLayout: {}, label: '类型', name: 'typeIdLike', type: deviceType?.type, selectData: typeChildren?.children || [] },
        { autoLayout: {}, label: '查询', name: 'blurQuery', type: 'input' }
    ];
    const columns = [
        { title: '设备编号', dataIndex: ['device', 'code'] },
        { title: '设备名称', dataIndex: ['device', 'name'] },
        { title: '类型', dataIndex: ['device', 'typeName'] },
        { title: '采集来源', dataIndex: 'collectionSourceName' },
        { title: '所属系统', dataIndex: ['device', 'systemNode', 'fullName'], ellipsis: true },
    ]
    const attrColumns = [
        { title: '属性名称', dataIndex: 'name' },
        { title: '单位', dataIndex: 'unitName' },
    ]
    const expandedRowRender = (dataSource) => {
        const rowSelection = {
            onChange: (selectedRowKeys, selectedRows) => {
                setSelectInfo({})
                const selectData = selectedRows?.map(item => (item?.extraAttrInfo))
                if(selectData && selectData?.length > 0){
                    setSelectInfo(selectData[0])
                }
            },
            type: 'radio'
        }

        return (
            <Table
                bordered
                size="small"
                rowKey="id"
                pagination={false}
                columns={attrColumns}
                dataSource={dataSource}
                rowSelection={rowSelection}
            />
        )
    }
    return <Modal
        title="关联实际运行容量"
        visible={visible}
        zIndex={1001}
        onOk={handleOk}
        onCancel={handleCancel}
        width="50%"
    >
        <Form form={form} onValuesChange={search.submit} style={{ display: 'flex', marginBottom: 10 }}>
            {allFormData?.length > 0 && allFormData.map(item => createSearchForm(item))}
        </Form>
        <Table
            loading={loading || false}
            size="small"
            bordered
            rowKey="id"
            columns={columns}
            dataSource={meterList.list}
            pagination={meterList.pagination}
            scroll={{ y: 400 }}
            expandable={{
                rowExpandable: (record) => record?.meterAttrList?.length > 0,
                expandedRowRender: (record) => {
                    const dataSource = record?.meterAttrList?.map(child => ({
                        ...child,
                        extraAttrInfo: {
                            deviceName: record.name,
                            deviceId: record.id,
                            modelId: child.id,
                            modelName: child.name,
                            modelValue: null,
                        }
                    })) || []
                    return expandedRowRender(dataSource, record?.meterAttrList, record.name)
                }
            }}
            {...tableProps}
        />
    </Modal>
}

export default connect(({ opsDevice, dict, loading }) => ({
    opsDevice, dict,
    loading: loading.effects['opsDevice/device_service_meter_post']
}))(AssociatedOptVolume);