import 'package:flutter/material.dart'; import 'package:liftmanager/res/gaps.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/widgets/app_bar.dart'; import 'package:liftmanager/internal/search/search_router.dart'; import 'package:liftmanager/widgets/app_search_bar.dart'; import 'package:liftmanager/res/resources.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/widgets/load_image.dart'; import 'package:liftmanager/internal/bbs/bbs_router.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:liftmanager/widgets/bbs_content.dart'; import 'package:flutter_alipay/flutter_alipay.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; //import 'package:tobias/tobias.dart'; // import 'package:sy_flutter_alipay/sy_flutter_alipay.dart'; import 'dart:convert'; import 'package:provider/provider.dart'; import '../provide/websocket.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flustars/flustars.dart' as FlutterStars; import 'package:liftmanager/common/common.dart'; import 'package:liftmanager/utils/fast_notification.dart'; import 'dart:math'; import 'package:fluwx/fluwx.dart' as fluwx; import 'package:liftmanager/utils/theme_utils.dart'; class BuyService extends StatefulWidget { BuyService(this.id); final String id; @override State createState() { return BuyServiceState(); } } class BuyServiceState extends State { // ExpertListState({Key key}) : super(key: key); bool sortBool = true; String couponChiose = '请选择'; String redChiose = '请选择'; String typeName = "卡券"; String questionType; int typeIdssCoupon; int typeIdssRed; double priceCoupon = 0.0; double priceRed = 0.0; double priceTotal = 0.0; int dataId; String expertName; double expertFee; double apiExpertFee = 0.0; dynamic _wxPay; @override initState() { super.initState(); setSchema(); getDataId(); getType(); getExpertName(); getExpertFee(); } void setSchema() async{ // await FlutterAlipay.setIosUrlSchema("tytylift"); await FlutterAlipay.setIosUrlSchema("com.tyty.lift.managers"); } void getDataId() async { SharedPreferences prefs = await SharedPreferences.getInstance(); dataId = prefs.getInt("dataId"); } void getType() async { SharedPreferences prefs = await SharedPreferences.getInstance(); questionType = prefs.getString("questionType"); } void getExpertName() async { SharedPreferences prefs = await SharedPreferences.getInstance(); expertName = prefs.getString("expertName"); } void getExpertFee() async { SharedPreferences prefs = await SharedPreferences.getInstance(); if(prefs.getDouble("expertFee") != null){ expertFee = prefs.getDouble("expertFee"); }else { expertFee = 0.0; } setState(() {}); print(expertFee); print(6666543); // priceTotal = expertFee; if (expertFee == 0.0) { getApiFee(); } else { priceTotal = expertFee; } } List couponList = []; Future getCouponList(type) async { await NewApiService().getCouponListNoPage( type, expertFee != null && expertFee != 0.0 ? expertFee.toString() : apiExpertFee.toString(), onSuccess: (res) { if (res != null) { couponList = res; print(jsonEncode(res)); print(111222); setState(() {}); } }, onError: (code, msg) { toasts(msg); }); } Future getApiFee() async { await NewApiService().getFee(onSuccess: (res) { if (res != null) { apiExpertFee = res; priceTotal = apiExpertFee; setState(() {}); print(res); print(6666544); } }, onError: (code, msg) { toasts(msg); }); } //余额支付 Future lastMoneyPay(orders) async { int liftCaseType; String payType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; questionType == "1" ? payType = "CASE" : payType = "CALL"; await NewApiService().getAlipayBalanceApp({ "payType": payType, "orders": orders, "liftCaseType": liftCaseType, "userId": FlutterStars.SpUtil.getString(Constant.userId), }, onSuccess: (res) { // moneyList = res; upDataMoney(); getRoom(); }, onError: (code, msg) { toasts(msg); }); } // 根据orderNo获取支付宝订单信息 Future getAlipayOrderInfo(ordersNo) async { int liftCaseType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; await NewApiService().aliPay( orders: ordersNo, liftCaseType: liftCaseType, onSuccess: (res) { callAlipay(res); }, onError: (code, msg) { toasts(msg); }); } // 根据orderNo获取wx订单信息 Future getWxOrderInfo(ordersNo) async { int liftCaseType; questionType == "1" ? liftCaseType = 1 : liftCaseType = 2; await NewApiService().wxPay( orders: ordersNo, liftCaseType: liftCaseType, onSuccess: (res) { wxMethod(res); }, onError: (code, msg) { toasts(msg); }); } wxMethod(_payInfo) { print(_payInfo["appid"]); fluwx.payWithWeChat( appId: _payInfo["appid"], partnerId: _payInfo["partnerid"], prepayId: _payInfo["prepayid"], packageValue: _payInfo["package"], nonceStr: _payInfo["noncestr"], timeStamp: int.parse(_payInfo["timestamp"]), sign: _payInfo["sign"] ).then((data) { print(data); }); _wxPay?.cancel(); _wxPay = fluwx.responseFromPayment.listen((fluwx.WeChatPaymentResponse response) async { print("WeChatPaymentResponse"+response.errCode.toString()); if (response.errCode == -2) { //支付取消 toasts("支付取消"); } else if (response.errCode == -1) { //支付失败 toasts("支付失败"); } else if (response.errCode == 0) { //支付成功 upDataMoney(); getRoom(); } }); } //根据专家Id和诊单Id获取orderId 0:余额 1:支付宝 Future generateOrder(int type) async { await NewApiService().generateOrder({ "id": dataId, "chargerId": widget.id, "couponId": typeIdssCoupon, "packetId": typeIdssRed }, onSuccess: (res) { print(res); if (res != null) { if (type == 0) { lastMoneyPay(res); } else if (type == 1) { getAlipayOrderInfo(res); }else if (type == 2){ getWxOrderInfo(res); } } print(555); }, onError: (code, msg) { toasts(msg); }); } upDataMoney() { String initThisUserMoney = randomInt(1111, 9999).toString() + DateTime.now().millisecondsSinceEpoch.toString(); FastNotification.push("initUserMoney", initThisUserMoney); } randomInt(int min, int max) { return new Random().nextInt(max) % (max - min + 1) + min; } //根据orderId来判断支付完成 // Future getPayType(orderId) async { // await NewApiService().getTestAlipayNotify(orderId, onSuccess: (res) { // print(res); // print(666); // getRoom(); // }, onError: (code, msg) { // toasts(msg); // }); // } //支付完成后用诊单Id获取房间号 Future getRoom() async { await NewApiService().findOne(dataId, onSuccess: (res) { print(res); String roomId = res.sessionid; toasts("支付成功,即将进入聊天室!"); NavigatorUtils.push( context, "${BbsRouter.chatRoom}?id=$roomId&type=someToOne"); print(666); }, onError: (code, msg) { toasts(msg); }); } void setExpertFee(double expertFee) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setDouble("expertFee", expertFee); } @override void dispose() { setExpertFee(0.0); super.dispose(); } void callAlipay(String _payInfo) async { AlipayResult payResult; try { print("The pay info is : " + _payInfo); payResult = await FlutterAlipay.pay(_payInfo); } on Exception catch (e) { payResult = null; } print(payResult); if (payResult != null) { if (payResult.resultStatus == "9000") { upDataMoney(); getRoom(); } else { toasts(payResult.memo); } } else { toasts("支付异常"); } } static const payType = [ { "icon": "tab_first/pay_yue", "title": "账户余额支付", "price": "", }, { "icon": "tab_first/pay_zhifubao", "title": "支付宝支付", }, { "icon": "tab_first/pay_winxin", "title": "微信支付", }, ]; int indexNow = 999; String checkFalse = "tab_first/check_false"; String checkTrue = "tab_first/check_true"; @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; double height = MediaQuery.of(context).size.height; return Container( child: Scaffold( appBar: MyAppBar( centerTitle: "购买服务", ), body: Container( child: Stack( children: [ Container( // padding: EdgeInsets.only(top:70), child: ListView(children: [ Container( padding: EdgeInsets.all(ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( questionType == "1" ? "问诊服务" : "出诊服务", style: TextStyle( fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(10)), child: Text( expertFee != null && expertFee != 0.0 ? expertName : "平台指定专家", style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ) ]), Container( child: Text( // "¥${expertFee != null ? expertFee.toString() : '0.0'}", "¥${expertFee != null && expertFee != 0.0 ? expertFee.toString() : apiExpertFee.toString()}", style: TextStyle( color: Colors.red, fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.end, ), ) ])), // ChioseThis(list: quanListChiose,label: "优惠券",labelText: '无可用优惠券',value:quanChiose,fun:(index){ // setState(() { // quanChiose = quanListChiose[index]; // }); // Navigator.maybePop(context); // }), ChioseThisRight( label: "优惠券", labelText: '无可用优惠券', value: couponChiose, fun: () { setState(() { // brandChiose = brandListChiose[index]; typeName = "卡券"; sortBool = false; print(5656333); }); getCouponList(1); // Navigator.maybePop(context); }), ChioseThisRight( label: "红包", labelText: '无可用红包', value: redChiose, fun: () { setState(() { // brandChiose = brandListChiose[index]; typeName = "红包"; sortBool = false; print(5656333); }); getCouponList(2); // Navigator.maybePop(context); }), // ChioseThis(list: redListChiose,label: "红包",labelText: '无可用红包',value:redChiose,fun:(index){ // setState(() { // redChiose = redListChiose[index]; // }); // Navigator.maybePop(context); // }), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "共需支付", style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), Text( "¥${priceTotal != null ? priceTotal.toStringAsFixed(2).toString() : '0.0'}", style: TextStyle( color: Colors.red, fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Color(0xfff5f5f5)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "选择支付方式", style: TextStyle( fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ]), ), Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15)), child: Column( children: payType.asMap().keys.map((i) { return Container( decoration: BoxDecoration( border: Border( bottom: BorderSide( width: 0.5, color: Color(0xfff5f5f5)), ), ), height: 60, child: InkWell( onTap: () { setState(() { indexNow = i; }); print(indexNow); }, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ LoadAssetImage( // image: AssetImage(i['img']), payType[i]["icon"], width: ScreenUtil().setWidth(20), height: ScreenUtil().setWidth(20), // alignment: Alignment.centerLeft, ), Container(width: 5, child: null), Text( payType[i]["title"], style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), Container(width: 5, child: null), // Text( // payType[i]["price"] != null // ? "¥${payType[i]["price"]}" // : "", // style: TextStyle( // color: Color(0xff999999), // fontSize: // ScreenUtil().setSp(16)), // textAlign: TextAlign.start, // ), ], ), Container( // padding: EdgeInsets.only(top:10,left:5,right:5,bottom:10), child: LoadAssetImage( // image: AssetImage(i['img']), indexNow == i ? checkTrue : checkFalse, width: ScreenUtil().setWidth(18), height: ScreenUtil().setWidth(18), // alignment: Alignment.centerLeft, ), ), ])), ); }).toList(), )) ]), ), Positioned( bottom: 0, left: 0, child: Container( width: width, padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15), left: ScreenUtil().setWidth(25), right: ScreenUtil().setWidth(25)), color: ThemeUtils.getDialogTextFieldColor(context), child: Container( height: ScreenUtil().setWidth(44), decoration: BoxDecoration( borderRadius: BorderRadius.circular(22.0), gradient: const LinearGradient( colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]), ), child: FlatButton( // padding: EdgeInsets.all(15.0), child: Text("立即购买"), textColor: Colors.white, onPressed: () { // NavigatorUtils.push(context, "${BbsRouter.chatRoom}?id=1111"); if(priceTotal <= 0 && indexNow != 0){ toasts("支付金额为0,请使用余额支付!"); return; } if (indexNow == 0) { showAlert( context, "提示", "确定支付?", "确定", () { generateOrder(0); NavigatorUtils.goBack(context); }, txt2: "取消", onPre2: () { NavigatorUtils.goBack(context); }, ); // NavigatorUtils.push(context, BbsRouter.chatRoom); } else if (indexNow == 1) { generateOrder(1); // NewApiService().aliPayOrder(orders, // onSuccess: (res) { // callAlipay(res); // }, onError: (code, msg) { // toasts(msg); // }); } else if (indexNow == 2) { generateOrder(2); } else { toasts("选择支付方式"); } }, ), ), )), !sortBool ? Positioned( top: 0, left: 0, child: GestureDetector( onTap: () { setState(() { sortBool = true; }); }, child: Container( width: width, height: height, color: Color.fromRGBO(0, 0, 0, 0.5)), ), ) : Container(child: null), !sortBool ? Positioned( top: 0, right: 0, child: Container( width: width / 4 * 3, height: height, color: ThemeUtils.getTabsBg(context), padding: EdgeInsets.all(10), child: ListView( children: [ Container( padding: EdgeInsets.only( left: 5, top: 5, bottom: 10), child: Text( typeName, style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), ), InkWell( onTap: () { print(priceCoupon); print(priceRed); print(33333333333); setState(() { expertFee != null && expertFee != 0.0 ? priceTotal = expertFee : priceTotal = apiExpertFee; sortBool = true; if (typeName == "卡券") { priceCoupon = 0.0; couponChiose = '请选择'; typeIdssCoupon = null; } else if (typeName == "红包") { priceRed = 0.0; redChiose = '请选择'; typeIdssRed = null; } print(priceCoupon); print(priceRed); print(123465798); if ((priceTotal - priceCoupon - priceRed) < 0) { priceTotal = 0; } else { priceTotal = priceTotal - priceCoupon - priceRed; } couponList = []; }); }, child: Container( // width: width / 4 - 17, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(10), right: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(10)), margin: EdgeInsets.only( left: 5, right: 5, bottom: 5, top: 5), decoration: BoxDecoration( // border: Border( // bottom: BorderSide(width: 0.5, color: Colours.line), // ), color: ThemeUtils.getDialogTextFieldColor(context)), child: Text( "不选择$typeName", style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.center, ), ), ), couponList != null && couponList.length > 0 ? Container( child: Wrap( alignment: WrapAlignment.start, crossAxisAlignment: WrapCrossAlignment.center, children: couponList.asMap().keys.map((index) { return InkWell( onTap: () { setState(() { expertFee != null && expertFee != 0.0 ? priceTotal = expertFee : priceTotal = apiExpertFee; sortBool = true; if (typeName == "卡券") { // if (priceTotal - // couponList[index] // .coupon // .price > // 0.0) { // priceCoupon = // couponList[index] // .coupon // .price; // }else { // priceTotal = 0.0; // } priceCoupon = couponList[index] .coupon .discount; couponChiose = couponList[index] .coupon .name ?? ""; typeIdssCoupon = couponList[index].id; } else if (typeName == "红包") { // if (priceTotal - // couponList[index] // .coupon // .price > // 0.0) { // priceRed = // couponList[index] // .coupon // .price; // }else { // priceTotal = 0.0; // } priceRed = couponList[index] .coupon .price; redChiose = couponList[index] .coupon .name ?? ""; typeIdssRed = couponList[index].id; } if ((priceTotal - priceCoupon - priceRed) < 0) { priceTotal = 0; } else { priceTotal = priceTotal - priceCoupon - priceRed; } couponList = []; }); }, child: Container( // width: width / 4 - 17, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(10), right: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(10)), margin: EdgeInsets.only( left: 5, right: 5, bottom: 5, top: 5), decoration: BoxDecoration( // border: Border( // bottom: BorderSide(width: 0.5, color: Colours.line), // ), color: ThemeUtils.getDialogTextFieldColor(context)), child: Text( couponList[index].coupon.name ?? "", style: typeName == "卡券" ? TextStyle( color: typeIdssCoupon == couponList[index].id ? Color(0xffff0000) : Color(0xff000000), fontSize: ScreenUtil() .setSp(14)) : TextStyle( color: typeIdssRed == couponList[index].id ? Color(0xffff0000) : Color(0xff000000), fontSize: ScreenUtil() .setSp(14)), textAlign: TextAlign.center, ), ), ); }).toList(), )) : Center(child: Text("暂无")), ], ))) : Container(child: null), ], ))), ); } Widget loadCircle() { return Container( padding: EdgeInsets.only(top: 10, bottom: 10), color: ThemeUtils.getTabsBg(context), child: Center( child: SpinKitFadingCircle( color: Colors.blueAccent, size: 30.0, ), ), ); } } class ChioseThisRight extends StatelessWidget { ChioseThisRight({Key key, this.value, this.label, this.fun, this.labelText}) : super(key: key); String value; String label; Function fun; String labelText; @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return InkWell( onTap: () { fun(); }, child: Container( padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15)), margin: EdgeInsets.only(left: ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: TextStyle( // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), value.isEmpty ? Container( child: Row(children: [ Text( labelText, style: TextStyle( color: Color(0xffcccccc), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(top: 3), child: Icon( Icons.keyboard_arrow_right, size: 20.0, color: Color(0xffcccccc), ), ), SizedBox(width: 10) ]), ) : Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Row(children: [ Text( value, style: TextStyle( fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), ]), ), ); } }