2 Revize 9ef796d00f ... c32dee82b1

Autor SHA1 Zpráva Datum
  glglove c32dee82b1 update před 3 měsíci
  glglove e0fb53711f update před 3 měsíci

+ 14 - 11
packages/cpt_community/lib/modules/garage/garagesale_detail/garagesale_detail_vm.dart

@@ -5,6 +5,7 @@ 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/permission/permission_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';
@@ -236,16 +237,18 @@ class GaragesaleDetailVm extends _$GaragesaleDetailVm {
 
   // 拨打电话
   Future<void> makePhoneCall(String phoneNumber) async {
-    final Uri launchUri = Uri(
-      scheme: 'tel',
-      path: phoneNumber,
-    );
-
-    if (await canLaunchUrl(launchUri)) {
-      await launchUrl(launchUri);
-    } else {
-      ToastEngine.show("Could not launch $launchUri");
-      throw 'Could not launch $launchUri';
-    }
+    PermissionEngine().requestCallPhonePermission(() async {
+      final Uri launchUri = Uri(
+        scheme: 'tel',
+        path: phoneNumber,
+      );
+
+      if (await canLaunchUrl(launchUri)) {
+        await launchUrl(launchUri);
+      } else {
+        ToastEngine.show("Could not launch $launchUri");
+        throw 'Could not launch $launchUri';
+      }
+    });
   }
 }

+ 2 - 2
packages/cpt_services/lib/components/chooseAirConditionContent_vm.dart

@@ -34,7 +34,7 @@ class ChooseAirConditionContentVm extends _$ChooseAirConditionContentVm {
           ..id = item['id']
           ..price = double.tryParse(item['price'] ?? '')
           ..name = item['name']
-          ..num = 1;
+          ..num = 0;
         airConditionListNew.add(newItem);
       });
       return ChooseAirConditionContentState(
@@ -76,7 +76,7 @@ class ChooseAirConditionContentVm extends _$ChooseAirConditionContentVm {
               ..id = item.id
               ..price = (item.price ?? 0.0).toDouble()
               ..name = item.name
-              ..num = 1;
+              ..num = 0;
             airConditionListNew.add(newItem);
           });
 

+ 16 - 13
packages/cpt_services/lib/components/chooseVisitTimeContent.dart

@@ -177,32 +177,35 @@ class ChooseVisitTimeContent extends HookConsumerWidget {
                   bottomRight: 10
                 ): const SizedBox.shrink(),
               ),
