import React, { useState, useEffect } from "react"; import { ResultFlowResult } from "@/components"; import { Select, Input, Button, Table, message, Pagination, DatePicker, Modal, Cascader, Tooltip } from "antd"; import { Icon } from "@/components" import { useSessionStorageState } from "ahooks"; import { lineChartOption, ringChartOption } from "../echarts.config"; import moment from "moment"; import ReactEcharts from "echarts-for-react"; import "./index.scss"; import ajax from "@/services"; //停车时段分析 function ParkingAlyPeriod() { // session缓存 const [defaultParams, setDefaultParams] = useSessionStorageState( "formData_parkingAlyPeriod", { defaultValue: null } ); //区域的下拉数据 const [areaList, setAreaList] = useState([]); // 默认数据 const defaultData = { start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD"), end_time: moment().endOf("day").format("YYYY-MM-DD"), date_type: '1', }; // 分页数据 const [pageInfo, setPageInfo] = useState({ pn: defaultParams ? defaultParams?.pn : 1, page_size: defaultParams ? defaultParams?.page_size : 15, }); // 表单数据 const [formData, setFormData] = useState({ ...defaultData, ...defaultParams, }); // 搜索提交数据-存储 const [holdData, setHoldData] = useState(formData); // 访问接口,isAjax改变时执行 const [isAjax, setIsAjax] = useState(false); // 检索按钮加载状态 const [loading, setLoading] = useState(false); // 表格加载状态 const [tabLoading, setTabLoading] = useState(false); // 表格返回数据 const [resultData, setResultData] = useState({ total: 0, list: [], }); //出入场车流量分析 const [revenueData, setRevenueData] = useState({}); //停车饱和度趋势分析 const [parkData, setParkData] = useState({}); const [searchSelectList, setSearchSelectList] = useState([]); //搜索下拉数据 const [sessionTabList, setSessionTabList] = useSessionStorageState('parkingAlyPeriod', { value: { } }) useEffect(() => { if (sessionTabList && Object.values(sessionTabList).length > 0) { setFormData({ ...formData, ...sessionTabList }) getCheck({ ...sessionTabList }) } else { getCheck() } }, [isAjax]) useEffect(() => { setSessionTabList({ ...formData }) }, [formData]) useEffect(() => { getSelectList(); }, []); // 访问接口,获取表格 // useEffect(() => { // getData(); // }, [isAjax]); //时间状态切换 const TimeChange = () => { let e = formData.date_type; let str = "day"; let mat = "YYYY-MM-DD"; if (e == 4) { str = "year"; mat = "YYYY"; } else if (e == 3) { str = "month"; mat = "YYYY-MM"; } else if (e == 2) { str = "week"; mat = "YYYY-MM-DD"; } return { str, mat }; }; //切换时间变化 const SetTimeNow = (e) => { let start = ""; let end = ""; if (e == 4) { start = moment().format("YYYY"); end = moment().format("YYYY"); } else if (e == 3) { start = moment().startOf('month').format("YYYY-MM-DD"); end = moment().endOf("month").format("YYYY-MM-DD"); } else if (e == 2) { start = moment().day(1).format("YYYY-MM-DD"); end = moment().day(7).format("YYYY-MM-DD"); } else { start = moment().startOf("day").format("YYYY-MM-DD"); end = moment().endOf("day").format("YYYY-MM-DD"); } setFormData({ ...formData, date_type: e, start_time: start, end_time: end, }); }; //出入场车流量分析 折线图 const getRevenueOption = (data) => { const areaNames = data[0].name ? [...new Set(data.map((item) => item.name))] : ['入场车次', '出场车次']; // 获取所有横坐标 const dates = [...new Set(data.map((item) => item.hour))].sort( (a, b) => a.hour - b.hour ); // 构建数据对象 const seriesData = areaNames.map((areaName, index) => { // 获取数据 const areaData = data[0].name ? data.filter((item) => item.name === areaName) : data // 构建数据对象 return { name: areaNames.length > 1 ? areaName : '', type: "line", itemStyle: { label: { show: true, //开启显示 position: 'top', //在上方显示 color: 'white',//字体颜色 fontSize: 10//字体大小 }, }, data: dates.map((item) => { for (const { hour, total_in_records, total_out_records } of areaData) { if (hour === item) return index == 1 ? total_in_records : total_out_records; } return 0; }), }; }); // 构建X轴数据 const xAxisData = dates.map((date) => { return { value: date, align: "center", lineStyle: { color: "skyblue", // 设置线的颜色为天蓝色 shadowBlur: 6, }, }; }); setRevenueData(lineChartOption(areaNames, xAxisData, "车次数(个)", seriesData)); }; //停车饱和趋势分析分析 折线图 const getParkOption = (data) => { // data = [ // { // "hour": 0, // "occupancy_rate": "0.01%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 1, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 2, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 3, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 4, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 5, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 6, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 7, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 8, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 9, // "occupancy_rate": "0.1%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 10, // "occupancy_rate": "0.01%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 11, // "occupancy_rate": "0.04%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 12, // "occupancy_rate": "0.06%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 13, // "occupancy_rate": "0.04%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 14, // "occupancy_rate": "0.06%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 15, // "occupancy_rate": "0.01%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 16, // "occupancy_rate": "0.04%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 17, // "occupancy_rate": "0.04%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 18, // "occupancy_rate": "0.07%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 19, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 20, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 21, // "occupancy_rate": "0.01%", // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 22, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // }, // { // "hour": 23, // "occupancy_rate": 0, // "charge_type": "2", // "charge_type_name": "二类区" // } // ] const areaNames = data[0].charge_type_name ? [...new Set(data.map((item) => item.charge_type_name))] : ['']; // 获取所有横坐标 const dates = [...new Set(data.map((item) => item.hour))].sort( (a, b) => a.hour - b.hour ); // 构建数据对象 const seriesData = areaNames.map((areaName, index) => { // 获取数据 const areaData = data[0].charge_type_name ? data.filter((item) => item.charge_type_name === areaName) : data // 构建数据对象 return { name: areaName, type: "line", itemStyle: { label: { show: true, //开启显示 position: 'top', //在上方显示 color: 'white',//字体颜色 fontSize: 10//字体大小 }, }, data: dates.map((item) => { for (const { hour, occupancy_rate } of areaData) { if (hour === item) return parseFloat(occupancy_rate); } return 0; }), }; }); // 构建X轴数据 const xAxisData = dates.map((date) => { return { value: date, align: "center", lineStyle: { color: "skyblue", // 设置线的颜色为天蓝色 shadowBlur: 6, }, }; }); setParkData(lineChartOption(areaNames, xAxisData, "饱和度", seriesData)); }; function getParkingIncome(data) { ajax .getParkingAlyPeriodLine(data) .then((res) => { if (res.status === 20000) { getRevenueOption(res.data.list); setResultData(res.data) } }) .catch((err) => console.error(err)); } function getParkingData(data) { ajax .getParkingAlyPeriodParkLine(data) .then((res) => { if (res.status === 20000) { getParkOption(res.data.list); } }) .catch((err) => console.error(err)); } // 获取下拉数据 const getSelectList = () => { ajax.getOperator().then((e) => { setSearchSelectList([ ...searchSelectList, ...e.data ]) }) }; // 携带参数处理 const getCheck = (v) => { let postData = { ...formData }; if (!loading) { postData = { ...holdData }; } setDefaultParams({ ...postData, ...pageInfo }); if (moment(formData.end_time) - moment(formData.start_time) > 1000 * 31 * 24 * 3600) { message.error("时间范围限制为31天!") setLoading(false); setTabLoading(false); return } setLoading(false); setTabLoading(false); let params = { ...postData, ...v, ...pageInfo } //请求接口 getParkingIncome(params) getParkingData(params) }; // 检索数据 const handleSearch = () => { setLoading(true); setPageInfo({ ...pageInfo, ...{ pn: 1 } }); setHoldData(formData); setIsAjax(!isAjax); }; // 导出 const handleExport = () => { if (tableData.list.area_list?.length > 0) { let { pn, page_size, ...params } = defaultParams; ajax.getParkingAlyDurationParkingExp(defaultParams).then( (res) => { if (res) { window.open(res.data.export_url) } else { message.error(res?.message); } }, (err) => { console.log(err); } ); } else { message.error("暂无数据"); } }; // useEffect(() => { // getParkingIncome(); // }, []); //区域下拉框数据 useEffect(() => { ajax .getAreaTree() .then((res) => { if (res.status === 20000) { setAreaList(res.data); } }) .catch((err) => { console.error(err); }); }, []); return ( <>
查询条件
{ setFormData({ ...formData, area_id: v ? v : null }); }} />
setFormData({ ...formData, car_parking_type: v }) } />
setFormData({ ...formData, road_name: e.target.value }) } />
); } export default ParkingAlyPeriod;