glglove 2 months ago
parent
commit
86a816ae95
53 changed files with 2331 additions and 281 deletions
  1. 1 1
      packages/cpt_services/lib/components/status_card_item.dart
  2. 632 0
      packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_page.dart
  3. 46 0
      packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_state.dart
  4. 373 0
      packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_vm.dart
  5. 27 0
      packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_vm.g.dart
  6. 1 1
      packages/cpt_services/lib/modules/services/homeService/home_service_page.dart
  7. 5 5
      packages/cpt_services/lib/modules/services/homeService/home_service_vm.dart
  8. 1 1
      packages/cpt_services/lib/modules/services/homeService/home_service_vm.g.dart
  9. 3 1
      packages/cpt_services/lib/modules/services/inProgress/in_progress_page.dart
  10. 3 4
      packages/cpt_services/lib/modules/services/inProgress/in_progress_vm.dart
  11. 240 0
      packages/cpt_services/lib/modules/services/repair/repair_page.dart
  12. 13 0
      packages/cpt_services/lib/modules/services/repair/repair_pageview_idx_data.dart
  13. 43 0
      packages/cpt_services/lib/modules/services/repair/repair_state.dart
  14. 254 0
      packages/cpt_services/lib/modules/services/repair/repair_vm.dart
  15. 25 0
      packages/cpt_services/lib/modules/services/repair/repair_vm.g.dart
  16. 36 7
      packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_page.dart
  17. 2 1
      packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_vm.dart
  18. 1 1
      packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_vm.g.dart
  19. 1 1
      packages/cpt_services/lib/modules/services/service_evaluate_create/service_evaluate_create_vm.g.dart
  20. 40 4
      packages/cpt_services/lib/modules/services/service_evaluate_create_success/evaluate_create_success_page.dart
  21. 1 1
      packages/cpt_services/lib/modules/services/service_evaluate_list/service_evaluate_list_vm.g.dart
  22. 9 6
      packages/cpt_services/lib/modules/services/service_order_confirm/service_order_confirm_page.dart
  23. 2 1
      packages/cpt_services/lib/modules/services/service_order_confirm/service_order_confirm_vm.dart
  24. 175 219
      packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_page.dart
  25. 2 2
      packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_state.dart
  26. 74 21
      packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_vm.dart
  27. 1 1
      packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_vm.g.dart
  28. 121 0
      packages/cpt_services/lib/modules/services/services_main_page.dart
  29. 3 3
      packages/cpt_services/lib/modules/services/services_state.dart
  30. 41 0
      packages/cpt_services/lib/router/page/services_page_router.dart
  31. 129 0
      packages/cpt_services/lib/router/page/services_page_router.gr.dart
  32. BIN
      packages/cs_resources/assets/service/arrow-right-icon.webp
  33. BIN
      packages/cs_resources/assets/service/calendar-icon.webp
  34. BIN
      packages/cs_resources/assets/service/card-icon.webp
  35. BIN
      packages/cs_resources/assets/service/evaluate-succuss-icon.webp
  36. BIN
      packages/cs_resources/assets/service/filter-icon.webp
  37. BIN
      packages/cs_resources/assets/service/highlight-icon.webp
  38. BIN
      packages/cs_resources/assets/service/history.webp
  39. BIN
      packages/cs_resources/assets/service/in-progress.webp
  40. BIN
      packages/cs_resources/assets/service/location-icon.webp
  41. BIN
      packages/cs_resources/assets/service/money-icon.webp
  42. BIN
      packages/cs_resources/assets/service/pay-success-icon.webp
  43. BIN
      packages/cs_resources/assets/service/payment-icon.webp
  44. BIN
      packages/cs_resources/assets/service/rating-fill-icon.webp
  45. BIN
      packages/cs_resources/assets/service/rating-unfill-icon.webp
  46. BIN
      packages/cs_resources/assets/service/repair_detail_01.png
  47. BIN
      packages/cs_resources/assets/service/repair_detail_02.png
  48. BIN
      packages/cs_resources/assets/service/right-icon.webp
  49. BIN
      packages/cs_resources/assets/service/service-avator-icon.webp
  50. BIN
      packages/cs_resources/assets/service/service-type.webp
  51. BIN
      packages/cs_resources/assets/service/time-icon.webp
  52. 20 0
      packages/cs_resources/lib/generated/assets.dart
  53. 6 0
      packages/cs_router/lib/path/router_path.dart

+ 1 - 1
packages/cpt_services/lib/components/status_card_item.dart

@@ -170,7 +170,7 @@ class StausCardItem extends HookConsumerWidget {
             ),
             Container(
               margin: EdgeInsets.only(top: 15),
-              child: _buildActionSection(context,actionBtnList!, vm, ref),
+              // child: _buildActionSection(context,actionBtnList!, vm, ref),
             ),
           ],
         ),

File diff suppressed because it is too large
+ 632 - 0
packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_page.dart


+ 46 - 0
packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_state.dart

@@ -0,0 +1,46 @@
+import 'package:flutter/cupertino.dart';
+import 'package:widgets/load_state_layout.dart';
+
+class CleanOrderDetailState {
+  //页面 LoadView 状态的展示
+  LoadState loadingState;
+  String? errorMessage;
+  double? totalPrice;
+  Map<String, Map<String, dynamic>> remarkInfo;
+  Map<String, dynamic>? datas;
+
+
+  CleanOrderDetailState({
+    this.loadingState = LoadState.State_Loading,
+    String? errorMessage,
+    double? totalPrice,
+
+    remarkInfo,
+    this.datas,
+  }): remarkInfo = remarkInfo ?? {
+    "remark": {
+      'value': '',
+      'controller': TextEditingController(),
+      'hintText': '',
+      'focusNode': FocusNode(),
+      'obsecure': false,
+    },
+  },
+        totalPrice = totalPrice ?? 0.0;
+
+  CleanOrderDetailState copyWith({
+    LoadState? loadingState,
+    String? errorMessage,
+    double? totalPrice,
+    Map<String, dynamic>? remarkInfo,
+    Map<String, dynamic>? datas,
+  }) {
+    return CleanOrderDetailState(
+      loadingState: loadingState ?? this.loadingState,
+      errorMessage: errorMessage ?? this.errorMessage,
+      totalPrice: totalPrice ?? this.totalPrice,
+      remarkInfo: remarkInfo ?? this.remarkInfo,
+      datas: datas ?? this.datas,
+    );
+  }
+}

+ 373 - 0
packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_vm.dart

