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.

516 lines
29 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.

# 巡检相关功能
> 模块编码inspection
> 端侧:小程序
> 关联文档01-模块划分.md §3.2、02-功能清单-小程序端.md §3、03-业务流转逻辑-小程序端.md §3、05-接口规范.md §9.2、06-项目技术要求.md §4.4&5.4
> 强制规范遵循 `07-前端界面开发规范.md`
## 功能概览
| 项目 | 说明 |
|------|------|
| 菜单名称 | 巡检相关功能 |
| 子菜单 | 今日巡检任务、蓝牙强制打卡、巡检执行、异常上报、巡检历史、异常数据补录 |
| 功能编号 | MP-I-01 ~ MP-I-06 |
| 权限编码 | inspection:plan:* / inspection:task:* 等 |
## 页面清单
### 页面1今日巡检任务列表
- **页面路径**`/pages/inspection/today-tasks`
- **页面元素**
- 今日任务统计(待执行/已完成/异常)
- 任务列表
- 下拉刷新
- **查询条件**:无(自动加载当日任务)
- **列表字段**
| 字段 | 说明 |
|------|------|
| 任务名称 | 巡检计划名称 |
| 巡检区域 | 区域名称 |
| 计划时间 | 开始~结束时间 |
| 任务状态 | 待执行/进行中/已完成/异常 |
| 蓝牙打卡状态 | 未打卡/已打卡 |
| 异常数量 | 异常项数量(红色标记) |
- **界面布局**
- 顶部:统计卡片(待执行/已完成/异常 三列数字)
- 中部:任务卡片列表
- 卡片顶部:任务名称 + 状态标签
- 卡片中部:巡检区域 + 计划时间
- 卡片底部:蓝牙打卡状态 + 异常数量
- 底部:无更多数据提示
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 开始巡检 | inspection:task:view | 跳转巡检执行页 |
| 查看详情 | inspection:task:view | 已完成的任务查看详情 |
#### 交互流程要求
1. **页面加载流程**:页面加载时自动请求当日巡检任务列表,显示骨架屏占位;获取任务后渲染统计卡片与任务列表;无任务时显示空状态插图与提示文案
2. **查询/筛选交互流程**:无手动筛选条件,自动按当日+本人过滤;支持下拉刷新重新加载任务数据
3. **表单填写与提交流程**:本页面无表单提交操作
4. **弹窗/弹层交互流程**:无弹窗
5. **行内操作流程**:点击「开始巡检」→ 校验蓝牙打卡状态 → 跳转巡检执行页;点击「查看详情」→ 跳转巡检详情页
6. **异常与错误处理**:网络异常显示重试提示;蓝牙状态异常在卡片上以图标提示;任务加载失败显示错误页与重试按钮
7. **联动/级联交互**:统计卡片数字与列表数据联动实时更新
8. **权限控制交互表现**:无权限时隐藏「开始巡检」和「查看详情」按钮;按钮置灰且不可点击
9. **H1 防重复提交**:「开始巡检」「查看详情」按钮点击时须设置 `:loading` + `:disabled` 双重锁定;下拉刷新期间禁止重复触发;使用 pending Promise 去重;分页请求切换月份时 abort 上一次请求
10. **H2 超时控制**GET 请求超时 15s页面加载 >3s 时须调用 `wx.showLoading({title:'加载中...', mask:true})`;请求超时时提示"网络请求超时,请重试"并显示重试按钮
11. **H3 操作确认**:点击「开始巡检」前若存在未完成巡检任务,须通过 `wx.showModal` 二次确认,内容含后果说明(如"当前有未完成任务,是否继续?");跳转操作无需二次确认
12. **H8 反馈规范**:任务加载成功后使用 `wx.showToast({icon:'success'})` 反馈;加载失败使用 `wx.showToast({icon:'none', title:'具体错误信息'})` 显示多文字提示;网络异常(`wx.getNetworkType` 判断非 wifi/4g时提示弱网络并提供重试入口
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 统计卡片 | `uni-card` | mode="center",三列等宽布局 |
| 任务列表 | `uni-list` + `uni-list-item` | clickable=trueshowArrow=true |
| 状态标签 | `uni-tag` | type: success(已完成)/warning(进行中)/error(异常)/default(待执行) |
| 蓝牙状态图标 | `uni-icons` | type="bluetooth"size="22" |
| 下拉刷新 | `uni-refresher` | @onRefresh 回调threshold=45px |
| 空状态 | `uni-section` | 插槽自定义空状态插图与文案 |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 任务列表 | 加载失败时允许重试 | "加载失败,请下拉刷新重试" |
| 统计数据 | 数据为空时显示0 | — |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px卡片宽度自适应屏幕宽度左右padding 16px
- **横竖屏适配策略**:竖屏为默认布局;横屏时统计卡片改为横向平铺,任务列表改为双列卡片
- **手势交互规范**所有可点击区域≥44px下拉刷新触发区域≥50px卡片内按钮间距≥8px
### 页面2蓝牙打卡页
- **页面路径**`/pages/inspection/bluetooth-checkin`
- **页面元素**
- 蓝牙扫描动画
- 当前扫描状态提示
- 检测到的Beacon列表如多个
- 打卡结果提示
- 补录入口
- **界面布局**
- 顶部:蓝牙扫描状态(扫描动画 + 文字提示)
- 中部Beacon信息展示
- Beacon名称
- UUID
- 信号强度RSSI
- 连接状态
- 底部:打卡结果 + 重试/补录按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 重新扫描 | — | 蓝牙扫描超时后可重试最多3次 |
| 进入补录模式 | — | 蓝牙无法连接时,进入补录模式 |
#### 交互流程要求
1. **页面加载流程**:页面加载时查询蓝牙策略→策略=REQUIRED自动启动蓝牙扫描→显示扫描动画策略=OPTIONAL显示打卡方式选择
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**自动扫描蓝牙Beacon→检测到Beacon→自动连接→连接成功打卡→显示打卡结果扫描超时→提示重新扫描或进入补录模式
4. **弹窗/弹层交互流程**:打卡成功弹出成功提示;扫描超时弹出重试提示;策略=OPTIONAL弹出打卡方式选择弹窗
5. **行内操作流程**:点击重新扫描→重新搜索蓝牙;点击进入补录模式→跳转补录页
6. **异常与错误处理**:蓝牙未开启提示"请开启手机蓝牙"扫描超时3次后自动显示补录入口蓝牙连接失败提示重试离线时提示"网络不可用"
7. **联动/级联交互**:蓝牙策略与扫描行为联动,策略=REQUIRED自动扫描策略=OPTIONAL手动选择
8. **权限控制交互表现**:所有巡检人员可访问;蓝牙权限被拒时引导开启
9. **H1 防重复提交**:「重新扫描」按钮点击时须设置 `:loading="scanning"` + `:disabled` 双重锁定,扫描期间禁止重复点击;「进入补录模式」按钮同样需要 loading+disabled 锁定;使用 pending 标志位防止重复发起扫描
10. **H2 超时控制**:蓝牙扫描超时 3s策略查询 GET 请求超时 15s扫描等待 >3s 时须显示 `wx.showLoading({title:'正在扫描...', mask:true})`;扫描超时或请求超时均需提示用户并提供重试入口
11. **H3 操作确认**:点击「进入补录模式」前须通过 `wx.showModal` 确认,内容说明"进入补录模式后将记录为手动打卡,是否继续?"
12. **H4 脏数据检测**:本页面以自动扫描为主,若用户手动修改过任何数据则标记 isDirty`onUnload` 生命周期中检测到 isDirty 且未提交时弹出 `wx.showModal` 提示"未完成的打卡将丢失,确定离开?"
13. **H7 上传约束**:本页面无上传功能(拍照在巡检执行页完成),此项不适用
14. **H8 反馈规范**:蓝牙连接成功使用 `wx.showToast({icon:'success', title:'打卡成功'})`;扫描失败使用 `wx.showToast({icon:'none', title:'未检测到蓝牙信号,请重试或补录'})`;网络异常通过 `wx.getNetworkType` 判断后提供重试
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 扫描动画 | `view` + CSS动画 | 旋转动画size=80px |
| 状态提示 | `text` | font-size="14px",动态文案 |
| Beacon信息 | `uni-list` + `uni-list-item` | :showArrow="false"显示UUID/RSSI |
| 重新扫描 | `button` | type="default":loading="scanning" |
| 进入补录模式 | `button` | type="warn"@click="goSupplement" |
| 打卡结果 | `uni-popup` | type="dialog",打卡成功/失败提示 |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 蓝牙状态 | 必须开启蓝牙 | "请开启手机蓝牙" |
| Beacon信号 | RSSI > -70dBm | "蓝牙信号弱,请靠近打卡点" |
| 扫描超时 | 3秒超时最多重试3次 | "蓝牙扫描超时,请重试或进入补录模式" |
| 打卡点验证 | Beacon必须属于本人班组打卡点 | "未检测到有效打卡点" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px扫描动画居中
- **横竖屏适配策略**:竖屏垂直布局;横屏动画与信息并排展示
- **手势交互规范**按钮可点击区域≥44px动画区域≥80px
- **安全区域**:底部按钮适配底部安全区
### 页面3巡检执行页
- **页面路径**`/pages/inspection/execute`
- **页面元素**
- 巡检清单列表(逐项检查)
- 每项检查项:正常/异常选择
- 异常项附加信息(拍照+严重等级+描述)
- 打卡状态指示
- 进度指示(已检查/总数)
- **查询条件**:无
- **列表字段**
| 字段 | 说明 |
|------|------|
| 检查项序号 | 序号标识 |
| 检查项名称 | 巡检清单项 |
| 检查结果 | 正常(绿)/异常(红)/未检查(灰) |
| 严重等级 | 异常时显示:一般/较重/严重 |
- **界面布局**
- 顶部:进度条(已检查/总数)+ 蓝牙连接状态指示
- 中部:检查项列表
- 每项:序号 + 名称 + 正常/异常切换
- 异常项展开:严重等级选择 + 描述输入 + 拍照上传
- 底部:提交巡检结果按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 标记正常 | — | 当前项标记为正常 |
| 标记异常 | — | 当前项标记为异常,展开附加信息 |
| 拍照上传 | — | 异常项拍照(蓝牙策略=REQUIRED时须在蓝牙连接下拍照 |
| 一键生成报修 | — | 异常项可直接生成报修工单(数据写入报修模块) |
| 提交巡检结果 | inspection:task:view | 提交巡检记录 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取巡检任务清单→渲染检查项列表和进度条;查询蓝牙策略→蓝牙策略=REQUIRED时显示蓝牙连接状态指示
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:逐项标记正常/异常→异常项展开附加信息→选择严重等级→输入描述→拍照上传(蓝牙策略=REQUIRED须蓝牙连接下拍照→点击提交巡检结果→确认弹窗→提交成功
4. **弹窗/弹层交互流程**:点击拍照弹出选择(拍照/相册);提交前弹出确认弹窗"确认提交巡检结果?";点击一键生成报修弹出确认弹窗
5. **行内操作流程**:点击标记正常→该项标记为正常;点击标记异常→展开附加信息区;点击拍照→调起相机;点击一键生成报修→创建报修工单
6. **异常与错误处理**:蓝牙断连时拍照提示"请连接蓝牙后拍照";提交失败显示重试;未完成所有检查项时提示"请完成所有检查项"
7. **联动/级联交互**:检查进度与进度条联动;异常项标记与附加信息展开联动
8. **权限控制交互表现**仅巡检人员可操作无inspection:task:view权限时提交按钮置灰
9. **H1 防重复提交**:「标记正常」「标记异常」「提交巡检结果」按钮点击时须设置 `:loading` + `:disabled` 双重锁定;「一键生成报修」按钮同样需要防重复;提交期间禁止重复操作
10. **H2 超时控制**:获取巡检清单 GET 请求超时 15s提交巡检结果 POST 请求超时 30s请求耗时 >3s 时须调用 `wx.showLoading({mask:true})`;超时提示"提交超时,请检查网络后重试"
11. **H3 操作确认**:点击「提交巡检结果」前须通过 `wx.showModal` 二次确认,内容包括已检查项数、正常/异常统计及后果说明;点击「一键生成报修」前须确认"确认为此异常项生成报修工单?"
12. **H4 脏数据检测**页面加载时对初始巡检清单数据进行快照JSON.stringify 深拷贝);每次标记正常/异常或填写附加信息时对比快照检测 isDirty`onUnload` 中检测到 isDirty 且未提交时弹出 `wx.showModal({content:"巡检数据尚未保存,确定离开?"})` 拦截离开
13. **H7 上传约束**:异常项照片上传单个文件 ≤10MB每项最多 ≤9 张;使用 `uni-file-picker` 配合进度回调 `@progress` 实时展示上传百分比;超出限制时提示"照片大小不能超过10MB"或"最多上传9张照片"
14. **H8 反馈规范**:提交成功使用 `wx.showToast({icon:'success', title:'巡检结果已提交'})`;校验失败(如未完成所有检查项)使用 `wx.showToast({icon:'none', title:'请完成所有检查项后再提交'})`;网络异常时通过 `wx.getNetworkType` 判断并提供重试按钮
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 进度条 | `progress` | :percent="progress"show-info=true |
| 蓝牙状态指示 | `uni-icons` | type="bluetooth"size="18"color动态 |
| 检查项列表 | `uni-list` + `uni-list-item` | :showArrow="false",可展开 |
| 正常/异常切换 | `uni-data-checkbox` | :localdata="[{value:'normal',text:'正常'},{value:'abnormal',text:'异常'}]" |
| 严重等级选择 | `uni-data-select` | :localdata="levelList" |
| 异常描述 | `uni-easyinput` | type="textarea"maxlength="500" |
| 照片上传 | `uni-file-picker` | limit="9"file-mediatype="image" |
| 一键生成报修 | `button` | type="warn"size="mini" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 检查项 | 必须逐项完成 | "请完成所有检查项" |
| 异常项严重等级 | 异常时必选 | "请选择严重等级" |
| 异常项描述 | 异常时必填 | "请填写异常描述" |
| 异常项照片 | 异常时至少1张 | "请上传异常照片" |
| 蓝牙状态 | 策略=REQUIRED拍照时须蓝牙连接 | "请连接蓝牙后拍照" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px检查项列表宽度自适应
- **横竖屏适配策略**:竖屏垂直列表;横屏异常项展开区域更宽
- **手势交互规范**检查项可点击区域≥44px按钮≥44px照片上传区域≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面4异常上报页
- **页面路径**`/pages/inspection/report-abnormal`
- **页面元素**
- 异常描述(多行文本,必填)
- 严重等级选择(一般/较重/严重)
- 照片上传最多9张含水印时间定位
- 是否生成报修工单(开关)
- 报修类型选择(生成工单时)
- **界面布局**
- 顶部:严重等级选择(三档按钮)
- 中部:异常描述输入 + 照片上传网格
- 下部:生成报修工单开关 + 报修类型选择
- 底部:提交上报按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 拍照上传 | — | 拍摄异常照片 |
| 提交上报 | — | 上报异常,如选择生成工单则同时创建报修工单 |
#### 交互流程要求
1. **页面加载流程**:页面加载时初始化表单,获取报修类型字典
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:选择严重等级→输入异常描述→拍照上传(含水印)→可选开启"生成报修工单"开关→选择报修类型→点击提交上报→确认弹窗→上报成功
4. **弹窗/弹层交互流程**:点击拍照弹出选择(拍照/相册);提交前弹出确认弹窗
5. **行内操作流程**:选择严重等级→输入描述→上传照片→开启生成报修工单→选择报修类型→提交
6. **异常与错误处理**:图片上传失败提示重传;提交失败显示重试
7. **联动/级联交互**:生成报修工单开关与报修类型选择联动,开启后显示报修类型选择器
8. **权限控制交互表现**:所有巡检人员可操作
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 严重等级 | `uni-data-select` | :localdata="[{value:'minor',text:'一般'},{value:'major',text:'较重'},{value:'critical',text:'严重'}]" |
| 异常描述 | `uni-easyinput` | type="textarea"maxlength="500":showWordLimit="true" |
| 照片上传 | `uni-file-picker` | limit="9"file-mediatype="image":auto-upload="true" |
| 生成报修工单 | `switch` | @change="onSwitchChange" |
| 报修类型 | `uni-data-select` | v-model="repairType":localdata="repairTypeList"v-if="generateRepair" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 严重等级 | 必选 | "请选择严重等级" |
| 异常描述 | 必填最多500字 | "请填写异常描述" / "描述不能超过500字" |
| 照片 | 至少1张最多9张 | "请上传异常照片" / "照片最多上传9张" |
| 报修类型 | 开启生成报修工单时必选 | "请选择报修类型" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**竖屏垂直布局横屏照片区3~4列网格
- **手势交互规范**选择器≥44px提交按钮≥44px照片上传区域≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面5巡检历史列表
- **页面路径**`/pages/inspection/history`
- **页面元素**
- 日期选择器(按月切换)
- 巡检记录列表
- 下拉刷新 + 上拉加载
- **查询条件**
| 条件 | 类型 | 说明 |
|------|------|------|
| 月份 | 月份选择器 | 按月筛选巡检记录 |
- **列表字段**
| 字段 | 说明 |
|------|------|
| 巡检日期 | 日期时间 |
| 巡检区域 | 区域名称 |
| 打卡方式 | 蓝牙/手动/补录 |
| 检查项总数 | 总计 |
| 异常数 | 异常项数量 |
| 状态 | 正常/异常 |
- **界面布局**
- 顶部:月份选择器
- 中部:巡检记录卡片列表
- 卡片顶部:日期 + 状态标签
- 卡片中部:区域 + 打卡方式
- 卡片底部:检查项总数 + 异常数
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 查看详情 | inspection:task:view | 查看巡检记录详情 |
#### 交互流程要求
1. **页面加载流程**:页面加载时默认加载当月巡检记录→显示骨架屏→渲染月份选择器和记录列表
2. **查询/筛选交互流程**:切换月份→重新加载对应月份记录;下拉刷新重新加载;上拉加载更多
3. **表单填写与提交流程**:无表单提交操作
4. **弹窗/弹层交互流程**:无弹窗
5. **行内操作流程**:点击查看详情→跳转巡检记录详情页;左右滑动切换月份
6. **异常与错误处理**:记录加载失败显示重试;无记录显示空状态插图和文案
7. **联动/级联交互**:月份切换与列表数据联动
8. **权限控制交互表现**仅巡检人员可访问本人数据主管可查看本班组数据无inspection:task:view权限时隐藏查看详情
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 月份选择器 | `uni-datetime-picker` | type="date"fields="month" |
| 记录列表 | `uni-list` + `uni-list-item` | clickable=trueshowArrow=true |
| 状态标签 | `uni-tag` | type: success(正常)/error(异常) |
| 下拉刷新 | `uni-refresher` | @onRefresh回调 |
| 上拉加载 | `uni-load-more` | :status="loadingStatus" |
| 空状态 | `uni-section` | 插槽自定义空状态插图与文案 |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 月份 | 必须选择有效月份 | — |
| 记录列表 | 加载失败允许重试 | "加载失败,请下拉刷新重试" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px卡片宽度自适应padding 16px
- **横竖屏适配策略**:竖屏单列卡片;横屏双列卡片展示
- **手势交互规范**记录项可点击区域≥44px月份选择器≥44px支持下拉刷新和上拉加载
- **安全区域**:底部列表适配底部安全区
### 页面6异常数据补录页
- **页面路径**`/pages/inspection/supplement`
- **页面元素**
- 补录原因选择(下拉:蓝牙失灵/定位失败/系统异常/其他)
- 补录说明(多行文本,必填)
- 证明材料上传照片最多3张
- 巡检记录补录表单
- 巡检时间(手动选择)
- 巡检区域
- 检查项结果(逐项填写)
- **界面布局**
- 顶部:补录原因选择 + 说明
- 中部:证明材料上传
- 下部:巡检记录补录表单
- 底部:提交补录申请按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 提交补录申请 | — | 提交后等待主管审核 |
#### 交互流程要求
1. **页面加载流程**:页面加载时显示补录模式提示(红色警示条)→获取巡检区域和检查项数据
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:选择补录原因→填写补录说明→上传证明材料→手动选择巡检时间→选择巡检区域→逐项填写检查项结果→点击提交补录申请→确认弹窗→提交成功等待主管审核
4. **弹窗/弹层交互流程**:点击上传弹出选择(拍照/相册);提交前弹出确认弹窗"确认提交补录申请?"
5. **行内操作流程**:选择原因→填写说明→上传照片→选择时间和区域→填写检查项→提交
6. **异常与错误处理**:图片上传失败提示重传;提交失败显示重试;离线时数据暂存本地
7. **联动/级联交互**:补录原因与其他字段无强联动;巡检区域与检查项联动
8. **权限控制交互表现**仅巡检人员可操作补录数据标记is_supplement=true
9. **H1 防重复提交**:「提交补录申请」按钮点击时须设置 `:loading="submitting"` + `:disabled` 双重锁定;提交期间禁止重复点击
10. **H2 超时控制**:获取区域和检查项数据 GET 请求超时 15s提交补录 POST 请求超时 30s证明材料上传超时 60s>3s 时须 `wx.showLoading({mask:true})`;超时后提示并提供重试
11. **H3 操作确认**:点击「提交补录申请」前须通过 `wx.showModal` 二次确认,内容包括补录原因摘要、说明字数及"提交后需等待主管审核"的后果说明
12. **H4 脏数据检测**:页面初始化时保存空白表单快照;选择补录原因、填写说明、上传材料、选择时间/区域、填写检查项等任一操作触发 isDirty=true`onUnload` 中检测 isDirty 时弹出 `wx.showModal({content:"补录信息尚未提交,确定离开?"})` 拦截
13. **H7 上传约束**:证明材料上传单个文件 ≤10MB最多 ≤3 张(业务限制);使用 `uni-file-picker``@progress` 回调显示上传进度;超出限制时前端拦截并提示
14. **H8 反馈规范**:提交成功使用 `wx.showToast({icon:'success', title:'补录申请已提交,待审核'})`;校验失败使用 `wx.showToast({icon:'none', title:'具体错误信息'})`;离线暂存本地时提示"已暂存至本地,联网后将自动提交"
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 补录原因 | `uni-data-select` | :localdata="[{value:'bluetooth',text:'蓝牙失灵'},{value:'location',text:'定位失败'},{value:'system',text:'系统异常'},{value:'other',text:'其他'}]" |
| 补录说明 | `uni-easyinput` | type="textarea"maxlength="200":showWordLimit="true" |
| 证明材料上传 | `uni-file-picker` | limit="3"file-mediatype="image" |
| 巡检时间 | `uni-datetime-picker` | type="datetime" |
| 巡检区域 | `uni-data-select` | v-model="areaId":localdata="areaList" |
| 检查项结果 | `uni-data-checkbox` | 每项动态渲染,正常/异常 |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 补录原因 | 必选 | "请选择补录原因" |
| 补录说明 | 必填最多200字 | "请填写补录说明" / "补录说明不能超过200字" |
| 证明材料 | 最多3张 | "证明材料最多上传3张" |
| 巡检时间 | 必选 | "请选择巡检时间" |
| 巡检区域 | 必选 | "请选择巡检区域" |
| 检查项结果 | 必须逐项填写 | "请完成所有检查项" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏表单水平分组展示
- **手势交互规范**选择器≥44px提交按钮≥44px上传区域≥44px
- **安全区域**:底部提交按钮适配底部安全区
## 需求追溯
| 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 |
|------------|----------|----------|----------|----------|
| MP-I-01 | 今日巡检任务 | 02-小程序端 §3 | 查看任务→开始巡检→蓝牙打卡 | 巡检计划Web端 |
| MP-I-02 | 蓝牙强制打卡 | 02-小程序端 §3 | 打卡成功→记录check_type=BLUETOOTH→开始巡检 | 蓝牙策略配置 |
| MP-I-03 | 巡检执行 | 02-小程序端 §3 | 逐项检查→记录正常/异常→提交 | 巡检计划清单 |
| MP-I-04 | 异常上报 | 02-小程序端 §3 | 上报→可一键生成报修工单→通知主管 | 在线报修(报修工单) |
| MP-I-05 | 巡检历史 | 02-小程序端 §3 | 查看个人历史巡检记录 | 统计报表 |
| MP-I-06 | 异常数据补录 | 02-小程序端 §3 | 提交补录→主管审核→审核通过后数据生效 | 补录审核Web+小程序) |
## 业务规则
1. **蓝牙策略规则**06-项目技术要求.md §4.4
- 策略=REQUIRED强制蓝牙
- 必须连接蓝牙Beacon后才可打卡
- 拍照也须在蓝牙连接状态下进行
- 蓝牙扫描超时3秒重试3次
- 未检测到蓝牙 → 提示"未检测到蓝牙信号" → 可重试或进入补录模式
- 打卡记录 `check_type=BLUETOOTH`
- 策略=OPTIONAL非强制蓝牙
- 用户选择打卡方式:蓝牙打卡或手动打卡
- 手动打卡:`check_type=MANUAL`
2. **蓝牙连接判定**06-项目技术要求.md §5.4
- **不判断距离,只要成功连接蓝牙设备即可打卡**
- 信号阈值RSSI > -70dBm可配置仅用于判定是否能建立连接
- 扫描超时3秒
- 重试次数3次
3. **蓝牙策略查询**03-业务流转逻辑-小程序端 §3
- 数据来源:`GET /system/bluetooth-policy → inspection_check_in`(打卡策略)
- 数据来源:`GET /system/bluetooth-policy → inspection_photo`(拍照策略)
4. **异常上报关联报修**03-业务流转逻辑-小程序端 §3
- 异常上报时可一键生成报修工单
- 数据写入报修模块INSPECTION_ABNORMAL事件 → repair模块消费
5. **补录数据规则**06-项目技术要求.md §4.5
- 补录数据必须标记 `is_supplement=true`
- 补录原因必填
- 需主管审核Web+小程序均可审核)
6. **数据权限**01-模块划分.md §1.3
- 巡检人员:仅本人巡检数据
- 主管:本班组巡检数据
## 状态流转
### 巡检任务状态流转
```
待执行 ──[蓝牙打卡]──▶ 进行中 ──[逐项检查]──▶ 已完成
│ │
│ └──[发现异常]──▶ 异常(可一键报修)
└──[蓝牙失败]──▶ 补录模式 ──[手动填写]──▶ 待审核 ──[主管通过]──▶ 已完成
└──[主管驳回]──▶ 已驳回
```
### 蓝牙打卡流程
```
开始打卡
查询蓝牙策略inspection_check_in
┌───策略=REQUIRED───┐
│ 自动扫描蓝牙Beacon │
│ │ │
│ ┌──检测到Beacon──┐ ┌──未检测到──┐
│ │ 连接蓝牙 │ │ 提示未检测 │
│ │ 连接成功→打卡 │ │ 重试/补录 │
│ │ check_type= │ └────────────┘
│ │ BLUETOOTH │
│ └────────────────┘
└────────────────────┘
┌───策略=OPTIONAL───┐
│ 选择打卡方式 │
│ ┌蓝牙打卡─手动打卡┐│
│ │BLUETOOTH MANUAL││
│ └────────────────┘│
└────────────────────┘
```