Files
feature-tenant/lib/features/v2/report/README.md

213 lines
5.2 KiB
Markdown
Raw Normal View History

# 现场上报模块使用说明
## 快速开始
### 1. 在路由中注册页面
```dart
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:maibu_satabot_v2/features/v2/report/report.dart';
// 在路由配置中添加
GoRoute(
path: '/report',
builder: (context, state) => BlocProvider(
create: (context) => ReportDependencyInjector.createReportCubit(),
child: const ReportPage(),
),
),
```
### 2. 跳转到上报页面
```dart
context.push('/report');
```
## 架构说明
### 清洁架构分层
```
lib/features/v2/report/
├── domain/ # 领域层(核心业务逻辑)
│ ├── entities/ # 实体类
│ │ └── report_entity.dart
│ ├── repositories/ # 仓储接口
│ │ └── report_repository.dart
│ └── usecases/ # 用例
│ └── submit_report_usecase.dart
├── data/ # 数据层(数据获取与存储)
│ ├── datasources/ # 数据源
│ │ ├── report_remote_datasource.dart
│ │ └── report_remote_datasource_impl.dart
│ ├── models/ # 数据模型
│ │ └── report_model.dart
│ └── repositories/ # 仓储实现
│ └── report_repository_impl.dart
├── presentation/ # 表现层(UI + 状态管理)
│ ├── constants/ # 常量
│ │ └── report_constants.dart
│ ├── cubit/ # 状态管理
│ │ └── report_cubit.dart
│ ├── states/ # 状态定义
│ │ └── report_state.dart
│ ├── pages/ # 页面
│ │ └── report_page.dart
│ ── widgets/ # 组件
│ ├── report_type_selector.dart
│ ├── device_selector.dart
│ ├── description_input.dart
│ ├── media_uploader.dart
│ └── level_selector.dart
├── di/ # 依赖注入
│ └── report_di.dart
└── report.dart # 统一导出
```
## 核心功能
### 1. 上报类型选择
- 设备故障
- 巡检记录
- 隐患上报
- 缺陷上报
### 2. 设备选择
- 点击选择设备(需实现设备选择页面)
### 3. 问题描述
- 多行文本输入
- 最大 200 字符限制
- 实时字符计数
### 4. 媒体上传
- 拍照上传
- 录像上传
- 图片预览
- 删除已上传图片
### 5. 问题等级
- 一般(灰色)
- 重要(橙色)
- 紧急(红色)
## 表单验证
提交时自动验证以下必填项:
1. 设备选择
2. 问题描述
3. 问题等级
## 状态管理
### 状态类型
- `ReportInitial`: 初始状态
- `ReportFormState`: 表单数据状态
- `ReportSubmitting`: 提交中状态
- `ReportSuccess`: 提交成功状态
- `ReportFailure`: 提交失败状态
### Cubit 方法
- `selectReportType(ReportType)`: 选择上报类型
- `selectDevice(String)`: 选择设备
- `updateDescription(String)`: 更新问题描述
- `selectProblemLevel(ProblemLevel)`: 选择问题等级
- `addMediaFile(String)`: 添加媒体文件
- `removeMediaFile(int)`: 删除媒体文件
- `submitReport()`: 提交上报
- `resetForm()`: 重置表单
## 自定义扩展
### 1. 对接真实 API
修改 `ReportRemoteDataSourceImpl`:
```dart
class ReportRemoteDataSourceImpl implements ReportRemoteDataSource {
final Dio dio; // 注入 Dio 实例
@override
Future<Either<Failure, bool>> submitReport(ReportModel report) async {
try {
final response = await dio.post(
'/api/report/submit',
data: report.toJson(),
);
if (response.statusCode == 200) {
return right(true);
} else {
return left(ServerFailure('提交失败'));
}
} catch (e) {
return left(NetworkFailure('网络错误: $e'));
}
}
}
```
### 2. 实现设备选择
在 `ReportPage` 中修改 `_showDevicePicker` 方法:
```dart
void _showDevicePicker(BuildContext context) {
// 跳转到设备选择页面
context.push('/device-select').then((device) {
if (device != null) {
context.read<ReportCubit>().selectDevice(device);
}
});
}
```
### 3. 实现真实的相机/相册功能
添加依赖:
```yaml
dependencies:
image_picker: ^1.1.2
```
修改 `MediaUploader`:
```dart
final ImagePicker picker = ImagePicker();
Future<void> _pickImage() async {
final XFile? image = await picker.pickImage(source: ImageSource.camera);
if (image != null) {
cubit.addMediaFile(image.path);
}
}
```
## 依赖说明
### 项目已有依赖
- flutter_bloc: ^9.1.1
- equatable: ^2.0.8
- fpdart: ^1.2.0
### 可选依赖(按需添加)
- image_picker: ^1.1.2 (图片/视频选择)
- dio: ^5.9.0 (HTTP 请求,项目已有)
## 注意事项
1. 所有颜色、尺寸常量已抽取到 `report_constants.dart`
2. 遵循清洁架构原则,内层不依赖外层
3. 使用 fpdart 进行错误处理(Either 类型)
4. 所有 UI 组件已适配 iOS 安全区
5. 模拟数据已实现,可直接运行测试
## 后续开发建议
1. 实现真实的设备选择页面
2. 对接后端 API
3. 添加图片压缩功能
4. 实现离线缓存
5. 添加草稿保存功能