Files
smartClean/docs/requirements.md
xqzp2026 8373460096 feat: 添加自动化部署方案(Docker + 远程服务器两套方案)
- 新增 deploy/docker/:Docker 本机模拟部署,含 Dockerfile、docker-compose、deploy.sh 一键脚本
- 新增 deploy/remote/:远程服务器部署,含 SSH 自动上传、重启、回滚脚本
- 新增 deploy/README.md:完整使用手册,含现状分析、落地调整工作清单、命令速查
- 新增 build.sh/start.sh:本地构建和启动脚本(含飞书通知)
- 新增前端 .env.docker 环境配置,API 指向测试服务器
- 前端 package.json 新增 build-docker 命令
- 更新 .gitignore:排除 IDE 配置、SQL 数据、Docker 敏感文件
- 前端 UI 样式优化(多个页面组件)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 18:41:15 +09:30

971 lines
39 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智慧清洁 SaaS 平台 - 业务需求全景文档
> 基于后端 xiaoqu-intellectual-web 和 xiaoqu-intellectual-task 两个项目的代码分析整理
---
## 一、系统概述
智慧清洁 SaaS 平台面向物业/市政清洁行业提供从计划排班、任务调度、打卡考勤、IoT设备管理到绩效分析的全链路数字化管理能力。
**系统架构**
- **Web 服务**(端口 8095提供 REST API支撑后台管理 SPA
- **Task 服务**(端口 8097定时任务调度 + MQTT 设备通信 + 消息推送
---
## 二、业务模块清单
### 模块 1登录与认证
| 功能 | 端点 | 说明 |
|------|------|------|
| 短信验证码登录 | `POST /login` | 手机号+验证码登录生成UUID30天有效期 |
| 用户退出 | `GET /logOut` | 清除Redis登录态 |
| 发送验证码 | `GET /sms/sendCode` | 短信平台发送验证码 |
**业务规则**
- 单点登录控制,防止多终端同时登录
- 请求签名机制UUID + 时间戳 + 手机号 MD5签名
- 签名有效期10秒窗口
- 登录日志记录IP、登录类型
---
### 模块 2权限管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 设置权限组人员 | `POST /authority/setAuthorityUser` | 批量添加用户到权限组 |
| 查询权限组成员 | `POST /authority/getAuthorityUserList` | 支持分页查询 |
**动态权限体系**
- **字段级权限**:按权限组控制表格列的显示/隐藏
- **按钮级权限**:按权限组控制操作按钮的可见性
- 权限链路:权限组 → 用户 → 页面 → 字段/按钮
---
### 模块 3用户与组织管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 用户分页查询 | `POST /userCenter/pageList` | 按服务区域、事项、技能、标签筛选 |
| 新增/修改用户 | `POST /userCenter/addOrUpdateUser` | |
| 删除用户 | `POST /userCenter/deleteUser` | |
| 用户导出 | `POST /userCenter/export` | Excel导出 |
| 用户菜单树 | `POST /userCenter/getUserMenuTree` | |
| 用户下拉选择 | `POST /userCenter/selectUsers` | |
**用户属性**
- 工作状态:作业(0) / 转场(1) / 空闲(2) / 休息(3)
- 关联:班组、技能标签、事项标签、服务区域、考勤设置
---
### 模块 4班组管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 班组分页查询 | `POST /workGroup/pageList` | |
| 新增/修改班组 | `POST /workGroup/addOrUpdate` | |
| 删除班组 | `POST /workGroup/deleteWorkGroup` | |
| 班组导出 | `POST /workGroup/export` | |
| 设置班组负责人 | `POST /workGroup/setWorkGroupPrincipal` | |
| 设置班组成员 | `POST /workGroup/setWorkGroupMember` | |
| 获取班组成员 | `POST /workGroup/getWorkGroupMember` | |
---
### 模块 5标签与技能管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 标签分页查询 | `POST /label/pageList` | |
| 新增/修改标签 | `POST /label/addOrUpdate` | |
| 删除标签 | `POST /label/delete` | |
| 获取所有标签 | `POST /label/allLabels` | |
| 技能分页查询 | `POST /skill/pageList` | |
| 新增/修改技能 | `POST /skill/addOrUpdate` | |
| 删除技能 | `POST /skill/delete` | |
| 获取所有技能 | `POST /skill/allSkills` | |
---
### 模块 6基础数据管理
#### 6.1 网格管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 网格查询 | `POST /grid/pageList` | 建筑/楼层/多级网格 |
| 新增/修改网格 | `POST /grid/addOrUpdateGrid` | |
| 删除网格 | `POST /grid/deleteGrid` | |
| 批量导入网格 | `POST /grid/importGrid` | |
| 网格负责人列表 | `POST /grid/gridPrincipalList` | |
**网格级别**:建筑(1) → 楼层(2) → 多级网格(3)
#### 6.2 场景管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 场景查询 | `POST /scenes/pageList` | 厕所、楼道等特定场景 |
| 新增/修改场景 | `POST /scenes/addOrUpdateScenes` | |
| 删除场景 | `POST /scenes/deleteScenes` | |
| 批量导入场景 | `POST /scenes/batchInsertScenes` | |
| 导入场景模板 | `POST /scenes/importScenes` | |
**场景级别**:一级场景(1如卫生间) → 二级场景(2如楼层卫生间)
#### 6.3 场景对象关联
| 功能 | 端点 | 说明 |
|------|------|------|
| 场景对象查询 | `POST /sceneObject/sceneObjectPageList` | |
| 关联对象到场景 | `POST /sceneObject/addOrUpdateSceneObject` | |
#### 6.4 对象管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 对象分页查询 | `POST /object/objectPageList` | 支持树查询 |
| 新增/修改对象 | `POST /object/addOrUpdateObject` | |
| 删除对象 | `POST /object/deleteObject` | |
| 批量导入对象 | `POST /object/importObject` | |
#### 6.5 事项管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 事项分页查询 | `POST /matter/matterPageList` | |
| 批量添加事项 | `POST /matter/addMatter` | |
| 修改事项 | `POST /matter/updateMatter` | |
| 删除事项 | `POST /matter/deleteMatter` | |
#### 6.6 作业管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 作业分页查询 | `POST /operation/oprationPageList` | 含工具关联 |
| 新增作业 | `POST /operation/addOperation` | |
| 修改作业 | `POST /operation/updateOperation` | |
| 删除作业 | `POST /operation/deleteOperation` | |
| 作业导出 | `POST /operation/export` | |
#### 6.7 工具管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 工具分页查询 | `POST /tools/toolsPageList` | |
| 新增/修改工具 | `POST /tools/addOrUpdateTools` | |
| 删除工具 | `POST /tools/deleteTools` | |
**层级关系**:对象(Object) → 事项(Matter) → 作业(Operation) + 工具(Tools)
---
### 模块 7计划管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 计划分页查询 | `POST /plan/planPageList` | 按场景、对象、作业筛选 |
| 新增/修改计划 | `POST /plan/addOrUpdatePlan` | |
| 删除计划 | `POST /plan/deletePlan` | |
| 启用计划 | `POST /plan/enablePlan` | |
| 禁用计划 | `POST /plan/disablePlan` | |
| 计划导出 | `POST /plan/export` | 保洁/巡检/设备维护三类 |
| 执行计划 | `POST /plan/executePlan` | 立即生成任务 |
| 复制计划 | `POST /plan/copyPlan` | |
| 计划选择列表 | `POST /plan/selectPlanList` | |
| 计划详情 | `POST /plan/getPlanDetail` | |
**计划类型**
- 保洁计划appointment
- 巡检计划inspect
- 设备维护计划devOps
**周期规则**
- 周期类型:天(0) / 周(1指定周几) / 月(2指定日期)
- 周期模式:不重复(0) / 周期重复(1) / 间隔重复(2)
- 支持节假日跳过或强制执行
- 支持人次触发(按规定人数完成后自动生成下一轮)
**计划关联**
- 计划对象PlanObject- 清洁对象清单
- 计划作业PlanOperation- 作业步骤
- 计划场景PlanScenes- 执行范围
- 计划用户PlanUser- 分配人员
- 计划班组PlanWorkGroup- 分配班组
---
### 模块 8任务管理
#### 8.1 清洁/保洁任务
| 功能 | 端点 | 说明 |
|------|------|------|
| 任务分页查询 | `POST /task/pageList` | 按网格/场景、状态、时间筛选 |
| 任务明细导出 | `POST /task/export` | Excel |
| 人工取消任务 | `POST /task/cancel` | |
| 查看任务详情 | `POST /task/look` | 含对象、作业、进度、积分 |
| 设置任务优先级 | `POST /task/setTaskTaskOrder` | |
#### 8.2 巡检任务
| 功能 | 端点 | 说明 |
|------|------|------|
| 巡检任务列表 | `POST /taskInspect/pageList` | |
| 巡检任务导出 | `POST /taskInspect/export` | |
| 巡检任务详情 | `POST /taskInspect/look` | |
| 上传巡检照片 | `POST /taskInspect/updateInspectPic` | |
#### 8.3 用户上报任务
| 功能 | 端点 | 说明 |
|------|------|------|
| 上报任务列表 | `POST /taskUserUpload/pageList` | |
| 上报任务详情 | `POST /taskUserUpload/look` | |
| 人工设置时薪 | `POST /taskUserUpload/setWageByManual` | |
**任务状态流转**
```
已生成(0) → 已匹配(1) → 待抢单(2) → 已接单(3) → 作业中(4) → 按时完成(5) / 超时完成(6)
↘ 人工取消(7) / 系统取消(8) / 未完成(9)
```
**任务类型**
- 0/1/2 = 保洁任务
- 3/4 = 用户上报任务
- 5 = 巡检任务
---
### 模块 9打卡与考勤
| 功能 | 端点 | 说明 |
|------|------|------|
| 打卡记录查询 | `POST /punchRecord/pageList` | 按网格/场景、时间筛选 |
| 打卡记录导出 | `POST /punchRecord/export` | |
| 考勤记录查询 | `POST /attendance/pageList` | |
| 考勤记录导出 | `POST /attendance/export` | |
| 日打卡统计查询 | `POST /punchRecordDayStatis/pageList` | 按用户分组 |
| 日打卡统计导出 | `POST /punchRecordDayStatis/export` | |
---
### 模块 10效率与绩效分析
| 功能 | 端点 | 说明 |
|------|------|------|
| 任务人效查询 | `POST /efficiency/taskEfficiencyPageList` | 按员工统计 |
| 人效数据导出 | `POST /efficiency/export` | |
| 时薪分页查询 | `POST /wage/wagePageList` | |
| 新增/修改时薪 | `POST /wage/addOrUpdateWage` | |
| 删除时薪 | `POST /wage/deleteWage` | |
| 积分换算时薪 | `POST /wage/getAmount` | |
**计价逻辑**:任务完成 → 获得积分(point) → 根据时薪表(Wage)换算金额
---
### 模块 11用户上报管理
| 功能 | 端点 | 说明 |
|------|------|------|
| 上报用户列表 | `POST /escalationUser/pageList` | |
| 添加/修改上报用户 | `POST /escalationUser/addOrUpdate` | |
| 导出 | `POST /escalationUser/export` | |
---
### 模块 12系统参数配置
| 功能 | 端点 | 说明 |
|------|------|------|
| 站点参数查询 | `POST /taskDistrictParam/taskDistrictParamPageList` | |
| 修改站点参数 | `POST /taskDistrictParam/updateTaskDistrictParam` | 紧急/特殊任务限制数 |
---
## 三、Task 服务 - 定时任务与后台处理
### 模块 13任务自动调度引擎XXL-Job
| 任务 | 触发方式 | 说明 |
|------|----------|------|
| planCreateTask | XXL-Job 动态创建 | 根据计划规则自动生成清洁/巡检/维护任务 |
| planDisableTask | XXL-Job 动态创建 | 按时间段禁用/启用任务生成 |
| InitWatch | XXL-Job 调度 | 手表设备初始化(震动/语音/蓝牙参数) |
| userRestStartTask | XXL-Job 调度 | 员工开始休息(记录、状态变更、蓝牙关闭) |
| userRestEndTask | XXL-Job 调度 | 员工结束休息(恢复状态) |
| restCountDown | XXL-Job 调度 | 休息倒计时监控,超时自动恢复 |
### 模块 14任务处理队列Spring @Scheduled
| 任务 | 频率 | 说明 |
|------|------|------|
| 任务人员派单 | 每秒 | 根据计划分配任务给清洁员 |
| 任务过期处理 | 每秒 | 超时任务自动标记超期 |
| 任务完成处理 | 每秒 | 完成后计算工资、评分 |
| 任务重派发 | 每秒 | 失败/拒绝后重新分配 |
| 巡检任务派单 | 每秒 | 巡检任务分配 |
| 上报任务派单 | 每秒 | 用户上报维修任务分配 |
| 设备维护自动完成 | 每秒 | 部分设备维护任务自动标记完成 |
| 设备告警任务生成 | 每秒 | 监听设备告警,自动创建维护任务 |
---
### 模块 15消息推送系统
| 任务 | 频率 | 说明 |
|------|------|------|
| 个推推送 | 每秒 | 通过个推SDK推送APP通知 |
| MQTT任务状态推送 | 每2秒 | 推送任务状态变更到手机端 |
| 任务动态消息生成 | 每2秒 | 生成任务动态并存储 |
**推送类型**
- 新任务提醒status=1
- 抢单池任务status=2
- 已接单通知status=3
- 任务取消通知status=7/8
- 厕所保养提醒status=-1
**推送方式**
- 在线推送NotificationTemplate立即推送
- 离线推送TransmissionTemplate24小时内推送支持厂商通道
---
### 模块 16IoT 设备通信MQTT
| 任务 | 频率 | 说明 |
|------|------|------|
| 手表连接状态监听 | 每秒 | 监测上下线,维护设备状态 |
| 手表震动语音参数下发 | 每秒 | 实时调整手表配置 |
| 手表参数初始化 | 每2秒 | 初始化手表配置 |
| 手表绑定/解绑消息 | 每2秒 | 下发绑定/解绑指令 |
| 手表任务消息推送 | 每2秒 | 下发新任务到手表 |
| 任务-用户关联处理 | 每2秒 | 将任务消息转换为手表格式 |
| 考勤状态消息 | 每秒 | 下班提醒,关闭手表蓝牙 |
| 放大镜监控消息 | 每秒 | 实时位置追踪提醒 |
| 心跳保活 | 每20秒/298秒 | 保持手表连接 |
---
### 模块 17蓝牙定位与轨迹追踪
| 任务 | 频率 | 说明 |
|------|------|------|
| 蓝牙信标定位 | 每秒 | 根据RSSI信号强度计算员工位置 |
| 下班定位关闭 | 每秒 | 结束进行中的轨迹记录 |
**定位逻辑**
- 手表扫描周围蓝牙信标 → 上报信标MAC+RSSI → 服务端计算位置
- RSSI ≥ 阈值 → 进入信标范围 → 记录驻留时间
- 同一位置停留 ≥ 5秒保存轨迹
- 生成员工轨迹记录UserTrajectory
---
### 模块 18员工休息管理
**完整流程**
1. 员工点击休息 → 创建休息记录 → 更新状态为"休息中"
2. 存入Redis倒计时默认60分钟
3. 发送蓝牙关闭消息到手表
4. 倒计时结束 → 自动生成休息完成记录 → 恢复员工状态
---
### 模块 19节假日同步
| 任务 | 频率 | 说明 |
|------|------|------|
| 节假日同步 | 每年12月28日 06:06:06 | 调用外部API同步下一年节假日 |
**节假日类型**:工作日(0) / 法定节假日(1) / 调休日(2) / 周末(3)
---
## 四、核心业务流程
### 流程 1清洁任务全生命周期
```
创建计划(Plan)
定义:对象 + 作业 + 场景范围 + 人员/班组
启用计划 → XXL-Job 定时触发 planCreateTask
生成 TaskInfo → 推入 PlanTaskQueue
TaskCorrelationSetTask 派单(匹配人员)
推送通知:个推(APP) + MQTT(手表)
员工接单 → 开始作业 → 完成作业
核算积分 → 换算时薪 → 绩效统计
```
### 流程 2设备告警 → 维护任务
```
设备传感器告警(如纸巾不足、空气质量异常)
告警推入 taskCommand 队列
TaskCreateQueue 处理:去重检查 + 创建 TaskInfo
分配维护员 → 推送通知
维护员完成维护 → 标记完成
```
### 流程 3员工实时定位
```
手表持续扫描蓝牙信标
上报信标数据 → BleutoothLocationQueue
计算位置 → 保存 UserLocation
生成驻留轨迹 → UserTrajectory
支撑人效分析报表
```
---
## 五、核心数据模型
| 实体 | 说明 | 所属库 |
|------|------|--------|
| TaskInfo | 任务主表 | db2 |
| Plan | 清洁/巡检/维护计划 | db2 |
| PlanObject | 计划对象清单 | db2 |
| PlanOperation | 计划作业 | db2 |
| PlanScenes | 计划执行范围 | db2 |
| TaskUser | 任务分配人员 | db2 |
| TaskScenes | 任务场景 | db2 |
| Operation | 作业定义 | db2 |
| Object | 清洁对象 | db2 |
| Matter | 事项 | db2 |
| Tools | 工具 | db2 |
| Wage | 时薪 | db2 |
| Authority | 权限组 | db2 |
| WorkGroup | 班组 | db2 |
| PunchRecord | 打卡记录 | db2 |
| AttendanceRecord | 考勤记录 | db2 |
| UserLocation | 实时定位 | db2 |
| UserTrajectory | 员工轨迹 | db2 |
| Watch | 手表设备 | db1 |
| WatchOffLog | 手表上下线日志 | db1 |
| Hardware | 硬件设备 | db1 |
| Beacon | 蓝牙信标 | db1 |
| Holiday | 节假日 | db2 |
| PushLog | 推送日志 | db2 |
| TodayDynamic | 任务动态消息 | db2 |
---
## 六、关键 Redis 数据结构
| Key | 类型 | 用途 |
|-----|------|------|
| `PlanTaskQueue` | List | 待生成的计划任务队列 |
| `taskCommand` | List | 设备告警命令队列 |
| `taskPushQueue` | List | 待推送的通知消息队列 |
| `IntellectualTaskIdList` | List | 待处理的任务ID队列 |
| `MqttWatchTaskMessage` | List | 待推送给手表的任务消息 |
| `WatchTaskUserList` | List | 待处理的任务-用户关联 |
| `WatchConnectList` | List | 手表连接/断开事件 |
| `BleutoothLocationQueue` | List | 蓝牙定位数据队列 |
| `CleaningRestLastTime` | ZSet | 员工休息倒计时score=截止时间戳) |
| `MQTTTOPIC` | Set | 活跃手表设备集合 |
| `Location:userId` | String | 员工最新位置 |
| `Disable:d/t/p:id:taskTypeId` | String | 任务生成禁用标记 |
---
## 七、数据库详细分析
### 7.1 数据库架构
系统使用 **两个 MySQL 数据库**,通过 MyBatis-Plus 多数据源配置:
| 数据库 | 名称 | 说明 |
|--------|------|------|
| DB1 | xiaoqu_comples_d | 基础信息库:组织、用户、硬件、设备、定位数据 |
| DB2 | xiaoqu_intellectual_d | 业务数据库:任务、计划、权限、考勤、日志 |
**连接配置**Druid 连接池最大连接数100初始10最小空闲5
### 7.2 DB1 实体表清单51张
#### 组织架构
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| agent | Agent | 代理商 | name, type(0区域主管/1代理/2物业), level(0总部/1一级/2二级), channel_no, parents_id |
| properyt | Properyt | 物业公司 | name, agent_id, serialnumber, district_on_count, hard_on_count, user_count |
| district | District | 区域站/站点 | district_name, property_id, agent_id, address, buildCount, punch_flag, online_state |
| building | Building | 一级网格(楼座) | name, district_id, longitude, latitude, grid_level, orderby |
| floor | Floor | 二级网格(楼层) | name, building_id, man, woman, man_floorpic, woman_floorpic, grid_level |
| multistage_grid | MultistageGrid | 多级网格 | 支持更细粒度的网格划分 |
| grid_to_principal | GridToPrincipal | 网格-负责人关联 | grid_id, principal_id |
| positions | Positions | 位置/岗位 | 厕所内具体位置(男厕、女厕等) |
**组织层级**Agent(代理) → Properyt(物业) → District(站点) → Building(楼座) → Floor(楼层) → MultistageGrid(多级网格)
#### 用户管理
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| user | User | 用户表 | mobile, name, idcard, sex, role_type, work_status, work_at_status, district_id, property_id, agent_id, authority_id |
| user_detail | UserDetail | 用户详情 | 扩展用户信息 |
| user_proper | UserProper | 用户-物业关联 | user_id, proper_id |
| user_toilet | UserToilet | 用户-卫生间关联 | user_id, toilet_id |
| user_district_attendance | UserDistrictAttendance | 用户站点考勤 | user_id, district_id, status, workAtStatus |
| user_rest | UserRest | 用户休息记录 | user_id, rest_time |
| user_location | UserLocation | 用户实时位置 | user_id, longitude, latitude, beacon_mac, rssi |
| user_trajectory | UserTrajectory | 用户轨迹 | user_id, location_id, stay_time, status |
| user_menu_district | UserMenuDistrict | 用户菜单-站点 | user_id, menu_id, district_id |
| proper_user_district | ProperUserDistrict | 物业用户-站点关联 | user_id, district_id |
**User 核心字段**
- 工作状态work_status, work_at_status(0作业/1转场/2空闲/3休息)
- 组织关联district_id, property_id, agent_id
- 权限role_id, authority_id, property_authority_id
- 认证weixin_openid, registration_id
#### 硬件设备
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| hardware | Hardware | 硬件设备 | sn_code, type, status, district_id |
| hardware_var | HardwareVar | 硬件变量 | hardware_id, var_name, var_value |
| watch | Watch | 手表设备 | imei, user_id, bind_status, online_status, shock_state, voice_state |
| watch_set_params | WatchSetParams | 手表参数设置 | watch_id, param_name, param_value |
| watch_bind_log | WatchBindLog | 手表绑定日志 | watch_id, user_id, bind_time |
| watch_off_log | WatchOffLog | 手表上下线日志 | watch_id, status(0离线/1在线), connected_at, disconnected_at |
| watch_test_log | WatchTestLog | 手表测试日志 | 测试数据 |
| toilet | Toilet | 卫生间/场景设备 | name, district_id, building_id, floor_id |
| toilet_airquality | ToiletAirquality | 空气质量传感器 | sn_code, toilet_id |
| heyi_dev | HeyiDev | 合一设备 | 第三方设备集成 |
| heyi_group | HeyiGroup | 合一设备分组 | 设备分组管理 |
| equipment_repair_recording | EquipmentRepairRecording | 设备维修记录 | equipment_id, repair_time, status |
#### 蓝牙信标与定位
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| beacon | Beacon | 蓝牙信标 | mac, name, district_id, rssi_threshold |
| beacon_log | BeaconLog | 信标日志 | beacon_id, event_type |
| beacon_area_pic | BeaconAreaPic | 场景区域图 | area_id, pic_url |
| beacon_area_position | BeaconAreaPosition | 图层管理 | area_id, position_x, position_y |
| beacon_point_manage | BeaconPointManage | 点位管理 | beacon_id, point_name |
| bluetooth_communication | BluetoothCommunication | 蓝牙通信日志 | 通信记录 |
| bluetooth_connect | BluetoothConnect | 蓝牙连接数据 | 连接状态 |
| bluetooth_location | BluetoothLocation | 蓝牙定位数据 | mac, rssi, user_id |
| rfid_info | RfidInfo | RFID信息 | rfid标签数据 |
#### 菜单与统计
| 表名 | 实体 | 说明 |
|------|------|------|
| app_menu | AppMenu | 物业APP菜单权限 |
| my_menu | MyMenu | 自定义菜单 |
| my_user_menu | MyUserMenu | 用户菜单 |
| district_strategy | DistrictStrategy | 区域策略 |
| monthly_statistics | MonthlyStatistics | 月度统计 |
| statistics_month_log | StatisticsMonthLog | 月度统计日志 |
| switch_day_data | SwitchDayData | 日数据统计 |
| switch_hour_data | SwitchHourData | 小时数据统计 |
| switch_month_data | SwitchMonthData | 月数据统计 |
| switch_year_data | SwitchYearData | 年数据统计 |
| airqualitylevelgrade | Airqualitylevelgrade | 分润管理明细 |
| xinbiao_record | XinbiaoRecord | 新表记录 |
### 7.3 DB2 实体表清单61张
#### 任务管理
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| task_info | TaskInfo | 任务主表 | name, no, task_type, status, plan_id, district_id, point, wage_hour |
| task_type | TaskType | 任务类型 | name, code |
| task_user | TaskUser | 任务-用户关联 | task_id, user_id, status |
| task_accept_user | TaskAcceptUser | 接单人员 | task_id, user_id |
| task_distributi_user | TaskDistributiUser | 派发人员 | task_id, user_id |
| task_pic | TaskPic | 任务照片 | task_id, pic_url, type |
| task_scenes | TaskScenes | 任务场景 | task_id, grid_level, scenes_level, building_id, floor_id |
| task_task_scenes | TaskTaskScenes | 任务-场景关联 | task_id, scenes_id |
| task_status_log | TaskStatusLog | 任务状态日志 | task_id, old_status, new_status, change_time |
| task_district_param | TaskDistrictParam | 站点任务参数 | district_id, rest_time, beacon_no |
**TaskInfo 核心字段**
- 状态流转status(0已生成→1匹配→2待抢→3已接→4作业中→5按时完成/6超时/7人工取消/8系统取消/9未完成)
- 时间跟踪create_time, send_time, confirm_time, action_time, finish_time, expire_time
- 时长统计confirm_timing(响应), timing(作业), over_timing(超时), transfer_timing(转场)
- 绩效point(积分), wage_hour(工时), wage_id, salary
- 巡检should_inspect(应巡), actual_inspect(实巡), not_inspect(未巡)
#### 计划管理
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| plan | Plan | 任务计划 | task_name, type(0例行/2指派/5巡检), circle_status, circle_type(0天/1周/2月), status |
| plan_object | PlanObject | 计划-对象关联 | plan_id, object_id |
| plan_operation | PlanOperation | 计划-作业关联 | plan_id, operation_id |
| plan_scenes | PlanScenes | 计划-场景关联 | plan_id, building_id, floor_id, multistage_grid_id, scenes_id |
| plan_user | PlanUser | 计划-用户关联 | plan_id, user_id |
| plan_work_group | PlanWorkGroup | 计划-班组关联 | plan_id, work_group_id |
| plan_logic_label | PlanLogicLabel | 计划-标签关联 | plan_id, label_id |
**Plan 核心字段**
- 周期配置circle_status(0不重复/1周期/2间隔), circle_type(0天/1周/2月), circle_no
- 执行时段action_start_time, action_end_time
- 过期设置expire_type(0不过期/1次日/2指定), expire_timing
- 时长参数working_timing(标准工时), transition_timing(转场), ready_timing(准备), redundance_timing(冗余)
- 跳过配置eliminate_type(0不跳/1节假日/2自定义)
#### 考勤打卡
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| punch_record | PunchRecord | 打卡记录 | user_id, punch_time, longitude, latitude, address, punch_type, pic_url |
| punch_record_day_statis | PunchRecordDayStatis | 打卡日统计 | user_id, date, punch_count |
| rest_record | RestRecord | 休息记录 | user_id, punch_type(0休息/1恢复), rest_duration |
| attendance_record | AttendanceRecord | 考勤记录 | user_id, date, status |
#### 权限管理
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| authority | Authority | 权限组 | name, type |
| webpage | Webpage | 页面 | name, url, parent_id |
| webpage_authority | WebpageAuthority | 页面权限 | webpage_id, authority_id |
| page_field | PageField | 页面字段 | webpage_id, field_name, field_label |
| field_webpage_authority | FieldWebpageAuthority | 字段-权限关联 | field_id, webpage_id, authority_id |
| button | Button | 按钮 | webpage_id, name, code |
| button_field | ButtonField | 按钮字段 | button_id, field_name |
| button_webpage_authority | ButtonWebpageAuthority | 按钮-权限关联 | button_id, webpage_id, authority_id |
**权限链路**Authority(权限组) → WebpageAuthority(页面) → FieldWebpageAuthority(字段) + ButtonWebpageAuthority(按钮)
#### 基础数据
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| object | Object | 清洁对象 | name, parent_id, level, type |
| object_type | ObjectType | 对象类型 | name |
| matter | Matter | 事项 | object_id, name, type |
| matter_type | MatterType | 事项类型 | name |
| operation | Operation | 作业 | name, type, tool_ids |
| tools | Tools | 工具 | name, district_id, status |
| scene_object | SceneObject | 场景-对象关联 | scene_id, object_id |
| inspect_scenes | InspectScenes | 巡检场景 | name, district_id |
| inspect_pic | InspectPic | 巡检照片 | inspect_id, pic_url |
#### 人员管理
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| work_group | WorkGroup | 班组 | work_group_name, district_id |
| work_group_to_principal | WorkGroupToPrincipal | 班组-负责人 | work_group_id, principal_id |
| skill_manage | SkillManage | 技能 | name |
| user_to_skill | UserToSkill | 用户-技能 | user_id, skill_id |
| label_manage | LabelManage | 标签 | name |
| user_to_label | UserToLabel | 用户-标签 | user_id, label_id |
| user_to_matter | UserToMatter | 用户-事项 | user_id, matter_id |
| user_to_service_area | UserToServiceArea | 用户-服务区域 | user_id, area_id |
| escalation_user | EscalationUser | 上报用户 | user_id |
| escalation_service_area | EscalationServiceArea | 上报服务区域 | escalation_id, area_id |
#### 绩效与薪资
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| wage | Wage | 时薪配置 | type, point, amount |
| efficiency_recording | EfficiencyRecording | 人效录入 | user_id, date |
| efficiency_detail | EfficiencyDetail | 人效详情 | recording_id, metric, value |
#### 日志与通知
| 表名 | 实体 | 说明 | 关键字段 |
|------|------|------|----------|
| login_log | LoginLog | 登录日志 | user_id, login_time, ip, type(0登录/1退出) |
| change_log | ChangeLog | 变更日志 | entity, operation, old_value, new_value |
| modify_log | ModifyLog | 修改日志 | 记录数据修改历史 |
| push_log | PushLog | 推送日志 | client_id, user_id, title, content, status |
| sms_send_record | SmsSendRecord | 短信发送记录 | mobile, content, status |
| user_push | UserPush | 用户推送映射 | user_id, client_id |
| today_dynamic | TodayDynamic | 今日动态消息 | task_id, user_id, message, type |
#### 其他
| 表名 | 实体 | 说明 |
|------|------|------|
| holiday | Holiday | 节假日(0工作日/1法定/2调休/3周末) |
| app_version | AppVersion | APP版本管理 |
| type_source | TypeSource | 类型来源 |
### 7.4 通用字段规范
所有实体均包含以下标准字段:
- `id` (Long) - 自增主键
- `create_id` (Long) - 创建人ID
- `create_time` (Date) - 创建时间
- `modify_id` (Long) - 修改人ID
- `modify_time` (Date) - 修改时间
- `soft_delete` (Integer) - 软删除标记(0正常/1已删除)
### 7.5 核心关系映射
```
组织层级:
Agent(代理) → Properyt(物业) → District(站点) → Building(楼座) → Floor(楼层) → MultistageGrid(多级网格)
用户关系:
User ←→ Authority(权限组)
User ←→ WorkGroup(班组)
User ←→ SkillManage(技能)
User ←→ LabelManage(标签)
User ←→ District(站点)
User ←→ Watch(手表)
任务流程:
Plan(计划) → TaskInfo(任务) → TaskUser(执行人)
Plan → PlanObject(对象) + PlanOperation(作业) + PlanScenes(场景)
TaskInfo → TaskScenes(场景) + TaskPic(照片) + TaskStatusLog(状态日志)
基础数据:
Object(对象) → Matter(事项) → Operation(作业) + Tools(工具)
District → Beacon(信标) → UserLocation(定位) → UserTrajectory(轨迹)
```
---
## 八、Redis 详细分析
### 8.1 Redis 架构配置
| 配置项 | 值 |
|--------|-----|
| 连接驱动 | Lettuce (Spring Data Redis) |
| 数据库数量 | 2 个独立 DB (DB4 和 DB5) |
| 连接池最大连接数 | 200 |
| 最大空闲连接 | 8 |
| 最小空闲连接 | 1 |
| 序列化方式 | StringRedisSerializer (Key + Value 均为字符串) |
**数据库分工**
| 数据库 | 用途 |
|--------|------|
| DB 4 | 消息队列、状态标志、计数器、分布式锁 |
| DB 5 | 实体缓存、设备命令队列、字典配置、时间序列 |
### 8.2 Redis 操作工具
**RedisService4 / RedisService5** - 封装以下数据类型操作:
| 数据类型 | 操作方法 |
|---------|---------|
| String | set, get, remove, exists |
| List | lPush, rPush, leftPop, rightPop, lRange, lRangeAll |
| Set | add, setRemove, isMember, setMembers, setPop |
| Hash | hmSet, hmGet |
| ZSet | zAdd, zRemove, rangeByScore |
**RedisDistributedLock** - 分布式锁:
- 锁前缀:`redis_lock_`
- 默认过期30秒
- 自旋重试最多10次间隔50ms
### 8.3 DB4 Key 详细映射
#### 任务消息队列
| Key | 类型 | 内容 | 写入方 | 消费方 |
|-----|------|------|--------|--------|
| `taskUserQueue` | List | 保洁派单消息 (TaskPlanEntity JSON) | TaskCorrelationSetTask, TaskCreateQueue | TaskCorrelationSetTask |
| `taskPushQueue` | List | APP推送消息 (TaskPushInfo JSON) | TaskCorrelationSetTask, TaskCreateQueue | TaskPushMessage |
| `taskReportQueue` | List | 上报任务派单 (TaskPlanEntity JSON) | TaskCorrelationSetTask | TaskCorrelationSetTask |
| `inspectTaskUserQueue` | List | 巡检任务派单 (TaskPlanEntity JSON) | TaskCorrelationSetTask | TaskCorrelationSetTask |
| `IntellectualTaskIdList` | List | 待处理任务ID | TaskCorrelationSetTask | ScheduledTask |
| `PlanTaskQueue` | List | 待生成的计划ID | PlanTimeTask | 任务处理系统 |
#### 手表/MQTT 消息队列
| Key | 类型 | 内容 | 写入方 | 消费方 |
|-----|------|------|--------|--------|
| `WatchTaskUserList` | List | 手表任务-用户ID | TaskCorrelationSetTask | ScheduledTask |
| `MqttWatchTaskMessage` | List | 手表任务消息 (JSON) | ScheduledTask | ScheduledTask (MQTT发送) |
| `MqttTaskStateMessage` | List | 任务状态变更消息 (JSON) | ScheduledTask | ScheduledTask (MQTT发送) |
| `AttendanceStatusMessage` | List | 考勤状态消息 (JSON) | UserRestTask | ScheduledTask |
| `TaskMagnifierMessage` | List | 放大镜监控消息 (JSON) | 业务系统 | ScheduledTask |
| `WatchConnectList` | List | 手表连接/断开事件 (JSON) | PushCallback | ScheduledTask |
| `WatchShockAndVoiceMessage` | List | 手表震动/语音参数 (JSON) | 业务系统 | ScheduledTask |
#### 蓝牙定位队列
| Key | 类型 | 内容 | 写入方 | 消费方 |
|-----|------|------|--------|--------|
| `BleutoothLocationQueue` | List | 蓝牙定位数据 (JSON) | 设备上报 | LocationTask |
| `OffDutyBleutoothLocationQueue` | List | 下班定位数据 (JSON) | 设备上报 | LocationTask |
#### 任务禁用/启用标志
| Key 模式 | 类型 | 值 | 说明 |
|---------|------|-----|------|
| `Disable:d:<districtId>:<taskTypeId>` | String | "0"/"1" | 站点级任务禁用 |
| `Disable:t:<toiletId>:<taskTypeId>` | String | "0"/"1" | 场景级任务禁用 |
| `Disable:p:<positionId>:<taskTypeId>` | String | "0"/"1" | 位置级任务禁用 |
| `DevTaskFlag:<districtId>` | String | "0"/"1" | 设备维护任务开关 |
| `workingTimeing:d:<districtId>:<taskTypeId>` | String | 数字 | 站点级工作时长 |
| `workingTimeing:t:<scenesId>:<taskTypeId>` | String | 数字 | 场景级工作时长 |
| `workingTimeing:p:<scenesId>:<taskTypeId>` | String | 数字 | 位置级工作时长 |
#### 计划/计数器
| Key 模式 | 类型 | 值 | 说明 |
|---------|------|-----|------|
| `Plan:<planType>:<planId>` | String | 任务ID | 计划关联的XXL-Job任务ID |
| `UserCount:p:<scenesId>` | Set | 计划ID集合 | 位置级计划集合 |
| `UserCount:p:<scenesId>:<planId>` | String | 数字 | 人次触发剩余次数 |
| `PoolOrderCount:<orderType>:<districtId>` | String | 数字 | 订单计数 |
#### MQTT 主题管理
| Key | 类型 | 值 | 说明 |
|-----|------|-----|------|
| `MQTTTOPIC` | Set | MQTT Topic 集合 | 活跃手表设备(旧) |
| `MQTTTOPICNEW` | Set | MQTT Topic 集合 | 活跃手表设备(新) |
#### 分布式锁
| Key 模式 | 类型 | TTL | 说明 |
|---------|------|-----|------|
| `redis_lock_<endpoint>` | String | 30秒 | 防重复提交 |
| `HolidayLock` | String | 1800秒 | 节假日同步锁 |
#### 其他
| Key 模式 | 类型 | 说明 |
|---------|------|------|
| `AuthorityWebpage:<authorityId>` | String | 权限页面缓存 |
| `mobileLimit:<mobile>` | String | 手机号限制标志 |
| `ToiletToUser:<toiletId>` | String | 厕所-用户映射 |
| `CleaningRestLastTime` | ZSet | 员工休息倒计时(score=截止时间戳) |
### 8.4 DB5 Key 详细映射
#### 设备命令队列
| Key | 类型 | 内容 | 写入方 | 消费方 |
|-----|------|------|--------|--------|
| `taskCommand` | List | 设备告警命令 (TaskCommandInfo JSON) | PlanTimeTask | TaskCreateQueue |
| `taskFinishCommand` | List | 任务完成命令 (TaskCommandInfo JSON) | 业务系统 | TaskCorrelationSetTask |
| `FinishTaskQueue` | List | 已完成任务ID | TaskCorrelationSetTask | TaskCorrelationSetTask |
| `ConfirmTaskQueue` | List | 已确认任务ID | 业务系统 | TaskCorrelationSetTask |
| `WatchSetParamsInit` | List | 手表初始化参数 (JSON) | 业务系统 | ScheduledTask |
| `WatchShockSetParamsInit` | List | 手表震动初始化参数 (JSON) | 业务系统 | ScheduledTask |
| `RepeatTaskQueue` | Set | 重派发任务集合 | TaskCorrelationSetTask | TaskCorrelationSetTask |
| `DistrictBeaconNoChange` | List | 信标号更新队列 | 业务系统 | BeaconTask |
#### 实体缓存
| Key 模式 | 类型 | 内容 | TTL |
|---------|------|------|-----|
| `entity:UserDistrictAttendance:<userId>_<districtId>` | String | 用户站点考勤 JSON | 无 |
| `entity:Hardware:<snCode>` | String | 硬件设备信息 JSON | 无 |
| `entity:ToiletAirQualityAirMac:<snCode>` | String | 空气质量传感器 JSON | 无 |
| `entity:TaskTypeNearFlag:<typeId>:<districtId>` | String | 任务类型临期标志 | 无 |
#### 名称缓存
| Key 模式 | 类型 | 内容 |
|---------|------|------|
| `name:Agent:<agentId>` | String | 代理商名称 |
| `name:Properyt:<propertyId>` | String | 物业名称 |
| `name:District:<districtId>` | String | 站点名称 |
| `name:PropertyAuthority:<authorityId>` | String | 权限组名称 |
#### 字典配置 (Hash)
| Key | Hash 字段 | 值 | 说明 |
|-----|----------|-----|------|
| `Dictionary` | `UserAppointFlag` | "0"/"1" | 用户预约标志 |
| `Dictionary` | `UserAreaFlag` | "0"/"1" | 用户服务区域标志 |
| `Dictionary` | `UserDutyFlag` | "0"/"1" | 用户职责标志 |
| `Dictionary` | `LogicFlag` | "0"/"1" | 逻辑标志 |
| `Dictionary` | `TaskNearFlag` | "0"/"1" | 任务临期标志 |
| `Dictionary` | `OperateAssignmentTypes` | 类型列表 | 操作分配类型 |
| `Dictionary` | `AutoOffWorkTime` | 数字 | 自动下班时间 |
| `Dictionary` | `ScenesType` | 场景类型列表 | 场景类型 |
#### 定位与状态
| Key 模式 | 类型 | 内容 |
|---------|------|------|
| `Location:<userId>` | String | 最新位置(格式: 时间_场景_楼栋_楼层) |
| `DistrictBeaconNo:<districtId>` | String | 站点信标编号 |
| `disinfect:p:<scenesId>` | String | 位置消毒状态("0"/"1") |
| `CleaningUpWorkAtStatus:<mobile>` | String | 员工原始工作状态 |
#### 时间序列
| Key | 类型 | Score | 说明 |
|-----|------|-------|------|
| `ImpendingTime` | ZSet | 过期时间戳(ms) | 临期任务队列 |
| `TaskExprieQueue` | ZSet | 过期时间戳(ms) | 任务过期队列 |
### 8.5 Redis 数据流转图
```
[计划调度]
PlanTimeTask → PlanTaskQueue(DB4) → 任务生成
PlanTimeTask → taskCommand(DB5) → TaskCreateQueue → taskPushQueue(DB4)
[任务派单]
TaskCorrelationSetTask ←→ taskUserQueue(DB4)
TaskCorrelationSetTask ←→ inspectTaskUserQueue(DB4)
TaskCorrelationSetTask ←→ taskReportQueue(DB4)
TaskCorrelationSetTask → WatchTaskUserList(DB4) → ScheduledTask → MqttWatchTaskMessage(DB4) → MQTT
[消息推送]
taskPushQueue(DB4) → TaskPushMessage → 个推SDK → APP
IntellectualTaskIdList(DB4) → ScheduledTask → MqttTaskStateMessage(DB4) → MQTT → 手机端
[设备通信]
WatchConnectList(DB4) → ScheduledTask → 更新Watch表
BleutoothLocationQueue(DB4) → LocationTask → UserLocation/UserTrajectory
[员工休息]
UserRestTask → AttendanceStatusMessage(DB4) → ScheduledTask → MQTT
CleaningRestLastTime(DB4, ZSet) → restCountDown → 自动恢复
```
---
## 九、统计汇总
| 维度 | 数量 |
|------|------|
| Controller 数量 | 27 个 |
| REST API 端点 | 约 150+ 个 |
| XXL-Job 定时任务 | 6 个 |
| Spring @Scheduled 任务 | 20+ 个 |
| 业务模块 | 19 个 |
| DB1 数据表 | 51 张 |
| DB2 数据表 | 61 张 |
| 数据表总计 | 112 张 |
| Redis DB4 Key 类型 | 30+ 种 |
| Redis DB5 Key 类型 | 25+ 种 |
| Redis 消息队列 | 15+ 个 |