import api_road_network from "@/http/api_road_network";
import api_sz_demo from "@/http/api_sz_demo";
import dayjs from "@/utils/dayjs";
import {
EnumArea,
AreaInfoByHour,
SegmentInfoByDate,
RoadInfoByDate,
SegmentInfoByHour,
RoadInfoByHour,
} from "@/store/roadUnit/types";
import { Area } from "@/store/global";
import { OriginTableData } from "@/store/types";
/**
* 区域列表原始信息
*/
interface AreaOriginData extends Area {
[propName: string]: any;
}
/**
* 获取深圳区域列表
*/
export const getAreaListByParentUid = async (areaUid: string): Promise => {
return (await api_road_network.area.queryAreaByParentUid(areaUid)).map((area) => {
return {
name: area.name,
uid: area.uid,
};
});
};
/**
* 原始数据格式化
* @param data 原始数据
*/
const formatOriginData = (data: OriginTableData) => {
const { recordList, fieldList } = data;
return recordList.map((row) => {
const columns: any = {};
fieldList.forEach((field, index) => {
columns[field.fieldName] = row.columns[index];
});
return columns;
}) as T[];
};
/**
* 道路通行车辆车次车速分日表(原始数据)
* @param time 查询时间, e.g. 2021-03-10
* @param area 查询区域
*/
const getOriginAreaDataByDate = async (time: string, area: EnumArea) => {
return await api_sz_demo.roadUnit.queryTableCacheData({ time, area });
};
/**
* 区域道路通行车辆车次车速分日表(汇总、排序后的数据)
* @param time 查询时间, e.g. 2021-03-10
* @param area 查询区域
*/
export const getSortedAreaDataByDate = async (time: string, area: EnumArea): Promise => {
return formatOriginData(await getOriginAreaDataByDate(time, area))
.reduce((acc, cur) => {
const isRoadExist = acc.find((road: any) => {
return road.road_name === cur.road_name;
});
if (isRoadExist) {
isRoadExist.pass_veh_occ += cur.pass_veh_occ;
isRoadExist.pass_veh_num += cur.pass_veh_num;
isRoadExist.segments.push(cur);
} else {
acc.push({
road_name: cur.road_name,
pass_veh_occ: cur.pass_veh_occ,
pass_veh_num: cur.pass_veh_num,
segments: [cur],
mean_velocity: 0,
});
}
return acc;
}, [] as RoadInfoByDate[])
.map((road) => {
const velocities = road.segments.reduce((acc, cur) => {
return (acc += cur.mean_velocity * cur.pass_veh_occ);
}, 0);
const occs = road.segments.reduce((acc, cur) => {
return (acc += cur.pass_veh_occ);
}, 0);
const mean_velocity = occs ? parseFloat((velocities / occs).toFixed(2)) : 0;
return {
...road,
...{
pass_veh_occ: Math.round(road.pass_veh_occ / road.segments.length),
pass_veh_num: Math.round(road.pass_veh_num / road.segments.length),
mean_velocity: mean_velocity,
},
};
})
.sort((a, b) => {
return b.pass_veh_occ - a.pass_veh_occ;
});
};
/**
* 区域通行车次车速分时表(原始数据)
* @param startTime 开始时间, e.g. 2021-03-10 00:00:00
* @param endTime 结束时间, e.g. 2021-03-10 24:00:00
* @param area 查询区域
*/
export const getOriginAreaDataByHour = async (startTime: string, endTime: string, area: EnumArea) => {
return await api_sz_demo.roadUnit.queryAreaTableCacheData({ startTime, endTime, area });
};
/**
* 区域通行车次车速分时表(汇总、排序后的数据)
* @param startTime 开始时间, e.g. 2021-03-10 00:00:00
* @param endTime 结束时间, e.g. 2021-03-10 24:00:00
* @param area 查询区域
*/
export const getSortAreaDataByHour = async (startTime: string, endTime: string, area: EnumArea) => {
return formatOriginData(await getOriginAreaDataByHour(startTime, endTime, area))
.map((item) => {
if (item.count_time.length === 10) {
item.count_time += " 00:00:00";
}
return item;
})
.sort((a, b) => {
return dayjs(a.count_time, "YYYY-MM-DD HH:mm:ss").isBefore(dayjs(b.count_time, "YYYY-MM-DD HH:mm:ss")) ? -1 : 1;
});
};
/**
* 道路通行车辆车次车速分时表(原始数据)
* @param roadName 查询道路名称
* @param startTime 开始时间, e.g. 2021-03-10 00:00:00
* @param endTime 结束时间, e.g. 2021-03-10 24:00:00
*/
const getOriginRoadDataByHour = async (roadName: string, startTime: string, endTime: string) => {
const res = await api_sz_demo.roadUnit.queryAreaTableCacheDataByHour(roadName, startTime, endTime);
return res;
};
/**
* 道路通行车辆车次车速分时表(汇总、排序后的数据)
* @param roadName 查询道路名称
* @param startTime 开始时间, e.g. 2021-03-10 00:00:00
* @param endTime 结束时间, e.g. 2021-03-10 24:00:00
*/
export const getSortedRoadDataByHour = async (roadName: string, startTime: string, endTime: string) => {
return formatOriginData(await getOriginRoadDataByHour(roadName, startTime, endTime))
.reduce((acc, cur) => {
const isCountTimeExist = acc.find((road) => {
return road.count_time === cur.count_time;
});
if (isCountTimeExist) {
isCountTimeExist.mean_velocity += cur.pass_veh_occ * cur.mean_velocity;
isCountTimeExist.pass_veh_occ += cur.pass_veh_occ;
isCountTimeExist.segments.push(cur);
} else {
acc.push({
road_name: cur.road_name,
count_time: cur.count_time,
mean_velocity: cur.pass_veh_occ * cur.mean_velocity,
pass_veh_occ: cur.pass_veh_occ,
segments: [cur],
});
}
return acc;
}, [] as RoadInfoByHour[])
.map((item) => {
item.count_time = item.count_time.length === 10 ? item.count_time + " 00:00:00" : item.count_time;
item.mean_velocity = item.pass_veh_occ ? parseFloat((item.mean_velocity / item.pass_veh_occ).toFixed(2)) : 0;
item.pass_veh_occ = item.segments.length ? parseFloat((item.pass_veh_occ / item.segments.length).toFixed(2)) : 0;
return item;
})
.sort((a, b) => {
return dayjs(a.count_time, "YYYY-MM-DD HH:mm:ss").isBefore(dayjs(b.count_time, "YYYY-MM-DD HH:mm:ss")) ? -1 : 1;
});
};