Parcourir la source

[feat]新增配置,后台控制显示折扣页

云天逵 il y a 10 mois
Parent
commit
28dc9b91be

+ 6 - 0
lib/data/api/atmob_api.dart

@@ -1,6 +1,8 @@
+import 'package:clean/data/api/request/config_request.dart';
 import 'package:clean/data/api/request/order_pay_request.dart';
 import 'package:clean/data/api/request/order_status_request.dart';
 import 'package:clean/data/api/request/subscription_resume_request.dart';
+import 'package:clean/data/api/response/config_response.dart';
 import 'package:clean/data/api/response/order_pay_response.dart';
 import 'package:clean/data/api/response/order_status_response.dart';
 import 'package:clean/data/api/response/store_index_response.dart';
@@ -46,6 +48,10 @@ abstract class AtmobApi {
   Future<BaseResponse<WallpaperListResponse>> wallpaperList(
       @Body() BaseRequest request);
 
+  //获取配置信息
+  @POST("/project/clean/v1/confs")
+  Future<BaseResponse<ConfigResponse>> confs(@Body() ConfigRequest request);
+
 }
 
 final atmobApi = AtmobApi(defaultDio, baseUrl: Constants.baseUrl);

+ 16 - 0
lib/data/api/request/config_request.dart

@@ -0,0 +1,16 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../../base/base_request.dart';
+
+part 'config_request.g.dart';
+
+@JsonSerializable()
+class ConfigRequest extends BaseRequest {
+  @JsonKey(name: "confCodes")
+  List<String> confCodes;
+
+  ConfigRequest({required this.confCodes});
+
+  @override
+  Map<String, dynamic> toJson() => _$ConfigRequestToJson(this);
+}

+ 16 - 0
lib/data/api/response/config_response.dart

@@ -0,0 +1,16 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../bean/config_bean.dart';
+
+part 'config_response.g.dart';
+
+@JsonSerializable()
+class ConfigResponse {
+  @JsonKey(name: "list")
+  List<ConfigBean>? list;
+
+  ConfigResponse(this.list);
+
+  factory ConfigResponse.fromJson(Map<String, dynamic> json) =>
+      _$ConfigResponseFromJson(json);
+}

+ 19 - 0
lib/data/bean/config_bean.dart

@@ -0,0 +1,19 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'config_bean.g.dart';
+
+@JsonSerializable()
+class ConfigBean {
+  @JsonKey(name: 'confCode')
+  String confCode;
+
+  @JsonKey(name: 'value')
+  dynamic value;
+
+  ConfigBean(this.confCode, this.value);
+
+  factory ConfigBean.fromJson(Map<String, dynamic> json) =>
+      _$ConfigBeanFromJson(json);
+
+  Map<String, dynamic> toJson() => _$ConfigBeanToJson(this);
+}

+ 16 - 0
lib/data/bean/member_pop_up_bean.dart

@@ -0,0 +1,16 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'member_pop_up_bean.g.dart';
+
+@JsonSerializable()
+class MemberPopUpBean {
+  @JsonKey(name: "enable")
+  bool? enable;
+
+  MemberPopUpBean(this.enable);
+
+  factory MemberPopUpBean.fromJson(Map<String, dynamic> json) =>
+      _$MemberPopUpBeanFromJson(json);
+
+  Map<String, dynamic> toJson() => _$MemberPopUpBeanToJson(this);
+}

+ 43 - 0
lib/data/repositories/config_repository.dart

@@ -0,0 +1,43 @@
+import 'package:flutter/Material.dart';
+import 'package:get/get.dart';
+
+import '../../utils/async_util.dart';
+import '../../utils/http_handler.dart';
+import '../api/atmob_api.dart';
+import '../api/request/config_request.dart';
+import '../api/response/config_response.dart';
+import '../bean/member_pop_up_bean.dart';
+
+class ConfigRepository {
+  ConfigRepository._();
+
+  final enable = false.obs;
+
+  void refreshConfig() {
+    AsyncUtil.retry(() => requestConfigsData(), Duration(seconds: 3),
+            maxRetry: 100)
+        .then((configsResponse) {
+      final list = configsResponse.list;
+      if (list == null || list.isEmpty) {
+        debugPrint('refreshConfig....list is empty');
+        return;
+      }
+      if (list.first.value is Map<String, dynamic>) {
+        final memberPopUpBean =
+            MemberPopUpBean.fromJson(list.first.value as Map<String, dynamic>);
+        debugPrint(
+            'refreshConfig....memberPopUpBean: ${memberPopUpBean.toJson()}');
+        enable.value = memberPopUpBean.enable == true;
+        debugPrint('refreshConfig....enable: ${enable.value}');
+      }
+    });
+  }
+
+  Future<ConfigResponse> requestConfigsData() {
+    return atmobApi
+        .confs(ConfigRequest(confCodes: ['member_pop_up']))
+        .then(HttpHandler.handle(true));
+  }
+}
+
+final configRepository = ConfigRepository._();

+ 14 - 12
lib/module/home/home_controller.dart

@@ -20,6 +20,7 @@ import 'package:wechat_assets_picker/wechat_assets_picker.dart';
 
 import '../../data/api/response/user_info_response.dart';
 import '../../data/consts/event_report_id.dart';
