You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
569 lines
21 KiB
569 lines
21 KiB
import React, { useState, useRef, useEffect } from "react";
|
|
import { ResultFlowResult } from "@/components"
|
|
import { Select, Input, Button, Table, message, Pagination, Popover, Modal, Col, Row, Form, Tabs } from 'antd'
|
|
import {
|
|
pageSizeOptions
|
|
} from '@/config/character.config.js'
|
|
import { SearchOutlined, DeleteOutlined, PlayCircleOutlined, EditOutlined, PlusCircleOutlined, InfoCircleOutlined } from '@ant-design/icons';
|
|
import ajax from '@/services'
|
|
import "./index.scss";
|
|
import { useSessionStorageState } from "ahooks"
|
|
function Road(props) {
|
|
const [form] = Form.useForm()
|
|
const [ajaxLoading, setAjaxLoading] = useState(false)
|
|
const [deviceDetail, setDeviceDetail] = useState({})
|
|
const [editModalVisible, setEditModalVisible] = useState(false)
|
|
const [editStatus, setEditStatus] = useState(false)
|
|
const [storeData, setStoreData] = useState([]) //所属商户
|
|
const [deviceTypeData, setDeviceTypeData] = useState([{ label: '全部', value: -1 }]) //设备类型
|
|
const [brandData, setBrandData] = useState([{ label: '全部', value: -1 }]) // 品牌list
|
|
const [resultData, setResultData] = useState({
|
|
data: [],
|
|
total_records: 0,
|
|
export_url: '',
|
|
process_url: ""
|
|
})
|
|
const parameter = {
|
|
device_name: '',
|
|
device_code: '',
|
|
pole_position_code: '',
|
|
type_id: -1, //设备类型
|
|
road_name: '',
|
|
operator: "0", //所属商户
|
|
operate_status: -1, //运营状态
|
|
device_status: -1, //设备状态
|
|
pn: 1,
|
|
length: Number(pageSizeOptions[0]), // 每页条数
|
|
}
|
|
const [formData, setFormData] = useState(parameter)
|
|
const [lastFormData, setLastFormData] = useState(formData)
|
|
const lastFormDataRef = useRef(formData)
|
|
const getOperatorData = () => {
|
|
ajax.getOperator().then((e) => {
|
|
setStoreData([
|
|
...storeData,
|
|
...e.data
|
|
])
|
|
})
|
|
}
|
|
const getDeviceType = () => {
|
|
ajax.getDeviceTypeList().then((e) => {
|
|
setDeviceTypeData([
|
|
...deviceTypeData,
|
|
...e.data
|
|
])
|
|
})
|
|
}
|
|
const getBrandData = () => {
|
|
ajax.getAllBrandNameList().then((e) => {
|
|
setBrandData([
|
|
...brandData,
|
|
...e.data
|
|
])
|
|
})
|
|
}
|
|
|
|
const handleDelToServer = (id) => {
|
|
return new Promise((resolved, rejected) => {
|
|
ajax.nvrDel(id).then((e) => {
|
|
if (e.status == 20000) {
|
|
resolved(e.message)
|
|
}
|
|
}).catch((err) => {
|
|
rejected(err)
|
|
})
|
|
})
|
|
}
|
|
|
|
const getDeviceDetail = (id) => {
|
|
return new Promise((resolved, rejected) => {
|
|
ajax.getDeviceDimensionDetail({id: id}).then((e) => {
|
|
if (e.status == 20000) {
|
|
resolved(e.data)
|
|
}
|
|
}).catch((err) => {
|
|
rejected(err)
|
|
})
|
|
})
|
|
}
|
|
const handleEdit = (item) => {
|
|
getDeviceDetail(item.id).then((data) => {
|
|
setEditStatus(true)
|
|
form.setFieldsValue({
|
|
...data
|
|
})
|
|
setDeviceDetail(data)
|
|
setEditModalVisible(true)
|
|
})
|
|
}
|
|
const editModalCancel = () => {
|
|
setEditModalVisible(false)
|
|
form.resetFields()
|
|
}
|
|
//列表
|
|
const handleColumns = (tab) => {
|
|
let result = [...tableColumns];
|
|
switch (tab) {
|
|
case '1':
|
|
result.splice(9, 1)
|
|
break;
|
|
|
|
}
|
|
return result;
|
|
}
|
|
//列表
|
|
const tableColumns = [
|
|
{
|
|
title: '设备名称',
|
|
dataIndex: 'name'
|
|
},
|
|
{
|
|
title: '设备编号',
|
|
dataIndex: 'code'
|
|
},
|
|
{
|
|
title: '设备类型',
|
|
dataIndex: 'type_name',
|
|
},
|
|
{
|
|
title: '所属路段',
|
|
dataIndex: 'road_name',
|
|
},
|
|
{
|
|
title: '对应杆位号',
|
|
dataIndex: 'pole_position_code',
|
|
},
|
|
{
|
|
title: '区域',
|
|
dataIndex: 'region_name',
|
|
},
|
|
{
|
|
title: '设备厂商',
|
|
dataIndex: 'operqator',
|
|
},
|
|
{
|
|
title: '运营状态',
|
|
dataIndex: 'operate_status',
|
|
},
|
|
{
|
|
title: '设备状态',
|
|
dataIndex: 'device_status',
|
|
render: (text, record, index) => {
|
|
return (
|
|
<div className="device_status">
|
|
<div className={(text == '在线' || text == '上线') ? 'text-online' : 'text-offline'}>{text}</div>
|
|
</div>
|
|
)
|
|
}
|
|
},
|
|
{
|
|
title: '更新时间',
|
|
dataIndex: 'update_time',
|
|
},
|
|
{
|
|
title: '操作',
|
|
width: 135,
|
|
// render: (text, record, index) => {
|
|
// return <>
|
|
// <div className="action-wrapper">
|
|
// <Button type="primary" shape="circle" s size="middle" icon={<InfoCircleOutlined />} onClick={() => handleEdit(record)}/>
|
|
// </div>
|
|
// </>
|
|
// },
|
|
render: (text, record) => {
|
|
return <>
|
|
<Popover content={
|
|
<div className="black">
|
|
<div className="yisa-btn" onClick={() => handleEdit(record)}>查看设备</div>
|
|
</div>}>
|
|
<Button type="primary" size="middle">操作</Button>
|
|
</Popover>
|
|
</>
|
|
},
|
|
}
|
|
]
|
|
|
|
// 获取列表数据
|
|
const getData = (data = formData) => {
|
|
setAjaxLoading(true)
|
|
ajax.getDeviceDimensionList(data).then(res => {
|
|
setAjaxLoading(false)
|
|
if (res.status === 20000) {
|
|
let resDataArr = res.data.list.map((item) => {
|
|
item.key = item.id
|
|
return item
|
|
})
|
|
setResultData({
|
|
...resultData,
|
|
data: resDataArr,
|
|
total_records: res.data.total
|
|
})
|
|
|
|
} else {
|
|
setResultData({
|
|
data: [],
|
|
total_records: 0,
|
|
export_url: '',
|
|
process_url: ""
|
|
})
|
|
message.error(res.message)
|
|
}
|
|
}, err => {
|
|
console.log(err)
|
|
})
|
|
}
|
|
//切换分页
|
|
const changePn = (pn, length) => {
|
|
if (lastFormData.length === length) {
|
|
setFormData(Object.assign({}, formData, { pn: pn, length: length}))
|
|
setLastFormData(Object.assign({}, lastFormData, { pn: pn, length: length }))
|
|
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn , length: length})
|
|
getData(Object.assign({}, formData, { pn: pn, length: length }))
|
|
}
|
|
}
|
|
//切换每页条数
|
|
const changeLength = (pn, length) => {
|
|
setFormData(Object.assign({}, formData, { pn: 1, length: length }))
|
|
setLastFormData(Object.assign({}, lastFormData, { pn: 1, length: length }))
|
|
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: 1, length: length })
|
|
getData(Object.assign({}, formData, { pn: 1, length: length }))
|
|
}
|
|
//检索数据
|
|
const getSearchData = (data = formData) => {
|
|
getData(data)
|
|
}
|
|
//重置表单
|
|
const formReset = () => {
|
|
setFormData({
|
|
...parameter
|
|
})
|
|
getData({...parameter})
|
|
}
|
|
|
|
const handleExport = () => {
|
|
ajax.deviceDimensionExport(formData).then(e => {
|
|
if (e.status == 20000) {
|
|
window.open(e.data.url)
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
const brandEdit = (params) => {
|
|
return new Promise((resolved, rejected) => {
|
|
ajax.brandEdit(params).then((e) => {
|
|
if (e.status == 20000) {
|
|
resolved(e.message)
|
|
}
|
|
}).catch(err => {
|
|
rejected(err)
|
|
})
|
|
})
|
|
}
|
|
const brandAdd = (params) => {
|
|
return new Promise((resolved, rejected) => {
|
|
ajax.brandAdd(params).then((e) => {
|
|
if (e.status == 20000) {
|
|
resolved(e.message)
|
|
}
|
|
}).catch(err => {
|
|
rejected(err)
|
|
})
|
|
})
|
|
}
|
|
const [sessionTabList, setSessionTabList] = useSessionStorageState('equipmentStatus', {
|
|
value: {
|
|
}
|
|
})
|
|
useEffect(() => {
|
|
if (sessionTabList && Object.values(sessionTabList).length > 0) {
|
|
setFormData({
|
|
device_name: sessionTabList?.device_name,
|
|
device_code: sessionTabList?.device_code,
|
|
pole_position_code: sessionTabList?.pole_position_code,
|
|
type_id: -1,
|
|
road_name: sessionTabList?.road_name,
|
|
operator: "0",
|
|
device_status: -1,
|
|
operate_status: -1
|
|
})
|
|
}
|
|
}, [])
|
|
useEffect(() => {
|
|
setSessionTabList({
|
|
...formData
|
|
})
|
|
}, [formData])
|
|
useEffect(() => {
|
|
getData()
|
|
getOperatorData()
|
|
getDeviceType()
|
|
getBrandData()
|
|
}, [])
|
|
return (
|
|
<>
|
|
<div className="road-container">
|
|
<div className="road-search">
|
|
<label className="search">查询条件</label>
|
|
<div className="yisa-search">
|
|
<label>设备名称</label>
|
|
<Input
|
|
placeholder="请输入设备名称"
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
value={formData.device_name}
|
|
onChange={(e) => setFormData({...formData, device_name: e.target.value})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>设备编号</label>
|
|
<Input
|
|
placeholder="请输入设备编号"
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
value={formData.device_code}
|
|
onChange={(e) => setFormData({...formData, device_code: e.target.value})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>对应杆位</label>
|
|
<Input
|
|
placeholder="请输入对应杆位"
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
value={formData.pole_position_code}
|
|
onChange={(e) => setFormData({...formData, pole_position_code: e.target.value})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>设备类型</label>
|
|
<Select
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
placeholder="请选择"
|
|
value={formData.type_id}
|
|
options={deviceTypeData}
|
|
onChange={(v) => setFormData({...formData, type_id: v})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>所属路段</label>
|
|
<Input
|
|
placeholder="请输入所属路段"
|
|
value={formData.road_name}
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
onChange={(e) => setFormData({...formData, road_name: e.target.value})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>商户</label>
|
|
<Select
|
|
style={{ width: 260, marginLeft: 42 }}
|
|
placeholder="请选择"
|
|
value={formData.operator}
|
|
options={storeData}
|
|
onChange={(v) => setFormData({...formData, operator: v})}
|
|
/>
|
|
</div>
|
|
<div className="yisa-search">
|
|
<label>运营状态</label>
|
|
<Select
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
placeholder="请选择"
|
|
value={formData.operate_status}
|
|
options={[
|
|
{
|
|
value: -1,
|
|
label: '全部'
|
|
},
|
|
{
|
|
value: '1',
|
|
label: '上线'
|
|
}, {
|
|
value: '2',
|
|
label: '下线'
|
|
}
|
|
]}
|
|
onChange={(v) => {
|
|
if (v == 2) {
|
|
setFormData({...formData, operate_status: v, device_status: -1})
|
|
} else {
|
|
setFormData({...formData, operate_status: v})
|
|
}
|
|
}}
|
|
/>
|
|
</div>
|
|
{
|
|
formData.operate_status != 2 ? (
|
|
<div className="yisa-search">
|
|
<label>设备状态</label>
|
|
<Select
|
|
style={{ width: 260, marginLeft: 14 }}
|
|
placeholder="请选择"
|
|
value={formData.device_status}
|
|
options={[
|
|
{
|
|
value: -1,
|
|
label: '全部'
|
|
},
|
|
{
|
|
value: '1',
|
|
label: '在线'
|
|
}, {
|
|
value: '2',
|
|
label: '离线'
|
|
}
|
|
]}
|
|
onChange={(v) => setFormData({...formData, device_status: v})}
|
|
/>
|
|
</div>
|
|
) : (<></>)
|
|
}
|
|
<div className="timePicker yisa-search">
|
|
<div className="btnBox">
|
|
<Button type="primary" className="yisa-btn colorBtn" icon={<SearchOutlined />} onClick={() => { getSearchData() }}>
|
|
搜索
|
|
</Button>
|
|
<Button type="primary" className="yisa-btn colorReset" icon={<DeleteOutlined />} onClick={() => { formReset() }}>
|
|
清空
|
|
</Button>
|
|
{/* <Button type="primary" className="yisa-btn" icon={<PlusCircleOutlined />} onClick={() => { handleAdd() }}>
|
|
添加
|
|
</Button> */}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="road-result">
|
|
<div className="result">
|
|
<div className="result-title">
|
|
<span className="font">共检索到<em>{resultData.total_records}</em>条结果</span>
|
|
<div className="export-btn" onClick={handleExport}>导出</div>
|
|
</div>
|
|
<ResultFlowResult ajaxLoad={ajaxLoading} resultData={resultData.data ? resultData.data : []}>
|
|
<Table
|
|
bordered
|
|
className='yisa-table'
|
|
dataSource={resultData.data}
|
|
columns={
|
|
handleColumns()
|
|
}
|
|
scroll={{y: 560}}
|
|
pagination={false}
|
|
loading={ajaxLoading}
|
|
/>
|
|
<Pagination
|
|
className="pagination-common"
|
|
showSizeChanger
|
|
showQuickJumper
|
|
showTotal={() => `共 ${resultData.total_records} 条`}
|
|
total={resultData.total_records}
|
|
current={lastFormData.pn}
|
|
pageSize={lastFormData.length}
|
|
pageSizeOptions={pageSizeOptions}
|
|
onChange={changePn}
|
|
onShowSizeChange={changeLength}
|
|
/>
|
|
</ResultFlowResult>
|
|
</div>
|
|
</div>
|
|
<Modal
|
|
open={editModalVisible}
|
|
onCancel={editModalCancel}
|
|
footer={null}
|
|
className="device-detail"
|
|
title={'设备详情'}
|
|
>
|
|
<div className="device-detail-container">
|
|
<Tabs
|
|
className="yisa-tabs"
|
|
defaultActiveKey={1}
|
|
destroyInactiveTabPane={true}
|
|
items={[
|
|
{
|
|
label: `设备基本信息`,
|
|
key: 1,
|
|
children: (
|
|
<>
|
|
<div className="device-detail-wrapper">
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">设备名称:</div>
|
|
<div className="device-content">{deviceDetail.name}</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label">硬件编码:</div>
|
|
<div className="device-content">{deviceDetail.code}</div>
|
|
</div>
|
|
</div>
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">设备类型:</div>
|
|
<div className="device-content">{deviceDetail.type_name}</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label">设备品牌:</div>
|
|
<div className="device-content">{deviceDetail.brand_name}</div>
|
|
</div>
|
|
</div>
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">设备功能:</div>
|
|
<div className="device-content">{deviceDetail.function}</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label">备注:</div>
|
|
<div className="device-content">{deviceDetail.note}</div>
|
|
</div>
|
|
</div>
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">对应泊位号:</div>
|
|
<div className="device-content">{deviceDetail.berth}</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label"></div>
|
|
<div className="device-content"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
)
|
|
},
|
|
{
|
|
label: `设备运营信息`,
|
|
key: 2,
|
|
children: (
|
|
<>
|
|
<div className="device-detail-wrapper">
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">设备厂商:</div>
|
|
<div className="device-content">{deviceDetail.brand_name}</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label">运营状态:</div>
|
|
<div className="device-content">{deviceDetail.operate_status}</div>
|
|
</div>
|
|
</div>
|
|
<div className="device-row">
|
|
<div className="device-item">
|
|
<div className="device-label">设备状态:</div>
|
|
<div className="device-content">
|
|
<div className={(deviceDetail.device_status == '在线' || deviceDetail.device_status == '上线') ? 'text-online' : 'text-offline'}>{deviceDetail.device_status}</div>
|
|
</div>
|
|
</div>
|
|
<div className="device-item">
|
|
<div className="device-label">状态变更时间:</div>
|
|
<div className="device-content">{deviceDetail.status_change_time}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
)
|
|
},
|
|
]}
|
|
/>
|
|
</div>
|
|
</Modal>
|
|
</div>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default Road;
|