facility_booking_view_model.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import 'package:domain/entity/facility_book_entity.dart';
  2. import 'package:domain/repository/facility_repository.dart';
  3. import 'package:plugin_platform/engine/loading/loading_engine.dart';
  4. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  5. import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
  6. import 'package:riverpod_annotation/riverpod_annotation.dart';
  7. import 'package:router/componentRouter/component_service_manager.dart';
  8. import 'package:shared/utils/log_utils.dart';
  9. import 'package:widgets/load_state_layout.dart';
  10. import '../book_confirm/book_confirm_page.dart';
  11. import '../detail/facility_detail_page.dart';
  12. import 'facility_booking_state.dart';
  13. part 'facility_booking_view_model.g.dart';
  14. @riverpod
  15. class FacilityBookingViewModel extends _$FacilityBookingViewModel with DioCancelableMixin {
  16. late final FacilityRepository _facilityRepository;
  17. @override
  18. FacilityBookingState build() {
  19. _facilityRepository = ref.read(facilityRepositoryProvider);
  20. final state = FacilityBookingState(
  21. selectedDate: DateTime.now(),
  22. );
  23. initListener(state);
  24. registerCancellation(callback: () {
  25. onDispose(state);
  26. });
  27. return state;
  28. }
  29. //设置设施的ID
  30. void setFacilityId(String? facilityId, String? facilityName) {
  31. state = state.copyWith(facilityId: facilityId, facilityName: facilityName);
  32. }
  33. //修改选中的时间
  34. void changeSelectedDate(DateTime dateTime) {
  35. state = state.copyWith(selectedDate: dateTime);
  36. Log.d("当前选中的日期:$dateTime");
  37. fetchListByDate();
  38. }
  39. //失败的重试
  40. void retryRequest() {
  41. fetchListByDate();
  42. }
  43. /// 获取服务器数据
  44. Future fetchListByDate() async {
  45. state = state.copyWith(loadingState: LoadState.State_Loading);
  46. // 获取列表
  47. var result = await _facilityRepository.fetchFacilityDateDetail(
  48. id: state.facilityId,
  49. date: state.selectedDate,
  50. cancelToken: cancelToken,
  51. );
  52. // 处理数据
  53. if (result.isSuccess) {
  54. if (result.data != null) {
  55. //有数据
  56. state = state.copyWith(data: result.data, bookAdvanceDays: result.data?.facilityType?.bookAdvanceDays ?? 0, loadingState: LoadState.State_Success);
  57. } else {
  58. //展示无数据的布局
  59. state = state.copyWith(data: null, loadingState: LoadState.State_Empty, errorMessage: null);
  60. }
  61. } else {
  62. state = state.copyWith(data: null, loadingState: LoadState.State_Error, errorMessage: result.errorMsg);
  63. }
  64. }
  65. void initListener(FacilityBookingState state) {
  66. Log.d("FacilityBookingViewModel - initListener");
  67. }
  68. void onDispose(FacilityBookingState state) {
  69. Log.d("FacilityBookingViewModel - onDispose");
  70. }
  71. //去付款确认页面
  72. void gotoConfirmPage() {
  73. if (state.data == null) return;
  74. //找到数据中的已选中数据
  75. final selectedPeriods = <FacilityBookFacilitiesPeriods>[];
  76. for (var facility in state.data!.facilities!) {
  77. final periods = facility.periods ?? [];
  78. // 筛选出已选中的 periods,并添加到结果列表
  79. selectedPeriods.addAll(
  80. periods.where((period) => period.selected).toList(),
  81. );
  82. }
  83. if (selectedPeriods.isEmpty) {
  84. ToastEngine.show("Select Facility And Date");
  85. } else {
  86. BookConfirmPage.startInstance();
  87. }
  88. }
  89. //选中指定的Task
  90. void selectPeriods(int index, int innerIndex) {
  91. // 创建新的 periods 列表来更新状态
  92. final updatedFacilities = state.data!.facilities!.map((facility) {
  93. // 创建新的 periods 列表
  94. final updatedPeriods = facility.periods!.map((period) {
  95. return FacilityBookFacilitiesPeriods()
  96. ..id = period.id
  97. ..start = period.start
  98. ..end = period.end
  99. ..price = period.price
  100. ..deposit = period.deposit
  101. ..enable = period.enable
  102. ..selected = false; // 设置默认未选中
  103. }).toList();
  104. return FacilityBookFacilities()
  105. ..id = facility.id
  106. ..name = facility.name
  107. ..periods = updatedPeriods;
  108. }).toList();
  109. // 设置指定索引的 selected 为 true
  110. updatedFacilities[index].periods?[innerIndex].selected = true;
  111. // 更新 FacilityBookEntity 的状态
  112. state = state.copyWith(
  113. data: FacilityBookEntity()
  114. ..remainQuota = state.data!.remainQuota
  115. ..quotaResetOn = state.data!.quotaResetOn
  116. ..facilityType = state.data!.facilityType
  117. ..facilities = updatedFacilities, //只更新了facilities对象
  118. index: index,
  119. innerIndex: innerIndex,
  120. );
  121. }
  122. //确认页面执行支付
  123. void doPayment() async {
  124. //支付流程 Loading 开始
  125. LoadingEngine.show();
  126. final result = await _facilityRepository.submitBooking(
  127. periodId: state.data?.facilities?[state.index].periods?[state.innerIndex].id,
  128. date: state.selectedDate,
  129. cancelToken: cancelToken,
  130. );
  131. if (result.isSuccess) {
  132. final bookingId = result.data?.booking?.id;
  133. String orderId = result.data?.order?.id ?? "";
  134. Log.d("当前 Facility 生成的订单ID:$orderId");
  135. //调用支付服务
  136. bool success = await ComponentServiceManager().paymentService.executePayment(orderId: orderId);
  137. //支付流程 Loading 结束
  138. LoadingEngine.dismiss();
  139. //如果成功,走下一步流程
  140. if (success) {
  141. FacilityDetailPage.startWithPop2Main(bookingId: bookingId);
  142. }
  143. } else {
  144. ToastEngine.show(result.errorMsg ?? "UnKnow Error");
  145. }
  146. }
  147. //确认页面选择银行卡页面
  148. void gotoChooseCardPage() {
  149. ComponentServiceManager().paymentService.startChooseCardPage();
  150. }
  151. }