# 巡检相关功能 > 模块编码: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=true,showArrow=true | | 状态标签 | `uni-tag` | type: success(已完成)/warning(进行中)/error(异常)/default(待执行) | | 蓝牙状态图标 | `uni-icons` | type="bluetooth",size="22" | | 下拉刷新 | `uni-refresher` | @onRefresh 回调,threshold=45px | | 空状态 | `uni-section` | 插槽自定义空状态插图与文案 | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 任务列表 | 加载失败时允许重试 | "加载失败,请下拉刷新重试" | | 统计数据 | 数据为空时显示0 | — | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),卡片宽度自适应屏幕宽度,左右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 SE(375px)~ iPad mini(768px),扫描动画居中 - **横竖屏适配策略**:竖屏垂直布局;横屏动画与信息并排展示 - **手势交互规范**:按钮可点击区域≥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 SE(375px)~ iPad mini(768px),检查项列表宽度自适应 - **横竖屏适配策略**:竖屏垂直列表;横屏异常项展开区域更宽 - **手势交互规范**:检查项可点击区域≥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 SE(375px)~ iPad mini(768px),表单宽度自适应 - **横竖屏适配策略**:竖屏垂直布局;横屏照片区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=true,showArrow=true | | 状态标签 | `uni-tag` | type: success(正常)/error(异常) | | 下拉刷新 | `uni-refresher` | @onRefresh回调 | | 上拉加载 | `uni-load-more` | :status="loadingStatus" | | 空状态 | `uni-section` | 插槽自定义空状态插图与文案 | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 月份 | 必须选择有效月份 | — | | 记录列表 | 加载失败允许重试 | "加载失败,请下拉刷新重试" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),卡片宽度自适应,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 SE(375px)~ iPad mini(768px),表单宽度自适应 - **横竖屏适配策略**:竖屏垂直布局;横屏表单水平分组展示 - **手势交互规范**:选择器≥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││ │ └────────────────┘│ └────────────────────┘ ```