Files
WXProgram/dist/pages/index/modules/mapModule.js

293 lines
12 KiB
JavaScript
Raw Permalink Normal View History

2025-10-26 13:15:04 +08:00
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MapModule = void 0;
// 地图模块 - 处理地图显示、定位、标记点管理
const mapService_1 = __importDefault(require("../../../services/mapService"));
const userService_1 = __importDefault(require("../../../services/userService"));
const helpers_1 = require("../../../utils/helpers");
class MapModule {
constructor(pageContext, dataModule) {
this.pageContext = pageContext;
this.dataModule = dataModule;
}
/**
* 初始化地图数据
*/
async initMap() {
try {
// 检查并请求位置权限
await this.checkAndRequestLocationPermission();
// 加载地图数据
this.loadMapData();
}
catch (error) {
console.error('初始化地图失败:', error);
(0, helpers_1.showToast)('地图初始化失败,请重试');
}
}
/**
* 检查并请求位置权限
*/
async checkAndRequestLocationPermission() {
try {
// 检查位置权限
const hasPermission = await userService_1.default.checkLocationPermission();
if (hasPermission) {
// 已授权,开始定位
await this.startLocation();
}
else {
// 未授权,请求权限
const permissionGranted = await userService_1.default.requestLocationPermission();
if (permissionGranted) {
await this.startLocation();
}
else {
// 授权失败,使用默认位置
this.setDefaultLocation();
(0, helpers_1.showToast)('已使用默认位置');
}
}
}
catch (error) {
console.error('检查位置权限失败:', error);
this.setDefaultLocation();
}
}
/**
* 开始定位
*/
async startLocation() {
try {
console.log('[MAP MODULE] 开始获取用户位置...');
const location = await mapService_1.default.getCurrentLocation();
console.log('[MAP MODULE] 获取位置成功,原始坐标:', location);
console.log('[MAP MODULE] 详细位置信息:');
console.log(`- 经度: ${location.longitude}`);
console.log(`- 纬度: ${location.latitude}`);
console.log(`- 精度: ${location.accuracy}`);
console.log(`- 速度: ${location.speed}`);
// 验证获取的坐标是否有效
if (isNaN(location.latitude) || isNaN(location.longitude)) {
console.error('[MAP MODULE] 获取的位置坐标无效:', location);
this.setDefaultLocation();
(0, helpers_1.showToast)('获取的位置无效,已使用默认位置');
return;
}
// 强制重置地图视角到用户位置
// 1. 更新用户位置
this.dataModule.updateUserLocation(location.latitude, location.longitude);
// 2. 重置地图缩放级别到15详细级别
this.dataModule.setMapScale(15);
// 3. 添加地图动画效果,让视角平滑回到用户位置
this.animateMapToUserLocation(location.latitude, location.longitude);
console.log('[MAP MODULE] 定位成功,坐标已更新,视角已重置:', location);
(0, helpers_1.showToast)('已定位到您的位置');
}
catch (error) {
console.error('[MAP MODULE] 定位失败:', error);
this.setDefaultLocation();
(0, helpers_1.showToast)('定位失败,已使用默认位置');
}
}
/**
* 设置默认位置
*/
setDefaultLocation() {
const defaultLatitude = 24.880095;
const defaultLongitude = 102.833722;
// 更新数据模块中的位置信息和缩放级别
this.dataModule.updateUserLocation(defaultLatitude, defaultLongitude);
this.dataModule.setMapScale(13);
// 动画效果回到默认位置
this.animateMapToUserLocation(defaultLatitude, defaultLongitude);
console.log('[MAP MODULE] 默认位置设置完成');
}
/**
* 动画效果将地图视角平滑移动到用户位置
*/
animateMapToUserLocation(latitude, longitude) {
// 使用微信小程序的MapContext.moveToLocation方法实现地图移动
const mapContext = wx.createMapContext('myMap', this.pageContext);
// 先设置地图中心点
this.pageContext.setData({
latitude: latitude,
longitude: longitude
});
// 使用moveToLocation方法平滑移动地图视角
mapContext.moveToLocation({
latitude: latitude,
longitude: longitude,
success: () => {
console.log('[MAP MODULE] 地图视角移动成功,位置:', { latitude, longitude });
},
fail: (err) => {
console.error('[MAP MODULE] 地图视角移动失败:', err);
// 如果moveToLocation失败直接设置中心点
this.pageContext.setData({
latitude: latitude,
longitude: longitude
});
}
});
console.log('[MAP MODULE] 地图视角动画已启动,移动到位置:', { latitude, longitude });
}
/**
* 加载地图数据仓库和货运人员
*/
loadMapData() {
// 这里会调用具体的服务来获取数据
// 目前使用模拟数据
const markers = this.generateInitialMarkers();
// 更新数据模块中的标记点
this.dataModule.updateMarkers(markers);
console.log('地图数据加载完成');
}
/**
* 生成初始标记点
*/
generateInitialMarkers() {
console.log('生成初始标记点');
const markers = [];
// 地图自带用户位置显示功能,无需手动添加用户位置标记点
return markers;
}
/**
* 更新用户标记图标为用户头像
* 注意由于地图自带用户位置显示功能此方法已不再需要
*/
updateUserMarkerIcon() {
console.log('地图自带用户位置显示功能,无需更新用户标记图标');
}
/**
* 更新员工标记点
*/
updateEmployeeMarkers(employeeMarkers) {
console.log('开始更新员工标记点,数量:', employeeMarkers.length);
const { markers } = this.pageContext.data;
// 过滤掉现有的员工标记点
const filteredMarkers = markers.filter((marker) => marker.type !== 'employee');
// 合并标记点
const updatedMarkers = [...filteredMarkers, ...employeeMarkers];
// 更新数据模块中的标记点
this.dataModule.updateMarkers(updatedMarkers);
console.log('员工标记点更新完成,总标记点数量:', updatedMarkers.length);
}
/**
* 清除所有员工标记点
*/
clearEmployeeMarkers() {
console.log('开始清除所有员工标记点');
const { markers } = this.pageContext.data;
// 过滤掉员工标记点,只保留其他类型的标记点
const filteredMarkers = markers.filter((marker) => marker.type !== 'employee');
// 更新数据模块中的标记点
this.dataModule.updateMarkers(filteredMarkers);
console.log('员工标记点清除完成,剩余标记点数量:', filteredMarkers.length);
}
/**
* 删除单个员工标记点
*/
removeEmployeeMarker(markerId) {
console.log('删除单个员工标记点:', markerId);
const { markers } = this.pageContext.data;
// 只删除员工类型的标记点,避免误删其他类型标记点
const filteredMarkers = markers.filter((marker) => !(marker.id === markerId && marker.type === 'employee'));
// 检查是否真的删除了标记点
const originalCount = markers.length;
const newCount = filteredMarkers.length;
if (originalCount === newCount) {
console.warn('未找到员工标记点,可能标记点不存在或不是员工类型:', markerId);
}
else {
console.log('成功删除员工标记点:', markerId);
}
// 更新数据模块中的标记点
this.dataModule.updateMarkers(filteredMarkers);
console.log('单个员工标记点删除完成,剩余标记点数量:', filteredMarkers.length);
}
/**
* 添加单个员工标记点
*/
addEmployeeMarker(employeeMarker) {
console.log('添加单个员工标记点:', employeeMarker.id);
// 确保标记点类型为员工
const markerWithType = {
...employeeMarker,
type: 'employee'
};
const { markers } = this.pageContext.data;
// 检查是否已存在相同ID的标记点
const existingIndex = markers.findIndex((marker) => marker.id === markerWithType.id && marker.type === 'employee');
let updatedMarkers;
if (existingIndex !== -1) {
// 如果已存在相同ID的员工标记点则更新
updatedMarkers = [...markers];
updatedMarkers[existingIndex] = markerWithType;
console.log('员工标记点已存在,执行更新操作');
}
else {
// 如果不存在,则添加新的员工标记点
updatedMarkers = [...markers, markerWithType];
console.log('员工标记点不存在,执行添加操作');
}
// 更新数据模块中的标记点
this.dataModule.updateMarkers(updatedMarkers);
console.log('单个员工标记点添加完成,总标记点数量:', updatedMarkers.length);
}
/**
* 更新单个员工标记点
*/
updateSingleEmployeeMarker(employeeMarker) {
console.log('更新单个员工标记点:', employeeMarker.id);
const { markers } = this.pageContext.data;
// 查找现有的员工标记点
const markerIndex = markers.findIndex((marker) => marker.type === 'employee' && marker.id === employeeMarker.id);
let updatedMarkers;
if (markerIndex !== -1) {
// 更新现有的标记点
updatedMarkers = [...markers];
updatedMarkers[markerIndex] = employeeMarker;
}
else {
// 添加新的标记点
updatedMarkers = [...markers, employeeMarker];
}
// 更新数据模块中的标记点
this.dataModule.updateMarkers(updatedMarkers);
console.log('单个员工标记点更新完成');
}
/**
* 处理地图点击事件
*/
onMapTap(e) {
console.log('地图被点击:', e);
// 可以在这里添加地图点击的处理逻辑
}
/**
* 处理标记点点击事件
*/
onMarkerTap(e) {
const markerId = e.markerId;
console.log('标记点被点击:', markerId);
// 根据标记点ID处理不同的点击逻辑
this.handleMarkerClick(markerId);
}
/**
* 处理标记点点击
*/
handleMarkerClick(markerId) {
// 这里可以根据标记点ID进行不同的处理
// 例如:显示订单详情、货运人员信息等
if (markerId === -1) {
// 用户位置标记
this.pageContext.showUserPanel();
}
// 可以添加其他标记点的处理逻辑
}
}
exports.MapModule = MapModule;