修改位置交互,修改代码逻辑

This commit is contained in:
2025-10-18 22:21:04 +08:00
parent c446df73b5
commit 39fa0b2d04
36 changed files with 2743 additions and 1995 deletions

327
README.md
View File

@@ -18,48 +18,72 @@
- **智能指派功能**: 将订单指派给合适的货运人员
- **订单状态跟踪**: 实时更新订单配送状态
### 用户系统功能
### 👤 用户系统功能
- **多角色支持**: 管理员、货运人员、游客等不同角色
- **用户登录/登出**: 支持微信登录
- **签到功能**: 支持每日签到记录和状态管理
- **注册功能**: 游客用户注册为正式用户
- **个人信息管理**: 查看和编辑个人信息
- **微信登录/登出**: 支持微信授权登录和登出
- **签到/签退功能**: 支持每日签到和签退状态管理
- **用户注册**: 游客用户注册为正式用户
- **用户状态管理**: 支持signed_in/signed_out/registered/unregistered四种状态
- **权限控制**: 不同角色有不同的操作权限
### ⚙️ 系统设置功能
- **数据模式切换**: 支持模拟数据和真实API两种模式
- **配置管理**: 可以配置API服务器地址等参数
- **调试信息**: 显示系统运行状态和调试信息
### 👥 员工管理功能
- **员工列表查看**: 管理员可以查看所有员工信息姓名、手机号、角色、ID
- **员工搜索过滤**: 支持按姓名、手机号、角色搜索员工
- **添加新员工**: 管理员可以添加新员工,包含姓名、手机号、角色信息
- **删除员工**: 管理员可以删除不需要的员工
- **员工信息验证**: 注册时验证员工信息是否存在
- **角色管理**: 支持管理员和配送员两种角色分配
### 📍 位置追踪功能
- **实时位置更新**: 通过WebSocket实现货运人员实时位置追踪
- **位置订阅机制**: 支持订阅特定货运人员的位置更新
- **在线状态管理**: 实时显示货运人员在线/离线状态
- **位置历史记录**: 记录货运人员位置历史轨迹
### 🔧 系统管理功能
- **API配置管理**: 可以配置API服务器地址等参数
- **调试信息显示**: 显示系统运行状态和调试信息
- **模块化架构**: 基于模块化设计,便于功能扩展和维护
## 技术架构
### 双服务架构设计
系统采用创新的双服务架构,支持两种运行模式
### 模块化架构设计
系统采用现代化的模块化架构设计,专注于生产环境部署和功能扩展
1. **模拟数据模式 (Mock Mode)**
- 使用本地模拟数据进行开发和测试
- 不依赖后端服务,可以独立运行
- 适合功能开发、单元测试、演示
**模块化设计模式**
- **主页面模块 (MainPageModule)**: 协调各个子模块,处理页面生命周期和事件分发
- **登录模块 (LoginModule)**: 处理用户登录、授权、用户信息管理
- **地图模块 (MapModule)**: 处理地图显示、定位、标记点管理
- **订单模块 (OrderModule)**: 处理订单列表、指派、状态跟踪
- **仓库模块 (WarehouseModule)**: 处理仓库信息展示和管理
- **员工模块 (EmployeeModule)**: 处理员工管理、位置跟踪、交互
- **位置模块 (LocationModule)**: 处理位置追踪和实时更新
- **数据模块 (DataModule)**: 统一管理页面数据状态
2. **真实API模式 (API Mode)**
- 连接真实的后端RESTful API服务
- 支持生产环境部署和联调测试
- 数据实时更新,支持多用户协作
**真实API模式 (API Mode)**
- 连接真实的后端RESTful API服务
- 支持生产环境部署和联调测试
- 数据实时更新,支持多用户协作
- 通过WebSocket实现实时位置追踪
**注意**: 模拟数据模式已移除系统现在仅支持真实API模式运行。
### 核心服务组件
- **apiService.ts**: 封装所有后端API调用的基础服务
- **userService.ts**: 用户认证和信息管理服务
- **mapService.ts**: 地图相关功能和服务
- **apiService.ts**: 封装所有后端API调用和WebSocket连接管理的基础服务
- **userService.ts**: 用户认证和信息管理服务(包含签到/签退功能)
- **mapService.ts**: 地图展示、路线规划、地点搜索等地图相关功能
- **orderService.ts**: 订单管理和指派服务
- **deliveryPersonService.ts**: 配送人员管理和位置更新服务
- **deliveryPersonService.ts**: 配送人员信息管理服务
- **warehouseService.ts**: 仓库和库存管理服务
- **employeeService.ts**: 员工管理服务
- **locationTrackingService.ts**: 位置追踪管理服务负责实时位置更新、在线用户状态管理、WebSocket位置订阅
## 后端接口需求
### 基础配置
- **API基础地址**: `http://localhost:8080`
- **模拟模式**: 支持模拟数据和真实API两种模式切换
- **WebSocket地址**: `ws://localhost:8080/ws/location`
### 用户认证模块
1. **微信登录** - `POST /user/wxlogin`
@@ -70,13 +94,38 @@
- 请求: `{ userId: number }`
- 响应: `{ success: boolean, userInfo: UserInfo, message?: string }`
3. **用户注册** - `POST /user/register`
3. **用户签退** - `POST /user/signout`
- 请求: `{ userId: number }`
- 响应: `{ success: boolean, message?: string }`
4. **获取用户状态** - `GET /user/status`
- 响应: `{ status: 'signed_in' | 'signed_out' | 'registered' | 'unregistered'; lastSignInTime?: string; lastSignOutTime?: string }`
5. **用户注册** - `POST /user/register`
- 请求: `{ name: string, phone: string }`
- 响应: `{ success: boolean, employeeInfo: EmployeeInfo, message?: string }`
4. **获取用户信息** - `GET /user/info`
6. **获取用户信息** - `GET /user/info`
- 响应: `UserInfo`
7. **用户登出** - `POST /user/logout`
- 响应: `{ success: boolean, message?: string }`
### 员工管理模块
1. **获取员工列表** - `GET /employees`
- 响应: `EmployeeInfo[]`
2. **添加员工** - `POST /employees`
- 请求: `{ name: string, phone: string, role: string }`
- 响应: `EmployeeInfo`
3. **删除员工** - `DELETE /employees/{id}`
- 响应: `{ success: boolean, message?: string }`
4. **更新员工信息** - `PUT /employees/{id}`
- 请求: `{ name?: string, phone?: string, role?: string }`
- 响应: `EmployeeInfo`
### 仓库管理模块
1. **获取仓库列表** - `GET /warehouses`
- 响应: `WarehouseInfo[]`
@@ -119,13 +168,7 @@
- 请求: `{ status: Order['status'] }`
- 响应: `{ success: boolean, message?: string }`
### 实时位置服务
1. **订阅位置更新** - `POST /locations/subscribe`
- 请求: `{ deliveryPersonIds: number[] }`
- 响应: `{ subscriptionId: string, expiresAt: number }`
2. **取消订阅** - `POST /locations/unsubscribe`
- 请求: `{ subscriptionId: string }`
### 统计和日志模块
1. **系统统计** - `GET /stats/system`
@@ -185,6 +228,19 @@
### 系统从服务器接收的消息数据
#### WebSocket实时位置消息
1. **位置更新消息**
```json
{
"type": "updateLocation", // 消息类型
"deliveryPersonId": number, // 货运人员ID
"latitude": number, // 纬度
"longitude": number, // 经度
"timestamp": number // 时间戳
}
```
#### 用户相关消息
1. **微信登录响应**
@@ -377,41 +433,167 @@
- **用户状态 (userStatus)**: 包括未登录、已登录、已签到等状态
- **角色权限**: 根据用户角色控制功能访问权限
## 运货师傅上线与位置更新机制
## WebSocket实时位置交互机制
### 师傅上线流程
1. **数据获取**: 通过 `deliveryPersonService.getDeliveryPersons()` 获取所有货运人员数据
2. **列表更新**: 在 `deliveryPersonModule.loadDeliveryPersons()` 中调用服务获取数据
3. **标记点生成**: 通过 `updateDeliveryPersonMarkers()` 方法将货运人员转换为地图标记点
4. **地图更新**: 调用 `dataModule.updateMarkers()` 更新地图显示
### WebSocket连接管理
### 实时位置更新机制
1. **订阅机制**: 通过 `deliveryPersonService.subscribeToRealTimeLocations()` 订阅实时位置更新
2. **WebSocket连接**: 在真实环境中使用WebSocket接收实时位置数据
3. **回调处理**: 位置更新通过 `handleRealTimeLocationUpdate()` 回调函数处理
4. **单个标记更新**: 通过 `updateSingleDeliveryPersonMarker()` 方法更新特定货运人员的图形位置
#### 连接建立流程
1. **连接初始化**: 通过 `apiService.initLocationWebSocket()` 建立WebSocket连接
2. **连接地址**: 使用配置的API地址将HTTP协议替换为WebSocket协议如 `ws://localhost:8080/ws/location`
3. **连接状态管理**: 自动处理连接建立、消息接收、连接关闭和错误重连
### 数据刷新机制
- **实时更新**: 当收到位置消息时,直接更新对应货运人员的标记点位置(经度、纬度)
- **数据同步**: 位置更新会同步修改货运人员对象的 `currentLocation` 属性
- **状态保持**: 货运人员的其他信息(姓名、状态、订单等)保持不变,只有位置信息更新
#### 连接生命周期
- **连接建立**: 调用 `wx.connectSocket()` 建立WebSocket连接
- **连接保持**: 连接成功后保持活跃状态,接收实时位置更新
- **自动重连**: 连接异常断开时3秒后自动尝试重连非正常关闭除外
- **连接关闭**: 调用 `apiService.closeLocationWebSocket()` 主动关闭连接
### 关键代码位置
- `deliveryPersonModule.ts` - 处理货运人员显示和位置更新
- `deliveryPersonService.ts` - 提供货运人员数据服务
- `dataModule.ts` - 管理地图数据和标记点
### 消息交互协议
#### 客户端发送消息类型
1. **发送位置更新**
```json
{
"type": "updateLocation",
"userId": 123,
"latitude": 39.9042,
"longitude": 116.4074,
"timestamp": 1640995200000
}
```
#### 服务端推送消息类型
1. **位置更新消息**
```json
{
"type": "updateLocation",
"userId": 123,
"latitude": 39.9042,
"longitude": 116.4074,
"timestamp": 1640995200000
}
```
2. **在线用户列表消息**
```json
{
"type": "onlineUserList",
"users": [
{
"userId": 123,
"name": "张三",
"latitude": 39.9042,
"longitude": 116.4074,
"lastUpdate": 1640995200000
}
]
}
```
### 位置更新处理流程
#### 订阅机制
1. **用户签到**: 用户签到成功后,服务器自动处理位置订阅逻辑
2. **WebSocket连接**: 建立WebSocket连接后服务器会自动推送位置更新
3. **回调绑定**: 通过 `apiService.onLocationUpdate(callback)` 注册位置更新回调函数
#### 实时位置处理
1. **消息接收**: WebSocket接收到位置更新消息后解析JSON数据
2. **消息分发**: 调用所有注册的位置更新回调函数
3. **地图更新**: 回调函数中更新对应货运人员的地图标记点位置
4. **数据同步**: 同步更新货运人员对象的当前位置信息
### 回调机制设计
#### 多回调支持
- **回调集合**: 使用 `Set` 数据结构管理多个位置更新回调函数
- **动态注册**: 支持多个组件同时订阅位置更新
- **自动清理**: 当所有回调都被移除时自动关闭WebSocket连接
#### 取消订阅机制
- **取消订阅**: 调用返回的取消订阅函数移除特定回调
- **连接管理**: 当没有活跃回调时自动关闭WebSocket连接以节省资源
### 错误处理与重连机制
#### 连接错误处理
- **连接失败**: 捕获连接异常并记录错误日志
- **环境检测**: 自动检测当前环境是否支持WebSocket
- **优雅降级**: 在不支持WebSocket的环境中使用模拟数据
#### 自动重连策略
- **异常检测**: 监控WebSocket连接状态
- **智能重连**: 仅在非正常关闭时触发重连(排除主动关闭)
- **重连间隔**: 3秒重连间隔避免频繁重连
### 真实环境部署
#### 生产环境要求
- **WebSocket支持**: 后端服务必须支持WebSocket协议
- **实时通信**: 支持实时位置更新推送
- **连接管理**: 支持连接保持和自动重连机制
#### 部署注意事项
- **HTTPS要求**: 生产环境必须使用HTTPS和WSS协议
- **认证授权**: WebSocket连接需要身份验证
- **性能优化**: 合理控制位置更新频率
### 关键服务组件
#### ApiService (核心WebSocket管理)
- **连接管理**: WebSocket连接的建立、维护和关闭
- **消息处理**: WebSocket消息的发送、接收和分发
- **错误处理**: 连接异常和消息处理错误的统一处理
#### DeliveryPersonService (货运人员服务)
- **位置订阅**: 封装位置订阅和取消订阅接口
- **实时更新**: 提供位置更新发送和接收功能
- **服务集成**: 与地图服务和用户服务集成
#### LocationTrackingService (位置追踪服务)
- **状态管理**: 管理在线用户状态和位置信息
- **位置分发**: 将位置更新分发给所有订阅者
- **超时检测**: 检测用户离线状态和位置更新超时
### 性能优化策略
#### 连接复用
- **单例模式**: 整个应用共享同一个WebSocket连接
- **按需连接**: 仅在需要时建立连接,无订阅时自动关闭
- **资源节约**: 避免多个组件创建重复的WebSocket连接
#### 消息优化
- **消息压缩**: 使用简洁的消息格式减少网络传输
- **批量更新**: 支持批量位置更新消息处理
- **频率控制**: 控制位置更新频率,避免过度频繁的更新
### 安全考虑
#### 认证授权
- **Token验证**: WebSocket连接使用Bearer Token进行身份验证
- **权限控制**: 仅允许授权用户订阅和发送位置更新
- **数据隔离**: 确保用户只能访问自己有权限的位置数据
#### 数据安全
- **数据验证**: 对接收的WebSocket消息进行格式验证
- **异常防护**: 防止恶意消息导致的系统异常
- **日志记录**: 记录关键操作和异常情况
## 开发与测试
### 开发模式(模拟数据)
1. 在设置页面切换到"模拟数据"模式
2. 系统使用本地模拟数据进行开发测试
3. 所有功能都可以独立运行,不依赖后端
### 开发环境要求
1. 确保后端API服务已启动并运行在配置的API地址
2. 系统会自动连接后端API进行数据交互
3. 支持WebSocket实时位置更新功能
### 联调模式真实API
1. 在设置页面切换到"真实API"模式
2. 确保后端服务运行在配置的API地址
3. 系统会自动连接后端API进行数据交互
### 联调测试
1. 验证所有API接口调用正常
2. 测试WebSocket连接和实时位置更新
3. 检查位置追踪服务的正常运行
### 快速开始
@@ -429,9 +611,9 @@
- 导入项目目录
- 点击编译运行
4. **切换数据模式**:
- 进入"设置"页面
- 切换数据模式进行测试
4. **配置后端服务**:
- 确保后端API服务运行在 `http://localhost:8080`
- 确保WebSocket服务运行在 `ws://localhost:8080/ws/location`
## 项目结构
@@ -452,8 +634,9 @@ miniprogram/
│ ├── admin/ # 管理员页面
│ └── index/ # 首页(地图+订单)
├── services/ # 服务层
│ ├── apiService.ts # API服务基础封装
│ ├── deliveryPersonService.ts # 配送人员服务
│ ├── apiService.ts # API服务基础封装包含WebSocket连接管理
│ ├── deliveryPersonService.ts # 配送人员服务(包含位置订阅功能)
│ ├── locationTrackingService.ts # 位置追踪服务(实时位置管理)
│ ├── mapService.ts # 地图服务
│ ├── orderService.ts # 订单服务
│ ├── userService.ts # 用户服务
@@ -470,21 +653,21 @@ miniprogram/
### 生产环境部署
1. 确保后端API服务已部署并正常运行
2. 修改API服务地址配置
3. 切换到"真实API"模式
2. 修改API服务地址配置为生产环境地址
3. 确保WebSocket服务正常运行
4. 提交审核发布
### 开发环境配置
1. 本地启动后端开发服务器
2. 配置API地址
3. 使用"真实API"模式进行联调测试
2. 配置API地址为开发环境地址
3. 确保WebSocket连接正常
## 注意事项
1. **数据一致性**: 确保模拟数据格式与后端API返回格式一致
2. **错误处理**: 两种模式下的错误处理机制需要保持一致
3. **性能优化**: 真实API模式下注意网络请求的优化
4. **安全性**: 生产环境务必使用HTTPS和合适的认证机制
1. **API一致性**: 确保前端API调用与后端接口格式一致
2. **错误处理**: 实现完善的网络错误和API错误处理机制
3. **性能优化**: 注意网络请求的优化和WebSocket连接管理
4. **安全性**: 生产环境务必使用HTTPS和WSS协议实现合适的认证机制
## 联系方式