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; }); };