import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart'; import 'package:flutter_datetime_picker_plus/src/datetime_picker_theme.dart' as picker_theme; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:fluwx/fluwx.dart'; import 'package:geolocator/geolocator.dart'; import 'package:huixiang/data/activity_details.dart'; import 'package:huixiang/data/address.dart'; import 'package:huixiang/data/base_data.dart'; import 'package:huixiang/data/base_list_data.dart'; import 'package:huixiang/data/down_order.dart'; import 'package:huixiang/data/launch_join_act.dart'; import 'package:huixiang/data/min_order_info.dart'; import 'package:huixiang/data/place_order_first.dart'; import 'package:huixiang/data/settle_order_info.dart'; import 'package:huixiang/data/shopping_cart.dart'; import 'package:huixiang/data/store_info.dart'; import 'package:huixiang/data/subscribe_param.dart'; import 'package:huixiang/data/wx_pay.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/min_api.dart'; import 'package:huixiang/settlement/settlement_model.dart'; import 'package:huixiang/settlement/settlement_view/activity_coupon_remarks.dart'; import 'package:huixiang/settlement/settlement_view/distribution.dart'; import 'package:huixiang/settlement/settlement_view/pay_method.dart'; import 'package:huixiang/settlement/settlement_view/settlement_activity.dart'; import 'package:huixiang/settlement/settlement_view/settlement_coupon.dart'; import 'package:huixiang/settlement/settlement_view/settlement_order_commodity.dart'; import 'package:huixiang/settlement/settlement_view/vip_discounts_select.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../view_widget/settlement_tips_dialog.dart'; class Settlement extends StatefulWidget { final arguments; Settlement({this.arguments}); @override State createState() { return _Settlement(); } } class _Settlement extends State { MinApiService? minService; Function(int type)? callback; StoreInfo? storeInfo; SettleOrderInfo? settleOrderInfo; MinOrderInfo? minOrderInfo; int selectedBtn = 0; String remakers = ""; String parentCode = ""; String? parentId = ""; int payChannel = 1; int tableId = 0; int numberOfPeople = 0; String? pageType; Address? address; CouponListBean? couponListBean; PromotionInfoListBean? promotion; String? mobile; bool placeOrder = false; String? actProductId; String? actProductSkuId; ActivityDetails? activityDetails; BargainType? bargainType = BargainType.BargainZBug; LaunchJoinAct? launchJoinAct; String? skuPrice1; JoinActivity? joinA = JoinActivity.GoJoin; String? bargainOrderId; String? productSkuId; int? count1 = 0; String? productId; bool orderButton = false; bool useVipPriceSelect = true; bool showVipTips = false; bool useBenefitSelect = true; bool isRaiseChannel = false; ShoppingCart? shopCarGoods; String? vipLevelName; bool? isVips = false; SubscribeParam? subscribeParam; String? reservationTime; String? subscribeStoresName; String? subTime; int storesIndex = 0; String? discountType; int diningStatus = 4; int vipSelect = 0; Fluwx fluwx = Fluwx(); @override void initState() { super.initState(); tableId = widget.arguments["tableId"] ?? 0; parentCode = widget.arguments["parentCode"] ?? ""; parentId = widget.arguments["parentId"] ?? ""; storeInfo = widget.arguments["storeInfo"]; numberOfPeople = widget.arguments["numberOfPeople"] ?? 0; promotions = widget.arguments["pName"] ?? ""; coupons = widget.arguments["cName"] ?? ""; pageType = widget.arguments["pageType"]; actProductId = widget.arguments["actProductId"]; actProductSkuId = widget.arguments["actProductSkuId"]; activityDetails = widget.arguments["activityDetails"]; bargainType = widget.arguments["bargainType"]; skuPrice1 = widget.arguments["skuPrice1"]; joinA = widget.arguments["joinA"]; bargainOrderId = widget.arguments["bargainOrderId"]; productSkuId = widget.arguments["productSkuId"]; count1 = widget.arguments["buyNum"]; productId = widget.arguments["productId"]; shopCarGoods = widget.arguments["shoppingCart"]; vipLevelName = widget.arguments["vipLevelName"]; isVips = widget.arguments["isVips"]; subscribeParam = widget.arguments["subscribeParam"] ?? null; if (tableId == 0) { placeOrder = true; } SharedPreferences.getInstance().then((value) { String minToken = value.getString("minToken") ?? ""; String tenant = value.getString("tenant") ?? ""; String storeId = value.getString("storeId") ?? ""; minService = MinApiService(Dio(), context: context, token: minToken, tenant: tenant, storeId: storeId, showLoading: false); queryMemberInfo(); if (widget.arguments["pid"] != null && widget.arguments["pid"] != "" && tableId <= 0) { queryOrderInfo( address != null ? address!.id : null, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, 0, 0, widget.arguments["pid"] ?? (productId ?? 0), productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } else if (widget.arguments["cid"] != null && widget.arguments["cid"] != "" && tableId <= 0) { queryOrderInfo( address != null ? address!.id : null, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, widget.arguments["cid"] ?? 0, 0, productId ?? 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } else queryOrderInfo( null, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && !(subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, 0, 0, productId ?? 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // (useVipPriceSelect == true && isVips) ? false:useBenefitSelect, count1, payChannel, tableId); }); fluwx.addSubscriber((response) { print("payCallback: ${response.errCode}"); toOrderDetails(placeOrderFirst?.id); }); } ///订单结算信息 queryOrderInfo(addressId, isTake, memberCouponId, orderId, promotionId, productSkuId, actProductId, actProductSkuId, discountType, buyNum, payChannel, tableId) async { try { SmartDialog.showLoading( msg: S.current.zhengzaijiazai, ); BaseData? baseData = await minService?.getOrderInfo({ "addressId": addressId, "isTake": isTake, "memberCouponId": memberCouponId, "orderId": orderId, "promotionId": promotionId, "productSkuId": productSkuId, "actProductId": actProductId, "actProductSkuId": actProductSkuId, "discountType": discountType, // "useVipPrice":useVipPriceSelect, // "useBenefit": useBenefitSelect, "buyNum": buyNum, "payChannel": payChannel, "tableId": tableId }).catchError((error) {}); this.promotion = null; promotions = ""; this.couponListBean = null; coupons = ""; if (baseData?.isSuccess ?? false) { settleOrderInfo = baseData!.data; if (settleOrderInfo?.promotionId?.isNotEmpty ?? false) { settleOrderInfo?.promotionInfoList?.forEach((element) { if (element.id == settleOrderInfo!.promotionId) { this.promotion = element; promotions = promotion?.name ?? ""; } }); } if (settleOrderInfo?.memberCouponId?.isNotEmpty ?? false) { settleOrderInfo?.couponList?.forEach((element) { if (element.id == settleOrderInfo?.memberCouponId) { this.couponListBean = element; coupons = couponListBean?.promotionName ?? ""; } }); } if (settleOrderInfo?.orderProductList?.length == 0) { placeOrder = true; queryOrderDetails(pageType != null ? widget.arguments["orderId"] : parentId); } if (!isRaiseChannel && (tableId > 0 ? (minOrderInfo?.isRaise ?? false) : (settleOrderInfo?.isRaise ?? false))) { isRaiseChannel = true; queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, couponListBean?.id, 0, promotion?.id ?? productId, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "NONE", // useVipPriceSelect, // useBenefitSelect, count1, (tableId > 0 ? (minOrderInfo?.isRaise ?? false) : (settleOrderInfo?.isRaise ?? false)) ? 7 : payChannel, tableId); } } else { SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } finally { setState(() {}); SmartDialog.dismiss(); } } ///会员信息 queryMemberInfo() async { BaseData? baseData = await minService?.memberInfo().catchError((error) { debugPrint("${error}"); }); if (baseData?.isSuccess ?? false) { SharedPreferences.getInstance().then( (value) => { value.setString('minMember', jsonEncode(baseData!.data)), }, ); } } ///查看订单详情 queryOrderDetails(id) async { SmartDialog.showLoading( msg: S.current.zhengzaijiazai, ); BaseData? baseData = await minService?.getOrderDetails({ "id": pageType != null ? widget.arguments["orderId"] : id ?? parentId, }).catchError((error) {}); if (baseData?.isSuccess ?? false) { setState(() { minOrderInfo = baseData!.data; coupons = minOrderInfo?.couponName ?? ""; }); SmartDialog.dismiss(); } else { SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); SmartDialog.dismiss(); } } ///取消优惠券 queryCancelMemberCoupon(orderId) async { BaseData? baseData = await minService?.cancelMemberCoupon(orderId).catchError((error) {}); if (baseData?.isSuccess ?? false) { queryOrderDetails(parentId); // SmartDialog.showToast(baseData.data, alignment: Alignment.center); } else { SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } ///使用该优惠券 queryUseMemberCoupon(memberCouponId) async { BaseData? baseData = await minService?.useMemberCoupon({ "memberCouponId": memberCouponId, "orderId": parentId, "phone": minOrderInfo?.orderInfoVo?.memberVO?.phone }).catchError((error) {}); if (baseData?.isSuccess ?? false) { queryOrderDetails(parentId); } else { SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } queryAddress(int selectedBtn) async { setState(() { this.selectedBtn = selectedBtn; }); if (address != null) { queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, null, 0, productId ?? null, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); return; } BaseListData
? baseDate = await minService?.queryAddress().catchError((error) { return BaseListData
()..isSuccess = false; }); Position? bmfCoordinate = Position( latitude: double.tryParse(storeInfo?.latitude ?? "")!, longitude: double.tryParse(storeInfo?.longitude ?? "")!, timestamp: DateTime.now(), accuracy: 0, altitude: 0, heading: 0, speed: 0, speedAccuracy: 0); if ((baseDate?.isSuccess ?? false) && (baseDate?.data ?? []).isNotEmpty) { setState(() { address = baseDate!.data![0]; }); for (int i = 1; i < baseDate!.data!.length; i++) { Address? address1 = baseDate.data![i]; Position? coordinate = Position( // COMMON->BD09LL longitude: double.tryParse(address?.longitude ?? "")!, latitude: double.tryParse(address?.latitude ?? "")!, timestamp: DateTime.now(), accuracy: 0, altitude: 0, heading: 0, speed: 0, speedAccuracy: 0); Position? coordinate1 = Position( // COMMON->BD09LL longitude: double.tryParse(address1.longitude ?? "")!, latitude: double.tryParse(address1.latitude ?? "")!, timestamp: DateTime.now(), accuracy: 0, altitude: 0, heading: 0, speed: 0, speedAccuracy: 0); double mi = Geolocator.distanceBetween( bmfCoordinate.latitude, bmfCoordinate.longitude, coordinate.latitude, coordinate.longitude, ); double mi1 = Geolocator.distanceBetween( bmfCoordinate.latitude, bmfCoordinate.longitude, coordinate1.latitude, coordinate1.longitude, ); if (mi1 < mi) { address = address1; } } await queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, null, 0, productId ?? null, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } } ///选择收货地址 selectedAddress(String addId) async { BaseListData
? baseDate = await minService?.queryAddress().catchError((error) {}); if (baseDate?.isSuccess ?? false) { setState(() { baseDate!.data?.forEach((element) { if (element.id == addId) address = element; }); }); queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, 0, 0, productId ?? 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } } PlaceOrderFirst? placeOrderFirst; DownOrder? downOrder; ///发起活动 queryLaunchAct() async { BaseData? baseData = await minService?.launchAct({ "actProductId": activityDetails?.actProduct?.id, "actRecordId": 0, "actTemplateId": activityDetails?.actProduct?.templateId, "actTimeId": activityDetails?.actProduct?.timeId, "addressId": address == null ? null : address!.id, "isDirectBuy": (bargainType == BargainType.BargainBug || bargainType == BargainType.CollageBug) ? false : true, "getType": selectedBtn, "productId": activityDetails?.actProduct?.productId, "skuId": actProductSkuId ?? "", "skuPrice": settleOrderInfo?.price, "templateType": pageType, }).catchError((error) {}); if (baseData?.isSuccess ?? false) { setState(() { launchJoinAct = baseData!.data; if (bargainType == BargainType.BargainBug) { toBargain(); } else { activityPay(); } }); } else { if ((activityDetails?.actProduct?.productStock ?? 0) == 0) SmartDialog.showToast("活动商品售罄", alignment: Alignment.center); } } ///参与活动 queryJoinAct() async { BaseData? baseData = await minService?.joinAct({ "actProductId": activityDetails?.actProduct?.id, "actRecordId": widget.arguments["indexP"], "actTemplateId": activityDetails?.actProduct?.templateId, "actTimeId": activityDetails?.actProduct?.timeId, "addressId": address == null ? null : address!.id, "isDirectBuy": (bargainType == BargainType.BargainBug || bargainType == BargainType.CollageBug) ? false : true, "getType": selectedBtn, "productId": activityDetails?.actProduct?.productId, "skuId": actProductSkuId ?? "", "skuPrice": skuPrice1, "templateType": pageType }).catchError((error) {}); if (baseData?.isSuccess ?? false) { launchJoinAct = baseData!.data; activityPay(); } else { SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } ///小程序下单 queryPlaceOrderFirst() async { try { SmartDialog.showLoading( msg: S.current.zhengzaijiazai, ); // for (int i = 0; i < settleOrderInfo.orderProductList.length; i++) { // settleOrderInfo.orderProductList.forEach((element1) { // if (settleOrderInfo.orderProductList[i].productId == // element1.productId) { // settleOrderInfo.orderProductList[i].skuId = element1.skuId; // } // }); // } if (settleOrderInfo == null || storeInfo == null) { return; } placeOrderFirst = PlaceOrderFirst(); placeOrderFirst!.cartNum = settleOrderInfo!.orderNum; placeOrderFirst?.cartSum = settleOrderInfo?.price; placeOrderFirst?.addressId = address == null ? null : address!.id; placeOrderFirst?.isSubscribe = ((subscribeParam?.isEnableSubscribe ?? false) == true) ? true : false; //是否预约 placeOrderFirst?.isTakeOut = ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && !(subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn; placeOrderFirst?.notes = remakers + (reservationTime ?? "") + ((subscribeParam?.isEnableSubscribe ?? false) == true ? "预约门店:${((subscribeParam?.stores?.length ?? 0) == 1 ? (subscribeParam?.stores?[0]) : (subscribeStoresName ?? ""))}" : ""); placeOrderFirst?.numberOfPeople = "$numberOfPeople"; placeOrderFirst?.orderSource = 2; placeOrderFirst?.orderType = "0"; placeOrderFirst?.orderTypeId = 0; placeOrderFirst?.parentCode = parentCode; // 火锅加菜 placeOrderFirst?.parentId = parentId; // 火锅加菜 placeOrderFirst?.payChannel = ((placeOrderFirst?.cartSum == "0.00") ? payChannel = 0 : ((tableId > 0 ? (minOrderInfo?.isRaise ?? false) : (settleOrderInfo?.isRaise ?? false)) ? 7 : payChannel)); placeOrderFirst?.promotionInfoDTO = PromotionInfoDTOBean(); placeOrderFirst?.promotionInfoDTO?.promotionId = (tableId <= 0) ? (promotion?.id ?? "") : ""; // : widget.arguments["pid"] ?? ""; placeOrderFirst?.promotionInfoDTO?.couponId = (tableId <= 0) ? (couponListBean?.id ?? "") : ""; // : widget.arguments["cid"] ?? ""; // placeOrderFirst.promotionInfoDTO.useVipPrice = (settleOrderInfo.isRaise || payChannel == 5 || ((payChannel == 4 && (settleOrderInfo.usePlateMoney == false))) ) ? false : useVipPriceSelect; // placeOrderFirst.promotionInfoDTO.useBenefit = (settleOrderInfo.isRaise || payChannel == 5 || ((payChannel == 4 && settleOrderInfo.usePlateMoney == false))) ? false : useBenefitSelect; placeOrderFirst?.promotionInfoDTO?.discountType = (!placeOrder) ? "AUTO" : settleOrderInfo?.discountType ?? ""; placeOrderFirst?.recMobile = (mobile?.isNotEmpty ?? false) ? mobile! : storeInfo!.headMobile; placeOrderFirst?.shoppingCartSkuItemList = settleOrderInfo!.orderProductList; placeOrderFirst?.skuItemDTOList = []; placeOrderFirst?.source = 1; placeOrderFirst?.storeId = storeInfo!.id; placeOrderFirst?.subcribeTime = subTime ?? ""; //预约时间 placeOrderFirst?.tableId = "$tableId"; for (int i = 0; i < (shopCarGoods?.shoppingCartSkuItemList?.length ?? 0); i++) { placeOrderFirst?.shoppingCartSkuItemList?[i].setMealDataList = shopCarGoods!.shoppingCartSkuItemList?[i].setMealDataList; } if (tableId == 0) { ///正常的商店下单 BaseData? baseData = await minService ?.placeOrderFirst(placeOrderFirst!.toJson()) .catchError((error) { print("error: $error"); }); if (baseData?.isSuccess ?? false) { placeOrder = true; this.downOrder = DownOrder.fromJson(baseData!.data); await querySettlement(); } else { // orderButton = false; SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } else { ///火锅店下单, 等待结算 BaseData? baseData; if (placeOrder) { // 结算 querySettlement(); return; } else { if (parentId == "") { // 下单 baseData = await minService ?.placeOrderFirst(placeOrderFirst!.toJson()) .catchError((error) { print("error: $error"); }); } else { //加菜 baseData = await minService ?.addOrder(placeOrderFirst!.toJson()) .catchError((error) { print("error: $error"); }); } } // orderButton = false; if (baseData?.isSuccess ?? false) { placeOrder = true; this.downOrder = DownOrder.fromJson(baseData!.data); if (this.downOrder != null) { parentId = this.downOrder?.id ?? this.downOrder!.parentId; queryOrderDetails(parentId); setState(() {}); } } else { // orderButton = false; SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } } } finally { SmartDialog.dismiss(); } } ///结算 querySettlement() async { if (placeOrderFirst == null || (minOrderInfo == null && settleOrderInfo == null) || downOrder == null) { return; } placeOrderFirst?.id = ((parentId?.isNotEmpty ?? false) ? parentId : downOrder?.id); placeOrderFirst?.orderProductVOList = ((downOrder == null) ? (minOrderInfo!.orderProductVOList ?? settleOrderInfo!.orderProductList) : downOrder!.orderProductVOList); if (placeOrderFirst?.payChannel == 1) { // if (Platform.isAndroid) { // if (!(await Min.isInitialize())) { // // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调, // // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针, // // 故而在此初始化一下 // await Min.initialize(); // } // } BaseData? baseData = await minService ?.settlementWx(placeOrderFirst!.toJson()) .catchError((error) { print(error); }); // orderButton = false; if (baseData?.isSuccess ?? false) { WxPay? wxPay = baseData!.data; if (wxPay?.isAnyEmpty() ?? true) { return; } await fluwx.registerApi( appId: wxPay!.appId!, doOnAndroid: true, universalLink: "https://hx.lotus-wallet.com/app/", ); fluwx.pay( which: Payment( appId: wxPay.appId!, partnerId: wxPay.partnerId!, prepayId: wxPay.prepayId!, packageValue: wxPay.packageValue!, nonceStr: wxPay.nonceStr!, timestamp: int.tryParse(wxPay.timeStamp!) ?? 0, sign: wxPay.sign!, )); } else { SmartDialog.dismiss(); SmartDialog.showToast("${baseData?.msg}", alignment: Alignment.center); Future.delayed(Duration(seconds: 2), () { toOrderDetails(placeOrderFirst!.id); }); } } else { BaseData? baseData = await minService ?.settlementApi(placeOrderFirst!.toJson()) .catchError((error) { print(error); }); // orderButton = false; if (baseData?.isSuccess ?? false) { // SmartDialog.showToast(baseData.data, alignment: Alignment.center); toOrderDetails(placeOrderFirst!.id); } else { SmartDialog.show( clickMaskDismiss: false, builder: (context) { return SettlementTips( () { toOrderDetails(placeOrderFirst!.id); }, text: "${baseData?.msg}", ); }, ); } } } ///活动结算 activityPay() async { if (payChannel == 1) { // if (Platform.isAndroid) { // if (!(await Min.isInitialize())) { // // 小程序的微信支付和app的充值支付使用同一个WXPayEntryActivity回调, // // 然而充值时小程序未初始化会导致回调内部代码调用getPackage空指针, // // 故而在此初始化一下 // await Min.initialize(); // } // } BaseData? baseData = await minService?.actPay({ "orderId": bargainOrderId != null ? bargainOrderId! : launchJoinAct?.orderId, "payChannel": placeOrderFirst!.payChannel }).catchError((error) { print(error); }); if (baseData?.isSuccess ?? false) { WxPay? wxPay = baseData!.data; if (wxPay?.isAnyEmpty() ?? true) { return; } await fluwx.registerApi( appId: wxPay!.appId!, doOnAndroid: true, universalLink: "https://hx.lotus-wallet.com/app/", ); fluwx.pay( which: Payment( appId: wxPay.appId!, partnerId: wxPay.partnerId!, prepayId: wxPay.prepayId!, packageValue: wxPay.packageValue!, nonceStr: wxPay.nonceStr!, timestamp: int.tryParse(wxPay.timeStamp!) ?? 0, sign: wxPay.sign!, )); } } else { BaseData? baseData = await minService?.actPay({ "orderId": bargainOrderId != null ? bargainOrderId : launchJoinAct?.orderId, "payChannel": payChannel }).catchError((error) { print(error); }); if (baseData?.isSuccess ?? false) { toOrderDetails( bargainOrderId != null ? bargainOrderId! : launchJoinAct?.orderId); } else { SmartDialog.show(builder: (ctx) { return SettlementTips( () { toOrderDetails(bargainOrderId != null ? bargainOrderId! : launchJoinAct?.orderId); }, text: "${baseData?.msg}", ); }); } } } toOrderDetails(String? orderId) { if (orderId == null) { return; } SmartDialog.dismiss(); Navigator.of(context).pushReplacementNamed( '/router/order_details', arguments: { "id": orderId, //原结算页跳转详情无需正在加载样式,因为,结算页支付成功会显示一个“订单支付成功”的toast,避免两者重叠显示;现在据要求,去掉toast,故而需要显示正在加载样式;1不需要加载,2需要加载 "jumpState": 2, }, ); // Navigator.of(context).pop(); } ///去砍价详情页面 toBargain() async { await Navigator.of(context) .pushReplacementNamed('/router/bargain_details', arguments: { "actRecordId": launchJoinAct?.actRecordId, // "limitNumber": limitNumber, "storeInfo": storeInfo, }); } @override Widget build(BuildContext context) { return Container( color: Colors.white, child: Stack( children: [ Container( // height: 175.h, // color: Color(0xFF3A405A), // width: MediaQuery.of(context).size.width, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: AssetImage("assets/image/settlement_bg.webp"), ), ), width: double.infinity, height: 375.h, ), Scaffold( backgroundColor: Colors.transparent, appBar: MyAppBar( background: Colors.transparent, leadingColor: Colors.white, title: S.of(context).dingdanjiesuan, titleColor: Colors.white, systemUiOverlayStyle: SystemUiOverlayStyle.dark, titleSize: 18.sp, ), body: Container( child: Column( children: [ Expanded( child: Container( child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( child: Column( children: [ DistributionMode( (addressId, isTake, memberCouponId, orderId, String? promotionId) { setState(() { this.selectedBtn = 0; }); queryOrderInfo( addressId, ((storeInfo?.pickupType ?.dineInTakeStatus ?? false) && (subscribeParam ?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, memberCouponId, orderId, promotionId ?? (productId ?? 0), productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "AUTO", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId ?? 0); }, queryAddress, storeInfo, address, selectedAddress, pageType, widget.arguments["distance"], ), SizedBox( height: 16.h, ), ///堂食/打包 if ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && !(subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) takeStatus(), /// 预留的手机号, 可修改 // EditPhoneWidget( // storeInfo, // mobileChange, // ), ///订单商品 if (settleOrderInfo != null || minOrderInfo != null) SettlementOrderCommodity( selectedBtn, diningStatus, settleOrderInfo, minOrderInfo, tableId, pageType, (coupons != "" || promotions != "") ? false : useVipPriceSelect, this.showVipTips, useBenefitSelect, placeOrder, ), ///会员优惠选择 if ((settleOrderInfo != null || minOrderInfo != null) && (placeOrder && tableId <= 0 && !(settleOrderInfo?.isRaise ?? false))) VipDiscountsSelect( vipSelectCheck, settleOrderInfo, minOrderInfo, payChannel, storeInfo,), ///优惠券/备注/会员优惠金额 if (settleOrderInfo != null || minOrderInfo != null) ActivityCouponRemarks( couponCart, activityCart, settleOrderInfo, minOrderInfo, coupons, promotions, couponCount(), placeOrder, remakers, () { Navigator.of(context).pushNamed( '/router/edit_remarks_page', arguments: { "remake": remakers }).then((value) => { setState(() { if (value != null) remakers = value as String; }) }); }, tableId, vipPriceSelect, () { setState(() { this.showVipTips = true; }); }, vipBenefitSelect, payChannel, vipLevelName, subscribeParam, showDateSelector, reservationTime, showAlertDialog, subscribeStoresName, ), if (placeOrder && joinA != JoinActivity.BargainBug) ///支付方式 PayMethod( payChannelCheck, coupons, promotions, useVipPriceSelect, settleOrderInfo, useBenefitSelect, tableId, minOrderInfo, ), ], ), ), ), ), flex: 1, ), Container( height: 58.h, decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Color(0x08213303).withAlpha(12), offset: Offset(0, -1), blurRadius: 8, spreadRadius: 0, ), ], ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Spacer(), Text( S.of(context).heji, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), Text( (minOrderInfo != null ? "¥${minOrderInfo!.finalPayPrice}" : "¥${settleOrderInfo == null ? "0" : settleOrderInfo!.price}"), style: TextStyle( fontSize: 20.sp, fontWeight: MyFontWeight.medium, fontFamily: 'JDZhengHT', color: Color(0xFF32A060), ), ), SizedBox( width: 28, ), RoundButton( width: 88.w, height: 32.h, radius: 16, text: joinA == JoinActivity.BargainBug ? "发起砍价" : (placeOrder ? "提交订单" : "下单"), textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFF32A060), fontSize: 15.sp, padding: EdgeInsets.symmetric( vertical: 5.h, ), callback: () { // if (orderButton) { // SmartDialog.showToast("订单正在提交中...", // alignment: Alignment.center); // return; // } else // orderButton = true; if (((subscribeParam?.isEnableSubscribe ?? false)) && (((subscribeParam?.stores?.length == 1 ? subscribeParam?.stores![0] : subscribeStoresName) == null))) { SmartDialog.showToast( (reservationTime == null) ? S.of(context).qingxuanzeyuyeushijian : S.of(context).qingxuanzeyuyuemendian, alignment: Alignment.center); return; } pageType != null ? bargainOrderId != null ? activityPay() : joinA == JoinActivity.GoJoin ? queryJoinAct() : queryLaunchAct() : queryPlaceOrderFirst(); }, ), SizedBox( width: 17, ) ], ), ), ], ), ), ) ], ), ); } ///堂食/打包外带选择 Widget takeStatus() { return Container( decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Color(0x0D000000), offset: Offset(0, 1), blurRadius: 8, spreadRadius: 0, ), ], borderRadius: BorderRadius.circular(8), ), margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 6.h, bottom: 6.h), padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.h), child: Row( children: [ Expanded( child: GestureDetector( onTap: () { if (settleOrderInfo == null) { return; } setState(() { diningStatus = 4; queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && !(subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : couponListBean?.id, 0, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : promotion?.id ?? productId, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", ((promotion?.id ?? productId ?? "") != "") ? "ACTIVITY" : ((couponListBean?.id ?? "") != "" ? "COUPON" : "AUTO"), // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); }); }, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(6)), border: Border.all( width: diningStatus == 4 ? 2.w : 1.w, color: diningStatus == 4 ? Color(0xFF32A060) : Color(0xFFDEDEDE), style: BorderStyle.solid, ), color: diningStatus == 4 ? Color(0xFFEEFFF5) : Color(0xFFFFFFFF), ), padding: EdgeInsets.only(top: 11.h, bottom: 14.h), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/home_he.webp", fit: BoxFit.fill, width: 21.w, height: 31.h, ), SizedBox( width: 10.w, ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( S.of(context).tangshi, style: TextStyle( color: Color(0xFF353535), fontSize: 14.sp, fontWeight: FontWeight.bold, ), ), SizedBox( height: 6.h, ), Text( S.of(context).dianneiyongcan, style: TextStyle( color: Color(0xFF32A060), fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), ], ) ], ), ), ), ), SizedBox( width: 12.w, ), Expanded( child: GestureDetector( onTap: () { if (settleOrderInfo == null) { return; } setState(() { diningStatus = 3; queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : couponListBean?.id, 0, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : promotion?.id ?? productId, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", ((promotion?.id ?? productId ?? "") != "") ? "ACTIVITY" : ((couponListBean?.id ?? "") != "" ? "COUPON" : "AUTO"), // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); }); }, child: Container( alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(6)), border: Border.all( width: diningStatus == 3 ? 2.w : 1.w, color: diningStatus == 3 ? Color(0xFF32A060) : Color(0xFFDEDEDE), style: BorderStyle.solid, ), color: diningStatus == 3 ? Color(0xFFEEFFF5) : Color(0xFFFFFFFF), ), padding: EdgeInsets.only(top: 11.h, bottom: 14.h), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/dining_w.webp", fit: BoxFit.fill, width: 24.w, height: 26.h, ), SizedBox( width: 9.w, ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( S.of(context).waidai, style: TextStyle( color: Color(0xFF353535), fontSize: 14.sp, fontWeight: FontWeight.bold, ), ), SizedBox( height: 6.h, ), Text( S.of(context).dabaodaodianqu, style: TextStyle( color: Color(0xFF32A060), fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), ], ) ], ), ), ), ), ], ), ); } ///会员优惠选择 vipSelectCheck(int vipSelect) { this.vipSelect = vipSelect; if (tableId > 0) { queryOrderDetails(parentId); } else { queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, 0, 0, productId ?? 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", vipSelectType(), count1, payChannel, tableId); } } String vipSelectType() { if (vipSelect == 1) return "MEMBER_RANK"; if (vipSelect == 2) { return "SURPRISE"; } else if (vipSelect == 3) { return "VIP"; } else { return "AUTO"; } } payChannelCheck(int payChannel) { this.payChannel = payChannel; if (tableId > 0) { queryOrderDetails(parentId); } else { if (settleOrderInfo == null) { return; } queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : couponListBean?.id, 0, ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) ? "" : widget.arguments["pid"] ?? (promotion?.id ?? productId), productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", // (settleOrderInfo.isRaise || payChannel == 5) // ? "NONE" // : ((useVipPriceSelect == false && // couponListBean?.id != "" && // ((promotion?.id ?? productId) != "")) // ? "MEMBER_RANK" // : (isVips == false) // ? "MEMBER_RANK" // : "AUTO"), preferentialType(), // (settleOrderInfo.isRaise || payChannel == 5 || ((payChannel == 4 && settleOrderInfo.usePlateMoney == false))) ? false :useVipPriceSelect, // (settleOrderInfo.isRaise || payChannel == 5 || ((payChannel == 4 && settleOrderInfo.usePlateMoney == false)) || useVipPriceSelect == true) ? false :useBenefitSelect, count1, payChannel, tableId); } } String preferentialType() { if (settleOrderInfo == null) { return "AUTO"; } if ((settleOrderInfo!.isRaise ?? false) || payChannel == 5) return "NONE"; if (settleOrderInfo!.discountType == "ACTIVITY") { return "ACTIVITY"; } else if (settleOrderInfo!.discountType == "COUPON") { return "COUPON"; } else if (settleOrderInfo!.discountType == "SURPRISE") { return "SURPRISE"; } else if (settleOrderInfo!.discountType == "MEMBER_RANK" || settleOrderInfo!.discountType == "SURPRISE") { return "MEMBER_RANK"; } else if (settleOrderInfo!.discountType == "VIP") { return "VIP"; } else { return "AUTO"; } } vipPriceSelect(bool useVipPriceSelect) { this.useVipPriceSelect = useVipPriceSelect; if (tableId > 0) { queryOrderDetails(parentId); } else { queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, 0, 0, productId ?? 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", (useVipPriceSelect == true) ? "VIP" : "MEMBER_RANK", // useVipPriceSelect, // useVipPriceSelect == true ? false :useBenefitSelect, count1, payChannel, tableId); } } ///会员等级选择 vipBenefitSelect(bool useBenefitSelect) { this.useBenefitSelect = useBenefitSelect; if (tableId > 0) { queryOrderDetails(parentId); } else { queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) == true && (subscribeParam?.isEnableSubscribe ?? false) == false && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, null, 0, productId ?? null, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", "MEMBER_RANK", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } } mobileChange(String mobile) { this.mobile = mobile; } int couponCount() { if (settleOrderInfo?.couponList?.isEmpty ?? true) return 0; int count = 0; settleOrderInfo!.couponList?.forEach((element) { if (element.tenantCode == "") { count++; } }); return count; } String coupons = ""; String promotions = ""; ///优惠券弹窗 couponCart() async { CouponListBean couponBean = await showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return SettlementCoupon( settleOrderInfo, minOrderInfo, tableId, storeInfo, couponBean: couponListBean, ); }, ); // if (couponBean != null) { // this.couponListBean = couponBean; // coupons = couponListBean?.promotionName ?? ""; // promotions = ""; // this.promotion = null; if (tableId > 0) { queryUseMemberCoupon(couponBean.id); } else { queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && (subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, ((couponBean.id ?? 0) == 0 && (promotion?.id ?? productId ?? 0) != 0) ? 0 : couponBean.id, 0, ((couponBean.id ?? 0) == 0 && (promotion?.id ?? productId ?? 0) != 0) ? promotion?.id ?? productId : 0, productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", (couponBean.id ?? 0) == 0 ? ((promotion?.id ?? productId ?? 0) != 0 ? "ACTIVITY" : "AUTO") : "COUPON", // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } // } } ///活动弹窗 activityCart() async { // if (couponListBean != null) return; PromotionInfoListBean? pro = await showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return SettlementActivity(settleOrderInfo, storeInfo); }, ); // if (pro != null) { // this.promotion = pro; // promotions = promotion?.name ?? ""; // coupons = ""; // this.couponListBean = null; queryOrderInfo( address?.id, ((storeInfo?.pickupType?.dineInTakeStatus ?? false) && (subscribeParam?.isEnableSubscribe ?? false) && selectedBtn != 1 && selectedBtn != 2) ? diningStatus : selectedBtn, (((pro?.id ?? 0) ?? (productId ?? 0)) == 0 && (couponListBean?.id ?? 0) != 0) ? couponListBean?.id : 0, 0, (((pro?.id ?? 0) ?? (productId ?? 0)) == 0 && (couponListBean?.id ?? 0) != 0) ? 0 : ((pro?.id ?? 0) ?? productId), productSkuId ?? "", actProductId ?? "", actProductSkuId ?? "", (((pro?.id ?? 0) ?? (productId ?? 0)) == 0 ? ((couponListBean?.id ?? 0) != 0 ? "COUPON" : "AUTO") : "ACTIVITY"), // useVipPriceSelect, // useBenefitSelect, count1, payChannel, tableId); } ///立即预约时间选择 showDateSelector() { var minTime = DateTime.now().isAfter( DateTime.tryParse(subscribeParam?.subscribeStartTime ?? "") ?? DateTime.now()) ? DateTime.now() : DateTime.tryParse(subscribeParam?.subscribeStartTime ?? ""); DatePicker.showDateTimePicker(context, showTitleActions: true, minTime: minTime, maxTime: DateTime.tryParse(subscribeParam?.subscribeEndTime ?? ""), theme: picker_theme.DatePickerTheme( headerColor: Colors.white, backgroundColor: Colors.white, itemStyle: TextStyle( color: Colors.black, fontWeight: MyFontWeight.bold, fontSize: 18), doneStyle: TextStyle(color: Color(0xFF32A060), fontSize: 16.sp)), onChanged: (date) { print('change $date in time zone ' + date.timeZoneOffset.inHours.toString()); }, onConfirm: (date) { reservationTime = date.toString().substring(0, 16); subTime = date.add(Duration(hours: 8)).toUtc().toIso8601String(); setState(() {}); }, currentTime: minTime, locale: LocaleType.zh); } ///预约店铺 showAlertDialog() { showModalBottomSheet( builder: (BuildContext context) { return StatefulBuilder(builder: (context, state) { return Container( width: double.infinity, height: 300.h, padding: EdgeInsets.symmetric( horizontal: 14.w, vertical: 16.h, ), decoration: new BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(8), topRight: Radius.circular(8), ), ), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Container( alignment: Alignment.center, margin: EdgeInsets.symmetric(vertical: 5.h), child: Text( S.of(context).qingxuanzeyuyuemendian, style: TextStyle( fontWeight: MyFontWeight.bold, fontSize: 15.sp, color: Color(0xFF353535), ), ), ), ), GestureDetector( onTap: () { setState(() { Navigator.of(context).pop(); }); }, child: Icon( Icons.clear, color: Colors.black, size: 18, ), ), // SizedBox(width:4.w), ], ), Expanded( child: ListView.builder( itemCount: subscribeParam?.stores?.length ?? 0, itemBuilder: (context, position) { return GestureDetector( onTap: () { state(() { storesIndex = position; }); }, child: storesNameItem(position), ); }, ), ), GestureDetector( onTap: () { setState(() { subscribeStoresName = subscribeParam?.stores?[storesIndex]; }); Navigator.of(context).pop(); }, child: Container( width: double.infinity, height: 40.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), color: Color(0xFF32A060), ), alignment: Alignment.center, margin: EdgeInsets.only( bottom: 10.h, ), child: Text( S.of(context).queding, style: TextStyle( fontWeight: MyFontWeight.bold, fontSize: 16.sp, color: Color(0xFFFFFFFF), ), ), ), ), ], ), ); }); }, backgroundColor: Colors.transparent, context: context, ); } Widget storesNameItem(index) { return Container( width: double.infinity, margin: EdgeInsets.symmetric(vertical: 8.h), padding: EdgeInsets.symmetric(vertical: 10.h), alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.circular(6), border: Border.all( color: storesIndex == index ? Color(0xFF32A060) : Color(0xFFF7F7F7), width: storesIndex == index ? 1 : 0, ), color: storesIndex == index ? Color(0xFFF0FAF4) : Color(0xFFF7F7F7), ), child: Text( subscribeParam?.stores![index] ?? "", style: TextStyle( fontWeight: MyFontWeight.medium, fontSize: 16.sp, color: storesIndex == index ? Color(0xFF32A060) : Colors.black, ), ), ); } }