@@ -0,0 +1,373 @@
+
+import 'package:cpt_services/components/chooseAirConditionContent_vm.dart';
+import 'package:cpt_services/components/chooseHouseCleanContent_vm.dart';
+import 'package:cpt_services/components/chooseVisitTimeContent.dart';
+import 'package:cpt_services/components/chooseVisitTimeContent_vm.dart';
+import 'package:cpt_services/components/chooseVisitTimeTitle.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:domain/entity/garage_sale_rent_entity.dart';
+import 'package:domain/entity/newsfeed_detail_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/dialog/dialog_content_wrap.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../../components/chooseHouseCleanContent.dart';
+import '../../../components/chooseHouseCleanTitle.dart';
+import '../../../components/chooseVisitTimeBottomFooter.dart';
+import '../../../constants_services.dart';
+import '../../../respository/services_respository.dart';
+import '../../../router/page/services_page_router.dart';
+import 'clean_order_detail_state.dart';
+
+part 'clean_order_detail_vm.g.dart';
+
+
+final _chooseVisitTimeDialogGlobalKey = GlobalKey<DialogContentWrapState>();
+
+@riverpod
+class CleanOrderDetailVm extends _$CleanOrderDetailVm {
+  late ServicesRespository servicesRespositoryInstance;
+  bool _needShowPlaceholder = false; //是否展示LoadingView
+  int _page = 1;  // 当前页
+  int _limit = 10; // 每页数量
+  int _count = 0; // 总条数
+
+  int _detailId = 0;
+  int _detailServiceTypeCode = 0;
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,  //允许刷新
+    controlFinishLoad: true,   //允许加载
+  );
+
+  CleanOrderDetailState initState() {
+    return CleanOrderDetailState(
+        datas: {}
+    );
+  }
+
+  @override
+  CleanOrderDetailState build(){
+    // 引入数据仓库
+    // servicesRespositoryInstance = ref.read(commonGarageRespositoryProvider);
+    final state = initState();
+    Log.d("--------------------------build---------------------");
+
+    return state;
+  }
+
+
+  //刷新页面状态
+  void changeLoadingState(LoadState loadState, String? errorMsg) {
+    state = state.copyWith(
+        loadingState: loadState,
+        errorMessage: errorMsg
+    );
+  }
+
+
+  setInitPageData({required int id, required int serviceTypeCode}){
+    _detailId = id;
+    _detailServiceTypeCode = serviceTypeCode;
+  }
+  // 初始化页面数据
+  initPageData({detailId, detailServiceTypeCode}) {
+    _detailId = detailId??_detailId;
+    _detailServiceTypeCode = detailServiceTypeCode??_detailServiceTypeCode;
+    Log.d("--------------------------initPageData---------------------");
+    changeLoadingState(LoadState.State_Success, null);
+    setConfirmOrderTotalPrice(null);
+  }
+
+  // 上拉加载 更多
+  Future loadMore() async {
+    Log.d("----home_service_vm-----loadMore");
+    _page++;
+    getListData();
+  }
+
+
+  // 下拉刷新
+  Future onRefresh() async {
+    // 当前pageView 页面正处于显示状态
+    Log.d("----forsale_vm-----onRefresh ");
+    // await Future.delayed(const Duration(seconds: 2));
+    _page = 1;
+    getListData();
+  }
+
+
+  // 手动进行刷新
+  Future triggerRefresh() async {
+    Log.d("trggerRefresh");
+    refreshController.callRefresh();
+  }
+
+  // 手动进行刷新
+  Future directRefresh() async {
+    state = state.copyWith(datas:null);
+    // 注意:由于 nestedscrollview 嵌套easyfresh 组件  refreshController.callRefresh() 自动刷新只能滚动顶部但是不会触发下拉刷新,这里调用是 用到了将其滚动到顶部的作用,进而刷新操作主动掉接口
+    // https://github.com/xuelongqy/flutter_easy_refresh/issues/692
+    refreshController.callRefresh();
+    refreshController.resetFooter();
+    _page = 1;
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+
+  // 重试请求
+  Future retryRequest() async {
+    _page = 1;
+    _needShowPlaceholder = true;
+    getListData();
+  }
+
+
+  // 获取list 列表数据
+  Future getListData<T>({bool? isLoadMore}) async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading, null);
+    }
+
+    List<Map<String, dynamic>> list = [
+      {
+        'id':1,
+        'service_type': 0,  // 0 房屋保洁 1 空调保洁  2 维修
+        'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
+        'title': 'House Cleaning Services',
+        'duration': 'Daily cleaning for 2 hours',
+        'totalPrice': 66,
+        'visit_time': '14 0ct 2024 15:00',
+        'order_time': '13 0ct 2024 12:00',
+        'status_text': 'In Progress',
+        'status_code': 0,
+        'company_name': 'HONG YE GROUP PTE LTD',
+      },
+      {
+        'id':2,
+        'service_type': 0,  // 0 房屋保洁 1 空调保洁  2 维修
+        'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
+        'title': 'House Cleaning Services',
+        'duration': 'Daily cleaning for 2 hours',
+        'totalPrice': 66,
+        'visit_time': '14 0ct 2024 15:00',
+        'order_time': '13 0ct 2024 12:00',
+        'status_text': 'In Progress',
+        'status_code': 1,
+        'company_name': 'HONG YE GROUP PTE LTD',
+      },
+      {
+        'id':3,
+        'service_type': 0,  // 0 房屋保洁 1 空调保洁  2 维修
+        'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
+        'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
+        'title': 'House Cleaning Services',
+        'duration': 'Daily cleaning for 2 hours',
+        'totalPrice': 66,
+        'visit_time': '14 0ct 2024 15:00',
+        'order_time': '13 0ct 2024 12:00',
+        'status_text': 'In Progress',
+        'status_code': 1,
+        'company_name': 'HONG YE GROUP PTE LTD',
+      },
+    ];
+    handlerResultData(true, list:list);
+
+    // try {
+    //   //请求网络
+    //   Map<String, dynamic>  params = {
+    //     "type": 1,  // 类型(1=Sale,2=Rent)
+    //     "category_id": _queryParams['category_id'],
+    //     "keyword": _queryParams['keyword'],
+    //     "page": _page,
+    //     "limit": _limit,
+    //   };
+    //   Log.d("请求参数------$params");
+    //   final result = await servicesRespositoryInstance.fetchGarageDataList(params);
+    //   //校验成功失败
+    //   if (result.isSuccess) {
+    //     // handlerResultList((result.data as GarageSaleRentEntity).list as List<GarageSaleRentList>, isLoadMore ?? false);
+    //   } else {
+    //     String errorMessage = result.errorMsg!;
+    //     changeLoadingState(LoadState.State_Error, errorMessage);
+    //     ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    //   }
+    // } catch (e) {
+    //   ToastEngine.show("Error: $e");
+    // }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+
+  }
+
+  handlerResultData(bool isList, {List<Map<String, dynamic>>? list, dynamic? data}){
+    Future.delayed(const Duration(seconds: 1)).then((value) {
+      if(isList){
+        // list 数据模式
+        // if(list != null && list.isNotEmpty){
+        //   if(_page == 1){
+        //     state.list.clear();
+        //     state.list!.addAll(list);
+        //     refreshController.finishRefresh();
+        //     changeLoadingState(LoadState.State_Success, null);
+        //   }else {
+        //     final allList = state.list;
+        //     allList!.addAll(list);
+        //     state = state.copyWith(list: allList);
+        //     refreshController.finishLoad();
+        //   }
+        // }else {
+        //   if(_page == 1){
+        //     state.list.clear();
+        //     changeLoadingState(LoadState.State_Empty, null);
+        //     refreshController.finishRefresh();
+        //   }else {
+        //     refreshController.finishLoad(IndicatorResult.noMore);
+        //   }
+        // }
+      }else {
+        // 单个数据模式
+        if(data!=null){
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Success, null);
+        }else {
+          if(_page == 1){
+            refreshController.finishRefresh();
+          }else{
+            refreshController.finishLoad();
+          }
+          changeLoadingState(LoadState.State_Empty, null);
+        }
+      }
+    });
+  }
+
+
+  handlerClickVisitTime(BuildContext context){
+    // ToastEngine.show("Visit Time");
+    handlerShowChooseVisitTimeDialog(context);
+  }
+
+  // 显示 选择空调型号和数量的弹框
+  handlerShowChooseVisitTimeDialog(BuildContext context) async{
+    // 定时器
+    LoadState dialogState = LoadState.State_Loading;
+
+    DialogEngine.show(
+        tag: "chooseAirConditionClean",
+        position: DialogPosition.bottom,
+        widget: DialogContentWrap(
+          key: _chooseVisitTimeDialogGlobalKey,
+          loadingState: dialogState,
+          maxHeight: 480.0,
+          isShowConfirmBtn: false,
+          isShowCancelBtn: false,
+          title: "",
+          bottomBtnRadius:0,
+          bottomBtnSpace: 0,
+          topLeftRadius: 20.0,
+          topRightRadius: 20.0,
+          // bottomBtnSectionPadding: EdgeInsets.only(left: 20, right: 20, bottom: 20,top: 20),
+          yesBtnBg: context.appColors.redDefault,
+          noBtnBg: context.appColors.grayBgE9,
+          confirmTxt: "Confirm",
+          cancelTxt: "Cancel",
+          // yesBtnTextStyle: TextStyle(
+          //   color: context.appColors.textWhite,
+          //   fontSize: 17,
+          //   fontWeight: FontWeight.w400
+          // ),
+          // noBtnTextStyle: TextStyle(
+          //   color: context.appColors.textBlack,
+          //   fontSize: 17,
+          //   fontWeight: FontWeight.w400
+          // ),
+          confirmAction: chooseVisitTimeConfirmFn,
+          cancelAction: chooseVisitTimeCancelFn,
+          titleBuilder: (context) {
+            return buildChooseVisitTimeTitle(context);
+          },
+          messageBuilder: (context) {
+            return buildChooseVisitTimeContent(context);
+          },
+          bottomFooterBuilder: (context){
+            return  buildChooseVisitTimeBottomFooter(context);
+          },
+        )
+    );
+
+    await Future.delayed(Duration(milliseconds: 1000));
+
+    _chooseVisitTimeDialogGlobalKey.currentState?.changeDialogLoadingState(LoadState.State_Success);
+  }
+
+  chooseVisitTimeConfirmFn(){
+    Log.d("点击了确定");
+    // 跳转到 订单确认页面
+    // appRouter.push(CleanOrderDetailPageRoute(id: _detailId, serviceTypeCode: _detailServiceTypeCode));
+  }
+
+  chooseVisitTimeCancelFn(){
+    Log.d("点击了取消");
+  }
+
+  Widget buildChooseVisitTimeTitle(BuildContext context){
+    return ChooseVisitTimeTitle(id: 0, serviceTypeCode: 0);
+  }
+
+  Widget buildChooseVisitTimeContent(BuildContext context){
+    return ChooseVisitTimeContent(id: 0, serviceTypeCode: 0,);
+  }
+
+  Widget buildChooseVisitTimeBottomFooter(BuildContext context){
+    return ChooseVisitTimeBottomFooter(id: 0, serviceTypeCode: 0,);
+  }
+
+  // 关闭visitTime 选择的弹框
+  handlerHideVisitTimeDialog(){
+    DialogEngine.dismiss(tag: 'chooseAirConditionClean');
+  }
+  handlerClickPayNow(BuildContext context, {int? id, int? serviceTypeCode}){
+    ToastEngine.show("Pay Now");
+
+  }
+
+  setConfirmOrderTotalPrice(BuildContext? context){
+    final visitTimeTotalPrice = ref.read(chooseVisitTimeContentVmProvider).totalPrice?? 0.0;
+    final airConditionTotalPrice = ref.read(chooseAirConditionContentVmProvider).totalPrice?? 0.0 ;
+    final houseCleaningTotalPrice = ref.read(chooseHouseCleanContentVmProvider).totalPrice?? 0.0;
+    final totalPrice = visitTimeTotalPrice.toDouble() + airConditionTotalPrice.toDouble() + houseCleaningTotalPrice.toDouble();
+    // if( _detailServiceTypeCode == servicesConstants.servicesType['houseCleaning'] ){
+    //
+    // }else if(_detailServiceTypeCode == servicesConstants.servicesType['airConditioner']){
+    //
+    // }else {
+    //
+    // }
+    state = state.copyWith(
+        totalPrice: totalPrice
+    );
+  }
+
+
+  gotoCleanOrderDetailPage(BuildContext context, {int? id, int? serviceTypeCode}){
+
+  }
+}

