import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/business_system/home/home_view/home_sideslip_dialog.dart'; import 'package:huixiang/utils/business_instance.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:intl/intl.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../generated/l10n.dart'; import '../../retrofit/business_api.dart'; import '../../retrofit/data/base_data.dart'; import '../../retrofit/data/business_login_info.dart'; import '../../retrofit/data/day_count.dart'; import '../../utils/flutter_utils.dart'; import '../../utils/font_weight.dart'; import '../../view_widget/settlement_tips_dialog.dart'; class BusinessHomePage extends StatefulWidget { final BusinessLoginInfo businessLoginInfo; final int selectStoreIndex; final Function changeIndex; final Function changeTab; BusinessHomePage( this.businessLoginInfo, this.selectStoreIndex, this.changeIndex,this.changeTab); @override State createState() { return _BusinessHomePage(); } } class _BusinessHomePage extends State with AutomaticKeepAliveClientMixin { final RefreshController refreshController = RefreshController(); final ScrollController scrollController = ScrollController(); BusinessApiService businessService; DayCount dayCount; int _loadCount = 0; @override void initState() { super.initState(); _onRefresh(); } @override void dispose() { super.dispose(); } _onRefresh({int index, isLoading = true}) async { if (isLoading) EasyLoading.show( status: S.current.zhengzaijiazai, maskType: EasyLoadingMaskType.black); SharedPreferences.getInstance().then((value) { businessService = BusinessApiService(Dio(), context: context, token: BusinessInstance.instance.businessToken, tenant: BusinessInstance.instance.businessTenant, storeId: widget.businessLoginInfo .storeList[index ?? widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[index ?? widget.selectStoreIndex].id); queryDayAmount(); }); } addLoadCount() { _loadCount += 1; if (_loadCount == 1) { _loadCount = 0; EasyLoading.dismiss(); if (refreshController.isRefresh) refreshController.refreshCompleted(); if (mounted) setState(() {}); } } ///每日营业额/交易笔数/退款金额/退款笔数 queryDayAmount() async { try { BaseData baseData = await businessService.getDayCounts({ "summaryDate": "${DateFormat("yyyy-MM-dd").format(DateTime.now())}" }).catchError((error) { SmartDialog.showToast(AppUtils.dioErrorTypeToString(error.type), alignment: Alignment.center); refreshController.refreshFailed(); refreshController.loadFailed(); }); if (baseData != null && baseData.isSuccess) { dayCount = baseData.data; } } finally { addLoadCount(); } } @override Widget build(BuildContext context) { super.build(context); return Column( children: [ Expanded( child: Container( child: SmartRefresher( controller: refreshController, enablePullDown: true, enablePullUp: false, header: MyHeader( color: Color(0xFF30415B), ), physics: BouncingScrollPhysics(), scrollController: scrollController, footer: CustomFooter( builder: (context, mode) { return MyFooter(mode); }, ), onRefresh: () { _onRefresh(isLoading: false); }, child: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: Column( children: [ homeTop(), commonFunctions(), homeStatistics(), ], )), ), ), ), SizedBox( height: 76.h, ), ], ); } ///首页头部 Widget homeTop() { return Container( color: Color(0xFF30415B), width: double.infinity, padding: EdgeInsets.only( top: MediaQuery.of(context).padding.top + 23.h, bottom: 16.h, left: 16.w, right: 16.w), child: Column( children: [ Row( children: [ Expanded( child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { showAlertDialog( widget.selectStoreIndex, widget.businessLoginInfo, ); //改变导航栏状态栏颜色 // SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle(statusBarColor: Colors.white), ); // Navigator.of(context).pushNamed('/router/select_shop'); }, child: Row( children: [ Image.asset( "assets/image/bs_more.webp", width: 16.w, height: 13.h, ), Padding( padding: EdgeInsets.only(left: 7.w), child: Text( widget?.businessLoginInfo ?.storeList[widget.selectStoreIndex].name ?? "", style: TextStyle( fontSize: 16.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.white, ), ), ), ], ), )), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { showIdentitySwitchDialog(); }, child: Container( padding: EdgeInsets.symmetric(horizontal: 10.w), child: Image.asset( "assets/image/bs_user_switch.webp", width: 25.h, height: 25.h, color: Colors.white, ), )), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { Navigator.of(context) .pushNamed('/router/scan_code_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id }); }, child: Image.asset( "assets/image/icon_scan_qr_code.webp", width: 28.h, height: 28.h, ), ) ], ), Container( margin: EdgeInsets.only(top: 14.h), padding: EdgeInsets.symmetric(vertical: 12.h), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(4), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 23.w), child: Row( children: [ Image.asset( "assets/image/bs_home_bill.webp", width: 14, height: 14, ), Padding( padding: EdgeInsets.only(left: 3.w), child: Text( "营业额(元)", style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.semi_bold, color: Color(0xFF30415B), ), ), ), ], )), Padding( padding: EdgeInsets.only( top: 6.h, bottom: 17.h, left: 23.w, right: 23.w), child: Text( dayCount?.paySum ?? "0", style: TextStyle( fontSize: 24.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/bs_trade_num.webp", width: 16, height: 16, ), Padding( padding: EdgeInsets.only(left: 3.w), child: Text( "交易笔数", style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], ), Padding( padding: EdgeInsets.only( top: 5.h, left: 20.w, right: 20.w), child: Text( (dayCount?.orderNum ?? 0).toString(), style: TextStyle( fontSize: 18.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], )), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/bs_refund.webp", width: 14, height: 14, ), Padding( padding: EdgeInsets.only(left: 3.w), child: Text( "退款金额(元)", style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], ), Padding( padding: EdgeInsets.only( top: 5.h, left: 20.w, right: 20.w), child: Text( (dayCount?.refundMoney ?? "0.00") == "0" ? "0.00" : (dayCount?.refundMoney ?? "0.00"), style: TextStyle( fontSize: 18.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], )), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/bs_refund_num.webp", width: 14, height: 14, ), Padding( padding: EdgeInsets.only(left: 3.w), child: Text( "退款笔数", style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], ), Padding( padding: EdgeInsets.only( top: 5.h, left: 20.w, right: 20.w), child: Text( (dayCount?.refundOrderNum ?? 0).toString(), style: TextStyle( fontSize: 18.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF30415B), ), ), ), ], )) ], ), ], ), ) ], ), ); } ///侧面弹窗 showAlertDialog( selectStoreIndex, businessLoginInfo, ) async { int index = await showCupertinoModalPopup( builder: (context) { return HomeSideslipDialog(selectStoreIndex, businessLoginInfo); }, context: context); if (index != null) { if (index == -1) { Navigator.of(context).pop(); return; } widget.changeIndex(index); _onRefresh(index: index); } } ///用户身份切换 showIdentitySwitchDialog() async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); showDialog( context: context, builder: (context) { return AlertDialog( content: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { sharedPreferences.setString('identitySwitch', "2"); Navigator.of(context).pushNamedAndRemoveUntil( '/router/main_page', (route) => false, ); }, child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( "assets/image/bs_user_switch_bg.webp", width: 144.h, height: 97.h, ), Padding( padding: EdgeInsets.only(top: 10.h, bottom: 10.h), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( "assets/image/bs_switch.webp", width: 12.h, height: 12.h, ), SizedBox( width: 10.w, ), Text( "切换成用户端", style: TextStyle( color: Color(0xFF30415B), fontSize: 15.sp, fontWeight: MyFontWeight.bold, ), ), ], ), ) ], ), )); }, ); } ///常用功能 Widget commonFunctions() { return Container( color: Colors.white, margin: EdgeInsets.only(bottom:16.h), padding: EdgeInsets.only(left: 16.w, right: 15.w, top: 12.h, bottom: 16.h), child: Column( children: [ Row( children: [ Container(width: 4.w, height: 16.h, color: Color(0xFF30415B)), Padding( padding: EdgeInsets.only( left: 12.w, ), child: Text( "常用功能", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, color: Color(0xFF0D0D0D), ), ), ), ], ), GridView.builder( itemCount:commonFunctionsList.length ?? 0, padding: EdgeInsets.only(top:24.h), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 4, crossAxisSpacing:15.w, mainAxisSpacing: 12.w, ), itemBuilder: (context, index) { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { commonFunctionsIndex(index); }, child: commonFunctionsItem(index)); }, ), ], ), ); } ///常用功能跳转 commonFunctionsIndex(index) async { switch (index) { case 0: if ((widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id) == "0") { SmartDialog.show( widget: SettlementTips( () {}, text: "请选择门店进行收银操作", color: Color(0xFF30415B), )); }else{ Navigator.of(context).pushNamed('/router/cashier_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); } break; case 1: Navigator.of(context) .pushNamed('/router/vip_recharge_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 2: Navigator.of(context) .pushNamed('/router/add_vip', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 3: Navigator.of(context) .pushNamed('/router/trade_overview_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 4: Navigator.of(context) .pushNamed('/router/business_vip_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 5: Navigator.of(context) .pushNamed('/router/hot_selling_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 6: Navigator.of(context) .pushNamed('/router/flow_page', arguments: { "storeName": widget?.businessLoginInfo ?.storeList[widget.selectStoreIndex].name ?? "", "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 7: widget.changeTab(3); break; } } ///常用功能板块 List> commonFunctionsList = [ {"image":"assets/image/bus_home_syt.webp","commonName":"收银台","imageWidth":"26","imageHeight":"23"}, {"image":"assets/image/bus_home_cz.webp","commonName":"充值","imageWidth":"22","imageHeight":"19"}, {"image":"assets/image/bus_home_bhy.webp","commonName":"办会员","imageWidth":"24","imageHeight":"21"}, {"image":"assets/image/bus_home_syzl.webp","commonName":"生意总览","imageWidth":"22","imageHeight":"23"}, {"image":"assets/image/bus_home_hygl.webp","commonName":"会员管理","imageWidth":"23","imageHeight":"25"}, {"image":"assets/image/bus_home_rxbd.webp","commonName":"热销榜单","imageWidth":"20","imageHeight":"26"}, {"image":"assets/image/bus_home_jrls.webp","commonName":"今日流水","imageWidth":"22","imageHeight":"23"}, {"image":"assets/image/bus_home_goods.webp","commonName":"商品","imageWidth":"21","imageHeight":"23"}, ]; ///常用功能Item Widget commonFunctionsItem(index){ return Column( children: [ Image.asset( commonFunctionsList[index]["image"], width: double.tryParse(commonFunctionsList[index]["imageWidth"]).w, height: double.tryParse(commonFunctionsList[index]["imageHeight"]).h, fit: BoxFit.fill, ), Padding(padding: EdgeInsets.only(top: 12.h), child: Text( commonFunctionsList[index]["commonName"], textAlign: TextAlign.center, style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.regular, color: Color(0xFF252626), ), )), ], ); } ///统计 Widget homeStatistics() { return Container( color: Colors.white, margin: EdgeInsets.only(bottom:16.h), padding: EdgeInsets.only(left: 16.w, right: 15.w, top: 12.h, bottom: 16.h), child: Column( children: [ Row( children: [ Container(width: 4.w, height: 16.h, color: Color(0xFF30415B)), Padding( padding: EdgeInsets.only( left: 12.w, ), child: Text( "统计", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, color: Color(0xFF0D0D0D), ), ), ), ], ), GridView.builder( itemCount:homeStatisticsList.length ?? 0, padding: EdgeInsets.only(top:24.h), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 4, crossAxisSpacing:15.w, mainAxisSpacing: 12.w, ), itemBuilder: (context, index) { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { homeStatisticsIndex(index); }, child: homeStatisticsItem(index)); }, ), ], ), ); } ///统计跳转 homeStatisticsIndex(index) async { switch (index) { case 0: Navigator.of(context) .pushNamed('/router/trade_overview_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, }); break; case 1: Navigator.of(context) .pushNamed('/router/business_vip_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, "index":2 }); break; case 2: Navigator.of(context) .pushNamed('/router/business_vip_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, "index":1 }); break; case 3: Navigator.of(context) .pushNamed('/router/consumer_ranking_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, "titleName":"会员余额统计" }); break; case 4: Navigator.of(context) .pushNamed('/router/consumer_ranking_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, "titleName":"消费排名" }); break; case 5: Navigator.of(context) .pushNamed('/router/trade_overview_page', arguments: { "storeId": widget.businessLoginInfo .storeList[widget.selectStoreIndex].name == "所有门店" ? "0" : widget.businessLoginInfo .storeList[widget.selectStoreIndex].id, "index":2 }); break; } } ///统计板块 List> homeStatisticsList = [ {"image":"assets/image/bus_home_yytj.webp","commonName":"营业统计","imageWidth":"21","imageHeight":"20"}, {"image":"assets/image/bus_home_xfjl.webp","commonName":"消费记录","imageWidth":"22","imageHeight":"21"}, {"image":"assets/image/bus_home_czjl.webp","commonName":"充值记录","imageWidth":"19","imageHeight":"22"}, {"image":"assets/image/bus_home_hyyetj.webp","commonName":"会员余额统计","imageWidth":"23","imageHeight":"23"}, {"image":"assets/image/bus_home_xfpm.webp","commonName":"消费排名","imageWidth":"26","imageHeight":"22"}, {"image":"assets/image/bus_home_goods_ssfx.webp","commonName":"商品销售分析","imageWidth":"26","imageHeight":"23"}, ]; ///统计Item Widget homeStatisticsItem(index){ return Column( children: [ Image.asset( homeStatisticsList[index]["image"], width: double.tryParse(homeStatisticsList[index]["imageWidth"]).w, height: double.tryParse(homeStatisticsList[index]["imageHeight"]).h, fit: BoxFit.fill, ), Padding(padding: EdgeInsets.only(top: 12.h), child: Text( homeStatisticsList[index]["commonName"], textAlign: TextAlign.center, style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.regular, color: Color(0xFF252626), ), )), ], ); } @override bool get wantKeepAlive => true; }