+import '../../data/repositories/config_repository.dart';
 import '../../handler/event_handler.dart';
 
 class HomeController extends BaseController {
@@ -88,22 +89,23 @@ class HomeController extends BaseController {
       ToastUtil.show("Please enable the album permission");
     }
 
+    configRepository.refreshConfig();
     await userRepository.getUserInfo();
 
     if (userRepository.userInfo.value != null) {
-       Airbridge.setUserID(userRepository.userInfo.value!.ssid);
-
-       // 接收归因结果
-       Airbridge.setOnAttributionReceived((result) {
-         print(result);
-         Map<String, String> attr = <String, String>{};
-         attr["attributedChannel"] = "Appstore";
-         Airbridge.fetchDeviceUUID(onSuccess: (uuid) {
-            eventRepository.attrPush(uuid, "airbridge", jsonEncode(result));
-         });
-       });
+      Airbridge.setUserID(userRepository.userInfo.value!.ssid);
+
+      // 接收归因结果
+      Airbridge.setOnAttributionReceived((result) {
+        print(result);
+        Map<String, String> attr = <String, String>{};
+        attr["attributedChannel"] = "Appstore";
+        Airbridge.fetchDeviceUUID(onSuccess: (uuid) {
+          eventRepository.attrPush(uuid, "airbridge", jsonEncode(result));
+        });
+      });
     }
-    
+
     EventHandler.pushInstall();
 
     if (!isFirstIntoApp() && !userRepository.isVip()) {

+ 20 - 14
lib/module/store/store_controller.dart

@@ -2,6 +2,7 @@ import 'dart:io';
 
 import 'package:apple_pay/apple_pay.dart';
 import 'package:classify_photo/classify_photo.dart';
+import 'package:clean/data/repositories/config_repository.dart';
 import 'package:clean/data/repositories/user_repository.dart';
 import 'package:clean/module/store/payment_status_manager.dart';
 import 'package:clean/router/app_pages.dart';
@@ -25,7 +26,6 @@ import '../../sdk/pay/assist/product_type.dart';
 import '../../utils/toast_util.dart';
 
 class StoreController extends BaseController implements PaymentStatusCallback {
-
   final RxList<StoreItem> storeItems = <StoreItem>[].obs;
 
   final RxList<PaymentWay> paymentWays = <PaymentWay>[].obs;
@@ -48,31 +48,32 @@ class StoreController extends BaseController implements PaymentStatusCallback {
   void onReady() {
     EventHandler.report(EventId.event_02001);
     super.onReady();
-
   }
+
   @override
   void onClose() {
     // TODO: implement onClose
     super.onClose();
-    if (isFirstIntoStore() && !userRepository.isVip()) {
+    if (isFirstIntoStore() &&
+        !userRepository.isVip() &&
+        configRepository.enable.value) {
       Get.toNamed(RoutePath.discount);
       setFirstIntoStore(false);
     }
   }
 
-
   void initStoreIndexData() {
     LoadingDialog.showLoading();
     storeRepository.storeIndex().then((indexData) async {
       storeItems.clear();
       storeItems.addAll(indexData.items);
       currentSelectedStoreItem.value =
-      storeItems.isNotEmpty ? storeItems.first : null;
+          storeItems.isNotEmpty ? storeItems.first : null;
 
       paymentWays.clear();
       paymentWays.addAll(indexData.paymentWays);
       currentSelectedPaymentWay.value =
-      paymentWays.isNotEmpty ? paymentWays.first : null;
+          paymentWays.isNotEmpty ? paymentWays.first : null;
 
       var freeAppleId = "";
       for (var item in storeItems) {
@@ -117,7 +118,6 @@ class StoreController extends BaseController implements PaymentStatusCallback {
   }
 
   void onBuyClick() async {
-
     EventHandler.report(EventId.event_02002);
     StoreItem? storeItem = currentSelectedStoreItem.value;
     if (storeItem == null) {
@@ -134,8 +134,9 @@ class StoreController extends BaseController implements PaymentStatusCallback {
     LoadingDialog.showLoading();
     try {
       // OrderPayResponse response =
-      storeRepository.orderPay(storeItem.id, payPlatform, payMethod).then((response) async {
-
+      storeRepository
+          .orderPay(storeItem.id, payPlatform, payMethod)
+          .then((response) async {
         dynamic payInfo;
         String outTradeNo = response.outTradeNo;
         if (payPlatform == PayPlatform.apple) {
@@ -147,11 +148,14 @@ class StoreController extends BaseController implements PaymentStatusCallback {
               response.appAccountToken);
         }
 
-        final result = await ApplePay().purchase(productId: storeItem.appleGoodsId, appAccountToken: response.appAccountToken);
+        final result = await ApplePay().purchase(
+            productId: storeItem.appleGoodsId,
+            appAccountToken: response.appAccountToken);
         if (result["success"] == true) {
           var receipt = result['receipt'];
           print('购买成功: ${result['receipt']}');
-          checkPaymentStatus(outTradeNo, paymentWay, storeItem, receiptData: receipt);
+          checkPaymentStatus(outTradeNo, paymentWay, storeItem,
+              receiptData: receipt);
         } else {
           LoadingDialog.hide();
           ToastUtil.show("Pay Error, Please try again");
@@ -167,10 +171,11 @@ class StoreController extends BaseController implements PaymentStatusCallback {
     }
   }
 
-  void closeBackClick(){
+  void closeBackClick() {
     EventHandler.report(EventId.event_02003);
     Get.back();
   }
+
   // 检查恢复订阅结果
   Future<void> checkRestoreStatus(String? receiptData) async {
     PaymentWay? paymentWay = currentSelectedPaymentWay.value;
@@ -214,7 +219,8 @@ class StoreController extends BaseController implements PaymentStatusCallback {
   }
 
   @override
-  void onPaymentSuccess(String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
+  void onPaymentSuccess(
+      String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
     // TODO: implement onPaymentSuccess
     LoadingDialog.hide();
     ToastUtil.show("Pay success");
@@ -231,4 +237,4 @@ class StoreController extends BaseController implements PaymentStatusCallback {
     LoadingDialog.hide();
     ErrorHandler.toastError(error);
   }
-}
+}