| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190 |
- const api = require('../../../api/index.js');
- const app = getApp(); // 在文件顶部获取app实例
- Page({
- data: {
- // 地图中心坐标
- longitude: 0,
- latitude: 0,
-
- // 标记点(包含起点、终点)
- markers: [],
-
- // 轨迹线(实际轨迹)
- polyline: [{
- points: [],
- color: "#ff0000", // 已走过的路线颜色:红色
- width: 6,
- dottedLine: false
- }],
-
- // 规划路线
- plannedRoute: [{
- points: [],
- color: "#2f693c", // 未走的规划路线颜色:绿色
- width: 4,
- dottedLine: false,
- arrowLine: true
- }],
-
- // 追踪状态
- isTracking: false,
-
- // 信息提示文本
- infoText: "",
-
- // 位置更新计时器
- locationTimer: null, // 这个计时器现在只由司机端后台定位使用
-
- // 终点位置
- destination: null,
-
- // 路线规划状态
- routePlanned: false,
-
- // 腾讯位置服务Key
- qqMapKey: 'VRGBZ-ZFRHB-SKIUP-NHHJ3-TXGJT-ZIFG3',
-
- // 偏离阈值(米)和偏离状态
- deviationThreshold: 50, // 超过50米视为偏离
- isDeviated: false,
-
- // 重新规划相关
- isReplanning: false, // 是否正在重新规划
- deviationCount: 0, // 连续偏离计数
- replanThreshold: 3, // 连续偏离多少次后重新规划
- orderdata: [],
- optionsid: '',
- showVerification: false,
- phoneNumber: "138****6789",
- userdata: [],
- moretype: false,
- // 拖动
- cardHeight: 'min', // 初始高度档位:min/mid/max
- currentHeight: 0, // 当前实际高度(px)
- startY: 0, // 触摸起始Y坐标
- maskOpacity: 0.3, // 遮罩透明度
- windowHeight: 0, // 屏幕可用高度(px)
- // 三个固定高度(max改为屏幕高度)
- heightConfig: {
- min: 320, // 最低高度(仅显示价格和路线简要)
- mid: 520, // 中间高度(显示行程详情)
- max: 0 // 占位,将在onLoad中设置为屏幕高度
- },
- costdetails: false,
- trackPoints: [],
- distance: '',
- obtainindex: 0,
- driverLocation: {}, // 司机位置(对象)
- mapInitialized: false, // 标记地图是否初始化
- isDriver: false // 标记是否为司机角色
-
- },
- onReady() {
- // 创建地图上下文
- this.mapCtx = wx.createMapContext('map');
- },
-
- onLoad(options) {
- // 监听WebSocket消息
- wx.$on('wsMessage', this.detailsWsMessage);
-
- // 获取屏幕可用高度(不含导航栏)
- const systemInfo = wx.getSystemInfoSync();
- const windowHeight = systemInfo.windowHeight;
-
- // 更新heightConfig,max设为屏幕高度
- this.setData({
- windowHeight,
- heightConfig: {
- ...this.data.heightConfig,
- max: windowHeight
- },
- currentHeight: this.data.heightConfig.min, // 初始高度为min档
- isDriver: wx.getStorageSync('user').operationRole == 4 // 初始化司机角色标记
- });
-
- this.setData({
- userdata: wx.getStorageSync('user') || {},
- optionsid: options.id
- });
-
- console.log('司机端模式:', this.data.isDriver);
-
- // 引入SDK核心类
- this.qqmapsdk = require('../../../libs/qqmap-wx-jssdk.min.js');
- // 初始化SDK
- this.mapSdk = new this.qqmapsdk({
- key: this.data.qqMapKey
- });
-
- // 初始化地图,获取当前位置和工单信息
- this.getoneworkorderdetailss();
- this.getoneworkorderdetails();
-
- },
-
- onUnload() {
- // 移除WebSocket消息监听
- wx.$off('wsMessage', this.detailsWsMessage);
-
- // 页面卸载时清理资源
- if (this.data.locationTimer) {
- clearInterval(this.data.locationTimer);
- }
-
- // 如果是司机角色,停止后台定位
- if (this.data.isDriver) {
-
- // wx.stopLocationUpdateBackground().catch(err => console.error('停止后台定位失败', err));
- // wx.offLocationChange(); // 移除位置监听
- }
- },
-
- /**
- * 处理接收到的 WebSocket 消息
- * @param {Object} message 从 app.js 广播过来的消息对象
- */
- detailsWsMessage(message) {
- console.log('收到 WebSocket 消息:', message);
-
- if (!message || !message.api) {
- console.warn('无效的WebSocket消息:', message);
- return;
- }
-
- // 根据消息的api字段进行不同的处理
- switch (message.api) {
- case '/sysworkorder/selectworkorderId':
- // 收到工单列表更新的消息,刷新当前工单信息
- // 这个消息通常意味着工单状态可能发生了变化(如分配、完成等)
- this.getoneworkorderdetails();
- break;
-
- case '/sysworkorder/selectworkorderredis':
- // 收到坐标上传的消息,意味着司机位置有更新
- // 这个消息可以由司机自己发出,也可以由服务器推送给乘客
- // 为了数据一致性,直接刷新轨迹
- this.historytrajectory();
- break;
-
- case '/sysworkorder/selectworkorderId':
- // 收到工单状态更新的消息(例如,乘客确认上车、到达目的地等)
- // 刷新工单信息以获取最新状态
- this.getoneworkorderdetails();
- break;
-
- // 你可以根据实际的业务需求,添加更多的case
- // case 'other_api_path':
- // // 处理其他类型的消息
- // break;
-
- default:
- // 对于未知类型的消息,可以打印日志以便调试
- console.log('收到未知类型的WebSocket消息, api:', message.api);
- // 作为一个备选方案,也可以默认刷新工单信息,确保数据最新
- // this.getoneworkorderdetails();
- break;
- }
- },
- getoneworkorderdetailss() {
- const data = {
- workorderId: this.data.optionsid
- };
-
- api.request(`/sysworkorder/selectworkorderId`, 'post', data, { isPublic: false })
- .then((data) => {
- console.log('工单数据:', data.data);
- if (data.code == 200) {
- // 保存旧的工单类型,用于比较状态变化
- const oldWorkorderType = this.data.orderdata.workorderType;
- // **核心修改点:调用 app.js 的方法来控制定位上传**
- if (this.data.isDriver) {
- // 如果工单状态变为进行中 (1-4),且之前未在上传,则启动上传
- if (data.data.workorderType >= 1 && data.data.workorderType <= 2) {
- app.startDriverLocationUpload(this.data.optionsid);
- this.showInfo('已开启实时位置上传');
- }
- this.initMap();
- }
- }
- })
- .catch((err) => {
- this.showInfo('获取工单信息失败');
- });
- },
-
- getoneworkorderdetails() {
- const data = {
- workorderId: this.data.optionsid
- };
-
- api.request(`/sysworkorder/selectworkorderId`, 'post', data, { isPublic: false })
- .then((data) => {
- console.log('工单数据:', data.data);
- if (data.code == 200) {
-
- // 保存旧的工单类型,用于比较状态变化
- this.setData({
- orderdata: data.data
- });
-
- this.setDestination();
-
- // this.setData({
- // markers: [],
- // polyline: [{ points: [] }],
- // plannedRoute: [{ points: [] }],
- // driverLocation: {}
- // });
-
- }
- })
- .catch((err) => {
- console.error('获取工单信息失败:', err);
- this.showInfo('获取工单信息失败');
- });
- },
-
- // 初始化地图(优化司机端逻辑)
- initMap() {
- // 获取用户当前位置(司机端优先使用自身位置作为地图中心)
- wx.getLocation({
- type: 'gcj02', // 腾讯地图坐标体系
- success: (res) => {
- const { longitude, latitude } = res;
-
- this.setData({
- longitude,
- latitude,
- });
-
- // 司机端逻辑:仅在工单已分配时开启后台定位(workorderType >= 1)
- if (this.data.isDriver && this.data.orderdata.workorderType >= 1) {
- this.setData({
- driverLocation: { longitude, latitude } // 司机端初始化自身位置
- })
- this.historytrajectory(); // 主动加载历史轨迹
- }
-
- this.setDestination();
- },
- fail: (err) => {
- console.error("获取位置失败:", err);
- this.showInfo(this.data.isDriver ? "司机定位权限未授权,请开启" : "请授权位置权限以使用地图功能");
-
- // 引导用户开启权限
- wx.openSetting({
- success: (res) => {
- if (res.authSetting['scope.userLocation']) {
- this.initMap();
- }
- }
- });
- }
- });
- },
-
- // 设置终点位置(核心修改:未分配工单时隐藏司机标记和轨迹)
- setDestination() {
- const ICON_PATH = {
- start: "https://esos-iot.bjdexn.cn/myminio/project/0b0593293af54ea097b168cea479c25c.png",
- end: "https://esos-iot.bjdexn.cn/myminio/project/6dc37b15321b462f9ab59c47263dd224.png",
- driver: "https://esos-iot.bjdexn.cn/myminio/project/f6fba6c83b2d4864a73f5f1d83cda416.png"
- };
- const MARKER_SIZE = { width: 30, height: 30 };
- const MAP_PADDING = [100, 100, 100, 100];
- const ROUTE_COLOR = "#ff0000";
- const ROUTE_WIDTH = 6;
-
- const requestData = {
- workorderId: this.data.optionsid
- };
-
- api.request(`/sysworkorder/selectworkorderredis`, 'post', requestData, { isPublic: false })
- .then((response) => {
- console.log('Redis轨迹数据:', response.data);
-
- if (response.code !== 200) {
- this.showInfo("获取轨迹数据失败,请重试");
- return;
- }
-
- if (!this.data.orderdata) {
- this.showInfo("订单信息加载中...");
- return;
- }
-
- // 关键判断:工单是否处于进行中状态(1-4)
- const isWorkorderAssigned = this.data.orderdata.workorderType >= 1 && this.data.orderdata.workorderType <= 4;
-
- // 初始化司机位置为 null
- let driverPoint = null;
-
- // 如果工单处于进行中状态
- if (isWorkorderAssigned) {
- // 优先从最新的响应数据中获取司机位置
- // 只有当 response.data 是一个非空数组时,才取第一个元素
- if (response.data && Array.isArray(response.data) && response.data.length > 0) {
- driverPoint = response.data[0];
- } else {
- // 如果响应数据为空或格式不正确,则使用页面上已缓存的司机位置
- driverPoint = null;
- }
- }else{
- const markers = [];
- const endPoint = this.data.orderdata;
-
- // 已分配工单时才显示起点
- markers.push({
- id: 0,
- longitude: response.data[response.data.length - 1].longitude,
- latitude: response.data[response.data.length - 1].latitude,
- iconPath: ICON_PATH.start,
- ...MARKER_SIZE,
- title: "起点"
- });
-
- // 始终添加终点标记
- markers.push({
- id: 1,
- longitude: endPoint.longitude,
- latitude: endPoint.latitude,
- iconPath: ICON_PATH.end,
- ...MARKER_SIZE,
- title: "终点",
- name: endPoint.poiName
- });
- this.setData({
- markers,
- plannedRoute: [{
- points: response.data,
- color: "#2f693c", // 未走的规划路线颜色:绿色
- width: 4,
- dottedLine: false,
- arrowLine: true
- }]
- })
- this.mapCtx.includePoints({
- points: response.data,
- padding: MAP_PADDING
- });
-
- return
- }
-
- // 对于工单状态为 5 (已完成) 或其他状态,driverPoint 保持为 null
- const startPoint = isWorkorderAssigned ? (response.data && response.data.length > 0 ? response.data[response.data.length - 1] : null) : null;
- const endPoint = this.data.orderdata;
- console.log(driverPoint);
- // 构建标记点(未分配时不添加司机标记)
- const markers = [];
-
- // 已分配工单时才显示起点
- if (isWorkorderAssigned && startPoint) {
- markers.push({
- id: 0,
- longitude: startPoint.longitude,
- latitude: startPoint.latitude,
- iconPath: ICON_PATH.start,
- ...MARKER_SIZE,
- title: "起点"
- });
- }
-
- // 始终添加终点标记
- markers.push({
- id: 1,
- longitude: endPoint.longitude,
- latitude: endPoint.latitude,
- iconPath: ICON_PATH.end,
- ...MARKER_SIZE,
- title: "终点",
- name: endPoint.poiName
- });
- console.log(driverPoint);
- // 已分配工单且有司机位置时,才添加司机标记
- if (isWorkorderAssigned && driverPoint) {
- markers.push({
- id: 2,
- longitude: driverPoint.longitude,
- latitude: driverPoint.latitude,
- iconPath: ICON_PATH.driver,
- width: 35,
- height: 35,
- title: this.data.isDriver ? "我的位置" : "司机正在赶来",
- callout: {
- content: this.data.isDriver ? "我的位置" : "司机正在赶来",
- display: "BYCLICK"
- }
- });
- }
-
- // 构建轨迹线(未分配时不显示轨迹线)
- const polyline = [];
- if (isWorkorderAssigned) {
- if (response.data && response.data.length > 1) {
- const trackPoints = response.data.map(point => ({
- longitude: point.longitude,
- latitude: point.latitude
- }));
- polyline.push({
- points: trackPoints,
- color: ROUTE_COLOR,
- width: ROUTE_WIDTH,
- dottedLine: false
- });
- } else if (startPoint && endPoint) {
- polyline.push({
- points: [
- { longitude: startPoint.longitude, latitude: startPoint.latitude },
- { longitude: endPoint.longitude, latitude: endPoint.latitude }
- ],
- color: ROUTE_COLOR,
- width: ROUTE_WIDTH,
- dottedLine: false
- });
- }
- }
-
- // 更新页面数据
- this.setData({
- markers,
- startPoint: isWorkorderAssigned ? startPoint : null,
- destination: { longitude: endPoint.longitude, latitude: endPoint.latitude },
- polyline
- });
-
- // 提示信息区分工单状态
- // if (isWorkorderAssigned) {
- // if (startPoint) {
- // this.showInfo(this.data.isDriver ? "已加载起点、终点和我的位置" : "已设置起点和终点位置");
- // } else {
- // this.showInfo(this.data.isDriver ? "已加载终点和我的位置(等待起点更新)" : "已加载终点位置(等待起点更新)");
- // }
- // } else {
- // this.showInfo("工单未分配,暂未显示司机信息");
- // }
-
- // 地图视野初始化(未分配时仅显示终点)
- if (this.mapCtx && !this.data.mapInitialized) {
- const includePoints = [{
- longitude: endPoint.longitude,
- latitude: endPoint.latitude
- }];
-
- // 已分配工单时才包含起点和司机位置
- if (isWorkorderAssigned) {
- if (startPoint) includePoints.push({ longitude: startPoint.longitude, latitude: startPoint.latitude });
- if (driverPoint) includePoints.push({ longitude: driverPoint.longitude, latitude: driverPoint.latitude });
- }
- console.log(includePoints);
- this.mapCtx.includePoints({
- points: includePoints,
- padding: MAP_PADDING
- });
-
-
-
- this.setData({ mapInitialized: true });
- }
-
- // 已分配工单且有起点终点时,才规划路线
- if (isWorkorderAssigned && startPoint && endPoint && !this.data.routePlanned) {
- this.planRoute();
-
- }
- })
- .catch((err) => {
- console.error('请求轨迹数据失败:', err);
- if (this.data.orderdata) {
- const endPoint = this.data.orderdata;
- const isWorkorderAssigned = this.data.orderdata.workorderType >= 1;
- const markers = [
- {
- id: 1,
- longitude: endPoint.longitude,
- latitude: endPoint.latitude,
- iconPath: ICON_PATH.end,
- ...MARKER_SIZE,
- title: "终点",
- name: endPoint.poiName
- }
- ];
-
- // 已分配工单时才显示司机位置
- if (isWorkorderAssigned && this.data.driverLocation.longitude) {
- markers.push({
- id: 2,
- longitude: this.data.driverLocation.longitude,
- latitude: this.data.driverLocation.latitude,
- iconPath: ICON_PATH.driver,
- width: 35,
- height: 35,
- title: "我的位置"
- });
- }
-
- this.setData({
- markers,
- startPoint: isWorkorderAssigned ? null : null,
- destination: { longitude: endPoint.longitude, latitude: endPoint.latitude },
- polyline: [] // 异常时不显示轨迹线
- });
-
- if (this.mapCtx && !this.data.mapInitialized) {
- const includePoints = [{ longitude: endPoint.longitude, latitude: endPoint.latitude }];
- if (isWorkorderAssigned && this.data.driverLocation.longitude) {
- includePoints.push({
- longitude: this.data.driverLocation.longitude,
- latitude: this.data.driverLocation.latitude
- });
- }
- this.mapCtx.includePoints({ points: includePoints, padding: MAP_PADDING });
- this.setData({ mapInitialized: true });
- }
-
- // 异常提示区分工单状态
- if (isWorkorderAssigned) {
- this.showInfo(this.data.isDriver ? "已加载终点和我的位置(轨迹数据加载失败)" : "已加载终点位置(等待起点更新)");
- } else {
- this.showInfo("工单未分配,暂未显示司机信息");
- }
- } else {
- this.showInfo("网络请求失败,请检查网络");
- }
- });
- },
-
- planRoute(isReplan = false) {
- const { startPoint, destination } = this.data;
-
- if (!startPoint || !destination) {
- this.showInfo("无法规划路线:起点或终点信息不完整");
- return;
- }
-
- if (isReplan) {
- this.setData({ isReplanning: true });
- this.showInfo("正在重新规划路线...");
- } else {
- this.showInfo("正在规划路线...");
- }
-
- this.mapSdk.direction({
- mode: 'driving',
- policy: 'REAL_TRAFFIC',
- from: { latitude: startPoint.latitude, longitude: startPoint.longitude },
- to: { latitude: destination.latitude, longitude: destination.longitude },
- success: (res) => {
- console.log("路线规划结果:", res);
-
- if (res.status == 0 && res.result.routes.length > 0) {
- const result = res.result;
- const route = result.routes[0];
- // 计算预计到达时间
- const durationMinutes = Math.ceil(result.routes[0].duration);
- const now = new Date();
- now.setMinutes(now.getMinutes() + durationMinutes);
-
- // 格式化时间(HH:MM)
- const estimatedArrivalTime = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
- const estimatedDuration = `${durationMinutes}分钟`;
-
- // 提取路线点
- const coors = route.polyline;
- const pl = [];
-
- // 坐标解压(返回的点串坐标,通过前向差分进行压缩)
- const kr = 1000000;
- for (let i = 2; i < coors.length; i++) {
- coors[i] = Number(coors[i - 2]) + Number(coors[i]) / kr;
- }
-
- // 将解压后的坐标放入点串数组pl中
- for (let i = 0; i < coors.length; i += 2) {
- pl.push({
- latitude: coors[i],
- longitude: coors[i + 1]
- });
- }
-
- // 更新路线数据
- const distance = (result.routes[0].distance / 1000).toFixed(1);
-
- this.setData({
- estimatedArrivalTime,
- estimatedDuration,
- plannedRoute: [{
- name: this.data.orderdata.poiName,
- points: pl,
- color: '#2f693c',
- width: 6,
- borderColor: '#2f693c',
- borderWidth: 1,
- arrowLine: true
- }],
- routePlanned: true,
- isReplanning: false,
- deviationCount: 0,
- distance
- });
-
- // 显示规划结果(区分司机/用户端提示)
- const message = this.data.isDriver
- ? (isReplan ? `已重新规划路线,距离${distance}公里,预计${estimatedDuration}后到达` : `距离${distance}公里,预计${estimatedDuration}后到达`)
- : (isReplan ? `已重新规划路线,距离${distance}公里,约${Math.ceil(result.routes[0].duration)}分钟` : `距离${distance}公里,约${Math.ceil(result.routes[0].duration)}分钟`);
-
- console.log(message);
- this.showInfo(message);
- } else {
- this.setData({ isReplanning: false });
- this.showInfo("路线规划失败,请重试");
- }
- },
- fail: (err) => {
- console.error("路线规划失败:", err);
- this.setData({ isReplanning: false });
- this.showInfo("路线规划失败,请检查网络");
- }
- });
- },
-
- // 获取历史轨迹线(司机端主动更新自身轨迹)
- historytrajectory() {
- // 工单未分配时不获取轨迹
- if (this.data.orderdata.workorderType < 1) return;
-
- const data = {
- workorderId: this.data.optionsid
- };
-
- api.request(`/sysworkorder/selectworkorderredis`, 'post', data, { isPublic: false })
- .then((response) => {
- console.log('历史轨迹:', response.data);
-
- // 兼容处理:检查返回数据是否有效
- if (!response.data || response.data.length === 0) {
- console.log('未获取到轨迹数据或轨迹数据为空');
- this.handleEmptyTrajectory();
- return;
- }
-
- if (response.code == 200 && response.data.length > 0) {
- // 司机端和用户端统一从[0]获取最新位置
- this.updateDriverLocation(response.data[0]);
-
- // 如果有多个轨迹点,更新轨迹线
- if (response.data.length > 1) {
- const trackPoints = response.data.map(point => ({
- longitude: point.longitude*1,
- latitude: point.latitude*1
- }));
-
- this.setData({
- polyline: [{
- points: trackPoints,
- color: "#ff0000",
- width: 6,
- dottedLine: false
- }]
- });
- console.log(trackPoints);
- if (trackPoints.length<3) {
- this.mapCtx.includePoints({
- points:[this.data.destination,...trackPoints],
- padding: [100, 100, 100, 100] // 适配屏幕边距
- });
- }
-
- } else {
- // 如果只有一个轨迹点(通常是司机的当前位置),则只更新司机位置,不绘制轨迹线
- console.log('只有一个轨迹点,不绘制轨迹线');
- this.setData({
- polyline: [{ points: [] }] // 清空轨迹线
- });
- }
- } else {
- // 服务器返回非200状态码或数据格式不正确
- // console.warn('获取轨迹数据失败,服务器返回:', response);
- this.handleEmptyTrajectory();
- }
- })
- .catch((err) => {
- console.error('获取历史轨迹失败:', err);
- // 司机端额外提示
- if (this.data.isDriver) {
- this.showInfo("轨迹更新失败,已自动重试");
- }
- });
- },
-
- /**
- * 处理空轨迹数据的情况
- */
- handleEmptyTrajectory() {
- // 清空轨迹线,避免显示旧的轨迹
- this.setData({
- polyline: [{ points: [] }]
- });
-
- // 根据角色给出不同的提示
- if (this.data.isDriver) {
- // 司机端:可能是刚接单,还未开始上传位置
- this.showInfo("尚未记录轨迹,请开始行驶或检查定位");
- } else {
- // 用户端:司机可能还未出发或未上传位置
- this.showInfo("司机尚未开始行驶或位置信息未更新");
- }
- },
-
- updateDriverLocation(newDriverLocation) {
- // 工单未分配时不更新司机位置
- if (this.data.orderdata.workorderType < 1) return;
-
- if (!newDriverLocation) return;
-
- // 更新司机位置数据
- this.setData({
- driverLocation: newDriverLocation
- });
-
- // 获取当前标记数组
- const markers = [...this.data.markers];
- // 找到司机标记(id:2)并更新位置
- const driverMarkerIndex = markers.findIndex(marker => marker.id == 2);
-
- if (driverMarkerIndex !== -1) {
- // 更新司机标记位置
- markers[driverMarkerIndex] = {
- ...markers[driverMarkerIndex],
- longitude: newDriverLocation.longitude,
- latitude: newDriverLocation.latitude
- };
- this.setData({ markers });
- } else {
- // 如果司机标记不存在,很可能是地图还没初始化好
- // 可以选择重新设置目的地来创建标记,或者给出提示
- console.warn('司机标记不存在,尝试重新设置目的地');
- // 这里可以加一个防抖(debounce),避免短时间内多次调用
- if (!this.setDestinationTimer) {
- this.setDestinationTimer = setTimeout(() => {
- this.setDestination();
- this.setDestinationTimer = null;
- }, 500);
- }
- }
- },
-
- // 显示信息提示(区分司机/用户端)
- showInfo(text) {
- this.setData({ infoText: text });
-
- // 3秒后自动隐藏非状态类信息(司机端状态类信息保留更久)
- const delay = this.data.isDriver && (text.includes("定位") || text.includes("轨迹") || text.includes("到达")) ? 5000 : 3000;
-
- if (!text.includes("正在") && !text.includes("距离") && !text.includes("偏离")) {
- setTimeout(() => {
- if (this.data.infoText == text) {
- this.setData({ infoText: "" });
- }
- }, delay);
- }
- },
-
- // 导航功能(司机端默认开启导航)
- navigation() {
- if (!this.data.destination) {
- this.showInfo("目的地尚未设置");
- return;
- }
-
- // 使用在腾讯位置服务申请的key
- const key = this.data.qqMapKey;
- const referer = '电速宝';
- const enableAI = true;
- const navigation = 1; // 强制开启导航
- const endPoint = JSON.stringify({
- name: this.data.orderdata.poiName || '目的地',
- latitude: this.data.orderdata.latitude,
- longitude: this.data.orderdata.longitude,
- });
- const layerStyle = 1;
-
- wx.navigateTo({
- url: `plugin://route-plan/index?key=${key}&referer=${referer}&endPoint=${endPoint}&enableAI=${enableAI}&navigation=${navigation}&layerStyle=${layerStyle}`,
- fail: (err) => {
- console.error('导航启动失败', err);
- this.showInfo(this.data.isDriver ? "导航启动失败,请手动开启" : "导航启动失败");
- }
- });
- },
-
- // 显示验证码弹窗(司机端无需验证码,直接执行操作)
- showVerificationPopup() {
- // 用户端正常显示验证码
- const data = { workorderId: this.data.optionsid };
-
- api.request(`/sysworkorder/createverify`, 'post', data, { isPublic: false })
- .then((data) => {
- if (data.code == 200) {
- wx.showToast({ title: data.msg || '验证码已发送', icon: 'none' });
- this.setData({ showVerification: true });
- } else {
- this.showInfo(data.msg || '获取验证码失败');
- }
- })
- .catch((err) => {
- console.error('获取验证码失败:', err);
- this.showInfo('获取验证码失败');
- });
- },
-
- // 关闭弹窗
- onPopupClose() {
- this.setData({ showVerification: false });
-
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 1000);
- },
-
- // 确认验证码(仅用户端有效)
- onCodeConfirm(e) {
- if (!this.data.isDriver) {
- console.log("确认验证码:", e.detail.code);
- this.setData({ showVerification: false });
- }
- },
-
- // 重新发送验证码(仅用户端有效)
- onResendCode() {
- if (!this.data.isDriver) {
- console.log("重新发送验证码");
- this.showVerificationPopup();
- }
- },
-
- // 验证码输入完成
- onCodeComplete(e) {
-
- const code = e.detail.code;
- if (!code || code.length < 4) {
- this.showInfo('请输入有效的验证码');
- return;
- }
-
- const data = {
- carId: this.data.carId,
- verifyCode: code,
- workorderId: this.data.orderdata.workorderId
- };
-
- api.request(`/sysworkorder/submitworkorder`, 'post', data, { isPublic: false })
- .then((data) => {
- if (data.code == 200) {
- wx.showToast({ title: data.msg || '验证成功', icon: 'none' });
- this.setData({ showVerification: false });
- } else {
- this.showInfo(data.msg || '验证失败');
- }
- })
- .catch((err) => {
- console.error('验证请求失败:', err);
- this.showInfo('验证请求失败');
-
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- });
- },
- onrecognize(e){
- console.log(1111111);
- const that = this;
- // 检查设备是否支持生物认证--
- wx.checkIsSupportSoterAuthentication({
- success(res) {
- console.log(res.supportMode.includes('facial'));
- console.log(res.supportMode.includes('fingerPrint'));
- if (res.supportMode.includes('facial')) {
- // 支持人脸识别(FaceID)
- wx.startSoterAuthentication({
- requestAuthModes: ['facial'],
- challenge:e.currentTarget.dataset.type,
- authContent: '请进行人脸识别验证',
- success(res) {
- console.log('验证成功', res);
- that.onSlideSuccess()
- },
- fail(err) {
- setTimeout(() => {
- const slideComponent = that.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- }
- });
- }
- if(res.supportMode.includes('fingerPrint')) {
- // 支持人脸识别(FaceID)
- wx.startSoterAuthentication({
- requestAuthModes: ['fingerPrint'],
- challenge:e.currentTarget.dataset.type,
- authContent: '请进行指纹识别验证',
- success(res) {
- console.log('验证成功', res);
- that.onSlideSuccess()
-
- },
- fail(err) {
- console.log(err);
- setTimeout(() => {
- const slideComponent = that.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- }
- });
- }
- }
- });
- },
- onarrivalposition(){
- const data = {
- carId: this.data.orderdata.carId,
- verifyCode: '',
- workorderId: this.data.orderdata.workorderId
- };
- api.request(`/sysworkorder/submitworkorder`, 'post', data, { isPublic: false })
- .then((data) => {
- if (data.code == 200) {
- app.stopDriverLocationUpload(this.data.optionsid);
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- } else {
- this.showInfo(data.msg || '操作失败');
- }
- })
- .catch((err) => {
- console.error('操作请求失败:', err);
- this.showInfo('操作请求失败');
-
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- });
- },
-
- onSlideSuccess() {
- // console.log(e.currentTarget.dataset.type);
- // const type = e.currentTarget.dataset.type;
-
- const data = {
- carId: this.data.orderdata.carId,
- verifyCode: '',
- workorderId: this.data.orderdata.workorderId
- };
-
- api.request(`/sysworkorder/submitworkorder`, 'post', data, { isPublic: false })
- .then((data) => {
- if (data.code == 200) {
- // if (this.data.isDriver && type == 4) {
- // wx.stopLocationUpdateBackground({
- // success: (res) => {
- // console.log('后台定位已停止', res);
- // this.showInfo(this.data.isDriver ? '已停止定位追踪' : '已停止位置追踪');
- // },
- // fail: (err) => {
- // console.error('停止后台定位失败', err);
- // },
- // });
- // wx.offLocationChange();
- // }
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- } else {
- this.showInfo(data.msg || '操作失败');
- }
- })
- .catch((err) => {
- console.error('操作请求失败:', err);
- this.showInfo('操作请求失败');
-
- setTimeout(() => {
- const slideComponent = this.selectComponent("#mySlideConfirm");
- if (slideComponent) {
- slideComponent.reset();
- }
- }, 5000);
- });
- },
-
- ontelephone(e) {
- const phoneNumber = e.currentTarget.dataset.phone;
-
- if (!phoneNumber) {
- this.showInfo('电话号码无效');
- return;
- }
-
- wx.showModal({
- title: '确认拨打电话',
- content: `是否拨打${phoneNumber}?`,
- success: (res) => {
- if (res.confirm) {
- wx.makePhoneCall({
- phoneNumber: phoneNumber,
- fail: (err) => {
- console.error('拨打电话失败', err);
- this.showInfo('拨打电话失败');
- }
- });
- }
- }
- });
- },
-
- onmore() {
- this.setData({ moretype: !this.data.moretype });
- },
-
- oncostdetails() {
- this.setData({ costdetails: !this.data.costdetails });
- },
-
- // 拖动功能(司机端默认展开行程详情)
- handleTouchStart(e) {
- this.setData({ startY: e.changedTouches[0].clientY });
- },
-
- handleTouchMove(e) {
- const currentY = e.changedTouches[0].clientY;
- const deltaY = currentY - this.data.startY;
- const { min, max } = this.data.heightConfig;
-
- let newHeight = this.data.currentHeight - deltaY;
- newHeight = Math.max(min, Math.min(max, newHeight));
-
- let maskOpacity = this.data.maskOpacity;
- if (newHeight < max && newHeight > min) {
- maskOpacity = 0.3 + (newHeight - min) / (this.data.heightConfig.mid - min) * 0.2;
- } else {
- maskOpacity = 0;
- }
-
- this.setData({ currentHeight: newHeight, maskOpacity, startY: currentY });
- },
-
- handleTouchEnd() {
- const { currentHeight } = this.data;
- const { min, mid, max } = this.data.heightConfig;
-
- const distToMin = Math.abs(currentHeight - min);
- const distToMid = Math.abs(currentHeight - mid);
- const distToMax = Math.abs(currentHeight - max);
-
- let targetHeight, targetMode;
- if (distToMax <= 80) {
- targetHeight = max;
- targetMode = 'max';
- } else if (distToMin <= 50) {
- targetHeight = min;
- targetMode = 'min';
- } else if (distToMid <= 60) {
- targetHeight = mid;
- targetMode = 'mid';
- } else {
- const minDist = Math.min(distToMin, distToMid, distToMax);
- if (minDist == distToMin) {
- targetHeight = min;
- targetMode = 'min';
- } else if (minDist == distToMid) {
- targetHeight = mid;
- targetMode = 'mid';
- } else {
- targetHeight = max;
- targetMode = 'max';
- }
- }
-
- this.setData({
- currentHeight: targetHeight,
- cardHeight: targetMode,
- maskOpacity: targetMode == 'mid' ? 0.5 : 0
- });
- },
-
- closeCard() {
- this.setData({
- currentHeight: this.data.heightConfig.min,
- cardHeight: 'min',
- maskOpacity: 0
- });
- },
-
- closeFullscreen() {
- this.setData({
- currentHeight: this.data.heightConfig.min,
- cardHeight: 'min',
- maskOpacity: 0
- });
- },
-
- // 编辑订单
- editorder(){
- wx.navigateTo({
- url: `/package-order/pages/createorder/index?order=${this.data.optionsid}`,
- })
- },
- cancel(){
- let _this = this
- // 在页面的 js 文件中
- wx.showModal({
- title: '提示',
- content: '确定要取消订单吗?',
- success (res) {
- if (res.confirm) {
- console.log('用户点击了确定')
- // 在这里执行确认后的操作
- let data ={
- workorderId:_this.data.optionsid,
- workorderDeletetype:1
- }
- api.request(`/sysworkorder/updateworkorder`, 'post', data, { isPublic: false })
- .then((data) => {
- if (data.code == 200) {
- wx.switchTab({
- url: '/pages/tool/index',
- })
- }
- })
- .catch((err) => {
- this.showInfo('操作失败');
- });
- } else if (res.cancel) {
- this.showInfo('取消操作');
-
- }
- }
- })
- }
- });
- //
|