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.

809 lines
43 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.

# 报修相关功能
> 模块编码repair
> 端侧:小程序
> 关联文档01-模块划分.md §3.1、02-功能清单-小程序端.md §2、03-业务流转逻辑-小程序端.md §2、05-接口规范.md §9.2、06-项目技术要求.md §4.4
> 强制规范遵循 `07-前端界面开发规范.md`
## 功能概览
| 项目 | 说明 |
|------|------|
| 菜单名称 | 报修相关功能 |
| 子菜单 | 扫码注册、一键报修、我的工单、催单、维修接单、维修完工、延期申请、延期审批、协助维修申请、工单分配、工单验收、评价 |
| 功能编号 | MP-R-01 ~ MP-R-12 |
| 权限编码 | repair:list:* / repair:detail:approve 等 |
## 页面清单
### 页面1扫码注册页
- **页面路径**`/pages/repair/scan-register`
- **页面元素**
- 扫码区域调用wx.scanCode
- 项目信息展示(扫码后显示)
- 确认绑定按钮
- **界面布局**
- 顶部:扫码提示文字
- 中部:扫码框(居中,带边框提示)
- 底部:扫码结果展示 + 确认绑定按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 扫描二维码 | — | 调用wx.scanCode扫描项目二维码 |
| 确认绑定 | — | 绑定身份到对应项目 |
#### 交互流程要求
1. **页面加载流程**页面加载时自动调起wx.scanCode扫码→扫码成功后显示项目信息→等待用户确认绑定
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**点击扫描二维码→调用wx.scanCode→获取项目编码→查询项目信息→展示项目名称、地址→点击确认绑定→绑定成功跳转工作台
4. **弹窗/弹层交互流程**:扫码失败弹出提示"二维码无效,请重新扫描";绑定成功弹出成功提示
5. **行内操作流程**:点击扫码区域→调起扫码;点击确认绑定→提交绑定请求
6. **异常与错误处理**:扫码超时提示"扫码超时,请重试";二维码无效提示重扫;网络异常显示重试;相机权限被拒提示"请开启相机权限"
7. **联动/级联交互**:扫码结果与项目信息联动展示
8. **权限控制交互表现**:所有用户均可扫码注册;已绑定用户不显示此页面
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 扫码区域 | `button` | @click="scanCode"type="primary"text="扫描二维码" |
| 项目信息展示 | `uni-card` | mode="basic",展示项目名称、地址 |
| 确认绑定 | `button` | type="primary":loading="binding" |
| 提示弹窗 | `uni-popup` | type="dialog",确认/取消 |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 二维码 | 必须为系统有效项目二维码 | "二维码无效,请重新扫描" |
| 项目信息 | 扫码后必须返回有效项目数据 | "未找到项目信息" |
| 绑定状态 | 未绑定才可操作 | "您已绑定项目" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px扫码区域居中
- **横竖屏适配策略**:竖屏垂直布局;横屏扫码区域与信息并排展示
- **手势交互规范**扫码按钮≥44px确认绑定按钮≥44px
- **安全区域**:底部按钮适配底部安全区
### 页面2一键报修页
- **页面路径**`/pages/repair/create`
- **页面元素**
- 报修类型选择下拉数据来源物业公司Web端配置的报修类型字典
- 报修描述多行文本最多500字
- 照片上传区域最多9张含水印时间定位
- 报修位置(可选,手动选择或自动定位)
- 联系方式(默认当前用户手机号)
- **界面布局**
- 顶部:报修类型选择器
- 中部:报修描述输入框
- 下部照片上传网格3列+号占位)
- 底部:提交按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 拍照上传 | — | 调用相机,自动添加水印(时间+位置) |
| 从相册选择 | — | 选择相册照片,自动添加水印 |
| 提交报修 | — | 生成工单,等待分配 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取报修类型字典→渲染类型选择器;获取当前位置信息预填位置
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:选择报修类型→输入报修描述→拍照/选择照片(自动添加时间+位置水印)→选择/确认报修位置→确认联系方式→点击提交报修→确认弹窗→提交成功跳转工单列表
4. **弹窗/弹层交互流程**:点击拍照/相册弹出选择弹窗(拍照/从相册选择);提交前弹出确认弹窗
5. **行内操作流程**:点击照片上传区域→调起相机/相册→选择照片→自动添加水印→显示缩略图;点击位置→打开地图选择位置
6. **异常与错误处理**:定位失败提示手动选择位置;图片上传失败提示重传;提交失败显示重试;离线时数据暂存本地草稿
7. **联动/级联交互**:报修类型与描述提示联动;位置自动获取与手动选择联动
8. **权限控制交互表现**:所有登录用户均可报修;相机/定位权限被拒时引导开启
9. **H1 防重复请求(强制)**:提交报修按钮点击后:loading="submitting"且disabled表单提交请求pending期间禁用提交和返回操作使用requestTask管理提交请求生命周期
10. **H2 超时配置(强制)**报修类型字典GET请求超时15s提交报修POST请求超时30s图片上传超时60s定位接口超时10s>3s wx.showLoading("正在提交..."); 超时后提示"请求超时,请重试"+重试按钮
11. **H3 操作确认(强制)**提交前必须弹出uni-popup确认弹窗"确认提交报修单?提交后将生成工单等待分配",含后果说明
12. **H4 脏数据检测(强制)**进入页面对空表单做深拷贝快照填写过程中任何字段变更标记isDirty=true页面卸载/onBackPress时检测isDirty若有已填写内容描述/照片等弹出uni-popup确认"有未提交的报修内容,确定离开吗?"
13. **H7 文件上传(建议)**照片上传使用wx.chooseMedia({count:9, mediaType:['image']})选择单张≤10MB格式白名单jpg/jpeg/png自动添加水印(时间+位置)后再上传;上传过程显示进度回调(uni-file-picker);上传失败提示具体原因支持重传
14. **H8 反馈(建议)**报修提交成功wx.showToast({icon:'success', title:'报修成功'}); 提交失败wx.showToast({icon:'none', title:'提交失败原因'})可显示多文字定位失败wx.showToast({icon:'none', title:'定位失败,请手动选择位置'}); 离线模式提示数据已存草稿
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 报修类型选择 | `uni-data-select` | v-model="type":localdata="typeList" |
| 报修描述 | `uni-easyinput` | type="textarea"maxlength="500":showWordLimit="true" |
| 照片上传 | `uni-file-picker` | limit="9"file-mediatype="image":auto-upload="true" |
| 报修位置 | `uni-list-item` | :showArrow="true"@click="chooseLocation" |
| 联系方式 | `uni-easyinput` | type="number"maxlength="11" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
| 位置选择 | `map` + `button` | 调用wx.chooseLocation |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 报修类型 | 必选 | "请选择报修类型" |
| 报修描述 | 必填最多500字 | "请填写报修描述" / "描述不能超过500字" |
| 照片 | 最多9张必须含水印 | "照片最多上传9张" |
| 联系方式 | 必填11位手机号 | "请输入联系方式" / "手机号格式不正确" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**竖屏垂直布局横屏照片上传区3~4列网格
- **手势交互规范**照片上传区域≥44px提交按钮≥44px位置选择≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面3我的工单列表
- **页面路径**`/pages/repair/my-orders`
- **页面元素**
- 状态Tab筛选全部/待分配/处理中/待验收/已完成/已关闭)
- 工单列表
- 下拉刷新 + 上拉加载
- **查询条件**
| 条件 | 类型 | 说明 |
|------|------|------|
| 状态筛选 | Tab | 全部/待分配/处理中/待验收/已完成/已关闭 |
| 关键词 | 搜索框 | 按工单号/描述搜索 |
- **列表字段**
| 字段 | 说明 |
|------|------|
| 工单编号 | 如 WO20260416001 |
| 报修类型 | 图标+文字 |
| 报修描述 | 截断显示 |
| 报修时间 | 相对时间 |
| 工单状态 | 状态标签(不同颜色) |
| 维修人员 | 已分配时显示 |
| 催单标记 | 已催单显示红色标记 |
- **界面布局**
- 顶部状态Tab + 搜索框
- 中部:工单卡片列表
- 卡片顶部:工单编号 + 状态标签
- 卡片中部:报修类型 + 描述
- 卡片底部:时间 + 维修人员 + 催单标记
- 底部:无更多数据提示
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 查看详情 | — | 跳转工单详情页 |
| 催单 | repair:list:view | 处理中工单可催单 |
#### 交互流程要求
1. **页面加载流程**页面加载时请求工单列表→显示骨架屏→渲染Tab和工单卡片默认显示"全部"状态
2. **查询/筛选交互流程**点击状态Tab切换筛选条件→重新加载列表输入关键词搜索工单号/描述;下拉刷新重新加载;上拉加载更多
3. **表单填写与提交流程**:无表单提交操作
4. **弹窗/弹层交互流程**:催单时弹出确认弹窗"确认催单?催单后维修人员和主管将收到通知"
5. **行内操作流程**:点击工单卡片→跳转工单详情;点击催单→确认催单→发送催单通知
6. **异常与错误处理**列表加载失败显示重试催单超过每日3次限制提示"今日已催单3次请明日再试";网络异常显示错误提示
7. **联动/级联交互**Tab切换与列表数据联动催单后催单标记实时更新
8. **权限控制交互表现**催单按钮仅处理中工单显示无repair:list:view权限时隐藏催单按钮
9. **H1 防重复请求(强制)**催单按钮点击后loading态+disabledTab切换请求pending时不重复发列表请求搜索输入防抖300ms上拉加载更多时分页用requestTask管理新请求abort前一次下拉刷新abort进行中请求
10. **H2 超时配置(强制)**工单列表GET请求超时15s催单POST请求超时30s>3s保持骨架屏超时后提示"请求超时,请下拉刷新"+重试按钮
11. **H3 操作确认(强制)**催单操作必须弹出uni-popup确认弹窗"确认催单催单后维修人员和主管将收到通知今日剩余X次",含后果说明和次数限制提示
12. **H6 批量限制(建议)**催单每天最多3次服务端校验前端达到限制时直接禁用催单按钮并提示"今日已催单3次请明日再试"
13. **H8 反馈(建议)**催单成功wx.showToast({icon:'success', title:'催单成功'}); 列表加载失败wx.showToast({icon:'none', title:'加载失败,请下拉刷新'}); 催单次数不足wx.showToast({icon:'none', title:'今日已催单3次请明日再试'})
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 状态Tab | `uni-segmented-control` | :values="['全部','待分配','处理中','待验收','已完成','已关闭']" |
| 搜索框 | `uni-search-bar` | placeholder="搜索工单号/描述" |
| 工单列表 | `uni-list` + `uni-list-item` | clickable=true |
| 状态标签 | `uni-tag` | type: success(已完成)/warning(处理中)/error(异常)/default(待分配) |
| 催单标记 | `uni-badge` | content="催"type="error" |
| 下拉刷新 | `uni-refresher` | @onRefresh回调 |
| 上拉加载 | `uni-load-more` | :status="loadingStatus" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 工单列表 | 加载失败允许重试 | "加载失败,请下拉刷新" |
| 搜索关键词 | 最少2个字符 | "请输入至少2个字符" |
| 催单 | 每天最多3次 | "今日已催单3次请明日再试" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px卡片宽度自适应padding 16px
- **横竖屏适配策略**:竖屏单列卡片;横屏双列卡片展示
- **手势交互规范**工单卡片可点击区域≥44px催单按钮≥44px支持下拉刷新和上拉加载
- **安全区域**:底部列表适配底部安全区
### 页面4待处理工单列表维修人员
- **页面路径**`/pages/repair/pending-orders`
- **页面元素**
- 待接单工单列表
- 下拉刷新 + 上拉加载
- **查询条件**:无(自动加载分配给当前人员的待处理工单)
- **列表字段**
| 字段 | 说明 |
|------|------|
| 工单编号 | 如 WO20260416001 |
| 报修类型 | 图标+文字 |
| 报修描述 | 截断显示 |
| 报修时间 | 相对时间 |
| 优先级 | 高/中/低,不同颜色标记 |
| 报修照片缩略图 | 第一张照片 |
- **界面布局**
- 顶部:待处理工单数量统计
- 中部:工单卡片列表
- 卡片顶部:工单编号 + 优先级标签
- 卡片中部:报修类型 + 描述
- 卡片底部:报修时间 + 接单按钮
- 底部:无更多数据提示
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 接单 | repair:list:update | 接单后工单状态变为"处理中" |
#### 交互流程要求
1. **页面加载流程**:页面加载时请求分配给当前维修人员的待处理工单→显示骨架屏→渲染待处理数量统计和工单列表
2. **查询/筛选交互流程**:无手动筛选,自动加载当前人员的待处理工单;下拉刷新重新加载
3. **表单填写与提交流程**:无表单提交操作
4. **弹窗/弹层交互流程**:点击接单→弹出确认弹窗"确认接单?"
5. **行内操作流程**:点击工单卡片→查看工单详情;点击接单→确认后工单状态变为处理中→通知报修人
6. **异常与错误处理**:列表加载失败显示重试;接单失败提示错误信息;工单已被他人接单提示"工单已被接单"
7. **联动/级联交互**:接单成功后列表数据更新,待处理数量减少
8. **权限控制交互表现**仅维修人员角色可见此页面无repair:list:update权限时接单按钮置灰
9. **H1 防重复请求(强制)**接单按钮点击后loading态+disabled列表加载pending不重复发上拉分页用requestTask管理新请求abort旧请求下拉刷新abort进行中请求
10. **H2 超时配置(强制)**待处理工单列表GET请求超时15s接单POST请求超时30s>3s保持骨架屏超时后提示"请求超时,请下拉刷新"+重试按钮
11. **H3 操作确认(强制)**接单操作必须弹出uni-popup确认弹窗"确认接单?接单后请在规定时间内完成维修",含后果说明
12. **H6 批量限制(建议)**:本页面主要为单个接单操作,无批量操作场景
13. **H8 反馈(建议)**接单成功wx.showToast({icon:'success', title:'接单成功'}); 工单已被他人接单wx.showToast({icon:'none', title:'工单已被接单,请刷新列表'}); 列表加载失败wx.showToast({icon:'none', title:'加载失败,请重试'})
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 待处理数量 | `uni-badge` | :content="count"type="warning"size="large" |
| 工单列表 | `uni-list` + `uni-list-item` | clickable=true |
| 优先级标签 | `uni-tag` | type: error(高)/warning(中)/default(低) |
| 照片缩略图 | `image` | mode="aspectFill"60px×60px圆角 |
| 接单按钮 | `button` | type="primary"size="mini" |
| 下拉刷新 | `uni-refresher` | @onRefresh回调 |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 工单列表 | 加载失败允许重试 | "加载失败,请下拉刷新" |
| 接单操作 | 工单必须为待分配/已分配状态 | "工单状态已变更,请刷新" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px卡片宽度自适应
- **横竖屏适配策略**:竖屏单列卡片;横屏双列卡片展示
- **手势交互规范**工单卡片可点击区域≥44px接单按钮≥44px支持下拉刷新
- **安全区域**:底部列表适配底部安全区
### 页面5维修完工页
- **页面路径**`/pages/repair/complete`
- **页面元素**
- 工单基本信息(只读)
- 维修说明(多行文本,必填)
- 维修后照片上传最多9张含水印时间定位
- 材料使用记录(可选)
- **界面布局**
- 顶部:工单信息摘要
- 中部:维修说明输入框
- 下部:照片上传网格
- 底部:提交完工按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 拍照上传 | — | 拍摄维修后照片 |
| 提交完工 | repair:list:update | 工单状态变为"待验收" |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息→渲染工单信息摘要
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:输入维修说明→拍照上传维修后照片(自动添加水印)→可选填材料使用记录→点击提交完工→确认弹窗→提交成功跳转工单列表
4. **弹窗/弹层交互流程**:点击拍照弹出选择弹窗(拍照/从相册选择);提交前弹出确认弹窗
5. **行内操作流程**:点击照片上传区域→调起相机/相册;点击提交完工→确认提交
6. **异常与错误处理**:图片上传失败提示重传;提交失败显示重试;离线时数据暂存本地草稿
7. **联动/级联交互**照片上传数量与限制联动最多9张
8. **权限控制交互表现**仅维修人员可操作无repair:list:update权限时提交按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 维修说明 | `uni-easyinput` | type="textarea"maxlength="500":showWordLimit="true" |
| 照片上传 | `uni-file-picker` | limit="9"file-mediatype="image":auto-upload="true" |
| 材料使用记录 | `uni-list` + `uni-list-item` | 可动态添加行 |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 维修说明 | 必填最多500字 | "请填写维修说明" / "维修说明不能超过500字" |
| 维修后照片 | 至少1张 | "请上传维修后照片" |
| 照片水印 | 自动添加时间+位置水印 | — |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**竖屏垂直布局横屏照片区3~4列网格
- **手势交互规范**照片上传区域≥44px提交按钮≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面6延期申请页
- **页面路径**`/pages/repair/extension-apply`
- **页面元素**
- 工单基本信息(只读)
- 延期原因(多行文本,必填)
- 预计完成时间(日期时间选择器,必填)
- **界面布局**
- 顶部:工单信息摘要
- 中部:延期原因输入 + 预计完成时间
- 底部:提交申请按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 提交延期申请 | repair:list:update | 工单状态变为"延期中",等待主管审批 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息→渲染工单信息摘要
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:输入延期原因→选择预计完成时间→点击提交延期申请→确认弹窗→提交成功跳转工单详情
4. **弹窗/弹层交互流程**:提交前弹出确认弹窗"确认申请延期?"
5. **行内操作流程**:点击预计完成时间→弹出日期时间选择器→选择时间;点击提交延期申请→确认提交
6. **异常与错误处理**:提交失败显示重试;预计完成时间不能早于当前时间
7. **联动/级联交互**:延期申请提交后工单状态变为"延期中"
8. **权限控制交互表现**仅维修人员可操作无repair:list:update权限时提交按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 延期原因 | `uni-easyinput` | type="textarea"maxlength="500":showWordLimit="true" |
| 预计完成时间 | `uni-datetime-picker` | type="datetime":start="minDate" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 延期原因 | 必填最多500字 | "请填写延期原因" / "延期原因不能超过500字" |
| 预计完成时间 | 必选,必须晚于当前时间 | "请选择预计完成时间" / "预计完成时间不能早于当前时间" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏表单水平分组展示
- **手势交互规范**时间选择器≥44px提交按钮≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面7延期审批页主管
- **页面路径**`/pages/repair/extension-approve`
- **页面元素**
- 工单基本信息(只读)
- 延期申请详情(申请人、原因、预计完成时间)
- 审批意见输入(多行文本)
- 通过/驳回按钮
- **界面布局**
- 顶部:工单信息摘要
- 中部:延期申请详情 + 审批意见
- 底部:通过 + 驳回按钮(并排)
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 通过 | repair:detail:approve | 延期生效,工单继续处理 |
| 驳回 | repair:detail:approve | 通知维修人员,工单恢复原状态 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息和延期申请详情→渲染工单信息摘要和申请详情
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:查看延期申请详情→输入审批意见→点击通过/驳回→确认弹窗→操作成功跳转列表
4. **弹窗/弹层交互流程**:通过时弹出确认弹窗"确认通过延期申请?";驳回时弹出确认弹窗+必填驳回原因
5. **行内操作流程**:点击通过→确认→延期生效;点击驳回→填写驳回原因→确认→通知维修人员
6. **异常与错误处理**:审批操作失败显示重试;工单状态已变更提示"工单状态已更新,请刷新"
7. **联动/级联交互**:审批结果与工单状态联动更新
8. **权限控制交互表现**仅主管可操作无repair:detail:approve权限时按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 延期申请详情 | `uni-list` + `uni-list-item` | :showArrow="false",展示申请人、原因、预计时间 |
| 审批意见 | `uni-easyinput` | type="textarea"maxlength="200" |
| 通过按钮 | `button` | type="primary"@click="approve" |
| 驳回按钮 | `button` | type="warn"@click="reject" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 审批意见 | 驳回时必填 | "请填写驳回原因" |
| 审批意见 | 最多200字 | "审批意见不能超过200字" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏按钮并排展示更宽
- **手势交互规范**:通过/驳回按钮≥44px间距≥16px
- **安全区域**:底部按钮适配底部安全区
### 页面8协助维修申请页
- **页面路径**`/pages/repair/assist-apply`
- **页面元素**
- 工单基本信息(只读)
- 协助班组选择(下拉选择其他班组)
- 协助原因(多行文本,必填)
- **界面布局**
- 顶部:工单信息摘要
- 中部:协助班组选择 + 协助原因
- 底部:提交申请按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 提交协助申请 | repair:list:update | 生成协助子工单,等待协助完成 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息和班组列表→渲染工单信息摘要
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:选择协助班组→输入协助原因→点击提交协助申请→确认弹窗→提交成功跳转工单详情
4. **弹窗/弹层交互流程**:提交前弹出确认弹窗"确认申请协助维修?"
5. **行内操作流程**:选择协助班组→输入协助原因→确认提交
6. **异常与错误处理**:提交失败显示重试;无可用协助班组提示"暂无可协助的班组"
7. **联动/级联交互**:协助申请提交后生成协助子工单
8. **权限控制交互表现**仅维修人员可操作无repair:list:update权限时提交按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 协助班组选择 | `uni-data-select` | v-model="team":localdata="teamList" |
| 协助原因 | `uni-easyinput` | type="textarea"maxlength="500":showWordLimit="true" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 协助班组 | 必选 | "请选择协助班组" |
| 协助原因 | 必填最多500字 | "请填写协助原因" / "协助原因不能超过500字" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏表单水平分组展示
- **手势交互规范**班组选择≥44px提交按钮≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面9工单分配页主管
- **页面路径**`/pages/repair/assign`
- **页面元素**
- 工单基本信息(只读)
- 分配班组选择(下拉选择)
- 分配人员选择(联动,根据班组筛选)
- 分配备注(可选)
- **界面布局**
- 顶部:工单信息摘要
- 中部:班组 + 人员级联选择
- 底部:确认分配按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 确认分配 | repair:list:assign | 分配成功后通知维修人员 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息和班组列表→渲染工单信息摘要
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:选择分配班组→联动加载班组下人员列表→选择分配人员→可选填分配备注→点击确认分配→确认弹窗→分配成功通知维修人员
4. **弹窗/弹层交互流程**:提交前弹出确认弹窗"确认分配给XXX"
5. **行内操作流程**:选择班组→人员列表联动刷新→选择人员→确认分配
6. **异常与错误处理**:班组下无人员提示"该班组暂无可用人员";分配失败显示重试
7. **联动/级联交互**:班组选择与人员列表联动,选择班组后动态加载该班组人员
8. **权限控制交互表现**仅主管可操作无repair:list:assign权限时提交按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 班组选择 | `uni-data-select` | v-model="teamId"@change="loadMembers" |
| 人员选择 | `uni-data-select` | v-model="memberId":localdata="memberList" |
| 分配备注 | `uni-easyinput` | type="textarea"maxlength="200" |
| 确认分配 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 分配班组 | 必选 | "请选择分配班组" |
| 分配人员 | 必选 | "请选择分配人员" |
| 分配备注 | 最多200字 | "备注不能超过200字" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏班组人员选择并排展示
- **手势交互规范**选择器≥44px确认按钮≥44px
- **安全区域**:底部按钮适配底部安全区
### 页面10工单验收页
- **页面路径**`/pages/repair/accept`
- **页面元素**
- 工单基本信息(只读)
- 维修说明展示
- 维修前后照片对比
- 验收结果选择(通过/不通过)
- 验收意见(多行文本,不通过时必填)
- **界面布局**
- 顶部:工单信息摘要
- 中部:维修说明 + 照片对比
- 下部:验收结果选择 + 验收意见
- 底部:提交验收按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 提交验收 | repair:detail:approve | 通过→工单完成;不通过→退回维修 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单信息→渲染工单摘要、维修说明、前后照片对比
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:查看维修前后照片对比→选择验收结果(通过/不通过)→不通过时填写验收意见→点击提交验收→确认弹窗→验收通过工单完成/不通过退回维修
4. **弹窗/弹层交互流程**:提交前弹出确认弹窗"确认验收结果?";点击照片弹出大图预览
5. **行内操作流程**:选择通过/不通过→不通过时展开验收意见输入→提交验收
6. **异常与错误处理**:验收操作失败显示重试;工单状态已变更提示刷新
7. **联动/级联交互**:验收结果选择与验收意见联动,不通过时验收意见必填
8. **权限控制交互表现**:仅主管/报修人可操作无repair:detail:approve权限时按钮置灰
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 照片对比 | `swiper` | 左右滑动对比,:indicator-dots="true" |
| 照片大图 | `uni-popup` | type="center",图片全屏预览 |
| 验收结果 | `uni-data-checkbox` | :localdata="[{value:'pass',text:'通过'},{value:'fail',text:'不通过'}]" |
| 验收意见 | `uni-easyinput` | type="textarea"maxlength="500" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 验收结果 | 必选 | "请选择验收结果" |
| 验收意见 | 不通过时必填最多500字 | "不通过时请填写验收意见" / "验收意见不能超过500字" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px照片区域宽度自适应
- **横竖屏适配策略**:竖屏照片上下对比;横屏照片左右对比
- **手势交互规范**照片可点击放大≥44px提交按钮≥44px左右滑动切换照片
- **安全区域**:底部按钮适配底部安全区
### 页面11工单评价页
- **页面路径**`/pages/repair/evaluate`
- **页面元素**
- 工单基本信息(只读)
- 评分组件(五分制星级评分)
- 评价内容多行文本最多200字
- 图片上传最多3张
- **界面布局**
- 顶部:工单信息摘要
- 中部:评分星级 + 评价输入 + 图片上传
- 底部:提交评价按钮
- **操作按钮**
| 按钮 | 权限 | 说明 |
|------|------|------|
| 提交评价 | — | 评价提交后不可修改 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单基本信息→渲染工单信息摘要
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:点击星级选择评分→输入评价内容→可选上传图片→点击提交评价→确认弹窗→评价提交成功跳转工单详情
4. **弹窗/弹层交互流程**:提交前弹出确认弹窗"确认提交评价?提交后不可修改";上传图片弹出选择(拍照/相册)
5. **行内操作流程**:点击星星评分→输入评价→上传图片→提交评价
6. **异常与错误处理**:图片上传失败提示重传;提交失败显示重试;评价已提交提示"已评价"
7. **联动/级联交互**:评分与评价提交联动,必须选择评分才能提交
8. **权限控制交互表现**:仅报修人可评价;已评价工单不显示评价入口
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 工单信息摘要 | `uni-card` | mode="basic",只读展示 |
| 星级评分 | `uni-rate` | :max="5":value="score":size="28" |
| 评价内容 | `uni-easyinput` | type="textarea"maxlength="200":showWordLimit="true" |
| 图片上传 | `uni-file-picker` | limit="3"file-mediatype="image" |
| 提交按钮 | `button` | type="primary":loading="submitting" |
| 确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 评分 | 必选1~5分 | "请选择评分" |
| 评价内容 | 最多200字 | "评价内容不能超过200字" |
| 图片 | 最多3张 | "评价图片最多上传3张" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px表单宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏评分与输入并排展示
- **手势交互规范**星级评分每颗星≥44px提交按钮≥44px
- **安全区域**:底部提交按钮适配底部安全区
### 页面12工单详情页
- **页面路径**`/pages/repair/detail`
- **页面元素**
- 工单基本信息
- 报修照片
- 维修人员信息(已分配时)
- 维修记录时间轴
- 维修后照片
- 操作按钮区(根据状态和角色动态显示)
- **界面布局**
- 顶部:工单编号 + 状态标签
- 信息区:报修类型、描述、位置、联系方式、报修时间
- 照片区:报修照片轮播
- 维修区:维修人员 + 维修说明 + 维修照片
- 时间轴:工单流转记录(提交→分配→接单→完工→验收)
- 底部:操作按钮区(动态)
- **操作按钮**(根据角色和状态动态显示):
| 按钮 | 适用角色 | 工单状态 | 说明 |
|------|----------|----------|------|
| 催单 | 报修人 | 处理中 | 发起催单 |
| 接单 | 维修人员 | 待分配/已分配 | 接单 |
| 完工 | 维修人员 | 处理中 | 提交维修完工 |
| 延期申请 | 维修人员 | 处理中 | 申请延期 |
| 协助申请 | 维修人员 | 处理中 | 请求协助 |
| 分配 | 主管 | 待分配 | 分配工单 |
| 延期审批 | 主管 | 延期中 | 审批延期 |
| 验收 | 主管/报修人 | 待验收 | 验收工单 |
| 评价 | 报修人 | 已完成 | 评价工单 |
#### 交互流程要求
1. **页面加载流程**:页面加载时获取工单详细信息→渲染工单编号、状态、基本信息、照片、维修记录、时间轴
2. **查询/筛选交互流程**:无筛选操作
3. **表单填写与提交流程**:本页面无表单提交操作,操作按钮跳转对应子页面
4. **弹窗/弹层交互流程**:点击照片→弹出大图预览;点击催单→弹出确认弹窗
5. **行内操作流程**:点击操作按钮→根据角色和状态跳转对应操作页面(接单→完工页、延期→延期申请页等);查看照片轮播;滚动查看时间轴
6. **异常与错误处理**:工单加载失败显示重试;照片加载失败显示占位图;网络异常显示错误提示
7. **联动/级联交互**:操作按钮根据工单状态和用户角色动态显示/隐藏
8. **权限控制交互表现**:不同角色看到不同操作按钮;无权限操作按钮不显示;催单按钮仅报修人可见
9. **H1 防重复请求(强制)**:各操作按钮(催单/接单/完工等点击后分别做loading+disabled防连击操作跳转子页面由子页面负责防重照片预览大图操作不做loading拦截工单详情GET请求pending期间不重复发
10. **H2 超时配置(强制)**工单详情GET请求超时15s>3s显示骨架屏详情加载超时后提示"加载超时,请重试"+重试按钮
11. **H3 操作确认(强制)**:催单操作在详情页弹出确认弹窗"确认催单今日剩余X次";其他危险操作由各子页面确认
12. **H7 文件上传(建议)**:本页面照片均为只读展示,不涉及上传操作
13. **H8 反馈(建议)**详情加载成功静默渲染无需toast加载失败wx.showToast({icon:'none', title:'工单信息加载失败,请重试'}); 照片加载失败显示占位图网络异常wx.getNetworkType检测+重试按钮
#### 组件规范
| 元素 | 组件 | 配置参数 |
|------|------|----------|
| 状态标签 | `uni-tag` | type: success(已完成)/warning(处理中)/error(异常)/default(待分配) |
| 照片轮播 | `swiper` | :indicator-dots="true":autoplay="false" |
| 照片大图 | `uni-popup` | type="center",图片全屏预览 |
| 维修记录 | `uni-steps` | :options="timeLineData"direction="column" |
| 信息列表 | `uni-list` + `uni-list-item` | :showArrow="false",展示各项信息 |
| 操作按钮区 | `view` + `button` | 固定底部,按钮根据角色动态渲染 |
| 催单确认弹窗 | `uni-popup` | type="dialog" |
#### 校验规则
| 字段 | 规则 | 错误提示 |
|------|------|----------|
| 工单信息 | 必须返回有效工单数据 | "工单信息加载失败,请重试" |
| 照片 | 加载失败显示占位图 | — |
| 操作权限 | 根据角色和状态校验 | "您暂无此操作权限" |
#### 响应式布局
- **适配机型**iPhone SE375px~ iPad mini768px信息区域宽度自适应
- **横竖屏适配策略**:竖屏垂直布局;横屏信息区和照片区可并排展示
- **手势交互规范**操作按钮≥44px照片可点击放大≥44px左右滑动切换照片
- **安全区域**底部操作按钮区适配底部安全区padding-bottom=env(safe-area-inset-bottom)
## 需求追溯
| 功能点编号 | 功能名称 | 文档来源 | 后续服务 | 关联功能 |
|------------|----------|----------|----------|----------|
| MP-R-01 | 扫码注册 | 02-小程序端 §2 | 注册成功→绑定项目身份 | 通用功能(登录) |
| MP-R-02 | 一键报修 | 02-小程序端 §2 | 提交→生成工单→触发分配通知 | 物业Web端工单列表 |
| MP-R-03 | 我的工单 | 02-小程序端 §2 | 查看工单状态→催单/验收/评价 | 工单详情 |
| MP-R-04 | 催单 | 02-小程序端 §2 | 催单→触发通知服务→通知维修人员/主管 | 消息通知 |
| MP-R-05 | 维修接单 | 02-小程序端 §2 | 接单→工单状态变更→通知报修人 | 工单详情 |
| MP-R-06 | 维修完工 | 02-小程序端 §2 | 完工→工单状态变为"待验收"→触发验收通知 | 工单验收 |
| MP-R-07 | 延期申请 | 02-小程序端 §2 | 申请→工单状态变为"延期中"→通知主管审批 | 延期审批 |
| MP-R-08 | 延期审批 | 02-小程序端 §2 | 通过→延期生效;驳回→通知申请人 | 延期申请 |
| MP-R-09 | 协助维修申请 | 02-小程序端 §2 | 申请→生成协助子工单→通知协助班组 | 工单分配 |
| MP-R-10 | 工单分配 | 02-小程序端 §2 | 分配→通知维修人员 | 维修接单 |
| MP-R-11 | 工单验收 | 02-小程序端 §2 | 验收通过→工单完成→触发评价 | 服务评价 |
| MP-R-12 | 评价 | 02-小程序端 §2 | 评价→数据写入评价模块→物业可查看回复 | 服务评价 |
## 业务规则
1. **照片上传规则**06-项目技术要求.md §4.4
- 报修照片最多9张必须含水印时间+位置信息)
- 水印位置:图片右下角
- 上传时自动附带 `bluetooth_connected` 标记(如蓝牙连接时)
2. **工单状态流转**03-业务流转逻辑-小程序端 §2
- 报修人提交 → 待分配 → 处理中(接单) → 待验收(完工) → 已完成(验收通过)
- 处理中可延期 → 延期中 → 主管审批 → 继续处理/驳回
- 处理中可申请协助 → 生成子工单
3. **催单规则**
- 只有处理中的工单可以催单
- 催单后触发通知服务,通知维修人员和主管
- 同一工单每天最多催单3次
4. **双端审批对照**02-功能清单-小程序端.md 附录):
- 工单延期审批Web+小程序均可(物业主管)
- 工单分配Web+小程序均可(物业主管)
- 工单验收Web+小程序均可(物业主管/报修人)
5. **数据权限**01-模块划分.md §1.3
- 主管:本班组工单数据
- 员工:仅本人相关工单数据
## 状态流转
### 工单完整状态流转
```
待分配 ──[主管分配/自动分配]──▶ 已分配 ──[维修人员接单]──▶ 处理中
│ │
│ ┌───正常完工───┐───延期申请───┐───协助申请───┐
│ │ │ │
│ ▼ ▼ ▼
│ 待验收 延期中 协助处理中
│ │ │ │
│ │ 主管审批 协助完成
│ │ ┌通过┐┌驳回┐ │
│ │ ▼ ▼ │
│ │ 继续处理 通知员工 │
│ │ │
│ ┌───验收通过───┐───验收不通过───┐
│ │ │ │
│ ▼ ▼ │
│ 已完成 退回处理中 │
│ │ │
│ 可评价 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```