+ 27 - 0
packages/cpt_services/lib/modules/services/clean_order_detail/clean_order_detail_vm.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'clean_order_detail_vm.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$cleanOrderDetailVmHash() =>
+    r'8126b9933477dd5c9cd32218958b8d1ccb101bf4';
+
+/// See also [CleanOrderDetailVm].
+@ProviderFor(CleanOrderDetailVm)
+final cleanOrderDetailVmProvider = AutoDisposeNotifierProvider<
+    CleanOrderDetailVm, CleanOrderDetailState>.internal(
+  CleanOrderDetailVm.new,
+  name: r'cleanOrderDetailVmProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$cleanOrderDetailVmHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$CleanOrderDetailVm = AutoDisposeNotifier<CleanOrderDetailState>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 1 - 1
packages/cpt_services/lib/modules/services/homeService/home_service_page.dart

@@ -180,7 +180,7 @@ class HomeServicePage extends HookConsumerWidget {
 
           // 排序
           const MyAssetImage(
-            Assets.assetsYyHomeLogo,
+            Assets.serviceFilterIcon,
             width: 20.5,
             height: 20.9,
           ).onTap((){

+ 5 - 5
packages/cpt_services/lib/modules/services/homeService/home_service_vm.dart

@@ -134,7 +134,7 @@ class HomeServiceVm extends _$HomeServiceVm {
         'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
         'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
         'title': 'House Cleaning Services',
-        'price': 66,
+        'price': 30,
         'unit': '/hr',
         'liked': true,
         'likes_count': 12,
@@ -145,8 +145,8 @@ class HomeServiceVm extends _$HomeServiceVm {
         'service_type': 1,  // 0 房屋保洁 1 空调保洁  2 维修
         'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
         'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
-        'title': 'Repair air Conditioner Services',
-        'price': 88,
+        'title': 'Air Conditioning Cleaning',
+        'price': 10,
         'unit': '/unit',
         'liked': false,
         'likes_count': 10,
@@ -157,8 +157,8 @@ class HomeServiceVm extends _$HomeServiceVm {
         'service_type': 2,  // 0 房屋保洁 1 空调保洁  2 维修
         'cover_img':  'https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500',
         'resources': ['https://img2.baidu.com/it/u=3489233687,2364672159&fm=253&fmt=auto&app=120&f=JPEG?w=507&h=500'],
-        'title': 'Air Conditioning Cleaning',
-        'price': 166,
+        'title': 'Repair air Conditioner Services',
+        'price': 200,
         'unit': '/hr',
         'liked': true,
         'likes_count': 1212,

+ 1 - 1
packages/cpt_services/lib/modules/services/homeService/home_service_vm.g.dart

@@ -6,7 +6,7 @@ part of 'home_service_vm.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$homeServiceVmHash() => r'183a53b6cf59798f91a9d58d32ac345427fe387c';
+String _$homeServiceVmHash() => r'93c5fc87d19bc58e3eae1ed469b3bf03732c9e9d';
 
 /// See also [HomeServiceVm].
 @ProviderFor(HomeServiceVm)

+ 3 - 1
packages/cpt_services/lib/modules/services/inProgress/in_progress_page.dart

@@ -88,7 +88,9 @@ class InProgressPage extends HookConsumerWidget {
                 SliverList(
                   delegate: SliverChildBuilderDelegate(
                         (context, index) {
-                      return  _buildInProgressItem(context, ref, state.list[index], vm,);
+                      return  _buildInProgressItem(context, ref, state.list[index], vm,).onTap((){
+                        vm.gotoCleanOrderDetailPage(context, state.list?[index]['id'], servicesConstants.servicesStatus['inProgress']?['code']);
+                      });
                     },
                     childCount: state.list.length,
                   ),

+ 3 - 4
packages/cpt_services/lib/modules/services/inProgress/in_progress_vm.dart

@@ -12,6 +12,7 @@ import 'package:widgets/widget_export.dart';
 
 import '../../../respository/services_respository.dart';
 import '../../../router/page/services_page_router.dart';
+import '../clean_order_detail/clean_order_detail_page.dart';
 import 'in_progress_state.dart';
 
 part 'in_progress_vm.g.dart';
@@ -334,9 +335,7 @@ class InProgressVm extends _$InProgressVm {
     return _queryParams;
   }
 
-  // 去详情页面
-  void handlerGotoDetail({BuildContext? context, required int id, String type='forSale'}){
-    Log.d("去详情页面");
-    // appRouter.push(GaragesaleDetailPageRoute(id: id, type: 'forSale'));
+  gotoCleanOrderDetailPage(BuildContext context, int id, int serviceTypeCode){
+    CleanOrderDetailPage.startInstance(id: id, serviceTypeCode: serviceTypeCode);
   }
 }

+ 240 - 0
packages/cpt_services/lib/modules/services/repair/repair_page.dart

@@ -0,0 +1,240 @@
+
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/custom_sliver_persistent_header_delegate.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../../router/page/services_page_router.dart';
+
+import 'repair_vm.dart';
+
+final tabsRouterKey = GlobalKey<AutoTabsRouterState>();
+final GlobalKey<ExtendedNestedScrollViewState> extendedNestedScrollViewKey =
+GlobalKey<ExtendedNestedScrollViewState>();
+@RoutePage()
+class RepairPage extends HookConsumerWidget with WidgetsBindingObserver {
+  RepairPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push( RepairPageRoute());
+    } else {
+      appRouter.push( RepairPageRoute());
+    }
+  }
+
+  bool _isKeyboardVisible = false;
+
+  void handlerNestedScrollViewScroll({double? outerOffset, double? innerOffset, bool? isOuterScrollAnimated=false, bool? isInnerScrollAnimated=false}){
+
+    if(outerOffset !=null){
+      if(isOuterScrollAnimated!){
+        extendedNestedScrollViewKey.currentState?.outerController.animateTo(
+          outerOffset,
+          duration: const Duration(seconds: 1),
+          curve: Curves.easeIn,
+        );
+      }else {
+        extendedNestedScrollViewKey.currentState?.outerController.jumpTo(
+          outerOffset,
+        );
+      }
+    }
+
+    if(innerOffset !=null){
+      extendedNestedScrollViewKey.currentState?.innerPositions.forEach((position) {
+        if(isInnerScrollAnimated!){
+          position.animateTo(innerOffset,
+              duration: Duration(seconds: 1), curve: Curves.easeIn);
+        }else {
+          position.jumpTo(innerOffset);
+        }
+      });
+    }
+  }
+
+  @override
+  void didChangeMetrics() {
+    final bottomInset = WidgetsBinding.instance.window.viewInsets.bottom;
+    final newValue = bottomInset > 0.0;
+    if (_isKeyboardVisible != newValue) {
+      _isKeyboardVisible = newValue;
+      if (_isKeyboardVisible) {
+        handlerNestedScrollViewScroll(innerOffset: 0.0,);
+        print("键盘已显示");
+      } else {
+        WidgetsBinding.instance.removeObserver(this);
+        print("键盘已隐藏");
+      }
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final vm = ref.read(repairVmProvider.notifier);
+    final state = ref.watch(repairVmProvider);
+    final currentPageIdx = tabsRouterKey.currentState?.controller?.activeIndex ?? 0;
+
+    useEffect(() {
+      // 监听窗口
+      WidgetsBinding.instance.addObserver(this);
+    }, []);
+
+
+
+    useEffect((){
+      Log.d("RepairPage initState");
+      // 延迟监听
+      WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+        if(tabsRouterKey.currentState?.controller != null){
+          tabsRouterKey.currentState?.controller?.addListener((){
+            vm.tabsRouterChange();
+          });
+        }
+      });
+
+      return (){
+        Log.d("RepairPage dispose");
+        WidgetsBinding.instance.removeObserver(this);
+        tabsRouterKey.currentState?.controller?.removeListener(vm.tabsRouterChange);
+      };
+    },[]);
+
+    return Scaffold(
+        appBar: MyAppBar.searchAppBar(
+            context,
+            value: vm.getCurrentQueryParams('keyword'),
+            actions: [
+              const MyAssetImage(
+                Assets.serviceServiceScoreYes,
+                width: 21.5,
+                height: 21.5,
+              ).onTap((){
+                vm.handlerClickNavbarLikeBtn(context);
+              }),
+              const SizedBox(width: 15),
+            ],
+            backgroundColor: context.appColors.backgroundWhite,
+            onSearch: (value) {
+              vm.handlerSearch(value);
+            }
+        ),
+        backgroundColor: context.appColors.backgroundDefault,
+        body:  ExtendedNestedScrollView(
+            key: extendedNestedScrollViewKey,
+            onlyOneScrollInBody: true,
+            headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
+              return [
+                SliverPersistentHeader(
+                  delegate: CustomSliverPersistentHeaderDelegate(
+                    maxHeight: 130,
+                    minHeight: 130,
+                    child: _buildTopSection(context, ref, vm, state),
+                  ),
+                  pinned: currentPageIdx !=0? true:false,
+                ),
+                // top 组件,转换为 Sliver 组件
+                // SliverToBoxAdapter(
+                //   child: _buildTopSection(context, ref, vm, state),
+                // ),
+              ];
+            },
+            body: Column(
+                mainAxisSize: MainAxisSize.max,
+                children: [
+                  Expanded(
+                      child: AutoTabsRouter.pageView(
+                        key: tabsRouterKey,
+                        routes: const [
+                          HomeServicePageRoute(),
+                          InProgressPageRoute(),
+                          HistoryPageRoute(),
+                        ],
+                        builder: (context, child, pageController) {
+                          final tabsRouter = AutoTabsRouter.of(context);
+                          return Column(
+                            children: [
+                              Expanded(child: child),
+                            ],
+                          );
+                        },
+                      )
+                  )
+                ]
+            )
+        )
+    );
+  }
+
+
+  Widget _buildTopSection(BuildContext context, WidgetRef ref, vm, state) {
+    final topSectionsData = vm.topSectionsData;
+    final currentPageIdx = tabsRouterKey.currentState?.controller?.activeIndex ?? 0;
+    return Container(
+      color: context.appColors.whiteBG,
+      child: Center(
+        child: Row(
+          mainAxisSize: MainAxisSize.max,
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          children: List.generate(topSectionsData.length, (index) {
+            final item = topSectionsData[index];
+            return Column(
+              children: [
+                Container(
+                  width: MediaQuery.of(context).size.width / topSectionsData.length - 36,
+                  height: 70,
+                  decoration: BoxDecoration(
+                    shape: BoxShape.circle, // 设置为圆形
+                    color: ColorUtils.string2Color("#F0F8FF"),
+                    boxShadow: index == currentPageIdx ? [
+                      BoxShadow(
+                        color: context.appColors.tabLightBlueShadow, // 设置阴影颜色
+                        blurRadius: 5, // 设置模糊半径
+                        spreadRadius: 0.05, // 控制阴影扩散
+                        offset: const Offset(0, 4), // 设置阴影偏移量
+                      ),] : [],// 未选中时无阴影,
+                  ),
+                  child: MyAssetImage(
+                    item['icon'],
+                    width: MediaQuery.of(context).size.width / topSectionsData.length - 36,
+                    // width: 70,
+                    height: 70,
+                  ).onTap(() {
+                    vm.handlerSwitchPageView(context, index);
+                  },
+                    type: ClickType.throttle,
+                  ),
+                ),
+                SizedBox.fromSize(size: const Size(0, 9)),
+                MyTextView(
+                  item['title'],
+                  fontSize: 15,
+                  textColor: index == currentPageIdx ? ColorUtils.string2Color('#4161D0'): context.appColors.textBlack,
+                  textAlign: TextAlign.center,
+                  isFontMedium: true,
+                ),
+              ],
+            ).marginOnly(left: 18, right: 18, top: 10, bottom: 10);
+          }),
+        ),
+      ),
+    );
+  }
+}
+

+ 13 - 0
packages/cpt_services/lib/modules/services/repair/repair_pageview_idx_data.dart

@@ -0,0 +1,13 @@
+
+class RepairPageviewIdxData {
+  static const int homeService = 0;
+  static const int inProgress = 1;
+  static const int history = 2;
+
+
+  static Map<int, String> get values => {
+    0: "homeService",
+    1: "inProgress",
+    2: "history",
+  };
+}

+ 43 - 0
packages/cpt_services/lib/modules/services/repair/repair_state.dart

@@ -0,0 +1,43 @@
+import 'package:cs_resources/generated/assets.dart';
+
+
+class RepairVmState {
+  List<Map<String, dynamic>>? topSectionsData;
+  int currentPageViewIdx = 0;
+  dynamic? tabsRouter;
+
+
+  RepairVmState({
+    List<Map<String, dynamic>>? topSectionsData,
+    required this.currentPageViewIdx,
+    this.tabsRouter,
+  }) : topSectionsData = topSectionsData?? [
+    {
+      "title": "Service",
+      "code": "service",
+      "icon": Assets.serviceServiceType,
+    },
+    {
+      "title": "In Progress",
+      "code": "inProgress",
+      "icon": Assets.serviceInProgress,
+    },
+    {
+      "title": "History",
+      "code": "history",
+      "icon": Assets.serviceHistory,
+    },
+  ];
+
+  RepairVmState copyWith({
+    List<Map<String, dynamic>>? topSectionsData,
+    int? currentPageViewIdx,
+    dynamic? tabsRouter,
+  }) {
+    return RepairVmState(
+      topSectionsData: topSectionsData ?? this.topSectionsData,
+      currentPageViewIdx: currentPageViewIdx ?? this.currentPageViewIdx,
+      tabsRouter: tabsRouter ?? this.tabsRouter,
+    );
+  }
+}

+ 254 - 0
packages/cpt_services/lib/modules/services/repair/repair_vm.dart

@@ -0,0 +1,254 @@
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/sp/sp_util.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:widgets/dialog/app_custom_dialog.dart';
+import 'package:widgets/my_checkbox_group.dart';
+
+import '../../../respository/services_respository.dart';
+import 'repair_page.dart';
+import 'repair_pageview_idx_data.dart';
+import 'repair_state.dart';
+
+part 'repair_vm.g.dart';
+
+@riverpod
+class RepairVm extends _$RepairVm {
+  get topSectionsData => state.topSectionsData;
+  late ServicesRespository repairRespositoryInstance;
+  late Map<int, dynamic> providerMap = {};
+
+  bool _isSingleSelect = true;
+  List<Map<String, dynamic>> _currentSelectedGarageCategory = [];
+
+  Map<int, Map<String, dynamic>> _queryParams = {};
+
+  // 获取当前的查询参数
+  getCurrentQueryParams(String key) {
+    return _queryParams[state.currentPageViewIdx]?[key];
+  }
+
+  // 根据索引获取 Provider
+  ProviderBase getProvider(int index) {
+    return providerMap[index]!;
+  }
+
+  // 初始化 _queryParams
+  queryParamsInit(){
+    List<MapEntry<int, String>> repairEntriesList = RepairPageviewIdxData.values.entries.toList();
+    repairEntriesList.asMap().forEach((index, value) {
+      _queryParams[index] = {
+        'keyword': null,
+        'is_liked': null,
+        'page_view_idx': index,
+        'page_view_name': value,
+      };
+    });
+  }
+
+  RepairVmState initState() {
+    return RepairVmState(
+      currentPageViewIdx: 0,
+    );
+  }
+
+  RepairVmState build(){
+    // 引入数据仓库
+    repairRespositoryInstance = ref.read(servicesRespositoryProvider);
+    final state = initState();
+    queryParamsInit();
+    setCurrentPageViewIconStatus();
+    getPageViewVm();
+
+    Log.d("-------------repair vm-------------build---------------------");
+    ref.onDispose((){
+      providerMap = {};
+      Log.d("-------------repair vm-------------dispose---------------------");
+    });
+    return state;
+  }
+
+  // 搜集pageView 对应的vm
+  void getPageViewVm(){
+    // 每次切换后需要重新获取 一组 pageView的 vm
+    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+      // 存入 一组 pageView的 vm
+      RepairPageviewIdxData.values.forEach((key, value) {
+        switch(key){
+          case 0:
+          case 1:
+          case 2:
+          // providerMap[key] = ref.read(forrentVmProvider.notifier);
+        }
+      });
+    });
+  }
+
+  // 设置当前导航栏的 图标 等状态
+  void setCurrentPageViewIconStatus(){
+    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
+      Log.d("获取当前的导航栏 相关状态resMap444 ${providerMap[state.currentPageViewIdx]} ");
+      Map<String, dynamic> resMap = providerMap[state.currentPageViewIdx]?.getCurrentQueryParams(null)??{};
+      Log.d("获取当前的导航栏 相关状态resMap $resMap ");
+      _queryParams[state.currentPageViewIdx] = resMap;
+    });
+  }
+
+  tabsRouterChange(){
+    // 设置当前导航栏的 图标 等状态
+    Log.d("----tabsRouterChange---${tabsRouterKey.currentState?.controller?.activeIndex}-");
+    state = state.copyWith(currentPageViewIdx: tabsRouterKey.currentState?.controller?.activeIndex ?? 0);
+
+    setCurrentPageViewIconStatus();
+    getPageViewVm();
+  }
+
+  handlerSwitchPageView(BuildContext? context, int pageViewIdx){
+    tabsRouterKey.currentState?.controller?.setActiveIndex(pageViewIdx);
+  }
+
+
+  // 获取当前pageView 的vm
+  getCurrentPageViewVm(int? pageViewIdx){
+    if(pageViewIdx !=null){
+      return providerMap[pageViewIdx];
+    }else {
+      return getCurrentPageViewVm(state.currentPageViewIdx);
+    }
+  }
+
+  // 返回当前 pageView 页面的 vm
+
+  // 判断当前pageview 页面正处于显示状态
+  Future isCurrentPageViewShowing(int pageViewIdx) async{
+    // 延迟获取结果
+    bool isShowing = await Future.delayed(const Duration(milliseconds: 500), (){
+      return state.currentPageViewIdx == pageViewIdx;
+    });
+    return isShowing;
+  }
+
+  Future<void> handlerShowChooseGarageCategoryDialog(BuildContext context, List<Map<String, dynamic>> garageCategoryList) async{
+    await DialogEngine.show(
+        tag: "chooseGarageSaleCategory",
+        position: DialogPosition.center,
+        widget: AppCustomDialog(
+          message: '',
+          dialogWidth: MediaQuery.of(context).size.width * 0.8,
+          // contentBoxMaxHeight: 350,
+          // contentBoxMinHeight: 300,
+          isShowConfirmBtn: garageCategoryList!.length > 0 ? true: false,
+          confirmTxt: "Ok",
+          messageBuilder: (BuildContext context){
+            return Container(
+              color: context.appColors.textWhite,
+              child: Column(
+                mainAxisAlignment: MainAxisAlignment.start,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: garageCategoryList!.length > 0 ? [
+                  MyCheckboxGroup(
+                      isSingleSelect: _isSingleSelect,
+                      labelStyle: const TextStyle(
+                        fontSize: 16,
+                        fontWeight: FontWeight.w500,
+                      ),
+                      items: garageCategoryList!,
+                      defaultSelectedItems: [],
+                      onChanged: (List<Map<String, dynamic>> selectedItems){
+                        Log.d("----MyCheckboxGroup onChanged  $selectedItems");
+                        _currentSelectedGarageCategory = selectedItems;
+                      }
+                  )
+                ]: [
+                  Container(
+                    child: CircularProgressIndicator(
+                      strokeWidth: 3,
+                      valueColor: AlwaysStoppedAnimation(context.appColors.textDarkGray),
+                    ),
+                  )
+                ],
+              ),
+            );
+          },
+          isShowCancelBtn:false,
+          confirmAction: (){
+            // 点击了确定
+            Log.d("----点击了确定按钮");
+            int? categoryId;
+            if(_isSingleSelect){
+              if(_currentSelectedGarageCategory.length > 0){
+                categoryId = _currentSelectedGarageCategory[0]['id'];
+              }
+            }
+
+            providerMap[state.currentPageViewIdx]
+              ..setCurrentQueryParams({
+                "category_id": _queryParams?[state.currentPageViewIdx]?['categoryId'],
+              })
+              ..directRefresh();
+          },
+        )
+    );
+  }
+
+  // 搜索
+  handlerSearch(String value){
+    Log.d("repair_vm 中 搜索 value: $value");
+    _queryParams?[state.currentPageViewIdx]?['keyword'] = value;
+    providerMap[state.currentPageViewIdx]
+      ..setCurrentQueryParams({
+        "keyword": _queryParams?[state.currentPageViewIdx]?['keyword'],
+      })
+      ..directRefresh();
+  }
+
+  // 点击了导航栏的 like btn
+  handlerClickNavbarLikeBtn(BuildContext? context){
+    _queryParams[state.currentPageViewIdx]?['is_liked'] = !(_queryParams?[state.currentPageViewIdx]?['is_liked']??false);
+    // 控制外层滚动和内层滚动
+    handlerNestedScrollViewScroll();
+
+    // providerMap[state.currentPageViewIdx]
+    //   ..setCurrentQueryParams({
+    //     "is_liked": _queryParams?[state.currentPageViewIdx]?['is_liked'],
+    //   })
+    //   ..directRefresh();
+  }
+
+  handlerNestedScrollViewScroll({double? outerOffset, double? innerOffset=0.0, bool? isOuterScrollAnimated=false, bool? isInnerScrollAnimated=false}){
+    if(outerOffset !=null){
+      if(isOuterScrollAnimated!){
+        extendedNestedScrollViewKey.currentState?.outerController.animateTo(
+          outerOffset,
+          duration: const Duration(seconds: 1),
+          curve: Curves.easeIn,
+        );
+      }else {
+        extendedNestedScrollViewKey.currentState?.outerController.jumpTo(
+          outerOffset,
+        );
+      }
+    }
+
+    if(innerOffset !=null){
+      extendedNestedScrollViewKey.currentState?.innerPositions.forEach((position) {
+        if(isInnerScrollAnimated!){
+          position.animateTo(innerOffset,
+              duration: Duration(seconds: 1), curve: Curves.easeIn);
+        }else {
+          position.jumpTo(innerOffset);
+        }
+      });
+    }
+  }
+}
+

+ 25 - 0
packages/cpt_services/lib/modules/services/repair/repair_vm.g.dart

@@ -0,0 +1,25 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'repair_vm.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$repairVmHash() => r'5a61cb25e807b8ef0ba9f09bf17bd7e8f699e904';
+
+/// See also [RepairVm].
+@ProviderFor(RepairVm)
+final repairVmProvider =
+    AutoDisposeNotifierProvider<RepairVm, RepairVmState>.internal(
+  RepairVm.new,
+  name: r'repairVmProvider',
+  debugGetCreateSourceHash:
+      const bool.fromEnvironment('dart.vm.product') ? null : _$repairVmHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+typedef _$RepairVm = AutoDisposeNotifier<RepairVmState>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 36 - 7
packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_page.dart

@@ -173,7 +173,24 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
               // 亮点
               Padding(
                 padding: const EdgeInsets.only(left: 16, right: 16, top: 16,),
-                child: hilightStr.isNotEmpty? MyTextView( hilightStr, fontSize: 13, isFontRegular: true, textColor: context.appColors.textDarkGray,):const SizedBox.shrink(),
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  children: [
+                    const MyAssetImage(
+                      Assets.serviceHighlightIcon,
+                      width: 9,
+                      height: 13,
+                    ),
+                    hilightStr.isNotEmpty? MyTextView(
+                      hilightStr,
+                      fontSize: 13,
+                      isFontRegular: true,
+                      textColor: context.appColors.textDarkGray,
+                      marginLeft: 5,
+                    ):const SizedBox.shrink(),
+                  ],
+                ),
               ),
               //  评分
               Column(
@@ -299,11 +316,23 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
                   fontSize: 17,
                   isFontBold: true,
                 ),
-                MyTextView(
-                  "All",
-                  textColor: context.appColors.textDarkGray999,
-                  fontSize: 14,
-                  isFontRegular: true,
+                Wrap(
+                  crossAxisAlignment: WrapCrossAlignment.center,
+                  spacing: 5,
+                  children: [
+                    MyTextView(
+                      "All",
+                      textColor: context.appColors.textDarkGray999,
+                      fontSize: 14,
+                      isFontRegular: true,
+                    ),
+                    MyAssetImage(
+                      Assets.serviceArrowRightIcon,
+                      width: 12.5,
+                      height: 10,
+                      color: context.appColors.textPrimary,
+                    ),
+                  ]
                 ),
               ],
             ).onTap((){
@@ -396,7 +425,7 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
                 const MyAssetImage(
-                  Assets.assetsYyHomeLogo,
+                  Assets.serviceServiceAvatorIcon,
                   width: 15,
                   height: 17.5,
                 ),

+ 2 - 1
packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_vm.dart

@@ -186,7 +186,8 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
       ToastEngine.show("Error: $e");
     }
 
-    // 最后赋值
+
+    // // 最后赋值
     _needShowPlaceholder = false;
   }
 

