# 保洁相关功能 > 模块编码:cleaning > 端侧:微信小程序 > 关联文档:01-模块划分.md(v4.0)、02-功能清单-小程序端.md(§4)、03-业务流转逻辑-小程序端.md(§4)、05-接口规范.md(§9)、06-项目技术要求.md > 强制规范遵循 `07-前端界面开发规范.md` ## 功能概览 | 项目 | 说明 | |------|------| | 菜单名称 | 保洁管理 | | 子菜单 | 今日保洁任务 / 保洁执行 / 保洁历史 | | 功能编号 | MP-CL-01 ~ MP-CL-07 | | 权限编码 | cleaning:task:*、cleaning:spot-check:*、cleaning:supplement:* | ## 页面清单 ### 页面1:今日保洁任务 - **页面路径**:`/pages/cleaning/today` - **适用角色**:保洁人员 - **页面元素**: - 日期显示(当天日期) - 任务统计卡片(待执行/进行中/已完成) - 任务列表 - **查询条件**:无(自动按当天+本人过滤) - **列表字段**: | 字段 | 类型 | 说明 | |------|------|------| | 任务名称 | 文本 | 保洁区域+任务类型 | | 保洁区域 | 标签 | 关联区域名称 | | 计划时间 | 时间 | 预计开始时间 | | 状态 | 标签 | 待执行/进行中/已完成/超时 | | 蓝牙状态 | 图标 | 是否需蓝牙打卡 | - **界面布局**: - 顶部:日期 + 统计数字横向排列 - 中部:任务卡片列表,每张卡片显示区域、时间、状态 - 底部:无操作栏 - **操作按钮**: - 「开始执行」→ 进入保洁执行页(权限:cleaning:task:update) - 「查看详情」→ 查看任务详情 #### 交互流程要求 1. **页面加载流程**:页面加载时获取当日保洁任务列表→显示骨架屏→渲染统计卡片和任务列表 2. **查询/筛选交互流程**:无手动筛选,自动按当天+本人过滤;支持下拉刷新 3. **表单填写与提交流程**:无表单提交操作 4. **弹窗/弹层交互流程**:无弹窗 5. **行内操作流程**:点击「开始执行」→校验蓝牙打卡状态→跳转保洁执行页;点击「查看详情」→查看任务详情 6. **异常与错误处理**:任务加载失败显示重试;无任务显示空状态插图和文案 7. **联动/级联交互**:统计卡片数字与列表数据联动更新 8. **权限控制交互表现**:无cleaning:task:update权限时隐藏「开始执行」按钮 9. **H1 防重复提交**:「开始执行」「查看详情」按钮点击时须设置 `:loading` + `:disabled` 双重锁定;下拉刷新期间禁止重复触发;使用 pending Promise 去重 10. **H2 超时控制**:获取保洁任务列表 GET 请求超时 15s;页面加载 >3s 时须调用 `wx.showLoading({title:'加载中...', mask:true})`;请求超时时提示"网络请求超时,请下拉刷新重试" 11. **H3 操作确认**:点击「开始执行」前若存在进行中任务,须通过 `wx.showModal` 二次确认,内容含后果说明 12. **H8 反馈规范**:任务加载成功使用静默渲染;加载失败使用 `wx.showToast({icon:'none', title:'加载失败,请重试'})`;网络异常通过 `wx.getNetworkType` 判断后提供重试入口 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 统计卡片 | `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 - **安全区域**:底部适配底部安全区 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-01 | 今日保洁任务 | 02-小程序端 §4 | 蓝牙打卡确认 | 保洁执行 | --- ### 页面2:蓝牙强制打卡确认 - **页面路径**:`/pages/cleaning/check-in`(从今日任务页面跳转) - **适用角色**:保洁人员 - **页面元素**: - 蓝牙扫描状态指示器(扫描中/已连接/未检测到) - 当前打卡点名称 - 蓝牙信号强度显示 - 重试按钮 - 补录入口(蓝牙未连接时显示) - **查询条件**:无 - **列表字段**:无 - **界面布局**: - 顶部:打卡点名称 + 蓝牙状态大图标 - 中部:蓝牙连接动画(扫描→连接→成功) - 底部:操作按钮区 - **操作按钮**: - 「重新扫描」→ 重新搜索蓝牙Beacon - 「进入补录模式」→ 跳转补录申请页(蓝牙策略=REQUIRED且扫描失败时显示) - 「确认打卡」→ 记录蓝牙打卡成功(check_type=BLUETOOTH) **蓝牙策略判断逻辑**: - 调用 `GET /system/bluetooth-policy → cleaning_check_in` - 策略=REQUIRED:必须蓝牙连接后才能打卡 - 策略=OPTIONAL:可选蓝牙或手动打卡 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-02 | 蓝牙强制打卡确认 | 02-小程序端 §4 | 保洁执行 | 保洁补录、系统蓝牙配置 | #### 交互流程要求 1. **页面加载流程**:页面加载时查询蓝牙策略→策略=REQUIRED自动启动蓝牙扫描→显示扫描动画;策略=OPTIONAL显示打卡方式选择 2. **查询/筛选交互流程**:无筛选操作 3. **表单填写与提交流程**:自动扫描蓝牙Beacon→检测到→连接→打卡成功(check_type=BLUETOOTH);扫描失败→重试/进入补录模式 4. **弹窗/弹层交互流程**:打卡成功弹出成功提示;扫描超时弹出重试提示 5. **行内操作流程**:点击重新扫描→重新搜索蓝牙;点击进入补录模式→跳转补录申请页;点击确认打卡→记录蓝牙打卡 6. **异常与错误处理**:蓝牙未开启提示"请开启手机蓝牙";扫描超时3次显示补录入口;连接失败提示重试 7. **联动/级联交互**:蓝牙策略与扫描行为联动 8. **权限控制交互表现**:所有保洁人员可访问 9. **H1 防重复提交**:「重新扫描」「确认打卡」「进入补录模式」按钮点击时均须设置 `:loading` + `:disabled` 双重锁定;扫描期间使用 pending 标志位防止重复发起蓝牙扫描 10. **H2 超时控制**:蓝牙策略查询 GET 请求超时 15s;蓝牙扫描超时 3s;>3s 时须显示 `wx.showLoading({title:'正在扫描...', mask:true})`;超时或连接失败均提示并提供重试/补录选项 11. **H3 操作确认**:点击「进入补录模式」前须通过 `wx.showModal` 确认,内容说明"进入补录后将记录为手动打卡,是否继续?";点击「确认打卡」前提示"确认在此位置打卡?" 12. **H4 脏数据检测**:本页面以自动操作为主,若用户手动修改过任何信息则标记 isDirty;`onUnload` 中检测到 isDirty 且未完成打卡时弹出 `wx.showModal({content:"未完成的打卡将丢失,确定离开?"})` 13. **H7 上传约束**:本页面无上传功能,此项不适用 14. **H8 反馈规范**:打卡成功使用 `wx.showToast({icon:'success', title:'打卡成功'})`;扫描失败使用 `wx.showToast({icon:'none', title:'未检测到蓝牙信号'})`;网络异常提供重试入口 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 扫描动画 | `view` + CSS动画 | 旋转动画,size=80px | | 蓝牙状态图标 | `uni-icons` | type="bluetooth",size=40 | | 打卡点名称 | `text` | font-size="18px",font-weight="bold" | | 信号强度 | `text` | font-size="14px",动态显示RSSI | | 重新扫描 | `button` | type="default",:loading="scanning" | | 进入补录模式 | `button` | type="warn" | | 确认打卡 | `button` | type="primary" | | 打卡结果 | `uni-popup` | type="dialog" | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 蓝牙状态 | 必须开启蓝牙 | "请开启手机蓝牙" | | Beacon信号 | RSSI > -70dBm | "蓝牙信号弱,请靠近打卡点" | | 扫描超时 | 3秒超时,最多重试3次 | "蓝牙扫描超时" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),扫描动画居中 - **横竖屏适配策略**:竖屏垂直布局;横屏动画与信息并排展示 - **手势交互规范**:按钮可点击区域≥44px - **安全区域**:底部按钮适配底部安全区 --- ### 页面3:保洁执行 - **页面路径**:`/pages/cleaning/execute` - **适用角色**:保洁人员 - **页面元素**: - 任务信息卡片(区域、类型、时间) - 保洁清单(逐项检查列表) - 每项操作按钮(完成/标记异常) - 完成后照片上传区(≤9张,含水印时间定位) - 蓝牙拍照提示(策略=REQUIRED时显示) - **查询条件**:无 - **列表字段**: | 字段 | 类型 | 说明 | |------|------|------| | 检查项名称 | 文本 | 保洁清单项目 | | 状态 | 标签 | 待完成/已完成/异常 | | 备注 | 文本 | 异常时填写说明 | - **界面布局**: - 顶部:任务信息摘要卡片 - 中部:保洁清单列表(逐项勾选) - 底部:照片上传区 + 提交按钮 - **操作按钮**: - 「完成该项」→ 标记该项完成 - 「标记异常」→ 跳转异常反馈页 - 「拍照」→ 调用相机拍照(蓝牙策略=REQUIRED时须在蓝牙连接状态下进行) - 「提交完成」→ 提交整个保洁任务 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-03 | 保洁执行 | 02-小程序端 §4 | 主管抽查 | 保洁异常反馈 | #### 交互流程要求 1. **页面加载流程**:页面加载时获取保洁任务详情和清单→渲染任务信息和检查项列表;查询蓝牙拍照策略 2. **查询/筛选交互流程**:无筛选操作 3. **表单填写与提交流程**:逐项点击「完成该项」→标记异常项点击「标记异常」→跳转异常反馈页→完成后拍照上传→点击「提交完成」→确认弹窗→提交成功 4. **弹窗/弹层交互流程**:点击拍照弹出选择(拍照/相册);提交前弹出确认弹窗 5. **行内操作流程**:点击完成该项→该项标记完成;点击标记异常→跳转异常反馈页;点击拍照→调起相机(蓝牙策略=REQUIRED须蓝牙连接下拍照) 6. **异常与错误处理**:蓝牙断连时拍照提示"请连接蓝牙后拍照";提交失败显示重试 7. **联动/级联交互**:检查项完成进度与任务状态联动 8. **权限控制交互表现**:无cleaning:task:update权限时按钮置灰 9. **H1 防重复提交**:「完成该项」「标记异常」「提交完成」按钮点击时均须设置 `:loading` + `:disabled` 双重锁定;提交期间禁止重复操作;拍照调用同样需要防抖处理 10. **H2 超时控制**:获取任务详情和清单 GET 请求超时 15s;提交完成 POST 请求超时 30s;照片上传超时 60s;>3s 时须 `wx.showLoading({mask:true})`;超时后提示具体原因及重试选项 11. **H3 操作确认**:点击「提交完成」前须通过 `wx.showModal` 二次确认,内容包括已完成项数、异常项数及"确认提交后将进入待抽查状态"的后果说明 12. **H4 脏数据检测**:页面加载时对初始清单数据进行快照(深拷贝);每次点击完成/标记异常或上传照片时对比快照检测 isDirty;`onUnload` 中检测到 isDirty 且未提交时弹出 `wx.showModal({content:"保洁数据尚未保存,确定离开?"})` 13. **H7 上传约束**:完成照片上传单个文件 ≤10MB,最多 ≤9 张;使用 `uni-file-picker` 的 `@progress` 回调实时展示上传进度百分比;蓝牙策略=REQUIRED 时拍照前校验蓝牙连接状态 14. **H8 反馈规范**:提交成功使用 `wx.showToast({icon:'success', title:'保洁任务已提交'})`;校验失败使用 `wx.showToast({icon:'none', title:'请完成所有保洁项目'})` 多文字提示;网络异常判断并提供重试 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 任务信息卡片 | `uni-card` | mode="basic",只读展示 | | 保洁清单列表 | `uni-list` + `uni-list-item` | :showArrow="false",可勾选 | | 完成该项 | `button` | type="default",size="mini",@click="completeItem" | | 标记异常 | `button` | type="warn",size="mini",@click="reportAbnormal" | | 照片上传 | `uni-file-picker` | limit="9",file-mediatype="image" | | 提交完成 | `button` | type="primary",:loading="submitting" | | 确认弹窗 | `uni-popup` | type="dialog" | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 保洁清单 | 必须逐项完成或标记异常 | "请完成所有保洁项目" | | 完成照片 | 至少1张 | "请上传完成照片" | | 蓝牙状态 | 策略=REQUIRED拍照时须蓝牙连接 | "请连接蓝牙后拍照" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),列表宽度自适应 - **横竖屏适配策略**:竖屏垂直列表;横屏清单与照片区并排 - **手势交互规范**:列表项可点击区域≥44px;按钮≥44px - **安全区域**:底部提交按钮适配底部安全区 --- ### 页面4:异常反馈 - **页面路径**:`/pages/cleaning/abnormal` - **适用角色**:保洁人员 - **页面元素**: - 异常描述输入框(多行文本) - 拍照上传区(≤9张,含水印时间定位) - 严重程度选择(一般/严重/紧急) - 提交按钮 - **查询条件**:无 - **列表字段**:无 - **界面布局**: - 顶部:异常类型提示 - 中部:照片上传 + 描述填写 - 底部:提交按钮 - **操作按钮**: - 「拍照」→ 调用相机 - 「提交反馈」→ 提交异常反馈 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-04 | 异常反馈 | 02-小程序端 §4 | 通知主管 | 保洁管理(Web端) | #### 交互流程要求 1. **页面加载流程**:页面加载时初始化表单 2. **查询/筛选交互流程**:无筛选操作 3. **表单填写与提交流程**:输入异常描述→选择严重程度→拍照上传→点击提交反馈→确认弹窗→提交成功通知主管 4. **弹窗/弹层交互流程**:点击拍照弹出选择(拍照/相册);提交前弹出确认弹窗 5. **行内操作流程**:输入描述→选择严重程度→上传照片→提交 6. **异常与错误处理**:图片上传失败提示重传;提交失败显示重试 7. **联动/级联交互**:无强联动 8. **权限控制交互表现**:所有保洁人员可操作 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 异常描述 | `uni-easyinput` | type="textarea",maxlength="500",:showWordLimit="true" | | 严重程度 | `uni-data-select` | :localdata="[{value:'minor',text:'一般'},{value:'major',text:'严重'},{value:'critical',text:'紧急'}]" | | 照片上传 | `uni-file-picker` | limit="9",file-mediatype="image",:auto-upload="true" | | 提交按钮 | `button` | type="primary",:loading="submitting" | | 确认弹窗 | `uni-popup` | type="dialog" | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 异常描述 | 必填,最多500字 | "请填写异常描述" / "描述不能超过500字" | | 严重程度 | 必选 | "请选择严重程度" | | 照片 | 最多9张,含水印 | "照片最多上传9张" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),表单宽度自适应 - **横竖屏适配策略**:竖屏垂直布局;横屏照片区3~4列网格 - **手势交互规范**:选择器≥44px;提交按钮≥44px;上传区域≥44px - **安全区域**:底部提交按钮适配底部安全区 --- ### 页面5:保洁抽查 - **页面路径**:`/pages/cleaning/spot-check` - **适用角色**:主管 - **页面元素**: - 待抽查任务列表 - 任务详情查看 - 抽查结果标记(合格/不合格) - 不合格原因输入框 - 不合格照片上传 - **查询条件**: - 日期筛选 - 区域筛选 - 状态筛选(待抽查/合格/不合格) - **列表字段**: | 字段 | 类型 | 说明 | |------|------|------| | 区域 | 文本 | 保洁区域名称 | | 执行人 | 文本 | 保洁人员姓名 | | 完成时间 | 时间 | 实际完成时间 | | 抽查状态 | 标签 | 待抽查/合格/不合格 | - **界面布局**: - 顶部:筛选条件横向滑动 - 中部:任务卡片列表 - 弹窗:抽查结果标记弹窗 - **操作按钮**: - 「合格」→ 确认完成(权限:cleaning:spot-check:approve) - 「不合格」→ 填写原因后重新生成任务 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-05 | 保洁抽查 | 02-小程序端 §4 | 不合格时重新生成任务 | 保洁管理(Web端) | #### 交互流程要求 1. **页面加载流程**:页面加载时获取待抽查任务列表→显示骨架屏→渲染筛选条件和任务列表 2. **查询/筛选交互流程**:日期/区域/状态筛选条件→切换筛选重新加载列表;下拉刷新 3. **表单填写与提交流程**:点击任务→弹出抽查结果标记弹窗→选择合格/不合格→不合格时填写原因+上传照片→确认提交 4. **弹窗/弹层交互流程**:点击抽查→弹出抽查标记弹窗(合格/不合格选择+原因输入) 5. **行内操作流程**:点击合格→确认完成;点击不合格→填写原因→确认→系统自动重新生成任务 6. **异常与错误处理**:列表加载失败显示重试;抽查操作失败显示重试 7. **联动/级联交互**:不合格标记与任务重新生成联动 8. **权限控制交互表现**:仅主管可操作;无cleaning:spot-check:approve权限时按钮置灰 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 筛选条件 | `uni-data-select` | 日期/区域/状态三个选择器 | | 任务列表 | `uni-list` + `uni-list-item` | clickable=true | | 抽查标记弹窗 | `uni-popup` | type="bottom",弹出抽查操作面板 | | 合格按钮 | `button` | type="primary",@click="markQualified" | | 不合格按钮 | `button` | type="warn",@click="markUnqualified" | | 不合格原因 | `uni-easyinput` | type="textarea",maxlength="200" | | 不合格照片 | `uni-file-picker` | limit="9",file-mediatype="image" | | 下拉刷新 | `uni-refresher` | @onRefresh回调 | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 抽查结果 | 必选(合格/不合格) | "请选择抽查结果" | | 不合格原因 | 不合格时必填 | "请填写不合格原因" | | 不合格照片 | 不合格时至少1张 | "请上传不合格照片" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),列表宽度自适应 - **横竖屏适配策略**:竖屏单列卡片;横屏双列卡片+底部弹窗更宽 - **手势交互规范**:任务项可点击区域≥44px;按钮≥44px - **安全区域**:底部弹窗适配底部安全区 --- ### 页面6:保洁历史 - **页面路径**:`/pages/cleaning/history` - **适用角色**:保洁人员 - **页面元素**: - 月份选择器 - 历史任务列表 - 任务详情查看 - **查询条件**: - 月份筛选 - 状态筛选(全部/正常/异常/补录) - **列表字段**: | 字段 | 类型 | 说明 | |------|------|------| | 日期 | 日期 | 执行日期 | | 区域 | 文本 | 保洁区域 | | 状态 | 标签 | 正常/异常/补录 | | 打卡方式 | 标签 | 蓝牙/手动/补录 | - **界面布局**: - 顶部:月份选择器 + 统计数字 - 中部:按日期分组的任务列表 - 底部:无操作栏 - **操作按钮**: - 「查看详情」→ 查看历史任务详情 **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-06 | 保洁历史 | 02-小程序端 §4 | 无 | 保洁执行 | #### 交互流程要求 1. **页面加载流程**:页面加载时默认加载当月保洁记录→显示骨架屏→渲染月份选择器和记录列表 2. **查询/筛选交互流程**:切换月份→重新加载;状态筛选(全部/正常/异常/补录)→过滤记录;下拉刷新 3. **表单填写与提交流程**:无表单提交操作 4. **弹窗/弹层交互流程**:无弹窗 5. **行内操作流程**:点击查看详情→查看历史任务详情 6. **异常与错误处理**:记录加载失败显示重试;无记录显示空状态 7. **联动/级联交互**:月份和状态筛选与列表数据联动 8. **权限控制交互表现**:仅保洁人员可访问本人数据 9. **H1 防重复提交**:「查看详情」按钮设置防重复标记;下拉刷新期间禁止重复触发;切换月份/状态筛选时 abort 未完成的上一次请求 10. **H2 超时控制**:获取历史记录 GET 请求超时 15s;切换月份加载 >3s 时须 `wx.showLoading({mask:true})`;超时提示"加载超时,请重试" 11. **H3 操作确认**:本页面主要为列表查看,无需操作确认 12. **H8 反馈规范**:记录加载成功静默渲染;加载失败使用 `wx.showToast({icon:'none', title:'记录加载失败,请重试'})`;空数据显示空状态插图;网络异常提供重试 #### 组件规范 | 元素 | 组件 | 配置参数 | |------|------|----------| | 月份选择器 | `uni-datetime-picker` | type="date",fields="month" | | 状态筛选 | `uni-segmented-control` | :values="['全部','正常','异常','补录']" | | 记录列表 | `uni-list` + `uni-list-item` | clickable=true,showArrow=true | | 状态标签 | `uni-tag` | type: success(正常)/error(异常)/primary(补录) | | 下拉刷新 | `uni-refresher` | @onRefresh回调 | | 空状态 | `uni-section` | 插槽自定义空状态插图与文案 | #### 校验规则 | 字段 | 规则 | 错误提示 | |------|------|----------| | 记录列表 | 加载失败允许重试 | "加载失败,请下拉刷新重试" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),卡片宽度自适应 - **横竖屏适配策略**:竖屏单列卡片;横屏双列卡片展示 - **手势交互规范**:记录项可点击区域≥44px;支持下拉刷新 - **安全区域**:底部适配底部安全区 --- ### 页面7:异常数据补录 - **页面路径**:`/pages/cleaning/supplement` - **适用角色**:保洁人员(蓝牙失灵/定位失败时) - **页面元素**: - 补录原因选择(蓝牙故障/手机异常/系统异常/其他) - 补录说明输入框 - 手动填写保洁记录 - 照片上传区(补录证据) - 提交按钮 - **查询条件**:无 - **列表字段**:无 - **界面布局**: - 顶部:补录模式提示(红色警示条) - 中部:原因选择 + 说明填写 + 保洁记录 - 底部:提交按钮 - **操作按钮**: - 「提交补录」→ 提交补录申请(需主管审核) **补录数据标记**: - 所有补录数据标记 `is_supplement=true` - `supplement_reason`:补录原因 - `check_type=MANUAL` **需求追溯**: | 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 | |------------|----------|----------|----------|----------| | MP-CL-07 | 异常数据补录 | 02-小程序端 §4 | 主管审核补录 | 操作日志、考勤补录审核 | #### 交互流程要求 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:'phone',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字 | "请填写补录说明" | | 证明材料 | 最多3张 | "证明材料最多上传3张" | | 保洁时间 | 必选 | "请选择保洁时间" | | 保洁区域 | 必选 | "请选择保洁区域" | #### 响应式布局 - **适配机型**:iPhone SE(375px)~ iPad mini(768px),表单宽度自适应 - **横竖屏适配策略**:竖屏垂直布局;横屏表单水平分组 - **手势交互规范**:选择器≥44px;提交按钮≥44px - **安全区域**:底部提交按钮适配底部安全区 --- ## 业务规则 1. **蓝牙策略**:保洁打卡和拍照均受蓝牙策略控制(`GET /system/bluetooth-policy → cleaning_check_in` / `cleaning_photo`) 2. **蓝牙强制打卡**:策略=REQUIRED时,必须连接蓝牙Beacon后才可确认完成,拍照也须在蓝牙连接状态下进行 3. **非强制蓝牙**:策略=OPTIONAL时,可选蓝牙打卡(check_type=BLUETOOTH)或手动打卡(check_type=MANUAL) 4. **补录审核**:所有蓝牙失灵的补录数据需主管在Web端或小程序端审核 5. **补录标记**:补录数据必须标记 `is_supplement=true`,并在操作日志中记录 6. **照片水印**:所有照片自动添加时间+位置水印,蓝牙场景标记 `bluetooth_connected` 7. **抽查不合格**:主管标记不合格后,系统自动重新生成保洁任务 8. **照片数量**:单次上传最多9张照片 ## 状态流转 ### 保洁任务状态 ``` 待执行 → 进行中 → 待抽查 → 已完成 ↓ 异常反馈 → 待处理 ↓ 主管抽查 → 合格 → 已完成 → 不合格 → 重新生成任务 ``` ### 补录流程 ``` 蓝牙失灵/定位失败 │ 进入补录模式 │ 选择补录原因 + 手动填写记录 │ 提交补录申请(is_supplement=true) │ 主管审核(Web/小程序均可) │ ┌─审核通过─┐ ┌─审核驳回─┐ 补录生效 通知员工 记录审核日志 记录审核日志 ```