补充generatePath的cubit层

This commit is contained in:
2026-02-28 12:46:29 +08:00
parent a55dd457ab
commit 7f47ef71f1
5 changed files with 64 additions and 12 deletions

View File

@@ -116,7 +116,7 @@ Future<void> init() async {
sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册 sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册
sl.registerLazySingleton(() => GetDeviceLocationUseCase(sl())); sl.registerLazySingleton(() => GetDeviceLocationUseCase(sl()));
sl.registerLazySingleton( sl.registerLazySingleton(
() => DevicesCubit(sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl()), () => DevicesCubit(sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(),sl()),
); );
sl.registerFactory(() => RemoteControlCubit(sl())); sl.registerFactory(() => RemoteControlCubit(sl()));

View File

@@ -0,0 +1,9 @@
class GenerPathFailure {
final String message;
GenerPathFailure(this.message);
}
class ServerFailure extends GenerPathFailure {
ServerFailure(String message) : super(message);
}

View File

@@ -1,9 +1,13 @@
import 'package:fpdart/fpdart.dart';
import '../../../../core/error/failure.dart';
import '../../../auth/domain/errors/auth_failure.dart';
import '../../data/models/device_add_path_point_model.dart'; import '../../data/models/device_add_path_point_model.dart';
import '../../data/models/device_work_area_param_model.dart'; import '../../data/models/device_work_area_param_model.dart';
import '../repositories/path_repository.dart'; import '../repositories/path_repository.dart';
abstract class GeneratePathUseCase { abstract class GeneratePathUseCase {
Future<List<DeviceAddPathPointModel>> execute({ Future<Either<Failure, List<DeviceAddPathPointModel>>> execute({
required ReferencePoint reference, required ReferencePoint reference,
required int heading, required int heading,
required OuterBoundary outer, required OuterBoundary outer,
@@ -11,27 +15,32 @@ abstract class GeneratePathUseCase {
required int workType, required int workType,
}); });
} }
class GeneratePathUseCaseImpl implements GeneratePathUseCase { class GeneratePathUseCaseImpl implements GeneratePathUseCase {
final PathRepository _repository; final PathRepository _repository;
GeneratePathUseCaseImpl(this._repository); GeneratePathUseCaseImpl(this._repository);
//完成路径的生成
@override @override
Future<List<DeviceAddPathPointModel>> execute({ Future<Either<Failure, List<DeviceAddPathPointModel>>> execute({
required ReferencePoint reference, required ReferencePoint reference,
required int heading, required int heading,
required OuterBoundary outer, required OuterBoundary outer,
required List<HoleBoundary> holes, required List<HoleBoundary> holes,
required int workType, required int workType,
}) async { }) async {
return await _repository.generatePath( try {
final result = await _repository.generatePath(
reference: reference, reference: reference,
heading: heading, heading: heading,
outer: outer, outer: outer,
holes: holes, holes: holes,
workType: workType, workType: workType,
); );
return Right(result); // 成功时返回 Right
} catch (e) {
return Left(ServerFailure(e.toString(),1)); // 失败时返回 Left
}
} }
} }

View File

@@ -2,12 +2,14 @@ import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart'; import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart';
import 'package:maibu_satabot_v2/features/devices/domain/repositories/device_repository.dart'; import 'package:maibu_satabot_v2/features/devices/domain/repositories/device_repository.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/generate_path_usecase.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/get_user_device_usecase.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/get_user_device_usecase.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/save_work_record_usecase.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/save_work_record_usecase.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/select_work_record_usecase.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/select_work_record_usecase.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/unbind_device_usecase.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/unbind_device_usecase.dart';
import 'package:maibu_satabot_v2/features/devices/domain/usecases/update_devicename_usecase.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/update_devicename_usecase.dart';
import '../../data/models/device_work_area_param_model.dart';
import '../../domain/usecases/delete_work_record_usecase.dart'; import '../../domain/usecases/delete_work_record_usecase.dart';
import '../../domain/usecases/get_device_location_usecase.dart'; import '../../domain/usecases/get_device_location_usecase.dart';
import '../../domain/usecases/get_work_record_usecase.dart'; import '../../domain/usecases/get_work_record_usecase.dart';
@@ -23,6 +25,7 @@ class DevicesCubit extends Cubit<DevicesState> {
final UpdateDevicenameUsecase _updateDevicename; final UpdateDevicenameUsecase _updateDevicename;
final SelectWorkRecordUseCase _selectWorkRecordUseCase; final SelectWorkRecordUseCase _selectWorkRecordUseCase;
final SaveWorkRecordUseCase _saveWorkRecordUseCase; final SaveWorkRecordUseCase _saveWorkRecordUseCase;
final GeneratePathUseCase _generatePathUseCase;
DevicesCubit( DevicesCubit(
this.repository, this.repository,
@@ -34,6 +37,7 @@ class DevicesCubit extends Cubit<DevicesState> {
this._updateDevicename, this._updateDevicename,
this._selectWorkRecordUseCase, this._selectWorkRecordUseCase,
this._saveWorkRecordUseCase, this._saveWorkRecordUseCase,
this._generatePathUseCase
) : super(const DevicesState()); ) : super(const DevicesState());
Future<void> unbindDevice(String deviceId, String deviceName) async { Future<void> unbindDevice(String deviceId, String deviceName) async {
@@ -298,6 +302,30 @@ class DevicesCubit extends Cubit<DevicesState> {
(data) => emit(state.copyWith(isLoading: false)), (data) => emit(state.copyWith(isLoading: false)),
); );
} }
/// generatePath
Future<void> generatePath({
required ReferencePoint reference,
required int heading,
required OuterBoundary outer,
required List<HoleBoundary> holes,
required int workType,
}) async {
emit(state.copyWith(isLoading: true));
final result = await _generatePathUseCase.execute(
reference: reference,
heading: heading,
outer: outer,
holes: holes,
workType: workType,
);
result.fold(
(failure) => emit(state.copyWith(errorMessage: failure.message)),
(pathData) => emit(state.copyWith(generatedPath: pathData)),
);
}
} }

View File

@@ -1,5 +1,7 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart'; import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart';
import '../../data/models/device_add_path_point_model.dart';
enum DeviceOperationType { enum DeviceOperationType {
none, // 无操作 none, // 无操作
unbind, // 解绑设备 unbind, // 解绑设备
@@ -17,6 +19,8 @@ class DevicesState extends Equatable {
final List<Map<String, dynamic>>? workRecords; final List<Map<String, dynamic>>? workRecords;
final DeviceOperationType operationType; // 标记当前操作类型 final DeviceOperationType operationType; // 标记当前操作类型
final List<Map<String, dynamic>>? pathData; final List<Map<String, dynamic>>? pathData;
final List<DeviceAddPathPointModel>? generatedPath; // 新增字段
const DevicesState({ const DevicesState({
@@ -29,6 +33,7 @@ class DevicesState extends Equatable {
this.workRecords, this.workRecords,
this.operationType = DeviceOperationType.none, // 默认无操作 this.operationType = DeviceOperationType.none, // 默认无操作
this.pathData, this.pathData,
this.generatedPath,
}); });
// 使用 copyWith 方便局部更新状态 // 使用 copyWith 方便局部更新状态
@@ -42,6 +47,7 @@ class DevicesState extends Equatable {
List<Map<String, dynamic>>? workRecords, List<Map<String, dynamic>>? workRecords,
DeviceOperationType? operationType, DeviceOperationType? operationType,
List<Map<String, dynamic>>? pathData, List<Map<String, dynamic>>? pathData,
List<DeviceAddPathPointModel>? generatedPath,
}) { }) {
return DevicesState( return DevicesState(
devices: devices ?? this.devices, devices: devices ?? this.devices,