+ 1 - 1
packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_vm.g.dart

@@ -7,7 +7,7 @@ part of 'service_clean_detail_vm.dart';
 // **************************************************************************
 
 String _$serviceCleanDetailVmHash() =>
-    r'b6fe1878337691f7676f1dff91046c4c7d9e266a';
+    r'c2d89942fd0baf13ac415edc25da0f650f4b34b0';
 
 /// See also [ServiceCleanDetailVm].
 @ProviderFor(ServiceCleanDetailVm)

+ 1 - 1
packages/cpt_services/lib/modules/services/service_evaluate_create/service_evaluate_create_vm.g.dart

@@ -7,7 +7,7 @@ part of 'service_evaluate_create_vm.dart';
 // **************************************************************************
 
 String _$serviceEvaluateCreateVmHash() =>
-    r'14c7ca8f77a7d98040e48e69425c5f8fa1fdec7f';
+    r'c3673d6b8f6296e9f28d6067ea138a001e1223f1';
 
 /// See also [ServiceEvaluateCreateVm].
 @ProviderFor(ServiceEvaluateCreateVm)

+ 40 - 4
packages/cpt_services/lib/modules/services/service_evaluate_create_success/evaluate_create_success_page.dart

@@ -6,6 +6,7 @@ import 'package:flutter/rendering.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:plugin_basic/provider/app_config/app_config_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/ext_dart.dart';
@@ -21,6 +22,7 @@ import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:widgets/widget_export.dart';
 
 import '../../../router/page/services_page_router.dart';
