facility_booking_view_model.dart 6.0 KB

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