1. 添加接口返回值

2. 解决返回类型冲突
This commit is contained in:
李宇奇 2025-04-15 12:36:12 +08:00
parent 93e30361a8
commit b16427f208
16 changed files with 205 additions and 138 deletions

View File

@ -0,0 +1,11 @@
enum WmsApiResponseCode {
success(code: 0, message: "成功"),
warning(code: 400, message: "警告"),
fail(code: 500, message: "失败"),
error(code: 999, message: "错误");
final int code;
final String message;
const WmsApiResponseCode({required this.code, required this.message});
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../features/page/domain/models/base_wms_api_response.dart';
import '/features/page/business_logic/notifiers/page_repository_notifier.dart';
import '/features/page/data/repositories/page_repository_impl.dart';
import '/features/page/domain/repositories/page_repository.dart';
@ -12,6 +13,7 @@ import '../api/config/api_config.dart';
import '../../features/stock/data/repositories/stock_repository_impl.dart';
import '../../features/stock/domain/repositories/stock_repository.dart';
import '../../features/stock/business_logic/notifiers/stock_in_empty_notifier.dart';
import '../../features/stock/domain/models/base_wms_api_response.dart';
final _defaultApiConfig = ApiConfig.fromYaml('''
wms:
@ -48,34 +50,34 @@ final pageRepositoryProvider = Provider<PageRepository>((ref) {
return PageRepositoryImpl(wmsApiClient: apiClient);
});
final stockInEmptyNotifierProvider =
StateNotifierProvider.autoDispose<StockInEmptyNotifier, AsyncValue<void>>((
ref,
) {
final stockInEmptyNotifierProvider = StateNotifierProvider.autoDispose<
StockInEmptyNotifier,
AsyncValue<StockBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(stockRepositoryProvider);
return StockInEmptyNotifier(repository);
});
final stockInNotifierProvider =
StateNotifierProvider.autoDispose<StockInManualNotifier, AsyncValue<void>>((
ref,
) {
final stockInNotifierProvider = StateNotifierProvider.autoDispose<
StockInManualNotifier,
AsyncValue<StockBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(stockRepositoryProvider);
return StockInManualNotifier(repository);
});
final pageNotifierProvider =
StateNotifierProvider.autoDispose<PageRepositoryNotifier, AsyncValue<void>>(
(ref) {
final pageNotifierProvider = StateNotifierProvider.autoDispose<
PageRepositoryNotifier,
AsyncValue<PageBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(pageRepositoryProvider);
return PageRepositoryNotifier(repository);
},
);
});
final stockOutEmptyNotifierProvider =
StateNotifierProvider.autoDispose<StockOutEmptyNotifier, AsyncValue<void>>((
ref,
) {
final stockOutEmptyNotifierProvider = StateNotifierProvider.autoDispose<
StockOutEmptyNotifier,
AsyncValue<StockBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(stockRepositoryProvider);
return StockOutEmptyNotifier(repository);
});

View File

@ -1,8 +1,10 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pda_template/features/page/domain/repositories/page_repository.dart';
import '/features/page/domain/models/base_wms_api_response.dart';
import '/features/page/domain/repositories/page_repository.dart';
import '../../../../core/di/providers.dart';
class PageRepositoryNotifier extends StateNotifier<AsyncValue<void>> {
class PageRepositoryNotifier
extends StateNotifier<AsyncValue<PageBaseWmsApiResponse?>> {
final PageRepository _repository;
PageRepositoryNotifier(this._repository) : super(const AsyncValue.data(null));
@ -10,18 +12,18 @@ class PageRepositoryNotifier extends StateNotifier<AsyncValue<void>> {
Future<void> submit() async {
state = const AsyncValue.loading();
try {
await _repository.testLink();
state = const AsyncValue.data(null);
final response = await _repository.testLink();
state = AsyncValue.data(response);
} catch (e) {
state = AsyncValue.error(e, StackTrace.current);
}
}
}
final pageNotifierProvider =
StateNotifierProvider.autoDispose<PageRepositoryNotifier, AsyncValue<void>>((
ref,
) {
final pageNotifierProvider = StateNotifierProvider.autoDispose<
PageRepositoryNotifier,
AsyncValue<PageBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(pageRepositoryProvider);
return PageRepositoryNotifier(repository);
});

View File

@ -1,7 +1,6 @@
import 'package:pda_template/core/api/clients/wms_api_client.dart';
import 'package:pda_template/features/page/domain/repositories/page_repository.dart';
import '../../../stock/domain/models/base_wms_api_response.dart';
import '../../domain/models/base_wms_api_response.dart';
class PageRepositoryImpl extends PageRepository {
final WmsApiClient wmsApiClient;
@ -9,7 +8,7 @@ class PageRepositoryImpl extends PageRepository {
PageRepositoryImpl({required this.wmsApiClient});
@override
Future<BaseWmsApiResponse> testLink() {
return wmsApiClient.testLink().then((value) => BaseWmsApiResponse.fromDto(value));
Future<PageBaseWmsApiResponse> testLink() {
return wmsApiClient.testLink().then((value) => PageBaseWmsApiResponse.fromDto(value));
}
}

View File

@ -1,20 +1,20 @@
import '../../../../core/api/models/responses/base_wms_api_response_dto.dart';
import '/core/api/models/responses/base_wms_api_response_dto.dart';
class BaseWmsApiResponse {
class PageBaseWmsApiResponse {
final int code;
final String message;
BaseWmsApiResponse({required this.code, required this.message});
PageBaseWmsApiResponse({required this.code, required this.message});
factory BaseWmsApiResponse.fromJson(Map<String, dynamic> json) {
return BaseWmsApiResponse(
factory PageBaseWmsApiResponse.fromJson(Map<String, dynamic> json) {
return PageBaseWmsApiResponse(
code: int.parse(json['code'].toString()),
message: json['message'].toString(),
);
}
factory BaseWmsApiResponse.fromDto(BaseWmsApiResponseDto dto) {
return BaseWmsApiResponse(
factory PageBaseWmsApiResponse.fromDto(BaseWmsApiResponseDto dto) {
return PageBaseWmsApiResponse(
code: dto.code,
message: dto.message,
);

View File

@ -1,5 +1,5 @@
import '../../../stock/domain/models/base_wms_api_response.dart';
import '../models/base_wms_api_response.dart';
abstract class PageRepository {
Future<BaseWmsApiResponse> testLink();
Future<PageBaseWmsApiResponse> testLink();
}

View File

@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:bruno/bruno.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pda_template/app/enum/wms_api_response_code.dart';
import '/features/page/domain/models/base_wms_api_response.dart';
import 'package:yaml/yaml.dart';
import '../../../app/enum/config_path_enum.dart';
import '../../../core/di/providers.dart';
@ -21,7 +23,7 @@ class _HomePageState extends ConsumerState<Home> {
List<BrnDoughnutDataItem> stockChartsData = [];
late Color primaryColor;
bool _isLoading = true;
AsyncValue<void>? _previousState;
AsyncValue<PageBaseWmsApiResponse?>? _previousState;
bool _hasSubmitted = false;
@override
@ -213,15 +215,18 @@ class _HomePageState extends ConsumerState<Home> {
ref.read(pageNotifierProvider.notifier).submit();
}
void _handleState(AsyncValue<void> state) {
void _handleState(AsyncValue<PageBaseWmsApiResponse?> state) {
state.whenOrNull(
loading: () => BrnLoadingDialog.show(context, content: "正在请求"),
error: (error, _) {
BrnLoadingDialog.dismiss(context);
DialogUtils.showErrorMessage(context, "请求发生错误", error.toString());
_hasSubmitted = false;
},
data: (_) {
data: (response) {
BrnLoadingDialog.dismiss(context);
if (response != null &&
response.code == WmsApiResponseCode.success.code) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("请求成功"),
@ -231,6 +236,15 @@ class _HomePageState extends ConsumerState<Home> {
margin: const EdgeInsets.only(bottom: 100, left: 20, right: 20),
),
);
_hasSubmitted = false;
} else if (response != null) {
DialogUtils.showWarningMessage(
context,
"操作未成功",
"${response.message} ${response.code.toString()}",
btnLabel: "返回",
);
}
},
);
}

View File

@ -2,8 +2,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../../core/di/providers.dart';
import '../../domain/models/stock_in_request.dart';
import '../../domain/repositories/stock_repository.dart';
import '../../domain/models/base_wms_api_response.dart';
class StockInEmptyNotifier extends StateNotifier<AsyncValue<void>> {
class StockInEmptyNotifier
extends StateNotifier<AsyncValue<StockBaseWmsApiResponse?>> {
final StockRepository _repository;
StockInEmptyNotifier(this._repository) : super(const AsyncValue.data(null));
@ -14,7 +16,7 @@ class StockInEmptyNotifier extends StateNotifier<AsyncValue<void>> {
}) async {
state = const AsyncValue.loading();
try {
await _repository.requireStockIn(
final response = await _repository.requireStockIn(
StockInRequest(
emptyTask: true,
vehicleId: vehicleId,
@ -23,17 +25,17 @@ class StockInEmptyNotifier extends StateNotifier<AsyncValue<void>> {
origin: standId,
),
);
state = const AsyncValue.data(null);
state = AsyncValue.data(response);
} catch (e) {
state = AsyncValue.error(e, StackTrace.current);
}
}
}
final stockEmptyInNotifierProvider =
StateNotifierProvider.autoDispose<StockInEmptyNotifier, AsyncValue<void>>((
ref,
) {
final stockEmptyInNotifierProvider = StateNotifierProvider.autoDispose<
StockInEmptyNotifier,
AsyncValue<StockBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(stockRepositoryProvider);
return StockInEmptyNotifier(repository);
});

View File

@ -1,10 +1,12 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pda_template/features/stock/domain/models/base_wms_api_response.dart';
import '../../../../core/di/providers.dart';
import '../../domain/models/goodsInfo_for_task.dart';
import '/features/stock/domain/repositories/stock_repository.dart';
import '../../domain/models/stock_in_request.dart';
class StockInManualNotifier extends StateNotifier<AsyncValue<void>> {
class StockInManualNotifier
extends StateNotifier<AsyncValue<StockBaseWmsApiResponse?>> {
final StockRepository _repository;
StockInManualNotifier(this._repository) : super(const AsyncValue.data(null));
@ -16,7 +18,7 @@ class StockInManualNotifier extends StateNotifier<AsyncValue<void>> {
}) async {
state = const AsyncValue.loading();
try {
await _repository.requireStockIn(
final response = await _repository.requireStockIn(
StockInRequest(
emptyTask: false,
vehicleId: vehicleId,
@ -25,17 +27,17 @@ class StockInManualNotifier extends StateNotifier<AsyncValue<void>> {
origin: standId,
),
);
state = const AsyncValue.data(null);
state = AsyncValue.data(response);
} catch (e) {
state = AsyncValue.error(e, StackTrace.current);
}
}
}
final stockInNotifierProvider =
StateNotifierProvider.autoDispose<StockInManualNotifier, AsyncValue<void>>((
ref,
) {
final stockInNotifierProvider = StateNotifierProvider.autoDispose<
StockInManualNotifier,
AsyncValue<StockBaseWmsApiResponse?>
>((ref) {
final repository = ref.watch(stockRepositoryProvider);
return StockInManualNotifier(repository);
});

View File

@ -1,8 +1,9 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pda_template/features/stock/domain/repositories/stock_repository.dart';
import '/features/stock/domain/models/base_wms_api_response.dart';
import '/features/stock/domain/repositories/stock_repository.dart';
import '/core/di/providers.dart';
class StockOutEmptyNotifier extends StateNotifier<AsyncValue<void>> {
class StockOutEmptyNotifier extends StateNotifier<AsyncValue<StockBaseWmsApiResponse?>> {
final StockRepository repository;
StockOutEmptyNotifier(this.repository) : super(const AsyncValue.data(null));
@ -13,11 +14,11 @@ class StockOutEmptyNotifier extends StateNotifier<AsyncValue<void>> {
}) async {
state = const AsyncValue.loading();
try {
await repository.emptyStockOut(
final response = await repository.emptyStockOut(
needNum: needNum,
destination: destination,
);
state = const AsyncValue.data(null);
state = AsyncValue.data(response);
} catch (e) {
state = AsyncValue.error(e, StackTrace.current);
}
@ -25,7 +26,7 @@ class StockOutEmptyNotifier extends StateNotifier<AsyncValue<void>> {
}
final stockEmptyOutNotifierProvider =
StateNotifierProvider.autoDispose<StockOutEmptyNotifier, AsyncValue<void>>((
StateNotifierProvider.autoDispose<StockOutEmptyNotifier, AsyncValue<StockBaseWmsApiResponse?>>((
ref,
) {
final repository = ref.watch(stockRepositoryProvider);

View File

@ -11,14 +11,14 @@ class StockRepositoryImpl implements StockRepository {
StockRepositoryImpl({required this.wmsApiClient});
@override
Future<BaseWmsApiResponse> requireStockIn(StockInRequest request) {
Future<StockBaseWmsApiResponse> requireStockIn(StockInRequest request) {
return wmsApiClient
.requireStockIn(request.toDto())
.then((value) => BaseWmsApiResponse.fromDto(value));
.then((value) => StockBaseWmsApiResponse.fromDto(value));
}
@override
Future<BaseWmsApiResponse> emptyStockIn({
Future<StockBaseWmsApiResponse> emptyStockIn({
required String vehicleId,
required String standId,
required String origin,
@ -32,11 +32,11 @@ class StockRepositoryImpl implements StockRepository {
);
return wmsApiClient
.requireStockIn(request.toDto())
.then((value) => BaseWmsApiResponse.fromDto(value));
.then((value) => StockBaseWmsApiResponse.fromDto(value));
}
@override
Future<BaseWmsApiResponse> emptyStockOut({
Future<StockBaseWmsApiResponse> emptyStockOut({
required int needNum,
required String destination,
}) {
@ -51,6 +51,6 @@ class StockRepositoryImpl implements StockRepository {
);
return wmsApiClient
.requireStockOut(request.toDto())
.then((value) => BaseWmsApiResponse.fromDto(value));
.then((value) => StockBaseWmsApiResponse.fromDto(value));
}
}

View File

@ -1,20 +1,20 @@
import '../../../../core/api/models/responses/base_wms_api_response_dto.dart';
class BaseWmsApiResponse {
class StockBaseWmsApiResponse {
final int code;
final String message;
BaseWmsApiResponse({required this.code, required this.message});
StockBaseWmsApiResponse({required this.code, required this.message});
factory BaseWmsApiResponse.fromJson(Map<String, dynamic> json) {
return BaseWmsApiResponse(
factory StockBaseWmsApiResponse.fromJson(Map<String, dynamic> json) {
return StockBaseWmsApiResponse(
code: int.parse(json['code'].toString()),
message: json['message'].toString(),
);
}
factory BaseWmsApiResponse.fromDto(BaseWmsApiResponseDto dto) {
return BaseWmsApiResponse(
factory StockBaseWmsApiResponse.fromDto(BaseWmsApiResponseDto dto) {
return StockBaseWmsApiResponse(
code: dto.code,
message: dto.message,
);

View File

@ -2,9 +2,9 @@ import '../models/stock_in_request.dart';
import '../models/base_wms_api_response.dart';
abstract class StockRepository {
Future<BaseWmsApiResponse> emptyStockIn({required String vehicleId, required String standId, required String origin});
Future<StockBaseWmsApiResponse> emptyStockIn({required String vehicleId, required String standId, required String origin});
Future<BaseWmsApiResponse> requireStockIn(StockInRequest request);
Future<StockBaseWmsApiResponse> requireStockIn(StockInRequest request);
Future<BaseWmsApiResponse> emptyStockOut({required int needNum, required String destination});
Future<StockBaseWmsApiResponse> emptyStockOut({required int needNum, required String destination});
}

View File

@ -1,12 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:bruno/bruno.dart';
import 'package:pda_template/app/enum/wms_api_response_code.dart';
import 'package:pda_template/app/enum/wms_out_type.dart';
import 'package:pda_template/core/di/providers.dart' as app_providers;
import 'package:flutter/services.dart' show rootBundle;
import 'package:yaml/yaml.dart';
import '../../../../app/enum/config_path_enum.dart';
import '../../../../app/enum/stand.dart';
import '../../../../core/utils/extensions/dialogUtils.dart';
import '../../domain/models/base_wms_api_response.dart';
class StockInEmpty extends ConsumerStatefulWidget {
const StockInEmpty({super.key});
@ -20,7 +23,7 @@ class _StockInEmptyPageState extends ConsumerState<StockInEmpty> {
Stand? _selectedStand;
late Color primaryColor;
bool _isLoading = true;
AsyncValue<void>? _previousState;
AsyncValue<StockBaseWmsApiResponse?>? _previousState;
bool _hasSubmitted = false;
@override
@ -33,16 +36,12 @@ class _StockInEmptyPageState extends ConsumerState<StockInEmpty> {
void didChangeDependencies() {
super.didChangeDependencies();
//
final currentState = ref.read(app_providers.stockInEmptyNotifierProvider);
//
if (_previousState != currentState && _hasSubmitted) {
_previousState = currentState;
// 使Future.microtask确保在build完成后处理状态
Future.microtask(() => _handleState(currentState));
} else {
//
_previousState = currentState;
}
}
@ -64,11 +63,9 @@ class _StockInEmptyPageState extends ConsumerState<StockInEmpty> {
return Scaffold(body: Center(child: CircularProgressIndicator()));
}
// build中处理
ref.listen(app_providers.stockInEmptyNotifierProvider, (previous, next) {
if (previous != next && _hasSubmitted) {
_previousState = next;
// 使Future.microtask确保在build完成后处理状态
Future.microtask(() => _handleState(next));
}
});
@ -192,18 +189,33 @@ class _StockInEmptyPageState extends ConsumerState<StockInEmpty> {
.submit(vehicleId: vehicleId, standId: standId!);
}
void _handleState(AsyncValue<void> state) {
void _handleState(AsyncValue<StockBaseWmsApiResponse?> state) {
state.whenOrNull(
loading: () => BrnLoadingDialog.show(context, content: "正在请求"),
error: (error, _) {
BrnLoadingDialog.dismiss(context);
DialogUtils.showErrorMessage(context, "请求发生错误", error.toString());
},
data: (_) {
data: (response) {
BrnLoadingDialog.dismiss(context);
DialogUtils.showSuccessMessage(context, "成功", "入库成功", btnLabel: "我知道了");
if (response != null &&
response.code == WmsApiResponseCode.success.code) {
DialogUtils.showSuccessMessage(
context,
"成功",
"入库成功",
btnLabel: "我知道了",
);
_vehicleTextController.clear();
setState(() => _selectedStand = null);
} else if (response != null) {
DialogUtils.showWarningMessage(
context,
"操作未成功",
"${response.message} ${response.code.toString()}",
btnLabel: "返回",
);
}
},
);
}

View File

@ -2,6 +2,8 @@ import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pda_template/app/enum/wms_api_response_code.dart';
import 'package:pda_template/features/stock/domain/models/base_wms_api_response.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
import 'package:yaml/yaml.dart';
import '../../../../app/enum/config_path_enum.dart';
@ -25,7 +27,7 @@ class _StockInManualPageState extends ConsumerState<StockInManual> {
Stand? _selectedStand;
late Color primaryColor;
bool _isLoading = true;
AsyncValue<void>? _previousState;
AsyncValue<StockBaseWmsApiResponse?>? _previousState;
bool _hasSubmitted = false;
@override
@ -90,7 +92,7 @@ class _StockInManualPageState extends ConsumerState<StockInManual> {
});
}
void _handleState(AsyncValue<void> state) {
void _handleState(AsyncValue<StockBaseWmsApiResponse?> state) {
state.whenOrNull(
loading: () => BrnLoadingDialog.show(context, content: "正在请求"),
error: (error, _) {
@ -98,8 +100,9 @@ class _StockInManualPageState extends ConsumerState<StockInManual> {
DialogUtils.showErrorMessage(context, "请求发生错误", error.toString());
_hasSubmitted = false;
},
data: (_) {
data: (response) {
BrnLoadingDialog.dismiss(context);
if (response != null && response.code == WmsApiResponseCode.success.code) {
DialogUtils.showSuccessMessage(context, "成功", "入库成功", btnLabel: "我知道了");
_vehicleIdController.clear();
_goodsCodeController.clear();
@ -108,6 +111,14 @@ class _StockInManualPageState extends ConsumerState<StockInManual> {
_selectedStand = null;
_hasSubmitted = false;
});
} else if (response != null) {
DialogUtils.showWarningMessage(
context,
"操作未成功",
"${response.message} ${response.code.toString()}",
btnLabel: "返回",
);
}
},
);
}
@ -206,7 +217,7 @@ class _StockInManualPageState extends ConsumerState<StockInManual> {
}
ref.listen(app_providers.stockInNotifierProvider, (previous, next) {
if (_hasSubmitted) {
if (previous != next && _hasSubmitted) {
_previousState = next;
Future.microtask(() => _handleState(next));
}

View File

@ -2,6 +2,8 @@ import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:pda_template/app/enum/wms_api_response_code.dart';
import 'package:pda_template/features/stock/domain/models/base_wms_api_response.dart';
import 'package:yaml/yaml.dart';
import '/app/enum/config_path_enum.dart';
import '/app/enum/stand.dart';
@ -26,7 +28,7 @@ class _StockOutEmptyPageState extends ConsumerState<StockOutEmpty> {
.map((stand) => BrnCommonActionSheetItem(stand.message))
.toList();
bool _hasSubmitted = false;
AsyncValue<void>? _previousState;
AsyncValue<StockBaseWmsApiResponse?>? _previousState;
late Color primaryColor;
bool _isLoading = true;
@ -60,7 +62,7 @@ class _StockOutEmptyPageState extends ConsumerState<StockOutEmpty> {
}
}
void _handleState(AsyncValue<void> state) {
void _handleState(AsyncValue<StockBaseWmsApiResponse?> state) {
state.whenOrNull(
loading: () => BrnLoadingDialog.show(context, content: "正在请求"),
error: (error, _) {
@ -68,8 +70,9 @@ class _StockOutEmptyPageState extends ConsumerState<StockOutEmpty> {
DialogUtils.showErrorMessage(context, "请求发生错误", error.toString());
_hasSubmitted = false;
},
data: (_) {
data: (response) {
BrnLoadingDialog.dismiss(context);
if (response != null && response.code == WmsApiResponseCode.success.code) {
DialogUtils.showSuccessMessage(
context,
"成功",
@ -80,6 +83,14 @@ class _StockOutEmptyPageState extends ConsumerState<StockOutEmpty> {
selectedQuantity = 1;
_hasSubmitted = false;
});
} else if (response != null) {
DialogUtils.showWarningMessage(
context,
"操作未成功",
"${response.message} ${response.code.toString()}",
btnLabel: "返回",
);
}
},
);
}