import { getConfigByNameAsync } from '@af-mobile-client-vue3/services/api/common' import { post } from '@af-mobile-client-vue3/services/restTools' import useUserStore from '@af-mobile-client-vue3/stores/modules/user' import { trajectoryThinning } from '@af-mobile-client-vue3/utils/map/track' import { trajectoryGrouping } from '@af-mobile-client-vue3/utils/map/trackUtils' import dayjs from 'dayjs/esm/index' /** * trajectoryThinning 是否抽稀 默认 false * trajectoryCorrection 是否高德纠偏 默认 false * group 是否分组 默认 false 要进行高德纠偏必须分组 * AMAP_KEY 高德key 用来纠偏 * gapMs 分组时间间隔 毫秒 默认 30分钟 * rdpEpsilon RDP 精度(度) 默认 0.000001 * dbscanEpsilon DBSCAN聚类半径(km) 默认 0.01 * minPuts DBSCAN聚类 最小开始聚类点数 默认 20 * minDistance 分组数据进行高德纠偏起始纠偏数 默认 20 不能低于20 否则就会纠偏失败,失败也算次数 */ export interface TrajectoryParams { trajectoryThinning?: boolean trajectoryCorrection?: boolean group?: boolean AMAP_KEY?: string gapMs?: number rdpEpsilon?: number dbscanEpsilon?: number minPuts?: number minDistance?: number orderTime?: string serviceName?: string } export const defaultTrajectoryParams: Required = { trajectoryThinning: false, trajectoryCorrection: false, group: false, AMAP_KEY: '', gapMs: 1800000, rdpEpsilon: 0.000001, dbscanEpsilon: 0.01, minPuts: 20, minDistance: 20, orderTime: 'f_realtime asc', serviceName: 'af-linepatrol', } /** * * @param userId 查询的用户id * @param dateStr 查询的轨迹日期 * @param trajectoryParams 后台轨迹纠偏参数 */ export async function getDeviceState( userId: string = useUserStore().getLogin().id, dateStr: string = dayjs().format('YYYY-MM-DD'), trajectoryParams: TrajectoryParams = defaultTrajectoryParams, ) { const condition = `1 = 1 and f_user_id = '${userId}' and (f_realtime between '${dateStr} 00:00:00' and '${dateStr} 23:59:59')` const param = { condition, dateStr, userId, ...trajectoryParams, } // 获取轨迹 const trackPoint = await post(`/api/${trajectoryParams.serviceName}/logic/getDeviceStateLogic`, param) // 轨迹数据未处理,需要对原始数据进行 处理 if (trackPoint.state === 'error') { // 轨迹抽稀 if (trackPoint.points.length >= 30) { // 轨迹抽稀 let path = trajectoryThinning(trackPoint.points) // 存储 path 数据供表格使用 const webConfig = await getConfigByNameAsync('webConfig') if (webConfig?.setting?.lesseeName === 'jinbin') { path = path.filter(item => item.sp !== '0.0') } // 轨迹分组 const trajectoryGroupingResult = trajectoryGrouping(path, {}) console.warn('>>>> trajectoryGroupingResult', trajectoryGroupingResult) return trajectoryGroupingResult // const graspRoadCorrectRes = await graspRoadCorrect(trajectoryGroupingResult) // console.warn('>>>> graspRoadCorrect', graspRoadCorrectRes) // console.warn('>>>> graspRoadCorrect', graspRoadCorrectRes.value) // 返回数据 // return JSON.parse(graspRoadCorrectRes.value) } else { console.warn('当日使用app时间较短或行程较少,不足够生成轨迹') } } if (trackPoint.state === 'success') { return trackPoint.points } }