+import '../homeService/home_service_page.dart';
 
 @RoutePage()
 class EvaluateCreateSuccessPage extends HookConsumerWidget {
@@ -63,10 +65,44 @@ class EvaluateCreateSuccessPage extends HookConsumerWidget {
         backgroundColor: context.appColors.whiteBG,
       ),
       backgroundColor: ColorUtils.string2Color("#F2F3F6"),
-      body: Column(
-        children: [
-          MyTextView("Thank you"),
-        ],
+      body: Center(
+        child: Container(
+          margin: EdgeInsets.only(top: 50),
+          child: Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              const MyAssetImage(
+                Assets.serviceEvaluateSuccussIcon,
+                width: 78,
+                height: 78,
+              ),
+              MyTextView(
+                "Thank you for your evaluation.",
+                fontSize: 15,
+                isFontRegular: true,
+                boxWidth: 122.5,
+                textAlign: TextAlign.center,
+                textColor: ColorUtils.string2Color('#333333'),
+                marginTop: 17,
+                marginBottom: 50,
+              ),
+              MyButton(
+                text: "Back Home",
+                onPressed: (){
+                  // 回到首页
+                  ComponentServiceManager().mainService.startMainPage();
+                },
+                fontSize: 15,
+                fontWeight: FontWeight.w500,
+                textColor: context.appColors.textWhite,
+                backgroundColor: context.appColors.textPrimary,
+                minHeight: 45,
+                minWidth: 310,
+              )
+            ],
+          ),
+        ),
       )
     );
   }

+ 1 - 1
packages/cpt_services/lib/modules/services/service_evaluate_list/service_evaluate_list_vm.g.dart

@@ -7,7 +7,7 @@ part of 'service_evaluate_list_vm.dart';
 // **************************************************************************
 
 String _$serviceEvaluateListVmHash() =>
-    r'cf8b9b7369798db17804f2b5b7db1d4fdc4c8e08';
+    r'993c979ca4e734163a320a8369185748208344b6';
 
 /// See also [ServiceEvaluateListVm].
 @ProviderFor(ServiceEvaluateListVm)

+ 9 - 6
packages/cpt_services/lib/modules/services/service_order_confirm/service_order_confirm_page.dart

@@ -9,6 +9,7 @@ import 'package:flutter/rendering.dart';
 import 'package:flutter_hooks/flutter_hooks.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:plugin_basic/provider/app_config/app_config_service.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/ext_dart.dart';
@@ -246,7 +247,7 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
             const MyAssetImage(
-              Assets.assetsYyHomeLogo,
+              Assets.serviceLocationIcon,
               width: 15,
               height: 17.5,
             ),
@@ -297,7 +298,7 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
             const MyAssetImage(
-              Assets.assetsYyHomeLogo,
+              Assets.serviceServiceAvatorIcon,
               width: 15,
               height: 17.5,
             ),
@@ -333,7 +334,7 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
         Row(
           children: [
             const MyAssetImage(
-              Assets.assetsYyHomeLogo,
+              Assets.serviceTimeIcon,
               width: 16,
               height: 16,
             ),
@@ -364,7 +365,7 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
               ),
               // 右箭头 icon
               const MyAssetImage(
-                Assets.assetsYyHomeLogo,
+                Assets.serviceRightIcon,
                 width: 17.5,
                 height: 17.5,
               ),
@@ -397,7 +398,7 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
                 crossAxisAlignment: WrapCrossAlignment.center,
                 children: [
                   const MyAssetImage(
-                    Assets.assetsYyHomeLogo,
+                    Assets.serviceCardIcon,
                     width: 63.5,
                     height: 38.5,
                   ),
@@ -411,7 +412,9 @@ class ServiceOrderConfirmPage extends HookConsumerWidget {
                 ],
               ),
               MyButton(
-                onPressed: null,
+                onPressed: (){
+                  ComponentServiceManager().paymentService.startChooseCardPage();
+                },
                 text: 'Change',
                 minWidth: 80,
                 minHeight: 30,

+ 2 - 1
packages/cpt_services/lib/modules/services/service_order_confirm/service_order_confirm_vm.dart

@@ -346,11 +346,12 @@ class ServiceOrderConfirmVm extends _$ServiceOrderConfirmVm {
   }
   handlerClickPayNow(BuildContext context, {int? id, int? serviceTypeCode}){
     ToastEngine.show("Pay Now");
+ 
   }
 
   setConfirmOrderTotalPrice(BuildContext? context){
     final visitTimeTotalPrice = ref.read(chooseVisitTimeContentVmProvider).totalPrice?? 0.0;
-    final airConditionTotalPrice = ref.read(chooseAirConditionContentVmProvider).totalPrice?? 0.0;
+    final airConditionTotalPrice = ref.read(chooseAirConditionContentVmProvider).totalPrice?? 0.0 ;
     final houseCleaningTotalPrice = ref.read(chooseHouseCleanContentVmProvider).totalPrice?? 0.0;
     final totalPrice = visitTimeTotalPrice.toDouble() + airConditionTotalPrice.toDouble() + houseCleaningTotalPrice.toDouble();
     // if( _detailServiceTypeCode == servicesConstants.servicesType['houseCleaning'] ){

+ 175 - 219
packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_page.dart

@@ -1,3 +1,4 @@
+import 'package:cpt_services/modules/services/service_repair_detail/service_repair_detail_state.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/theme/app_colors_theme.dart';
 import 'package:domain/entity/garage_sale_rent_detail_entity.dart';
@@ -17,6 +18,7 @@ import 'package:shared/utils/size_config.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
 import 'package:widgets/my_like_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
@@ -47,13 +49,10 @@ class ServiceRepairDetailPage extends HookConsumerWidget {
     final state = ref.watch(serviceRepairDetailVmProvider);
     final vm = ref.read(serviceRepairDetailVmProvider.notifier);
     final String pageTitle = 'Repair Details';
-    GlobalKey _likeButtonKey = GlobalKey<MyLikeButtonState>();
 
-    GarageSaleRentDetailEntity? detailInfo = state.datas?? null;
-    String title =  detailInfo?.title?? '';
-    int price =  detailInfo?.price?? 0;
+    Map<String, dynamic>? detailInfo = state.datas?? {};
 
-    String contactType =  detailInfo?.contact??'';
+    String contactType =  detailInfo?['contact']??'';
 
     String description = '';
 
@@ -104,259 +103,216 @@ class ServiceRepairDetailPage extends HookConsumerWidget {
                         SliverList(
                           delegate: SliverChildBuilderDelegate(
                                   (context, index){
-                                return detailInfo !=null? _buildContentBox(context, ref, detailInfo): Container();
+                                return _buildContentBox(context, ref, detailInfo!, state, vm);
                               },
                               childCount: 1
                           ),
                         )
                       ],
                     ),
-                    Visibility(
-                      visible: state.loadingState == LoadState.State_Success,
-                      child: Visibility(
-                        visible: vm.isContactWhatsApp(contactType),
-                        child: _buildWhatsApp(context, ref,
-                          title:title,
-                          price:price,
-                          contactType:contactType,
-                          description:description,
-                        ),
-                      ),
-                    ),
                   ]
               ),
             ),
           ),
-          // 底部联系信息
-          Visibility(
-            visible: state.loadingState == LoadState.State_Success,
-            child: detailInfo !=null ? _buildBottomConcatInfo(context, ref, _likeButtonKey,
-              title:title,
-              price:price,
-              contactType:contactType,
-              description:description,
-              detailInfo:detailInfo,
-            ): Container(),
-          )
         ],
       ),
     );
   }
 
-  Widget _buildWhatsApp(BuildContext context, WidgetRef ref, {required String title, required int price, required String contactType, required String description}) {
-    final vm = ref.read(serviceRepairDetailVmProvider.notifier);
-    return Positioned(
-      right: 15.5,
-      bottom: 42,
-      child: InkWell(
-        onTap: () {
-          // 点击了whatsapp
-          vm.handlerClickWhatsapp(context, contactType, title, price);
-        },
-        child: const MyAssetImage(Assets.communityWhatsAPP, width: 57,height: 57,),
-      ),
-    );
-  }
 
