From 7f47ef71f1b6c41f0f812a04e0948cd034551def Mon Sep 17 00:00:00 2001 From: Songzex <2402265378@qq.com> Date: Sat, 28 Feb 2026 12:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85generatePath=E7=9A=84cubit?= =?UTF-8?q?=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/di/injection.dart | 2 +- .../domain/errors/generpath_failure.dart | 9 ++++++ .../usecases/generate_path_usecase.dart | 31 ++++++++++++------- .../presentation/bloc/devices_cubit.dart | 28 +++++++++++++++++ .../presentation/bloc/devices_state.dart | 6 ++++ 5 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 lib/features/devices/domain/errors/generpath_failure.dart diff --git a/lib/core/di/injection.dart b/lib/core/di/injection.dart index 68f7f780..750e8fba 100644 --- a/lib/core/di/injection.dart +++ b/lib/core/di/injection.dart @@ -116,7 +116,7 @@ Future init() async { sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册 sl.registerLazySingleton(() => GetDeviceLocationUseCase(sl())); 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())); diff --git a/lib/features/devices/domain/errors/generpath_failure.dart b/lib/features/devices/domain/errors/generpath_failure.dart new file mode 100644 index 00000000..ec0ba356 --- /dev/null +++ b/lib/features/devices/domain/errors/generpath_failure.dart @@ -0,0 +1,9 @@ +class GenerPathFailure { + final String message; + + GenerPathFailure(this.message); +} + +class ServerFailure extends GenerPathFailure { + ServerFailure(String message) : super(message); +} diff --git a/lib/features/devices/domain/usecases/generate_path_usecase.dart b/lib/features/devices/domain/usecases/generate_path_usecase.dart index 0c540a52..bc13217f 100644 --- a/lib/features/devices/domain/usecases/generate_path_usecase.dart +++ b/lib/features/devices/domain/usecases/generate_path_usecase.dart @@ -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_work_area_param_model.dart'; import '../repositories/path_repository.dart'; abstract class GeneratePathUseCase { - Future> execute({ + Future>> execute({ required ReferencePoint reference, required int heading, required OuterBoundary outer, @@ -11,27 +15,32 @@ abstract class GeneratePathUseCase { required int workType, }); } - class GeneratePathUseCaseImpl implements GeneratePathUseCase { final PathRepository _repository; GeneratePathUseCaseImpl(this._repository); -//完成路径的生成 + @override - Future> execute({ + Future>> execute({ required ReferencePoint reference, required int heading, required OuterBoundary outer, required List holes, required int workType, }) async { - return await _repository.generatePath( - reference: reference, - heading: heading, - outer: outer, - holes: holes, - workType: workType, - ); + try { + final result = await _repository.generatePath( + reference: reference, + heading: heading, + outer: outer, + holes: holes, + workType: workType, + ); + return Right(result); // 成功时返回 Right + } catch (e) { + return Left(ServerFailure(e.toString(),1)); // 失败时返回 Left + } } } + diff --git a/lib/features/devices/presentation/bloc/devices_cubit.dart b/lib/features/devices/presentation/bloc/devices_cubit.dart index 0b3b2f01..a9ba3044 100644 --- a/lib/features/devices/presentation/bloc/devices_cubit.dart +++ b/lib/features/devices/presentation/bloc/devices_cubit.dart @@ -2,12 +2,14 @@ import 'package:flutter/rendering.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/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/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/unbind_device_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/get_device_location_usecase.dart'; import '../../domain/usecases/get_work_record_usecase.dart'; @@ -23,6 +25,7 @@ class DevicesCubit extends Cubit { final UpdateDevicenameUsecase _updateDevicename; final SelectWorkRecordUseCase _selectWorkRecordUseCase; final SaveWorkRecordUseCase _saveWorkRecordUseCase; + final GeneratePathUseCase _generatePathUseCase; DevicesCubit( this.repository, @@ -34,6 +37,7 @@ class DevicesCubit extends Cubit { this._updateDevicename, this._selectWorkRecordUseCase, this._saveWorkRecordUseCase, + this._generatePathUseCase ) : super(const DevicesState()); Future unbindDevice(String deviceId, String deviceName) async { @@ -298,6 +302,30 @@ class DevicesCubit extends Cubit { (data) => emit(state.copyWith(isLoading: false)), ); } + /// generatePath + Future generatePath({ + required ReferencePoint reference, + required int heading, + required OuterBoundary outer, + required List 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)), + ); + + } + } diff --git a/lib/features/devices/presentation/bloc/devices_state.dart b/lib/features/devices/presentation/bloc/devices_state.dart index 1fdb9a48..3959e3db 100644 --- a/lib/features/devices/presentation/bloc/devices_state.dart +++ b/lib/features/devices/presentation/bloc/devices_state.dart @@ -1,5 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart'; + +import '../../data/models/device_add_path_point_model.dart'; enum DeviceOperationType { none, // 无操作 unbind, // 解绑设备 @@ -17,6 +19,8 @@ class DevicesState extends Equatable { final List>? workRecords; final DeviceOperationType operationType; // 标记当前操作类型 final List>? pathData; + final List? generatedPath; // 新增字段 + const DevicesState({ @@ -29,6 +33,7 @@ class DevicesState extends Equatable { this.workRecords, this.operationType = DeviceOperationType.none, // 默认无操作 this.pathData, + this.generatedPath, }); // 使用 copyWith 方便局部更新状态 @@ -42,6 +47,7 @@ class DevicesState extends Equatable { List>? workRecords, DeviceOperationType? operationType, List>? pathData, + List? generatedPath, }) { return DevicesState( devices: devices ?? this.devices,