-              // 节假日
+              // 夜间
               Positioned(
-                right: 0,
-                top: 0,
-                child: holiday.value? MyTextView(
-                  'Holiday',
-                  textColor: ColorUtils.string2Color("#DD6800"),
+                left: 0,
+                bottom: 2,
+                child: night.value? MyTextView(
+                  'Night',
+                  textColor: ColorUtils.string2Color("#FE4066"),
                   fontSize: 8,
                   isFontRegular: true,
-                  backgroundColor:ColorUtils.string2Color("#FFEBD9"),
+                  backgroundColor: ColorUtils.string2Color("#FE4066").withOpacity(0.2),
                   paddingTop: 2,
                   paddingBottom: 2,
                   paddingLeft: 5,
                   paddingRight: 5,
                 ).clipRRect(
-                    topLeft: 10,
-                    bottomRight: 10
+                    topRight: 10,
+                    bottomLeft: 10
                 ): const SizedBox.shrink(),
               ),
+              // 节假日
               Positioned(
-                child: night.value? MyTextView(
-                  'Night',
-                  textColor: ColorUtils.string2Color("#DD6800"),
+                right: 0,
+                bottom: 2,
+                child: holiday.value? MyTextView(
+                  'Holiday',
+                  textColor: ColorUtils.string2Color("#37d7cc"),
                   fontSize: 8,
                   isFontRegular: true,
-                  backgroundColor:ColorUtils.string2Color("#FFEBD9"),
+                  backgroundColor:ColorUtils.string2Color("#68f1e7").withOpacity(0.2),
                   paddingTop: 2,
                   paddingBottom: 2,
                   paddingLeft: 5,

+ 1 - 0
packages/cpt_services/lib/components/chooseVisitTimeContent_vm.dart

@@ -171,6 +171,7 @@ class ChooseVisitTimeContentVm extends _$ChooseVisitTimeContentVm {
 
     final cleanDetailVm = ref.read(serviceCleanDetailVmProvider.notifier);
     // 结算当前所 预约的价格 (加急/节假日/夜间 等)所有选中的时间段 如果有 紧急、节假日、夜间 则需要加上相应价格
+    // 注意: 如果一个时间段同时设置了多种 预约类型(加急、节假日、夜间) 目前仅算了其中一个的费用 选择的顺序为 加急、节假日、夜间
     final extraCostItemList = state.allSelectedTimeList?.map((item) {
       if (item.urgent ?? false) {
         return cleanDetailVm?.state.urgentPrice ?? 0.0;

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

@@ -212,7 +212,6 @@ class HomeServicePage extends HookConsumerWidget {
             Log.d("点击了sort");
             vm.handlerClickSortIcon(context);
             expandSortIcon.value = !expandSortIcon.value;
-
           }),
 
           // 排序

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

@@ -490,6 +490,7 @@ class HomeServiceVm extends _$HomeServiceVm {
       onPickerChanged: (_, index) {
         state = state.copyWith(sortBySelectedOption: state.sortByOptionsList?[index]);
         // 调用list 接口
+        directRefresh();
       },
     );
   }

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

@@ -412,7 +412,6 @@ class RepairHomeServiceVm extends _$RepairHomeServiceVm {
       final result = await servicesRespositoryInstance.fetchServiceLiked(params);
       //校验成功失败
       if (result.isSuccess) {
-        Log.d("4444444");
         // 修改 该id 的 liked 和 likes_count 字段
         state.list!.forEach((RepairServiceList elementEntity) {
 
@@ -475,6 +474,7 @@ class RepairHomeServiceVm extends _$RepairHomeServiceVm {
       onPickerChanged: (_, index) {
         state = state.copyWith(sortBySelectedOption: state.sortByOptionsList?[index]);
         // 调用list 接口
+        directRefresh();
       },
     );
   }

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

@@ -368,7 +368,7 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
     int? card_id = item.id?? null;
     double card_score = (item.score?? 5.0).toDouble();
     String card_comment = item.comment??"";
-    List<String>? card_resources = item.resources??[];
+    List<String>? card_resources = (item.resources??[]).cast<String>();
     String card_created_at = item.createdAt??"";
     PaidServiceDetailEvaluationsAccount? account=item.account??null;
     String card_name = account?.name??"";
@@ -468,9 +468,11 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
       ) {
     final vm = ref.read(serviceCleanDetailVmProvider.notifier);
 
-    int? likes_count = 0;
-    bool isLiked = false;
-    final contact = '+8613563656325';
+    PaidServiceDetailMerchant? merchant = detailInfo?.merchant??null;
+    final contact = merchant?.contactPhone??"";
+
+    int? likes_count = likesCount?? 0;
+    bool isLiked = liked?? false;
 
     final _likes_count = useState<int>(likes_count!);
     final _isLiked = useState<bool>(isLiked);
@@ -508,7 +510,7 @@ class ServiceCleanDetailPage extends HookConsumerWidget {
                           Log.d('点击了like button');
                           int id = detailInfo.id!;
                           final isSuccess = await vm.handlerClickLikedBtn(context, id, true);
-                          if(isSuccess!=null && isSuccess){
+                          if(isSuccess!=null && isSuccess == true){
                             // 成功
                             if(_isLiked.value){
                               Log.d("取消点赞");

+ 34 - 23
packages/cpt_services/lib/modules/services/service_clean_detail/service_clean_detail_vm.dart

@@ -11,6 +11,7 @@ import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/permission/permission_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';
@@ -172,18 +173,20 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
 
   // 点击了底部的点赞按钮
   Future<bool?> handlerClickLikedBtn(BuildContext? context, int id, bool isLiked) async{
-    // var vm;
-    // if(_cleanServiceType == "forSale"){
-    //   // vm = ref.read(forsaleVmProvider.notifier);
-    // }else if(_cleanServiceType == "forRent"){
-    //   vm = ref.read(forrentVmProvider.notifier);
-    // }
-    // try {
-    //   final isSuccess = await vm.handlerClickCollection(id, isCollection);
-    //   return isSuccess;
-    // }catch(e){
-    //
-    // }
+    try {
+      Map<String, dynamic> params = {
+        "id": id,
+        "type": 'paid', // 类型(paid=付费服务,inquiry=询价服务)
+      };
+      final result = await serviceRespositoryInstance.fetchServiceLiked(params);
+      if(result.isSuccess){
+        return true;
+      }else{
+        return false;
+      }
+    }catch(e){
+      return false;
+    }
   }
 
   // 判断是whatsapp 还是 mobile  (通过 contact: whatsapp:+8617671757687)
@@ -240,17 +243,19 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
 
   // 拨打电话
   Future<void> makePhoneCall(String phoneNumber) async {
-    final Uri launchUri = Uri(
-      scheme: 'tel',
-      path: phoneNumber,
-    );
-
-    if (await canLaunchUrl(launchUri)) {
-      await launchUrl(launchUri);
-    } else {
-      ToastEngine.show("Could not launch $launchUri");
-      throw 'Could not launch $launchUri';
-    }
+    PermissionEngine().requestCallPhonePermission(() async {
+      final Uri launchUri = Uri(
+        scheme: 'tel',
+        path: phoneNumber,
+      );
+
+      if (await canLaunchUrl(launchUri)) {
+        await launchUrl(launchUri);
+      } else {
+        ToastEngine.show("Could not launch $launchUri");
+        throw 'Could not launch $launchUri';
+      }
+    });
   }
 
   // 点击了 Book Now 按钮
@@ -285,6 +290,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
     DialogEngine.show(
         tag: "chooseHouseClean",
         position: DialogPosition.bottom,
+        clickMaskDismiss:false,
         widget: DialogContentWrap(
           key: _chooseHouseCleanDialogGlobalKey,
           loadingState: dialogState,
@@ -300,6 +306,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
           // bottomBtnSectionPadding: EdgeInsets.only(left: 20, right: 20, bottom: 20,top: 20),
           yesBtnBg: context.appColors.redDefault,
           noBtnBg: context.appColors.grayBgE9,
+          closeIconColor: context.appColors.textPrimary,
           confirmTxt: "Confirm Selection",
           cancelTxt: "Cancel",
           // yesBtnTextStyle: TextStyle(
@@ -312,6 +319,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
           //   fontSize: 17,
           //   fontWeight: FontWeight.w400
           // ),
+          closeAction: (){},
           confirmAction: chooseHouseCleanConfirmFn,
           cancelAction: chooseHouseCleanCancelFn,
           titleBuilder: (context) {
@@ -335,6 +343,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
     DialogEngine.show(
       tag: "chooseAirConditionClean",
       position: DialogPosition.bottom,
+        clickMaskDismiss:false ,
       widget: DialogContentWrap(
         key: _chooseAirCleanDialogGlobalKey,
         loadingState: dialogState,
@@ -348,6 +357,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
         topLeftRadius: 20.0,
         topRightRadius: 20.0,
         // bottomBtnSectionPadding: EdgeInsets.only(left: 20, right: 20, bottom: 20,top: 20),
+        closeIconColor: context.appColors.textPrimary,
         yesBtnBg: context.appColors.redDefault,
         noBtnBg: context.appColors.grayBgE9,
         confirmTxt: "Confirm Selection",
@@ -363,6 +373,7 @@ class ServiceCleanDetailVm extends _$ServiceCleanDetailVm {
         //   fontWeight: FontWeight.w400
         // ),
         isConfirmAutoClose: false,
+        closeAction: () {},
         confirmAction: chooseAirConditionConfirmFn,
         cancelAction: chooseAirConditionCancelFn,
         titleBuilder: (context) {

+ 19 - 16
packages/cpt_services/lib/modules/services/service_repair_detail/service_repair_detail_vm.dart

@@ -5,6 +5,7 @@ import 'package:domain/entity/service_repair_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/permission/permission_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';
@@ -206,12 +207,9 @@ class ServiceRepairDetailVm extends _$ServiceRepairDetailVm {
   // 点击 whatsapp
   handlerClickWhatsapp(
       BuildContext? context, String contactType, String title, int price) {
-    // 假设你有一个获取 WhatsApp 号码的方法
     String whatsappNumber = getContactNumber(contactType); // 你需要实现这个方法
-    // 构建消息并进行编码
     String message = Uri.encodeComponent(
         "Hello, I am interested in your listing: $title for $price.");
-    // 打开WhatsApp
     openWhatsApp(whatsappNumber, message);
   }
 
@@ -230,28 +228,33 @@ class ServiceRepairDetailVm extends _$ServiceRepairDetailVm {
   handlerClickMobile(BuildContext? context, String contactType) {
     String mobileNumber = getContactNumber(contactType);
     // 拨打电话
-    makePhoneCall(mobileNumber);
+    PermissionEngine().requestCallPhonePermission(() async {
+      // 拨打电话
+      makePhoneCall(mobileNumber);
+    });
   }
 
   // 拨打电话
   Future<void> makePhoneCall(String phoneNumber) async {
-    final Uri launchUri = Uri(
-      scheme: 'tel',
-      path: phoneNumber,
-    );
-
-    if (await canLaunchUrl(launchUri)) {
-      await launchUrl(launchUri);
-    } else {
-      ToastEngine.show("Could not launch $launchUri");
-      throw 'Could not launch $launchUri';
-    }
+    PermissionEngine().requestCallPhonePermission(() async {
+      final Uri launchUri = Uri(
+        scheme: 'tel',
+        path: phoneNumber,
+      );
+
+      if (await canLaunchUrl(launchUri)) {
+        await launchUrl(launchUri);
+      } else {
+        ToastEngine.show("Could not launch $launchUri");
+        throw 'Could not launch $launchUri';
+      }
+    });
   }
 
   Future RepairServiceSubmit<T>(
       BuildContext context, int id) async {
     try {
-      Map<String, dynamic> params = {"service_id": id, "user_notes": ""};
+      Map<String, dynamic> params = {"service_id": id, "user_notes": "test"};
       final result =
           await serviceRespositoryInstance.fetchRepairServiceSubmit(params);
       if (result.isSuccess) {

+ 3 - 4
packages/cpt_services/lib/respository/services_respository.dart

@@ -132,8 +132,7 @@ class ServicesRespository {
     // headers["Accept"] = "application/x.yyjobs-api.v1+json";
 
     final result = await dioEngine.requestNetResult(
-      // ApiConstants.apiServerTime, // api 地址
-      '/api/v1/user/service/paid-service/liked', // api 地址
+      '/api/v1/user/service/like/click', // api 地址
       params: params,
       headers: headers,
       method: HttpMethod.POST,
@@ -146,9 +145,9 @@ class ServicesRespository {
     //根据返回的结果,封装原始数据为Bean/Entity对象
     if (result.isSuccess) {
       //重新赋值data或list
-      final json = result.getDataDynamic();
+      final boolData = result.getDataDynamic();
       //重新赋值data或list
-      return result.convert(data: json);
+      return result.convert(data: boolData);
     } else {
       if (result.errorMsg != null && result.errorMsg!.isNotEmpty) {
         ToastEngine.show("${result.errorMsg}");

+ 4 - 2
packages/cs_domain/lib/entity/paid_service_detail_entity.dart

@@ -16,7 +16,7 @@ class PaidServiceDetailEntity {
 	@JSONField(name: "holiday_price")
 	int? holidayPrice;
 	@JSONField(name: "night_price")
-	double? nightPrice;
+	int? nightPrice;
 	@JSONField(name: "service_period_start")
 	String? servicePeriodStart;
 	@JSONField(name: "service_period_end")
@@ -45,6 +45,8 @@ class PaidServiceDetailEntity {
 class PaidServiceDetailMerchant {
 	int? id;
 	String? name;
+	@JSONField(name: "contact_phone")
+	String? contactPhone;
 
 	PaidServiceDetailMerchant();
 
@@ -101,7 +103,7 @@ class PaidServiceDetailEvaluations {
 	int? id;
 	int? score;
 	String? comment;
-	List<String>? resources;
+	List<dynamic>? resources;
 	PaidServiceDetailEvaluationsAccount? account;
 	@JSONField(name: "created_at")
 	String? createdAt;

+ 14 - 6
packages/cs_domain/lib/generated/json/paid_service_detail_entity.g.dart

@@ -34,7 +34,7 @@ PaidServiceDetailEntity $PaidServiceDetailEntityFromJson(
   if (holidayPrice != null) {
     paidServiceDetailEntity.holidayPrice = holidayPrice;
   }
-  final double? nightPrice = jsonConvert.convert<double>(json['night_price']);
+  final int? nightPrice = jsonConvert.convert<int>(json['night_price']);
   if (nightPrice != null) {
     paidServiceDetailEntity.nightPrice = nightPrice;
   }
@@ -118,7 +118,7 @@ extension PaidServiceDetailEntityExtension on PaidServiceDetailEntity {
     String? highlight,
     int? urgentPrice,
     int? holidayPrice,
-    double? nightPrice,
+    int? nightPrice,
     String? servicePeriodStart,
     String? servicePeriodEnd,
     int? servicePeriodInterval,
@@ -160,6 +160,11 @@ PaidServiceDetailMerchant $PaidServiceDetailMerchantFromJson(
   if (name != null) {
     paidServiceDetailMerchant.name = name;
   }
+  final String? contactPhone = jsonConvert.convert<String>(
+      json['contact_phone']);
+  if (contactPhone != null) {
+    paidServiceDetailMerchant.contactPhone = contactPhone;
+  }
   return paidServiceDetailMerchant;
 }
 
@@ -168,6 +173,7 @@ Map<String, dynamic> $PaidServiceDetailMerchantToJson(
   final Map<String, dynamic> data = <String, dynamic>{};
   data['id'] = entity.id;
   data['name'] = entity.name;
+  data['contact_phone'] = entity.contactPhone;
   return data;
 }
 
@@ -175,10 +181,12 @@ extension PaidServiceDetailMerchantExtension on PaidServiceDetailMerchant {
   PaidServiceDetailMerchant copyWith({
     int? id,
     String? name,
+    String? contactPhone,
   }) {
     return PaidServiceDetailMerchant()
       ..id = id ?? this.id
-      ..name = name ?? this.name;
+      ..name = name ?? this.name
+      ..contactPhone = contactPhone ?? this.contactPhone;
   }
 }
 
@@ -285,8 +293,8 @@ PaidServiceDetailEvaluations $PaidServiceDetailEvaluationsFromJson(
   if (comment != null) {
     paidServiceDetailEvaluations.comment = comment;
   }
-  final List<String>? resources = (json['resources'] as List<dynamic>?)?.map(
-          (e) => jsonConvert.convert<String>(e) as String).toList();
+  final List<dynamic>? resources = (json['resources'] as List<dynamic>?)?.map(
+          (e) => e).toList();
   if (resources != null) {
     paidServiceDetailEvaluations.resources = resources;
   }
@@ -319,7 +327,7 @@ extension PaidServiceDetailEvaluationsExtension on PaidServiceDetailEvaluations
     int? id,
     int? score,
     String? comment,
-    List<String>? resources,
+    List<dynamic>? resources,
     PaidServiceDetailEvaluationsAccount? account,
     String? createdAt,
   }) {

+ 1 - 1
packages/cs_widgets/lib/my_cart_num.dart

@@ -6,7 +6,7 @@ class MyCartNum extends StatefulWidget {
   final int initialNum;
   final ValueChanged<int> onChange; // 添加回调函数
 
-  MyCartNum({Key? key, this.initialNum = 1, required this.onChange}) : super(key: key);
+  MyCartNum({Key? key, this.initialNum = 0, required this.onChange}) : super(key: key);
 
   @override
   _MyCartNumState createState() => _MyCartNumState();