-  Widget _buildContentBox(BuildContext context, WidgetRef ref, GarageSaleRentDetailEntity detailInfo) {
-    List<String> resources = detailInfo.resources??[];
-    String goods_img = resources[0]??'';
-    String title =  detailInfo.title??'';
-    int price = detailInfo.price??0;
-    String contactType =  '';
-    String description = detailInfo.description??'';
-    CarouselSliderController buttonCarouselController = CarouselSliderController();
+  Widget _buildContentBox(BuildContext context, WidgetRef ref, Map<String, dynamic>? detailInfo, ServiceRepairDetailState state, ServiceRepairDetailVm vm) {
+    // List<String> resources = detailInfo?['resources'].cast<String>()??[];
+    // String title =  detailInfo?['title']??'';
+    double score = detailInfo?['score']?? 5.0;
+    // String description = detailInfo?['description']??'';
+
     return Column(
         crossAxisAlignment: CrossAxisAlignment.start,
         children: [
-          // 图片
-          SizedBox(
-            width: SizeConfig().screenWidth,
-            height: 173.5,
-            child: CarouselSlider(
-              // items: [MyLoadImage(goods_img)] ,
-              items: resources.map((resource) => MyLoadImage(
-                resource,
-                fit: BoxFit.cover, // 确保图片覆盖整个区域
-                width: SizeConfig().screenWidth, // 确保图片宽度与屏幕宽度一致
-                height: 173.5, // 确保图片高度与 CarouselSlider 高度一致
-              ).onTap((){
-                ImagePreviewEngine.multipleImagePreview(
-                    context,
-                    resources,
-                    heroes: List.generate(resources.length, (index) => resources[index]),
-                    onLongPressAction: (url) {}
-                );
-              })
-              ).toList(),
-              carouselController: buttonCarouselController,
-              options: CarouselOptions(
-                autoPlay: false,
-                enlargeCenterPage: true,
-                viewportFraction: 1,
-                initialPage: 0,
-              ),
-            ),
-          ),
           Column(
             crossAxisAlignment: CrossAxisAlignment.start,
             children: [
-              // 标题
-              Padding(
-                padding: const EdgeInsets.only(left: 16, right: 16, top: 16,),
-                child: title.isNotEmpty? MyTextView( title, fontSize: 18, isFontMedium: true, textColor: context.appColors.textBlack,):const SizedBox.shrink(),
+              //  评分
+              Column(
+                children: [
+                  Container(
+                    width: double.infinity,
+                    padding: const EdgeInsets.only(left: 16, right: 16, top: 16,bottom: 16),
+                    color: context.appColors.whiteBG,
+                    child: Column(
+                      crossAxisAlignment: CrossAxisAlignment.start,
+                      children: [
+                        MyTextView(
+                          "House Cleaning Services",
+                          textColor: context.appColors.textBlack,
+                          fontSize: 18,
+                          isFontBold: true,
+                          marginBottom: 5,
+                        ),
+                        Row(
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          children: [
+                            AnimatedRatingStars(
+                              initialRating: score,
+                              onChanged: (rating) {
+                              },
+                              readOnly: true,
+                              displayRatingValue: true, // Display the rating value
+                              interactiveTooltips: true, // Allow toggling half-star state
+                              customFilledIcon: Icons.star,
+                              customHalfFilledIcon: Icons.star_half,
+                              customEmptyIcon: Icons.star_border,
+                              filledColor: ColorUtils.string2Color("#FF0000"),
+                              starSize: 16.5,
+                              animationDuration: const Duration(milliseconds: 0),
+                              animationCurve: Curves.easeInOut,
+                            ),
+                            MyTextView(
+                              "${score}",
+                              textColor: context.appColors.textBlack,
+                              fontSize: 16,
+                              isFontMedium: true,
+                              marginLeft: 15,
+                            ),
+                          ],
+                        ),
+                        MyTextView(
+                          "HONG YE GROUP PTE LTD",
+                          textColor: context.appColors.textDarkGray999,
+                          fontSize: 12,
+                          isFontRegular: true,
+                          marginTop: 10,
+                          marginBottom: 5,
+                        ),
+                      ],
+                    ),
+                  ),
+                ],
               ),
-              // 价格
-              Padding(
-                padding: const EdgeInsets.only(left: 16, right: 16, top: 10),
-                child: price!=null? MyTextView( '$price', fontSize: 24, isFontMedium: true, textColor: context.appColors.textBlack,):const SizedBox.shrink(),
+              // profile信息
+              Container(
+                width: double.infinity,
+                margin: const EdgeInsets.only(left: 0, right: 0, top: 5, bottom: 0),
+                padding: const EdgeInsets.only(left: 10, right: 10, top: 18.5, bottom: 18.5),
+                decoration: BoxDecoration(
+                  color: context.appColors.whiteBG,
+                ),
+                child: _buildOrderProfile(context, state, vm),
+              ),
+              // quote 按钮
+              Container(
+                width: double.infinity,
+                padding: const EdgeInsets.only(left: 16, right: 16, top: 20,bottom: 20),
+                color: Colors.transparent,
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    Center(
+                      child: MyButton(
+                        text: "Get A Quote",
+                        textColor: context.appColors.textWhite,
+                        backgroundColor: context.appColors.textPrimary,
+                        fontSize: 15,
+                        minWidth: 310,
+                        minHeight: 44.5,
+                        fontWeight: FontWeight.w400,
+                        onPressed: () {
+                          vm.handlerClickQuoteBtn(context, id, serviceTypeCode);
+                        },
+                      ),
+                    ),
+                    Center(
+                      child: MyTextView(
+                        'The merchant will contact you as soon as possible. Please keep your phone open',
+                        textColor: context.appColors.textBlack,
+                        fontSize: 14,
+                        isFontRegular: true,
+                        marginTop: 17,
+                        // boxWidth: 330,
+                        marginLeft: 20,
+                        marginRight: 20,
+                        textAlign: TextAlign.center,
+                      ),
+                    )
+                  ]
+                )
               ),
-              //  内容
+              // 介绍图
               Padding(
-                padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
-                child: description.isNotEmpty? MyTextView( description, fontSize: 17, isFontRegular: true, textColor: context.appColors.textBlack,):const SizedBox.shrink(),
+                  padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
+                  child: Column(
+                    children: List.generate(2, (index) {
+                      // 创建一个映射来关联字符串和资源
+                      final Map<String, String> assetMap = {
+                        'serviceDetail01': Assets.serviceRepairDetail01,
+                        'serviceDetail02': Assets.serviceRepairDetail02,
+                      };
+                      String curDetailStr = 'serviceDetail0${(index + 1)}';
+                      Log.d("curDetailStr   $curDetailStr");
+                      return MyAssetImage(
+                        assetMap[curDetailStr]!,
+                        width: SizeConfig().screenWidth,
+                        fit: BoxFit.cover,
+                      );
+                    }).toList(),
+                  )
               ),
             ],
           ),
-
         ]
     );
   }
 
-  Widget _buildBottomConcatInfo(
-      BuildContext context,
-      WidgetRef ref,
-      likeButtonKey,
-      {
-        required String title,
-        required int price,
-        required String contactType,
-        required String description,
-        required GarageSaleRentDetailEntity detailInfo,
-      }
-      ) {
-    final vm = ref.read(serviceRepairDetailVmProvider.notifier);
-
-    GarageSaleRentDetailAccount  account = detailInfo.account?? GarageSaleRentDetailAccount();
-
-    Log.d("0000000 ${detailInfo.likesCount}");
-    String publisher =  account.name??'-';
-    String publisherAvatar = account.avatar??'-';
-
-    String contactType =  detailInfo.contact??'';
-    String publisherTime =  detailInfo.createdAt??'-';
-    int? likes_count =  detailInfo.likesCount??0;
-    Log.d("666666 ${likes_count}");
-
-
-    final _likes_count = useState<int>(likes_count!);
-    final _isLiked = useState<bool>(false);
-    Log.d("4344 ${_likes_count.value}");
-
-
-    return Container(
-      height: 50,
-      color: ColorUtils.string2Color('#4161D0'),
-      child: Row(
-        mainAxisAlignment: MainAxisAlignment.center,
-        children: [
-          Expanded(
-            child: Row(
-              crossAxisAlignment: CrossAxisAlignment.center,
+  Widget _buildOrderProfile(BuildContext context, ServiceRepairDetailState state, ServiceRepairDetailVm vm,) {
+    return Column(
+      children: [
+        Row(
+          mainAxisAlignment: MainAxisAlignment.start,
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            const MyAssetImage(
+              Assets.serviceLocationIcon,
+              width: 15,
+              height: 17.5,
+            ),
+            const SizedBox(
+              width: 10,
+            ),
+            Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
-                SizedBox.fromSize(size: const Size(15, 0)),
-                MyLoadImage(
-                  publisherAvatar,
-                  width: 29,
-                  height: 29,
-                  isCircle: true,
+                MyTextView(
+                  '705 Qiming Huijin Building',
+                  fontSize: 17,
+                  isFontBold: true,
+                  textColor: context.appColors.textBlack,
+                  marginBottom: 5,
                 ),
-                SizedBox.fromSize(size: const Size(10, 0)),
-                Column(
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  mainAxisAlignment: MainAxisAlignment.center,
+                Row(
+                  mainAxisAlignment: MainAxisAlignment.start,
                   children: [
-                    MyTextView(publisher, fontSize:12, textColor: context.appColors.textWhite, isFontMedium: true,),
-                    MyTextView(publisherTime, fontSize:10, textColor: context.appColors.textWhite, isFontRegular: true, marginTop: 4,)
+                    MyTextView(
+                      'Sundy',
+                      fontSize: 14,
+                      textColor: context.appColors.textDarkGray999,
+                      isFontRegular: true,
+                    ),
+                    MyTextView(
+                      '+6588991122',
+                      fontSize: 14,
+                      textColor: context.appColors.textDarkGray999,
+                      isFontRegular: true,
+                      marginLeft: 10,
+                    ),
                   ],
                 ),
               ],
             ),
-          ),
-          Expanded(
-            child: Row(
-              mainAxisAlignment: MainAxisAlignment.end,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              children: [
-                Container(
-                  alignment: Alignment.center,
-                  padding: const EdgeInsets.only(left:5, right: 0,top:5,bottom: 5),
-                  child: Row(
-                    mainAxisAlignment: MainAxisAlignment.center,
-                    children: [
-                      MyLikeButton(
-                        key: likeButtonKey,
-                        isLiked: _isLiked.value,
-                        isCustomIcon: true,
-                        customIconUnActiveAssets: Assets.communityCollection,
-                        customIconActiveAssets: Assets.communityLikeActive,
-                        // customIconWidth: 18,
-                        // customIconHeight: 18,
-                        onLike: () async {
-                          Log.d('点击了like button');
-                          int id = detailInfo!.id as int;
-                          final isSuccess = await vm.handlerClickCollection(context, id, true);
-                          if(isSuccess!=null && isSuccess){
-                            // 成功
-                            if(_isLiked.value){
-                              Log.d("取消点赞");
-                              _likes_count.value--;
-                              _isLiked.value = false;
-                            }else {
-                              Log.d("点赞");
-                              _likes_count.value++;
-                              _isLiked.value = true;
-                            }
-                          }
-                        },
-                      ),
-                      MyTextView(
-                        "${_likes_count.value}",
-                        fontSize: 18,
-                        textColor: Colors.white,
-                        isFontRegular: true,
-                        marginLeft: 5,
-                        marginRight: 15,
-                        onClick: (){
-                          final state = likeButtonKey.currentState;
-                          state?.triggerTap();
-                        },
-                      ),
-                    ],
-                  ),
-                ),
-                // const MyAssetImage(Assets.communityCollection, width: 18,height: 18,),
-                Visibility(
-                  visible: vm.isContactMobile(contactType),
-                  child:  Row(
-                    children: [
-                      const SizedBox(width: 4,),
-                      const MyAssetImage(
-                        Assets.communityPhone,
-                        width: 21.5,
-                        height: 18,
-                      ).onTap((){
-                        vm.handlerClickMobile(context, contactType);
-                      }),
-                      const SizedBox(width: 15,),
-                    ],
-                  ),
-                ),
-              ],
-            ),
-          ),
-        ],
-      ),
+          ],
+        ),
+      ],
     );
   }
+
 }

+ 2 - 2
packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_state.dart

@@ -9,7 +9,7 @@ class ServiceRepairDetailState {
   final int? id;
   final String? type;
 
-  GarageSaleRentDetailEntity? datas;
+  Map<String, dynamic>? datas;
 
   ServiceRepairDetailState({
     this.loadingState = LoadState.State_Loading,
@@ -20,7 +20,7 @@ class ServiceRepairDetailState {
   });
 
   ServiceRepairDetailState copyWith({
-    GarageSaleRentDetailEntity? datas,
+    Map<String, dynamic>? datas,
     LoadState? loadingState,
     String? errorMessage,
     int? id,

+ 74 - 21
packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_vm.dart

@@ -1,14 +1,20 @@
 
+import 'package:cpt_services/components/chooseAirConditionContent.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/garage_sale_rent_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
 import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/dialog/app_custom_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
+import 'package:flutter/src/widgets/framework.dart';
 
 import '../../../respository/services_respository.dart';
 import '../../../router/page/services_page_router.dart';
@@ -62,7 +68,8 @@ class ServiceRepairDetailVm extends _$ServiceRepairDetailVm {
   // 初始化页面数据
   initPageData() {
     Log.d("----for_sale_vm-----initPageData   ${state.loadingState}");
-    onRefresh();
+    // onRefresh();
+    changeLoadingState(LoadState.State_Success, null);
   }
 
   // 上拉加载 更多
@@ -145,26 +152,26 @@ class ServiceRepairDetailVm extends _$ServiceRepairDetailVm {
     // _needShowPlaceholder = false;
 
 
-    try {
-      Map<String, dynamic> params = {
-        "id": _detailId,
-      };
-      final result = await serviceRespositoryInstance.fetchServiceRepairDetailInfo(params);
-      if(result.isSuccess){
-        state = state.copyWith(datas: result.data as GarageSaleRentDetailEntity);
-        changeLoadingState(LoadState.State_Success, null);
-        refreshController.finishRefresh();
-      } else {
-        String errorMessage = result.errorMsg!;
-        changeLoadingState(LoadState.State_Error, errorMessage);
-        ToastEngine.show(result.errorMsg ?? "Network Load Error");
-      }
-    } catch (e) {
-      ToastEngine.show("Error: $e");
-    }
-
-    // 最后赋值
-    _needShowPlaceholder = false;
+    // try {
+    //   Map<String, dynamic> params = {
+    //     "id": _detailId,
+    //   };
+    //   final result = await serviceRespositoryInstance.fetchServiceRepairDetailInfo(params);
+    //   if(result.isSuccess){
+    //     state = state.copyWith(datas: result.data as GarageSaleRentDetailEntity);
+    //     changeLoadingState(LoadState.State_Success, null);
+    //     refreshController.finishRefresh();
+    //   } else {
+    //     String errorMessage = result.errorMsg!;
+    //     changeLoadingState(LoadState.State_Error, errorMessage);
+    //     ToastEngine.show(result.errorMsg ?? "Network Load Error");
+    //   }
+    // } catch (e) {
+    //   ToastEngine.show("Error: $e");
+    // }
+    //
+    // // 最后赋值
+    // _needShowPlaceholder = false;
   }
 
 
@@ -245,4 +252,50 @@ class ServiceRepairDetailVm extends _$ServiceRepairDetailVm {
       throw 'Could not launch $launchUri';
     }
   }
+
+  handlerClickQuoteBtn(BuildContext context, int id, int serviceTypeCode) async{
+    await DialogEngine.show(
+        tag: "gotoQuote",
+        position: DialogPosition.center,
+        widget: AppCustomDialog(
+          message: '',
+          title: 'Confirm',
+          dialogWidth: MediaQuery.of(context).size.width * 0.8,
+          // contentBoxMaxHeight: 350,
+          // contentBoxMinHeight: 300,
+          isShowConfirmBtn: true,
+          confirmTxt: "Confirm",
+          isShowCancelBtn:false,
+          messageBuilder: (BuildContext context){
+            return Container(
+              padding: EdgeInsets.symmetric(horizontal: 30),
+              child: Column(
+                children: [
+                  MyTextView(
+                    "Please select the category of the service you want to quote:",
+                    fontSize: 16,
+                    isFontMedium: true,
+                    textAlign: TextAlign.center,
+                    textColor: ColorUtils.string2Color("#4161D0"),
+                  ),
+                  SizedBox(height: 20,),
+                  MyTextView(
+                    "We will contact you as soon as possible. Please keep your phone open",
+                    fontSize: 16,
+                    isFontMedium: true,
+                    textAlign: TextAlign.center,
+                    textColor: ColorUtils.string2Color("#000000"),
+                    // textColor: context.appColors.textPrimary,
+                  ),
+                ]
+              )
+            );
+          },
+          confirmAction: (){
+            // 点击了确定
+            Log.d("----点击了确定按钮");
+          },
+        )
+    );
+  }
 }

+ 1 - 1
packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_vm.g.dart

@@ -7,7 +7,7 @@ part of 'service_repair_detail_vm.dart';
 // **************************************************************************
 
 String _$serviceRepairDetailVmHash() =>
-    r'd828d6b6e6677999dea7125508ba85448ebf7d00';
+    r'26e25c4041436aaefa8c3eb25a2921a7c3daeb7a';
 
 /// See also [ServiceRepairDetailVm].
 @ProviderFor(ServiceRepairDetailVm)

+ 121 - 0
packages/cpt_services/lib/modules/services/services_main_page.dart

@@ -0,0 +1,121 @@
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter_hooks/flutter_hooks.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:shared/utils/color_utils.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/custom_sliver_persistent_header_delegate.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:cs_resources/theme/app_colors_theme.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../router/page/services_page_router.dart';
+import 'inProgress/in_progress_page.dart';
+import 'repair/repair_page.dart';
+import 'services_page.dart';
+
+enum ServicesType {
+  cleaning,
+  repair,
+}
+
+
+@RoutePage()
+class ServicesMainPage extends HookConsumerWidget {
+  ServicesMainPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push( ServicesMainPageRoute());
+    } else {
+      appRouter.push( ServicesMainPageRoute());
+    }
+  }
+
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+
+    useEffect(() {
+      // 监听窗口
+    }, []);
+
+
+    useEffect(() {
+      Log.d("ServicesMainPage initState");
+      // 延迟监听
+
+    }, []);
+
+    return Scaffold(
+      appBar: MyAppBar.appBar(
+        context,
+        "ServicesMain",
+        backgroundColor: context.appColors.whiteBG,
+      ),
+      backgroundColor: context.appColors.backgroundDefault,
+      body: Container(
+        child: GridView.count(
+          crossAxisCount: 2,
+          padding: EdgeInsets.all(10),
+          mainAxisSpacing: 10,
+          crossAxisSpacing: 10,
+          children: [
+            _buildServiceCard(
+              context,
+              ServicesType.cleaning,
+              Assets.serviceInProgress,
+              "Home Services",
+              ServicesPage.startInstance,
+            ),
+            _buildServiceCard(
+              context,
+              ServicesType.repair,
+              Assets.serviceHistory,
+              "Maintenance",
+              RepairPage.startInstance,
+            ),
+          ]
+        ),
+      ),
+    );
+  }
+
+  Widget _buildServiceCard(
+    BuildContext context,
+    ServicesType type,
+    String imagePath,
+    String title,
+    Function() onTap,
+  ) {
+    return Container(
+      decoration: BoxDecoration(
+        color: context.appColors.whiteBG,
+        borderRadius: BorderRadius.circular(10),
+        boxShadow: [
+          BoxShadow(
+            color: context.appColors.whiteBG,
+            blurRadius: 5,
+            offset: Offset(0, 3),
+          ),
+        ],
+      ),
+    ).onTap((){
+      if(type == ServicesType.cleaning){
+        ServicesPage.startInstance();
+      }else if(type == ServicesType.repair){
+        RepairPage.startInstance();
+      }
+    });
+  }
+}
+

+ 3 - 3
packages/cpt_services/lib/modules/services/services_state.dart

@@ -15,17 +15,17 @@ class ServicesVmState {
     {
       "title": "Service",
       "code": "service",
-      "icon": Assets.communityNews,
+      "icon": Assets.serviceServiceType,
     },
     {
       "title": "In Progress",
       "code": "inProgress",
-      "icon": Assets.communityGarageSale,
+      "icon": Assets.serviceInProgress,
     },
     {
       "title": "History",
       "code": "history",
-      "icon": Assets.communityGarageSale,
+      "icon": Assets.serviceHistory,
     },
   ];
 

+ 41 - 0
packages/cpt_services/lib/router/page/services_page_router.dart

@@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
 import 'package:router/ext/auto_router_extensions.dart';
 import 'package:router/path/router_path.dart';
 
+import '../../modules/services/services_main_page.dart';
+
 import '../../modules/services/homeService/home_service_page.dart';
 import '../../modules/services/inProgress/in_progress_page.dart';
 import '../../modules/services/history/history_page.dart';
@@ -15,6 +17,13 @@ import '../../modules/services/service_order_confirm/service_order_confirm_page.
 import '../../modules/services/service_pay_success/service_pay_success_page.dart';
 import '../../modules/services/service_repair_detail/service_repair_detail_page.dart';
 import '../../modules/services/services_page.dart';
+import '../../modules/services/clean_order_detail/clean_order_detail_page.dart';
+
+
+
+import '../../modules/services/repair/repair_page.dart';
+
+
 part 'services_page_router.gr.dart';
 
 /*\
@@ -25,6 +34,33 @@ class ServicesPageRouter extends _$ServicesPageRouter {
   @override
   List<AutoRoute> get routes => [
     CustomRoute(
+      page: ServicesMainPageRoute.page,
+      path: RouterPath.servicesMain,
+      transitionsBuilder: applySlideTransition,
+    ),
+    CustomRoute(
+        page: RepairPageRoute.page,
+        path: RouterPath.repair,
+        transitionsBuilder: applySlideTransition,
+        children: [
+          // CustomRoute(
+          //     page: RepairHomeServicePageRoute.page,
+          //     path: RouterPath.repaireHomeService,
+          //     transitionsBuilder: applySlideTransition
+          // ),
+          // CustomRoute(
+          //   page: RepairInProgressPageRoute.page,
+          //   path: RouterPath.repairInProgress,
+          //   transitionsBuilder: applySlideTransition,
+          // ),
+          // CustomRoute(
+          //   page: RepairHistoryPageRoute.page,
+          //   path: RouterPath.repairHistory,
+          //   transitionsBuilder: applySlideTransition,
+          // ),
+        ]
+    ),
+    CustomRoute(
         page: ServicesPageRoute.page,
         path: RouterPath.services,
         transitionsBuilder: applySlideTransition,
@@ -62,6 +98,11 @@ class ServicesPageRouter extends _$ServicesPageRouter {
       transitionsBuilder: applySlideTransition,
     ),
     CustomRoute(
+      page: CleanOrderDetailPageRoute.page,
+      path: "${RouterPath.servicesOrderDetail}:id/:serviceTypeCode",
+      transitionsBuilder: applySlideTransition,
+    ),
+    CustomRoute(
       page: ServicePaySuccessPageRoute.page,
       path: "${RouterPath.servicesOrderPaySuccess}:id/:serviceTypeCode",
       transitionsBuilder: applySlideTransition,

+ 129 - 0
packages/cpt_services/lib/router/page/services_page_router.gr.dart

@@ -15,6 +15,17 @@ abstract class _$ServicesPageRouter extends RootStackRouter {
 
   @override
   final Map<String, PageFactory> pagesMap = {
+    CleanOrderDetailPageRoute.name: (routeData) {
+      final args = routeData.argsAs<CleanOrderDetailPageRouteArgs>();
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: CleanOrderDetailPage(
+          key: args.key,
+          id: args.id,
+          serviceTypeCode: args.serviceTypeCode,
+        ),
+      );
+    },
     EvaluateCreateSuccessPageRoute.name: (routeData) {
       final args = routeData.argsAs<EvaluateCreateSuccessPageRouteArgs>();
       return AutoRoutePage<dynamic>(
@@ -44,6 +55,14 @@ abstract class _$ServicesPageRouter extends RootStackRouter {
         child: const InProgressPage(),
       );
     },
+    RepairPageRoute.name: (routeData) {
+      final args = routeData.argsAs<RepairPageRouteArgs>(
+          orElse: () => const RepairPageRouteArgs());
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: RepairPage(key: args.key),
+      );
+    },
     ServiceCleanDetailPageRoute.name: (routeData) {
       final pathParams = routeData.inheritedPathParams;
       final args = routeData.argsAs<ServiceCleanDetailPageRouteArgs>(
@@ -120,6 +139,14 @@ abstract class _$ServicesPageRouter extends RootStackRouter {
         ),
       );
     },
+    ServicesMainPageRoute.name: (routeData) {
+      final args = routeData.argsAs<ServicesMainPageRouteArgs>(
+          orElse: () => const ServicesMainPageRouteArgs());
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: ServicesMainPage(key: args.key),
+      );
+    },
     ServicesPageRoute.name: (routeData) {
       final args = routeData.argsAs<ServicesPageRouteArgs>(
           orElse: () => const ServicesPageRouteArgs());
@@ -132,6 +159,50 @@ abstract class _$ServicesPageRouter extends RootStackRouter {
 }
 
 /// generated route for
+/// [CleanOrderDetailPage]
+class CleanOrderDetailPageRoute
+    extends PageRouteInfo<CleanOrderDetailPageRouteArgs> {
+  CleanOrderDetailPageRoute({
+    Key? key,
+    required int id,
+    required int serviceTypeCode,
+    List<PageRouteInfo>? children,
+  }) : super(
+          CleanOrderDetailPageRoute.name,
+          args: CleanOrderDetailPageRouteArgs(
+            key: key,
+            id: id,
+            serviceTypeCode: serviceTypeCode,
+          ),
+          initialChildren: children,
+        );
+
+  static const String name = 'CleanOrderDetailPageRoute';
+
+  static const PageInfo<CleanOrderDetailPageRouteArgs> page =
+      PageInfo<CleanOrderDetailPageRouteArgs>(name);
+}
+
+class CleanOrderDetailPageRouteArgs {
+  const CleanOrderDetailPageRouteArgs({
+    this.key,
+    required this.id,
+    required this.serviceTypeCode,
+  });
+
+  final Key? key;
+
+  final int id;
+
+  final int serviceTypeCode;
+
+  @override
+  String toString() {
+    return 'CleanOrderDetailPageRouteArgs{key: $key, id: $id, serviceTypeCode: $serviceTypeCode}';
+  }
+}
+
+/// generated route for
 /// [EvaluateCreateSuccessPage]
 class EvaluateCreateSuccessPageRoute
     extends PageRouteInfo<EvaluateCreateSuccessPageRouteArgs> {
@@ -218,6 +289,35 @@ class InProgressPageRoute extends PageRouteInfo<void> {
 }
 
 /// generated route for
+/// [RepairPage]
+class RepairPageRoute extends PageRouteInfo<RepairPageRouteArgs> {
+  RepairPageRoute({
+    Key? key,
+    List<PageRouteInfo>? children,
+  }) : super(
+          RepairPageRoute.name,
+          args: RepairPageRouteArgs(key: key),
+          initialChildren: children,
+        );
+
+  static const String name = 'RepairPageRoute';
+
+  static const PageInfo<RepairPageRouteArgs> page =
+      PageInfo<RepairPageRouteArgs>(name);
+}
+
+class RepairPageRouteArgs {
+  const RepairPageRouteArgs({this.key});
+
+  final Key? key;
+
+  @override
+  String toString() {
+    return 'RepairPageRouteArgs{key: $key}';
+  }
+}
+
+/// generated route for
 /// [ServiceCleanDetailPage]
 class ServiceCleanDetailPageRoute
     extends PageRouteInfo<ServiceCleanDetailPageRouteArgs> {
@@ -490,6 +590,35 @@ class ServiceRepairDetailPageRouteArgs {
 }
 
 /// generated route for
+/// [ServicesMainPage]
+class ServicesMainPageRoute extends PageRouteInfo<ServicesMainPageRouteArgs> {
+  ServicesMainPageRoute({
+    Key? key,
+    List<PageRouteInfo>? children,
+  }) : super(
+          ServicesMainPageRoute.name,
+          args: ServicesMainPageRouteArgs(key: key),
+          initialChildren: children,
+        );
+
+  static const String name = 'ServicesMainPageRoute';
+
+  static const PageInfo<ServicesMainPageRouteArgs> page =
+      PageInfo<ServicesMainPageRouteArgs>(name);
+}
+
+class ServicesMainPageRouteArgs {
+  const ServicesMainPageRouteArgs({this.key});
+
+  final Key? key;
+
+  @override
+  String toString() {
+    return 'ServicesMainPageRouteArgs{key: $key}';
+  }
+}
+
+/// generated route for
 /// [ServicesPage]
 class ServicesPageRoute extends PageRouteInfo<ServicesPageRouteArgs> {
   ServicesPageRoute({

BIN
packages/cs_resources/assets/service/arrow-right-icon.webp


BIN
packages/cs_resources/assets/service/calendar-icon.webp


BIN
packages/cs_resources/assets/service/card-icon.webp


BIN
packages/cs_resources/assets/service/evaluate-succuss-icon.webp


BIN
packages/cs_resources/assets/service/filter-icon.webp


BIN
packages/cs_resources/assets/service/highlight-icon.webp


BIN
packages/cs_resources/assets/service/history.webp


BIN
packages/cs_resources/assets/service/in-progress.webp


BIN
packages/cs_resources/assets/service/location-icon.webp


BIN
packages/cs_resources/assets/service/money-icon.webp


BIN
packages/cs_resources/assets/service/pay-success-icon.webp


BIN
packages/cs_resources/assets/service/payment-icon.webp


BIN
packages/cs_resources/assets/service/rating-fill-icon.webp


BIN
packages/cs_resources/assets/service/rating-unfill-icon.webp


BIN
packages/cs_resources/assets/service/repair_detail_01.png


BIN
packages/cs_resources/assets/service/repair_detail_02.png


BIN
packages/cs_resources/assets/service/right-icon.webp


BIN
packages/cs_resources/assets/service/service-avator-icon.webp


BIN
packages/cs_resources/assets/service/service-type.webp


BIN
packages/cs_resources/assets/service/time-icon.webp


+ 20 - 0
packages/cs_resources/lib/generated/assets.dart

@@ -230,13 +230,33 @@ class Assets {
   static const String rewardsRewardsSuccess = 'assets/rewards/rewards_success.png';
   static const String rewardsRewardsT = 'assets/rewards/rewards_t.png';
   static const String rewardsRewardsY = 'assets/rewards/rewards_y.png';
+  static const String serviceArrowRightIcon = 'assets/service/arrow-right-icon.webp';
+  static const String serviceCalendarIcon = 'assets/service/calendar-icon.webp';
+  static const String serviceCardIcon = 'assets/service/card-icon.webp';
   static const String serviceDetail01 = 'assets/service/detail01.png';
   static const String serviceDetail02 = 'assets/service/detail02.png';
   static const String serviceDetail03 = 'assets/service/detail03.png';
   static const String serviceDetail04 = 'assets/service/detail04.png';
   static const String serviceDetail05 = 'assets/service/detail05.png';
   static const String serviceDetail06 = 'assets/service/detail06.png';
+  static const String serviceEvaluateSuccussIcon = 'assets/service/evaluate-succuss-icon.webp';
+  static const String serviceFilterIcon = 'assets/service/filter-icon.webp';
+  static const String serviceHighlightIcon = 'assets/service/highlight-icon.webp';
+  static const String serviceHistory = 'assets/service/history.webp';
+  static const String serviceInProgress = 'assets/service/in-progress.webp';
+  static const String serviceLocationIcon = 'assets/service/location-icon.webp';
+  static const String serviceMoneyIcon = 'assets/service/money-icon.webp';
+  static const String servicePaySuccessIcon = 'assets/service/pay-success-icon.webp';
+  static const String servicePaymentIcon = 'assets/service/payment-icon.webp';
+  static const String serviceRatingFillIcon = 'assets/service/rating-fill-icon.webp';
+  static const String serviceRatingUnfillIcon = 'assets/service/rating-unfill-icon.webp';
+  static const String serviceRepairDetail01 = 'assets/service/repair_detail_01.png';
+  static const String serviceRepairDetail02 = 'assets/service/repair_detail_02.png';
+  static const String serviceRightIcon = 'assets/service/right-icon.webp';
+  static const String serviceServiceAvatorIcon = 'assets/service/service-avator-icon.webp';
   static const String serviceServiceScoreNo = 'assets/service/service_score_no.png';
   static const String serviceServiceScoreYes = 'assets/service/service_score_yes.png';
+  static const String serviceServiceType = 'assets/service/service-type.webp';
+  static const String serviceTimeIcon = 'assets/service/time-icon.webp';
 
 }

+ 6 - 0
packages/cs_router/lib/path/router_path.dart

@@ -134,6 +134,8 @@ class RouterPath {
   
 
   //服务广告
+  static const servicesMain = '/services_main';
+
   static const services = '/services';
   static const servicesHomeService = 'services_home_service';
   static const servicesInProgress = 'services_in_progress';
@@ -141,12 +143,16 @@ class RouterPath {
   static const servicesCleanDetail = '/services_clean_detail';
   static const servicesRepairDetail = '/services_repair_detail';
   static const servicesOrderConfirm = '/services_order_confirm';
+  static const servicesOrderDetail = '/services_order_detail';
   static const servicesOrderPaySuccess = '/services_order_pay_success';
   static const servicesEvaluateCreate = '/services_evaluate_create';
   static const servicesEvaluateCreateSuccess = '/services_evaluate_create_success';
   static const servicesEvaluateList = '/services_evaluate_list';
 
 
+  static const repair = '/repair';
+
+
   //全局其他
   static const previewImage = '/preview/image'; //预览图片
   static const globalWeb = '/global/web/:isShowAppBar/:initialUrl/:title'; //全局公用的Web页面