You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

782 lines
47 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 保洁管理
> 模块编码cleaning
> 端侧Web + 小程序(双端)
> 关联文档01-模块划分 §3.3 / 02-功能清单-物业公司 §3 / 03-业务流转逻辑-物业公司 §3 / 05-接口规范 §9.2 / 06-项目技术要求 §4.4
> 强制规范遵循 `07-前端界面开发规范.md`
## 功能概览
| 项目 | 说明 |
|------|------|
| 菜单名称 | 保洁管理 |
| 子菜单 | 保洁区域管理、保洁任务看板、人员排班、蓝牙点位管理、超时预警、保洁抽查、数据补录 |
| 功能编号 | PR-C-01 ~ PR-C-08 |
| 权限编码前缀 | cleaning:area:* / cleaning:task:* / cleaning:schedule:* / cleaning:spot-check:* / cleaning:supplement:* |
---
## 页面1保洁区域管理页
**页面编号**PR-C-01-P01
**端侧归属**Web专属
**页面路径**/cleaning/areas
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 保洁管理 > 保洁区域管理 │
├──────────────────────────────────────────────────────────────────┤
│ [操作栏] [新增区域] │
├──────────────────────────────────────────────────────────────────┤
│ [树形+列表] │
│ ┌──────────────┐ ┌──────────────────────────────────────────┐ │
│ │ 主院区(项目) │ │ 区域:主院区 > 门诊楼 > 3层 > 公共区域 │ │
│ │ ├ 门诊楼 │ │ 区域责任人:张三 │ │
│ │ │ ├ 1层 │ │ 蓝牙BeaconB-010 (在线) │ │
│ │ │ │ ├ 大厅 │ │ 当前排班:早班(06:00-14:00) │ │
│ │ │ │ └ 走廊 │ │ [编辑] [删除]│ │
│ │ │ ├ 2层 │ └──────────────────────────────────────────┘ │
│ │ │ └ 3层 │ │
│ │ └ 住院楼 │ │
│ └──────────────┘ │
└──────────────────────────────────────────────────────────────────┘
```
### 五级架构
| 层级 | 说明 | 示例 |
|------|------|------|
| 项目 | 最顶层 | 主院区 |
| 区域 | 建筑分区 | 门诊楼 |
| 楼栋 | 单独楼 | 1号楼 |
| 楼层 | 楼层 | 3层 |
| 区域责任人 | 最末级+负责人 | 公共区域(张三) |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 新增区域 | cleaning:area:create | 操作栏 | 始终 | 弹窗 |
| 编辑 | cleaning:area:update | 详情区 | 始终 | — |
| 删除 | cleaning:area:delete | 详情区 | 无排班关联时 | 二次确认 |
### 表单字段(新增/编辑弹窗)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 区域名称 | 文本输入 | 是 | — | 自填 | 最大30字 |
| 上级区域 | 级联选择 | 是 | — | 区域树 | — |
| 区域责任人 | 下拉单选 | 是 | — | 组织架构-人员 | — |
| 蓝牙Beacon | 下拉单选 | 是 | — | 蓝牙设备管理 | — |
| 保洁清单 | 下拉多选 | 是 | — | 保洁清单模板 | 至少选一个 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 区域树 | /api/v1/cleaning-areas/tree | GET | 五级树形结构 |
| 新增 | /api/v1/cleaning-areas | POST | — |
| 编辑 | /api/v1/cleaning-areas/{id} | PUT | — |
| 删除 | /api/v1/cleaning-areas/{id} | DELETE | — |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用区域树接口 GET /api/v1/cleaning-areas/tree → 渲染左侧五级树形结构 → 默认选中第一个项目节点 → 右侧展示该节点详情信息
2. **查询/筛选交互流程**:点击树形节点 → 右侧实时刷新展示选中区域的详情区域路径、责任人、蓝牙Beacon、当前排班
3. **表单填写与提交流程**:点击[新增区域] → 弹窗表单 → 填写区域名称、选择上级区域级联、选择责任人、选择蓝牙Beacon、选择保洁清单 → 点击确认 → 提交 POST /api/v1/cleaning-areas → 成功后刷新树形结构并选中新节点
4. **弹窗/抽屉交互流程**:新增/编辑弹窗宽度520px上级区域级联选择器懒加载展开提交后自动关闭弹窗
5. **行内操作流程**:点击[编辑] → 弹窗回填当前区域数据 → 修改后提交 PUT /api/v1/cleaning-areas/{id} → 刷新右侧详情;点击[删除] → 二次确认弹窗("删除后不可恢复,确认删除?" → 确认后调用 DELETE → 刷新树形
6. **异常与错误处理**:区域名称重复提示"该区域名称已存在"存在排班关联时删除按钮置灰并Tooltip提示"该区域存在排班关联,不可删除";网络异常显示全局错误提示
7. **联动/级联交互**:上级区域级联选择器联动下级选项;选择项目后区域选项刷新,选择区域后楼栋选项刷新,依次类推
8. **权限控制交互表现**:无 cleaning:area:create 权限时[新增区域]按钮隐藏;无 cleaning:area:update 权限时[编辑]按钮隐藏;无 cleaning:area:delete 权限时[删除]按钮隐藏
9. **【H1 防重复请求】**
- 区域树加载:进入页面时调用 GET /api/v1/cleaning-areas/treeloading 状态禁用树形节点点击;切换节点时右侧详情区展示 skeleton 加载占位
- 新增/提交:弹窗确认按钮 `:loading` + `:disabled` 防重复提交
- 行内操作:[编辑][删除]按钮操作中 disabled+loading 图标,防止连续点击
10. **【H2 统一超时】**
- GET区域树15s 超时POST新增/PUT编辑/DELETE删除30s 超时
- 超时后中断请求、提示"请求超时,请检查网络后重试"、按钮状态恢复
- 响应时间 >3s 时自动显示全局 ElLoading 全屏遮罩提示"数据加载中..."
11. **【H3 操作确认(不可逆操作)】**
- 删除操作必须调用 confirm("确定要删除区域「{区域名称}」?删除后将不可恢复且关联排班将被影响", { type: "error", confirmButtonText: "确认删除", cancelButtonText: "取消" })
- 无排班关联时可执行删除,关联存在时按钮置灰并 Tooltip 提示
12. **【H4 脏数据检测(弹窗编辑)】**
- 编辑模式进入时对当前区域数据进行 deep clone 快照JSON.parse(JSON.stringify(row))
- 弹窗内通过 watch/deepWatch 监测 isDirty 状态变化
- 关闭弹窗时若 isDirty 为 true拦截并弹出 confirm("修改未保存,确定要关闭吗?")
13. **【H8 操作结果反馈】**
- 新增成功ElMessage.success("区域创建成功", duration=2000)2秒后 silent 刷新树形结构并选中新节点
- 编辑成功ElMessage.success("区域更新成功")silent 刷新右侧详情
- 删除成功ElMessage.success("删除成功"),刷新树形结构
- 失败ElMessage.error(接口返回错误信息, duration=0)
- 网络异常ElMessage.error("网络连接异常,请检查网络") + 显示重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 区域树 | el-tree | :data="areaTree" node-key="id" :props="{label:'name',children:'children'}" highlight-current :expand-on-click-node="false" @node-click="handleNodeClick" |
| 新增区域按钮 | el-button | type="primary" @click="showAddDialog" v-hasPermission="['cleaning:area:create']" |
| 编辑按钮 | el-button | type="primary" link @click="showEditDialog" v-hasPermission="['cleaning:area:update']" |
| 删除按钮 | el-button | type="danger" link @click="handleDelete" :disabled="hasScheduleBind" v-hasPermission="['cleaning:area:delete']" |
| 新增/编辑弹窗 | el-dialog | :title="dialogTitle" v-model="dialogVisible" width="520px" :close-on-click-modal="false" |
| 区域名称 | el-input | v-model="form.name" maxlength="30" show-word-limit placeholder="请输入区域名称" |
| 上级区域 | el-cascader | v-model="form.parentId" :options="areaOptions" :props="{checkStrictly:true,emitPath:false,value:'id',label:'name'}" placeholder="请选择上级区域" clearable |
| 区域责任人 | el-select | v-model="form.responsibleId" filterable placeholder="请选择责任人" |
| 蓝牙Beacon | el-select | v-model="form.beaconId" filterable placeholder="请选择蓝牙Beacon" |
| 保洁清单 | el-select | v-model="form.checklistIds" multiple collapse-tags collapse-tags-tooltip placeholder="请选择保洁清单" |
| 删除确认 | el-message-box | confirmButtonText="确认" cancelButtonText="取消" type="warning" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 区域名称 | 必填长度1-30字符 | 请输入区域名称 / 区域名称不能超过30个字符 |
| 上级区域 | 必填 | 请选择上级区域 |
| 区域责任人 | 必填 | 请选择区域责任人 |
| 蓝牙Beacon | 必填 | 请选择蓝牙Beacon |
| 保洁清单 | 必填至少选择1项 | 请至少选择一个保洁清单 |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 左侧树形面板固定宽度280px右侧详情区自适应剩余宽度弹窗宽度520px |
| 1024-1279pxPad横屏 | 左侧树形面板宽度缩减至220px右侧详情区自适应弹窗宽度480px |
| 768-1023pxPad竖屏 | 树形面板折叠为顶部下拉选择器详情区全宽展示弹窗宽度90% |
---
## 页面2保洁任务看板页
**页面编号**PR-C-02-P01
**端侧归属**Web专属
**页面路径**/cleaning/tasks
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 保洁管理 > 保洁任务看板 │
├──────────────────────────────────────────────────────────────────┤
│ [看板视图] │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 待执行(5) │ │ 执行中(3) │ │ 已完成(12)│ │
│ │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ │
│ │ │门诊1层│ │ │ │门诊3层│ │ │ │门诊2层│ │ │
│ │ │张三 │ │ │ │李四 │ │ │ │王五 │ │ │
│ │ │06:00 │ │ │ │06:15 │ │ │ │07:00 │ │ │
│ │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
├──────────────────────────────────────────────────────────────────┤
│ [查询条件区] │
│ 日期[____] 班组[▼] 人员[____] 状态[▼] [查询] [重置] │
└──────────────────────────────────────────────────────────────────┘
```
### 查询条件
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 |
|--------|----------|------|--------|------|
| 日期 | 日期选择 | 否 | 今天 | — |
| 班组 | 下拉单选 | 否 | 全部 | — |
| 人员 | 文本输入 | 否 | — | 模糊匹配 |
| 状态 | 下拉单选 | 否 | 全部 | 待执行/执行中/已完成/超时 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 查看详情 | cleaning:task:view | 卡片/行操作 | 始终 | 跳转任务详情 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 任务列表 | /api/v1/cleaning-tasks | GET | 分页查询+看板数据 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 默认查询条件为"今天+全部班组+全部状态" → 调用 GET /api/v1/cleaning-tasks → 渲染看板三列(待执行/执行中/已完成)及任务卡片
2. **查询/筛选交互流程**:修改日期/班组/人员/状态筛选条件 → 点击[查询] → 重新请求接口刷新看板数据;点击[重置] → 恢复默认条件并刷新
3. **表单填写与提交流程**:本页面无表单提交操作,仅查询展示
4. **弹窗/抽屉交互流程**:点击任务卡片[查看详情] → 跳转至任务详情页(新页面路由)
5. **行内操作流程**:点击任务卡片 → 展开卡片详情浮层(区域、人员、时间、清单);点击[查看详情]按钮 → 路由跳转至详情页
6. **异常与错误处理**:接口超时时显示"数据加载失败,请重试"无数据时看板列显示空状态el-empty超时任务卡片边框红色高亮
7. **联动/级联交互**:筛选条件中班组与人员联动,选择班组后人员下拉仅显示该班组人员
8. **权限控制交互表现**:无 cleaning:task:view 权限时[查看详情]按钮隐藏,卡片仅展示基本信息
9. **【H1 防重复请求】**
- 查询按钮:点击后 `:loading` + `:disabled` 防止重复点击
- 看板加载:数据请求期间看板三列展示 skeleton 占位卡片
- 分页/翻页:切换日期或筛选条件时 abort 上一个未完成请求再发起新请求
10. **【H2 统一超时】**
- GET 任务列表 15s 超时
- 超时后中断请求、提示"数据加载超时"、查询按钮恢复可用
- 响应时间 >3s 时显示全局 ElLoading 提示"任务数据加载中..."
11. **【H8 操作结果反馈】**
- 数据加载成功:正常渲染看板,无需额外提示
- 加载失败ElMessage.error("任务数据加载失败", duration=0)
- 空数据:各列展示 el-empty "暂无任务数据"
- 超时卡片边框红色高亮,配合 ElMessage.warning("存在超时任务,请及时处理")
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 看板容器 | 自定义看板组件 | 三列布局每列header显示状态名+数量,列内任务卡片纵向排列 |
| 任务卡片 | el-card | shadow="hover" :body-style="{padding:'12px'}" @click="viewDetail" |
| 状态标签 | el-tag | :type="statusType" 待执行=info 执行中=warning 已完成=success 超时=danger |
| 日期筛选 | el-date-picker | v-model="query.date" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" |
| 班组筛选 | el-select | v-model="query.teamId" clearable placeholder="全部班组" |
| 人员筛选 | el-input | v-model="query.staffName" clearable placeholder="输入人员姓名" |
| 状态筛选 | el-select | v-model="query.status" clearable placeholder="全部状态" |
| 查询按钮 | el-button | type="primary" @click="handleQuery" |
| 重置按钮 | el-button | @click="handleReset" |
| 查看详情按钮 | el-button | type="primary" link @click="viewDetail" v-hasPermission="['cleaning:task:view']" |
| 空状态 | el-empty | description="暂无任务数据" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 日期 | 非必填格式YYYY-MM-DD | 日期格式不正确 |
| 人员 | 非必填最大20字符 | — |
| 状态 | 非必填枚举值pending/ongoing/completed/timeout | — |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 看板三列横向排列,每列宽度均分,查询条件区水平排列 |
| 1024-1279pxPad横屏 | 看板三列横向排列,卡片内容字号略减,查询条件区水平排列 |
| 768-1023pxPad竖屏 | 看板改为纵向堆叠每列占满宽度查询条件区换行排列每行2个条件 |
---
## 页面3人员排班页
**页面编号**PR-C-03-P01
**端侧归属**Web专属
**页面路径**/cleaning/schedules
### 界面布局
```
┌──────────────────────────────────────────────────────────────────┐
│ [面包屑] 保洁管理 > 人员排班 │
├──────────────────────────────────────────────────────────────────┤
│ [视图切换] 📅周视图 📆月视图 [◀ 本周 ▶] [复制上周排班] │
├──────────────────────────────────────────────────────────────────┤
│ [周视图] │
│ 区域/人员 | 周一 | 周二 | 周三 | ... | 周日 │
│ 门诊1层大厅 | 张三早班| 张三早班| 李四早班| ... | 张三早班 │
│ 门诊2层走廊 | 王五早班| 王五早班| 王五早班| ... | — │
│ 住院1层 | 李四晚班| 李四晚班| — | ... | 李四晚班 │
├──────────────────────────────────────────────────────────────────┤
│ [操作] [保存排班] [清空本周] [导出排班表] │
└──────────────────────────────────────────────────────────────────┘
```
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 复制上周排班 | cleaning:schedule:create | 操作栏 | 始终 | 一键复制上周排班到本周 |
| 保存排班 | cleaning:schedule:update | 操作栏 | 始终 | — |
| 清空本周 | cleaning:schedule:delete | 操作栏 | 始终 | 二次确认 |
| 导出排班表 | cleaning:schedule:export | 操作栏 | 始终 | 导出Excel |
### 表单字段(排班编辑弹窗)
| 字段名 | 控件类型 | 必填 | 默认值 | 数据来源 | 校验规则 |
|--------|----------|------|--------|----------|----------|
| 保洁人员 | 下拉单选 | 是 | — | 组织架构-保洁人员 | — |
| 班次 | 下拉单选 | 是 | — | 字典管理-班次 | 早班/晚班/全天 |
| 时间范围 | 时间范围 | 是 | — | 自填 | — |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 排班查询 | /api/v1/cleaning-schedules | GET | 按周/月查询 |
| 保存排班 | /api/v1/cleaning-schedules/batch | POST | 批量保存 |
| 复制排班 | /api/v1/cleaning-schedules/copy | POST | 从指定周复制 |
| 导出 | /api/v1/cleaning-schedules/export | GET | 导出Excel |
### 交互流程要求
1. **页面加载流程**:进入页面 → 默认显示本周周视图 → 调用排班查询API GET /api/v1/cleaning-schedules → 渲染周视图排班表格(区域×日期矩阵),同时加载班组下拉选项
2. **查询/筛选交互流程**:切换周视图/月视图 → 重新请求对应维度数据;点击左右箭头切换周/月 → 重新加载;选择班组 → 过滤显示该班组的排班数据
3. **表单填写与提交流程**:点击排班单元格 → 弹出编辑弹窗 → 选择保洁人员、班次、时间范围 → 确认后暂存到前端;点击[保存排班] → 批量提交所有变更 → 成功后刷新排班视图;点击[复制上周排班] → 调用复制API → 成功后刷新本周视图
4. **弹窗/抽屉交互流程**排班编辑弹窗宽度420px点击单元格打开点击[清空本周] → 二次确认"确认清空本周所有排班数据?" → 确认后调用清空API
5. **行内操作流程**:点击排班单元格 → 弹出编辑弹窗 → 修改后暂存;已有排班数据的单元格显示人员和班次信息;空白单元格可点击新增
6. **异常与错误处理**:同一人员同一时段排班冲突时提示"该人员此时段已有排班"保存失败显示ElMessage.error复制上周无数据时提示"上周无排班数据"
7. **联动/级联交互**班次选择后自动填充时间范围早班06:00-14:00/晚班14:00-22:00/全天08:00-17:00周视图/月视图切换联动数据刷新
8. **权限控制交互表现**:无 cleaning:schedule:create 权限时[复制上周排班]按钮隐藏;无 cleaning:schedule:update 权限时排班单元格不可点击编辑;无 cleaning:schedule:delete 权限时[清空本周]按钮隐藏
9. **[H1]防重复请求**
- [保存排班]按钮点击后::loading=true + 文案"保存中..." + disabled + 排班表格区域半透明遮罩API返回后恢复
- [复制上周排班]按钮点击后立即 disabled + loading态API返回后恢复
- [清空本周]按钮点击后 disabled + loading态确认弹窗通过后执行
- 单元格编辑弹窗保存后:弹窗内保存按钮 :loading + 弹窗关闭期间父页面不可操作
- 周视图/月视图切换、左右箭头切换abort上一请求再发新请求
10. **[H2]超时与加载反馈**
- 排班数据查询GET列表/周/月视图timeout=15秒
- 保存排班/复制上周/清空本周POSTtimeout=30秒
- 超时 → ElMessage.error("请求超时,请检查网络后重试") + 按钮恢复
- 加载>2秒显示全局ElLoading
11. **[H3]操作确认机制**
- 清空本周ElMessageBox.confirm("确认清空本周所有排班数据?清开后数据无法恢复", "清空确认", { type: 'warning', confirmButtonText: '确认清空', cancelButtonText: '取消' })
- 复制上周ElMessageBox.confirm("确定复制上周排班数据到本周?将覆盖本周已有排班", { type: 'info' })
12. **[H4]脏数据检测**
- 用户编辑任一单元格后排班表标记 isDirty=true
- 切换周/月视图时:若 isDirty → ElMessageBox.confirm("当前有未保存的排班变更,切换视图将丢失未保存内容,是否继续?")
- 离开页面时beforeRouteLeave 导航守卫拦截isDirty 则弹出确认提示
- 保存成功后将当前状态设为新快照,重置 isDirty=false
13. **[H8]操作结果反馈**
- 保存成功ElMessage.success("排班保存成功", duration=2000) + silent刷新排班视图
- 复制成功ElMessage.success("已复制上周排班到本周") + 刷新
- 清空成功ElMessage.success("已清空本周排班") + 刷新
- 冲突提示ElMessage.warning("该人员此时段已有排班") + 标红冲突单元格
- 失败ElMessage.error(错误信息, duration=0)
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 视图切换 | el-radio-group + el-radio-button | v-model="viewMode", size="default" |
| 周导航 | 自定义组件 | 左右箭头+周显示,@prev/@next |
| 班组筛选 | el-select | clearable, filterable, placeholder="全部班组" |
| 周视图表格 | 自定义排班表格 | 行=区域,列=周一~周日,单元格可点击 |
| 排班编辑弹窗 | el-dialog | title="编辑排班", width="420px", :close-on-click-modal="false" |
| 保洁人员 | el-select | v-model="form.staffId", filterable, placeholder="请选择保洁人员" |
| 班次 | el-select | v-model="form.shift", placeholder="请选择班次", @change="fillTimeRange" |
| 时间范围 | el-time-picker | is-range, format="HH:mm", range-separator="至" |
| 保存排班按钮 | el-button | type="primary", :loading="saving" |
| 清空本周按钮 | el-button | type="danger" |
| 复制上周按钮 | el-button | type="success" |
| 导出按钮 | el-button | type="success", icon="Download" |
| 二次确认 | el-message-box | type="warning", confirmButtonText="确认", cancelButtonText="取消" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 保洁人员 | 必选 | "请选择保洁人员" |
| 班次 | 必选 | "请选择班次" |
| 时间范围 | 必选,结束时间>开始时间 | "请选择时间范围" / "结束时间必须晚于开始时间" |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 周视图完整7列展示排班编辑弹窗420px |
| 1024-1279pxPad横屏 | 周视图列宽缩窄单元格字号略减弹窗宽度380px |
| 768-1023pxPad竖屏 | 周视图改为3天一组展示今天+后2天左右滑动切换日期范围弹窗宽度90vw |
---
## 页面4蓝牙点位管理页
**页面编号**PR-C-04-P01
**端侧归属**Web专属
**页面路径**/cleaning/beacon-points
### 查询条件
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 |
|--------|----------|------|--------|------|
| 区域 | 级联选择 | 否 | 全部 | — |
| Beacon状态 | 下拉单选 | 否 | 全部 | 在线/离线 |
| 电量 | 下拉单选 | 否 | 全部 | 正常/低电量 |
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | Beacon名称 | 120px | 否 | — |
| 2 | UUID | 180px | 否 | — |
| 3 | 绑定区域 | 150px | 否 | — |
| 4 | 状态 | 80px | 是 | 在线(绿)/离线(红) |
| 5 | 电量 | 80px | 是 | <20%=红色低电量 |
| 6 | 最后心跳 | 140px | | 超过15分钟=离线 |
| 7 | 操作 | 100px | | 编辑绑定/解绑 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 编辑绑定 | cleaning:area:update | 行操作 | 始终 | 绑定/更换区域 |
| 解绑 | cleaning:area:update | 行操作 | 已绑定 | 二次确认 |
### 通知触发
| 触发操作 | 通知对象 | 通知方式 | 消息模板 | 文档来源 |
|----------|----------|----------|----------|----------|
| Beacon离线 | 物业管理员 | 系统内通知 | Beacon离线预警 | 05 §5.2 (BEACON_OFFLINE) |
| Beacon低电量 | 物业管理员 | 系统内通知 | Beacon低电量预警 | 05 §5.2 (BEACON_LOW_BATTERY) |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 列表查询 | /api/v1/cleaning-beacon-points | GET | |
| 绑定 | /api/v1/cleaning-beacon-points/{id}/bind | PUT | 绑定区域 |
| 解绑 | /api/v1/cleaning-beacon-points/{id}/unbind | PUT | |
### 交互流程要求
1. **页面加载流程**:进入页面 调用列表查询API GET /api/v1/cleaning-beacon-points 渲染Beacon列表表格,同时加载区域级联数据;默认按Beacon名称排列
2. **查询/筛选交互流程**:选择区域/选择Beacon状态/选择电量状态 筛选条件变更后自动触发查询(无需手动点击查询按钮);区域级联选择逐级展开
3. **表单填写与提交流程**:点击[编辑绑定] 弹窗选择要绑定的区域 确认后调用绑定API 成功后刷新列表;点击[解绑] 二次确认"确认解绑该Beacon与区域的绑定关系?" 确认后调用解绑API
4. **弹窗/抽屉交互流程**:编辑绑定弹窗宽度480px,展示当前Beacon信息+区域级联选择器;点击遮罩层可关闭
5. **行内操作流程**:点击[编辑绑定] 弹窗选择新区域 提交 刷新行数据;点击[解绑](已绑定时显示)→ 二次确认 解绑 刷新行数据
6. **异常与错误处理**:解绑未绑定的Beacon时提示"该Beacon未绑定区域"API请求失败显示ElMessage.errorBeacon离线状态实时刷新(每30秒轮询心跳数据)
7. **联动/级联交互**:区域筛选级联选择——选择项目→加载区域→选择区域→加载楼栋;Beacon状态根据心跳数据实时更新;电量<20%显示红色低电量标签
8. **权限控制交互表现**:无 cleaning:area:update 权限时[编辑绑定][解绑]按钮隐藏
9. **[H1]防重复请求**
- 行内操作点击后该行禁用 + loading
- 筛选条件变更自动触发查询时 abort 上一个未完成请求再发新请求
10. **[H2]超时与加载反馈**
- GET列表查询 timeout=15秒POST/PUT写操作 timeout=30秒
- 超时 提示"请求超时,请检查网络后重试" + 按钮恢复
- 加载>2秒显示全局loading
11. **[H3]操作确认机制**(有不可逆操作时)
- 解绑: ElMessageBox.confirm("确认解绑该Beacon与区域的绑定关系", { type: 'warning' })
12. **[H4]脏数据检测**
- 编辑模式进入时deep clone快照
- isDirty检测 + 取消/离开拦截
13. **[H8]操作结果反馈**
- 成功: success(2s) + silent刷新
- 失败: error(0手动关闭)
- 网络: 异常提示+重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 区域筛选 | el-cascader | :props="{checkStrictly:true, emitPath:false}", clearable, filterable, placeholder="选择区域" |
| Beacon状态筛选 | el-select | clearable, placeholder="全部状态" |
| 电量筛选 | el-select | clearable, placeholder="全部" |
| 列表 | el-table | stripe, border, :data="tableData" |
| Beacon状态标签 | el-tag | 在线=success / 离线=danger |
| 电量显示 | el-progress | :percentage="row.battery", :color="batteryColor", :stroke-width="8", :text-inside="true" |
| 绑定区域 | el-link | type="primary", @click="viewArea" |
| 编辑绑定按钮 | el-button | type="primary", link |
| 解绑按钮 | el-button | type="danger", link, v-if="row.bindAreaId" |
| 编辑绑定弹窗 | el-dialog | title="编辑Beacon绑定", width="480px", :close-on-click-modal="true" |
| 区域选择 | el-cascader | :props="{checkStrictly:true, emitPath:false}", filterable, placeholder="请选择绑定区域" |
| 解绑确认 | el-message-box | type="warning", confirmButtonText="确认解绑", cancelButtonText="取消" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 绑定区域 | 编辑绑定时必选 | "请选择绑定区域" |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 筛选条件区水平排列表格完整展示全部7列 |
| 1024-1279pxPad横屏 | 筛选条件区换行排列,表格隐藏"UUID"列 |
| 768-1023pxPad竖屏 | 筛选条件区垂直堆叠表格仅显示Beacon名称、绑定区域、状态、操作列 |
---
## 页面5超时预警页
**页面编号**PR-C-05-P01
**端侧归属**Web专属
**页面路径**/cleaning/timeouts
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 任务区域 | 150px | 否 | — |
| 2 | 保洁人员 | 80px | 否 | — |
| 3 | 计划完成时间 | 140px | 是 | — |
| 4 | 超时时长 | 80px | 是 | 红色标记 |
| 5 | 当前状态 | 100px | 否 | 超时未开始/超时未完成 |
| 6 | 操作 | 100px | — | 催办/查看 |
### 通知触发
| 触发操作 | 通知对象 | 通知方式 | 消息模板 | 文档来源 |
|----------|----------|----------|----------|----------|
| 任务超时 | 物业主管 | 小程序推送 | 保洁超时预警 | 01 §7.1 / 05 §5.2 (CLEANING_TIMEOUT) |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 超时列表 | /api/v1/cleaning-tasks/timeouts | GET | 仅显示超时任务 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用超时列表API GET /api/v1/cleaning-tasks/timeouts → 渲染超时任务表格,默认按超时时长降序排列
2. **查询/筛选交互流程**:本页无独立筛选条件,仅展示超时任务列表;数据由后端自动筛选超时任务
3. **表单填写与提交流程**:点击[催办] → 调用催办API → 发送小程序推送通知对应保洁人员 → 成功后刷新该行状态;点击[查看] → 跳转任务详情页
4. **弹窗/抽屉交互流程**:催办操作弹出确认弹窗"将向保洁人员发送催办通知,确认?" → 确认后发送催办
5. **行内操作流程**:点击[催办] → 二次确认 → 发送催办通知 → 刷新行数据;点击[查看] → 跳转任务详情页
6. **异常与错误处理**:催办失败提示"催办通知发送失败,请重试"列表无数据时显示ElEmpty"暂无超时任务,太棒了!"
7. **联动/级联交互**:超时时长列红色标记,时长越长颜色越深;催办后更新催办状态
8. **权限控制交互表现**:本页仅物业管理员和主管可见;主管仅看本班组超时数据
9. **[H1]防重复请求**
- 催办按钮点击后 disabled + loading态API返回后恢复
10. **[H2]超时与加载反馈**
- GET列表查询 timeout=15秒POST催办 timeout=30秒
- 超时 → 提示"请求超时,请检查网络后重试" + 按钮恢复
- 加载>2秒显示全局loading
11. **[H3]操作确认机制**(有不可逆操作时)
- 催办: ElMessageBox.confirm("将向保洁人员发送催办通知,确认?", { type: 'warning' })
12. **[H8]操作结果反馈**
- 成功: success(2s) + silent刷新
- 失败: error(0手动关闭)
- 网络: 异常提示+重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 列表 | el-table | stripe, border, :data="timeoutList", :row-class-name="timeoutRowClass" |
| 超时时长 | el-tag | type="danger", 超时越长字体越大 |
| 当前状态标签 | el-tag | 超时未开始=danger / 超时未完成=danger, effect="dark" |
| 催办按钮 | el-button | type="warning", link, icon="Bell" |
| 查看按钮 | el-button | type="primary", link |
| 催办确认 | el-message-box | type="warning", confirmButtonText="确认催办", cancelButtonText="取消" |
| 空状态 | el-empty | description="暂无超时任务,太棒了!" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| — | — | — |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 表格完整展示全部6列 |
| 1024-1279pxPad横屏 | 表格隐藏"计划完成时间"列 |
| 768-1023pxPad竖屏 | 表格仅显示任务区域、保洁人员、超时时长、操作列 |
---
## 页面6保洁抽查页
**页面编号**PR-C-06-P01
**端侧归属**Web专属
**页面路径**/cleaning/spot-checks
### 查询条件
| 字段名 | 控件类型 | 必填 | 默认值 | 说明 |
|--------|----------|------|--------|------|
| 抽查结果 | 下拉单选 | 否 | 全部 | 合格/不合格 |
| 抽查人 | 文本输入 | 否 | — | 模糊匹配 |
| 日期范围 | 日期范围 | 否 | — | — |
### 列表字段
| 序号 | 字段名 | 列宽 | 支持排序 | 说明 |
|------|--------|------|----------|------|
| 1 | 任务区域 | 150px | 否 | — |
| 2 | 保洁人员 | 80px | 否 | — |
| 3 | 抽查人 | 80px | 否 | 主管名称 |
| 4 | 抽查时间 | 140px | 是 | 默认倒序 |
| 5 | 抽查结果 | 80px | 否 | 合格(绿)/不合格(红) |
| 6 | 不合格原因 | 150px | 否 | — |
| 7 | 操作 | 100px | — | 标记抽查 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 标记抽查 | cleaning:spot-check:approve | 操作栏 | 始终 | 弹窗选择合格/不合格 |
| 不合格→重新生成 | cleaning:spot-check:approve | 行操作 | 结果=不合格 | 重新生成该区域保洁任务 |
### API端点
| 页面操作 | API路径 | 方法 | 说明 |
|----------|---------|------|------|
| 抽查列表 | /api/v1/cleaning-spot-checks | GET | — |
| 标记抽查 | /api/v1/cleaning-spot-checks | POST | — |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用抽查列表API GET /api/v1/cleaning-spot-checks → 渲染抽查记录表格,默认按抽查时间倒序排列
2. **查询/筛选交互流程**:选择抽查结果/输入抽查人/选择日期范围 → 点击[查询] → 重新加载数据 → 点击[重置]清空条件并重新加载
3. **表单填写与提交流程**:点击[标记抽查] → 弹窗选择合格/不合格,不合格时必填原因 → 确认后调用标记抽查API → 成功后刷新列表
4. **弹窗/抽屉交互流程**标记抽查弹窗宽度480px选择结果后不合格显示原因输入框点击遮罩层不关闭
5. **行内操作流程**:不合格记录点击[重新生成] → 二次确认"将为该区域重新生成保洁任务,确认?" → 确认后调用重新生成API → 刷新行数据
6. **异常与错误处理**:重复标记提示"该任务已抽查过"重新生成失败提示ElMessage.error列表无数据时显示ElEmpty
7. **联动/级联交互**:选择"不合格"时自动显示原因输入框;不合格记录自动触发重新生成按钮
8. **权限控制交互表现**:无 cleaning:spot-check:approve 权限时[标记抽查][重新生成]按钮隐藏
9. **[H1]防重复请求**
- 查询按钮点击后 disabled + loading态API返回后恢复
- 行内操作点击后该行禁用 + loading态
- 分页切换 abort上一请求再发新请求
10. **[H2]超时与加载反馈**
- GET列表查询 timeout=15秒POST/PUT写操作 timeout=30秒
- 超时 → 提示"请求超时,请检查网络后重试" + 按钮恢复
- 加载>2秒显示全局loading
11. **[H3]操作确认机制**(有不可逆操作时)
- 重新生成: ElMessageBox.confirm("将为该区域重新生成保洁任务,确认?", { type: 'warning' })
12. **[H4]脏数据检测**
- 编辑模式进入时deep clone快照
- isDirty检测 + 取消/离开拦截
13. **[H8]操作结果反馈**
- 成功: success(2s) + silent刷新
- 失败: error(0手动关闭)
- 网络: 异常提示+重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 抽查结果筛选 | el-select | clearable, placeholder="全部结果" |
| 抽查人输入 | el-input | clearable, maxlength=20, placeholder="请输入抽查人" |
| 日期范围 | el-date-picker | type="daterange", value-format="YYYY-MM-DD", range-separator="至" |
| 列表 | el-table | stripe, border, :data="tableData" |
| 抽查结果标签 | el-tag | 合格=success / 不合格=danger |
| 标记抽查按钮 | el-button | type="primary", icon="Check" |
| 重新生成按钮 | el-button | type="warning", link, v-if="row.result==='unqualified'" |
| 标记抽查弹窗 | el-dialog | title="标记抽查", width="480px", :close-on-click-modal="false" |
| 抽查结果 | el-radio-group | v-model="checkForm.result" |
| 不合格原因 | el-input | type="textarea", :rows="3", maxlength=200, show-word-limit, v-if="checkForm.result==='unqualified'" |
| 二次确认 | el-message-box | type="warning" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 抽查结果 | 必选 | "请选择抽查结果" |
| 不合格原因 | 不合格时必填maxlength=200 | "请填写不合格原因" |
| 日期范围 | 结束日期≥开始日期 | "结束日期不能早于开始日期" |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 查询条件区水平排列表格完整展示全部7列 |
| 1024-1279pxPad横屏 | 查询条件区换行排列,表格隐藏"不合格原因"列 |
| 768-1023pxPad竖屏 | 查询条件区垂直堆叠,表格仅显示任务区域、保洁人员、抽查结果、操作列 |
---
## 页面7数据补录与补录审核页
**页面编号**PR-C-07-P01 / PR-C-08-P01
**端侧归属**Web专属
**页面路径**/cleaning/supplement
### 补录数据标记规范
| 标记项 | 说明 |
|--------|------|
| is_supplement | true |
| supplement_reason | 蓝牙故障/系统异常/定位失败/其他 |
| supplement_audit_status | 待审核/通过/驳回 |
| 统计排除 | 补录数据在统计中单独标记 |
### 操作按钮
| 按钮 | 权限编码 | 位置 | 显示条件 | 说明 |
|------|----------|------|----------|------|
| 审核 | cleaning:supplement:approve | 行操作 | 审核状态=待审核 | 通过/驳回 |
### 交互流程要求
1. **页面加载流程**:进入页面 → 调用补录列表API → 渲染补录数据表格默认按补录时间倒序排列每页20条同时加载审核状态下拉选项
2. **查询/筛选交互流程**:选择审核状态/输入补录人/选择日期范围 → 点击[查询] → 重新加载数据 → 点击[重置]清空条件
3. **表单填写与提交流程**:本页无新增表单,补录数据由小程序端提交
4. **弹窗/抽屉交互流程**:点击[审核](审核状态=待审核时显示)→ 弹出审核弹窗,选择"通过"或"驳回",驳回时必填驳回原因 → 确认后调用审核API → 成功后关闭弹窗并刷新列表
5. **行内操作流程**:点击[审核] → 弹窗选择通过/驳回 → 提交 → 刷新该行审核状态和审核人/审核时间
6. **异常与错误处理**:审核已审核过的记录时提示"该记录已审核"API请求失败显示ElMessage.error列表无数据时显示ElEmpty
7. **联动/级联交互**审核状态筛选影响列表展示补录数据标记规范中is_supplement=true的数据在此页面展示
8. **权限控制交互表现**:无 cleaning:supplement:approve 权限时[审核]按钮隐藏
9. **【H1 防重复请求】**
- 查询按钮 `:loading` + `:disabled` 防重复点击
- 分页切换时 abort 上一个未完成请求再发新请求
- [审核]按钮及弹窗确认按钮操作中 disabled+loading
10. **【H2 统一超时】**
- GET补录列表15s 超时PUT审核30s 超时
- 超时后中断请求、提示"请求超时"
- 响应时间 >3s 时全局 ElLoading
11. **【H3 操作确认(不可逆操作)**
- 审核通过confirm("确认通过该补录数据?通过后数据将纳入正常统计", { type: "info", confirmButtonText: "确认通过", cancelButtonText: "取消" })
- 审核驳回confirm("确认驳回该补录数据?驳回后需补录人重新提交", { type: "warning", confirmButtonText: "确认驳回", cancelButtonText: "取消",含后果说明 })
12. **【H4 脏数据检测(审核弹窗)】**
- 审核弹窗打开时初始化空审核表单快照
- 选择通过/驳回或填写驳回原因后检测 isDirty
- 关闭弹窗若 isDirty 为 true 拦截并 confirm("审核结果未提交,确定要关闭?")
13. **【H8 操作结果反馈】**
- 审核成功ElMessage.success(审核结果 === 'pass' ? "审核通过" : "已驳回")silent 刷新列表行状态
- 重复审核ElMessage.warning("该记录已审核")
- 操作失败ElMessage.error(错误信息, duration=0)
- 网络异常ElMessage.error("网络连接异常") + 重试按钮
### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 审核状态筛选 | el-select | clearable, placeholder="全部状态" |
| 补录人输入 | el-input | clearable, maxlength=20, placeholder="请输入补录人" |
| 日期范围 | el-date-picker | type="daterange", value-format="YYYY-MM-DD", range-separator="至" |
| 列表 | el-table | stripe, border, :data="tableData" |
| 分页 | el-pagination | layout="total, sizes, prev, pager, next", :page-sizes="[10,20,50]" |
| 审核状态标签 | el-tag | 待审核=warning / 已通过=success / 已驳回=danger |
| 审核按钮 | el-button | type="primary", link, v-if="row.auditStatus==='pending'" |
| 审核弹窗 | el-dialog | title="审核补录", width="500px", :close-on-click-modal="false" |
| 审核结果 | el-radio-group | v-model="auditForm.result" |
| 驳回原因 | el-input | type="textarea", :rows="3", maxlength=200, show-word-limit, v-if="auditForm.result==='reject'" |
### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 审核结果 | 必选 | "请选择审核结果" |
| 驳回原因 | 驳回时必填maxlength=200 | "请填写驳回原因" |
| 日期范围 | 结束日期≥开始日期 | "结束日期不能早于开始日期" |
### 响应式布局
| 断点 | 布局调整 |
|------|----------|
| ≥1280px桌面端 | 查询条件区水平排列表格完整展示弹窗宽度500px |
| 1024-1279pxPad横屏 | 查询条件区换行排列表格隐藏次要列弹窗宽度460px |
| 768-1023pxPad竖屏 | 查询条件区垂直堆叠表格仅显示关键列弹窗宽度90vw |
---
## 需求追溯
| 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 |
|------------|----------|----------|----------|----------|
| PR-C-01 | 保洁区域管理 | 02-物业公司 §3 / 03-物业公司 §3 | 五级架构→排班→任务生成 | 巡检区域管理(复用架构) |
| PR-C-02 | 保洁任务看板 | 02-物业公司 §3 / 03-物业公司 §3 | — | 小程序端今日保洁(MP-CL-01) |
| PR-C-03 | 人员排班 | 02-物业公司 §3 / 03-物业公司 §3 | 排班→自动生成每日任务 | 组织架构→人员管理 |
| PR-C-04 | 蓝牙点位管理 | 02-物业公司 §3 | 区域→Beacon绑定 | 系统配置→蓝牙设备管理 |
| PR-C-05 | 超时预警 | 02-物业公司 §3 / 03-物业公司 §3 | 超时→推送主管 | 通知机制 |
| PR-C-06 | 保洁抽查 | 02-物业公司 §3 / 03-物业公司 §3 | 不合格→重新生成任务 | 小程序端抽查标记(MP-CL-05) |
| PR-C-07 | 数据补录 | 02-物业公司 §3 / 03-物业公司 §2.2 | 补录→审核 | 小程序端异常数据补录(MP-CL-07) |
| PR-C-08 | 补录审核 | 02-物业公司 §3 / 03-物业公司 §2.2 | 审核→通知补录人 | 操作日志→补录日志 |
## 业务规则
1. **五级架构**项目→区域→楼栋→楼层→区域责任人最末级必须指定责任人来源02-物业公司 PR-C-01
2. **排班自动生成任务**根据排班数据自动生成每日保洁任务来源03-物业公司 §3
3. **蓝牙打卡确认**:策略=REQUIRED时必须连接Beacon后才可确认完成失败进入补录模式来源06 §4.4
4. **蓝牙双模式**:策略=OPTIONAL时允许手动打卡(check_type=MANUAL)来源06 §4.4
5. **超时预警**任务超过计划完成时间未完成系统自动预警推送主管来源02-物业公司 PR-C-05 / 03-物业公司 §3
6. **抽查不合格**主管标记不合格后系统自动重新生成该区域保洁任务来源03-物业公司 §3
7. **补录流程**与巡检一致补录需主管审核来源03-物业公司 §2.2