import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:velocity_x/velocity_x.dart'; import 'package:recook/base/base_store_state.dart'; import 'package:recook/constants/app_image_resources.dart'; import 'package:recook/constants/header.dart'; import 'package:recook/constants/styles.dart'; import 'package:recook/pages/user/functions/user_benefit_func.dart'; import 'package:recook/pages/user/model/user_accumulate_model.dart'; import 'package:recook/pages/user/model/user_month_income_model.dart'; import 'package:recook/pages/user/user_benefit_sub_page.dart'; import 'package:recook/utils/custom_route.dart'; import 'package:recook/utils/user_level_tool.dart'; import 'package:recook/widgets/alert.dart'; import 'package:recook/widgets/bottom_time_picker.dart'; import 'package:recook/widgets/custom_app_bar.dart'; import 'package:recook/widgets/custom_image_button.dart'; import 'package:recook/widgets/dashed_rect.dart'; class CumulativeIncomePage extends StatefulWidget { @override State createState() { return _CumulativeIncomePageState(); } } class _CumulativeIncomePageState extends BaseStoreState with TickerProviderStateMixin { //user new api // // TeamIncomeModel _teamIncomeModel; bool _noData = false; ///选择的日期 DateTime _selectYear; ///选择的年份 String get _selectYearValue => _selectYear.year.toString(); /// 年度收益 double get _yearIncome { double result = 0; _models.forEach((element) { result += element?.allAmount ?? 0; }); return result; } ///累计收益 /// UserAccumulateModel _model = UserAccumulateModel.zero(); List _models = []; ///自购收益 double get _purchase => _model?.data?.purchaseAmount ?? 0; ///导购收益 double get _guide => _model?.data?.guideAmount ?? 0; ///团队收益 double get _team => _model?.data?.teamAmount ?? 0; ///推荐奖励 double get _recommand => _model?.data?.recommendAmount ?? 0; ///平台奖励收益 double get _reward => _model?.data?.rewardAmount ?? 0; double get _allAmount => _model?.data?.allAmount; UserRoleLevel get _role => UserLevelTool.currentRoleLevelEnum(); bool get _purchaseShow => true; bool get _guideShow => _role != UserRoleLevel.None && _role != UserRoleLevel.Vip; bool get _teamShow => _role != UserRoleLevel.None && _role != UserRoleLevel.Vip; bool get _recommendShow => _role == UserRoleLevel.Diamond_1 || _role == UserRoleLevel.Diamond_2; bool get _rewardShow => _role == UserRoleLevel.Diamond_1; @override void initState() { _selectYear = DateTime.now(); // _getShopIncome(); _getAccumulate(); _getMonthIncome(DateTime.now().year); super.initState(); } @override Widget buildContext(BuildContext context, {store}) { return Scaffold( appBar: CustomAppBar( appBackground: AppColor.blackColor, themeData: AppThemes.themeDataMain.appBarTheme, elevation: 0, title: "累计收益", ), body: _body(), ); } _body() { return Container( color: AppColor.frenchColor, width: double.infinity, height: double.infinity, child: Stack( children: [ Positioned( left: 0, right: 0, top: 0, height: 200 / 375 * ScreenUtil().screenWidth, child: Image.asset( ShopImageName.income_appbar_bg, fit: BoxFit.fill, ), ), Positioned( left: 0, right: 0, top: 0, bottom: 0, child: ListView( physics: AlwaysScrollableScrollPhysics(), children: [ _barWidget(), _selectTimeWidget(), _infoWidgetV2(), // _infoWidget(), ], )) ], ), ); } _showTimePickerBottomSheet() { showModalBottomSheet( isScrollControlled: false, context: context, builder: (BuildContext context) { return SizedBox( height: 350 + MediaQuery.of(context).padding.bottom, child: BottomTimePicker( timePickerTypes: [BottomTimePickerType.BottomTimePickerYear], cancle: () { Navigator.maybePop(context); }, submit: (time, type) { Navigator.maybePop(context); _selectYear = time; setState(() {}); // _getShopIncome(); _getMonthIncome(_selectYear.year); }, )); }, ).then((val) { if (mounted) {} }); } _selectTimeWidget() { return Container( padding: EdgeInsets.only(left: 15, right: 15, top: 10), height: 50, child: Row( children: [ TimeSelectTitleWidget( title: _selectYearValue, click: () { _showTimePickerBottomSheet(); }, ), Spacer(), Container( child: RichText( text: TextSpan(children: [ TextSpan( text: "年度收益:", style: TextStyle( color: Color(0xff999999), fontSize: 14, ), ), TextSpan( text: _yearIncome.toStringAsFixed(2), style: TextStyle( fontWeight: FontWeight.w500, color: AppColor.redColor, fontSize: 14)), ])), ), ], ), ); } _barWidget() { double width = ScreenUtil().screenWidth - 30; double height = 170.0 / 345 * width; return Container( margin: EdgeInsets.symmetric(horizontal: 15), width: width, child: Column( children: [ Container( alignment: Alignment.centerLeft, height: 40, child: RichText( text: TextSpan(children: [ TextSpan( text: "收益汇总", style: TextStyle(color: Colors.white, fontSize: 14 * 2.sp)), TextSpan( text: "(瑞币)", style: TextStyle( color: Colors.white, fontWeight: FontWeight.w300, fontSize: 10 * 2.sp)), ]), ), ), ClipRRect( borderRadius: BorderRadius.circular(5.rw), child: Container( padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), decoration: BoxDecoration( image: DecorationImage( image: AssetImage(UserLevelTool.currentCardImagePath()), fit: BoxFit.cover, ), ), child: Column( children: [ Container( alignment: Alignment.centerLeft, child: _textColumn( titleText: "累计收益", infoText: _allAmount.toStringAsFixed(2), infoFontSize: 24, ), ), 20.hb, GridView( padding: EdgeInsets.zero, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, crossAxisSpacing: 10.rw, mainAxisSpacing: 5.rw, childAspectRatio: 110 / 70, ), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), children: [ _buildGridColumn( context, title: '自购收益', value: _purchase.toStringAsFixed(2), index: 0, show: _purchaseShow, ), _buildGridColumn( context, title: '导购收益', value: _guide.toStringAsFixed(2), index: 1, show: _guideShow, ), _buildGridColumn( context, title: '团队收益', value: _team.toStringAsFixed(2), index: 2, show: _teamShow, ), _buildGridColumn( context, title: "推荐收益", value: _recommand.toStringAsFixed(2), index: 3, show: _recommendShow, ), _buildGridColumn( context, title: "平台奖励", value: _reward.toStringAsFixed(2), index: 4, show: _rewardShow, ), ]..removeWhere((element) => element == null), ), // Container( // child: Row( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // _teamIncomeModel != null && // _teamIncomeModel.data.roleVisable // ? Spacer() // : Container(), // _teamIncomeModel != null && // _teamIncomeModel.data.roleVisable // ? _textColumn( // titleText: "团队收益", // infoText: _teamIncomeModel == null // ? "0.00" // : _teamIncomeModel // .data.accumulateIncome.team // ?.toStringAsFixed(2), // infoColor: UserLevelTool.roleLevelEnum( // _teamIncomeModel // ?.data?.roleLevel) == // UserRoleLevel.Master // ? Colors.black26 // : Colors.black) // : Container(), // ], // ), // ), ], ), ), ).box.withShadow([ BoxShadow( color: Color(0x8FA6A6AD), offset: Offset(0, 2.rw), blurRadius: 6.rw, ) ]).make(), ], ), ); } _infoWidgetV2() { return Container( constraints: BoxConstraints(minHeight: 200), decoration: BoxDecoration( image: DecorationImage( // centerSlice: Rect.fromLTRB(30, 90, 30, 30), centerSlice: Rect.fromLTWH(30, 100, 30, 1), image: AssetImage(R.ASSETS_SHOP_PAGE_INCOME_PAGE_BG_PNG), )), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ 10.hb, [ 64.hb, 30.wb, '月度收益'.text.size(14).black.bold.make(), Spacer(), '共${_models.length}期收益'.text.size(14).color(Colors.black38).make(), 30.wb, ].row(), DashedRect( color: Color(0xFFE6E6E6), ).pSymmetric(h: 15.rw), _models.isEmpty ? Container( width: 140, height: 130, child: Image.asset(ShopImageName.income_nodata), margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), ) : SizedBox(), 20.hb, ...List.generate(_models.length, (index) { return _buildInfoItem(isFirst: index == 0, model: _models[index]); }).sepWidget(separate: 20.hb), 30.hb, ], ), ); } Widget _buildMonthTile({ String title, String value, bool isSettlement = false, }) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ title.text.size(12.rsp).color(Color(0xFF666666)).make(), 4.hb, isSettlement ? value.text.size(12.rsp).color(Color(0xFF666666)).make() : '未结算'.text.size(14.rsp).color(Color(0xFFD5101A)).make(), ], ); } Widget _rowStack([ Widget prefix, Widget mid, Widget suffix, ]) { return Stack( children: [ mid?.centered() ?? SizedBox(), Positioned( left: 0, top: 0, bottom: 0, child: prefix ?? SizedBox(), ), Positioned( right: 0, top: 0, bottom: 0, child: suffix ?? SizedBox(), ), ], ); } Widget _buildInfoItem({ UserMonthIncomeModel model, bool isFirst = false, }) { return [ VxBox( child: Column( children: [ Row( // textBaseline: TextBaseline.ideographic, crossAxisAlignment: CrossAxisAlignment.end, children: [ (model?.date?.month ?? '') .toString() .text .black .bold .size(14.rsp) .make(), '月'.text.black.size(10.rsp).make(), Spacer(), '总收益:'.text.color(Color(0xFF999999)).size(12.rsp).make(), ((model?.isSettlement ?? true) ? ((model?.allAmount ?? 0).toStringAsFixed(2)) : '未结算') .text .color(Color(0xFFD5101A)) .size(12.rsp) .make(), ], ), 20.hb, _rowStack( _buildMonthTile( title: '自购收益', value: model.purchaseAmount.toStringAsFixed(2), isSettlement: model.isSettlement, ), _buildMonthTile( title: '导购收益', value: model.guideAmount.toStringAsFixed(2), isSettlement: model.isSettlement, ), _buildMonthTile( title: '团队收益', value: model.teamAmount.toStringAsFixed(2), isSettlement: model.isSettlement, ), ), 16.hb, _rowStack( _buildMonthTile( title: '推荐收益', value: model.recommendAmount.toStringAsFixed(2), isSettlement: model.isSettlement, ), _buildMonthTile( title: '平台收益', value: model.rewardAmount.toStringAsFixed(2), isSettlement: model.isSettlement, ), ), ], ), ) .color(Color(0xFFF7F8FA)) .padding(EdgeInsets.all(15.rw)) .margin(EdgeInsets.symmetric(horizontal: 30.rw)) .withRounded(value: 5.rw) .make(), isFirst ? SizedBox() : Positioned( left: 40.rw, top: -30.rw, child: Container( height: 40.rw, width: 3.rw, decoration: BoxDecoration( color: Color(0xFFD5101A), borderRadius: BorderRadius.circular(3.rw), ), ), ), isFirst ? SizedBox() : Positioned( right: 40.rw, top: -30.rw, child: Container( height: 40.rw, width: 3.rw, decoration: BoxDecoration( color: Color(0xFFD5101A), borderRadius: BorderRadius.circular(3.rw), ), ), ), ].stack(clip: Clip.none); } //TODO remove bottom code // _infoWidget() { // double width = ScreenUtil().screenWidth; // double height = 140 * width / 375; // return Container( // constraints: BoxConstraints( // minHeight: height, // minWidth: width, // ), // decoration: BoxDecoration( // image: DecorationImage( // // centerSlice: Rect.fromLTRB(30, 90, 30, 30), // centerSlice: Rect.fromLTWH(30, 100, 30, 1), // image: AssetImage(R.ASSETS_SHOP_PAGE_INCOME_PAGE_BG_PNG), // )), // child: Container( // margin: EdgeInsets.only(top: 30, bottom: 30), // child: Column( // children: [ // Container( // margin: EdgeInsets.symmetric(horizontal: 30), // height: 60, // child: Row( // children: [ // Text( // "月度收益", // style: TextStyle( // fontSize: 14, // color: Colors.black, // fontWeight: FontWeight.w500), // ), // Spacer(), // Text( // _teamIncomeModel == null // ? "" // : "共${_teamIncomeModel.data.incomes.length}期收益", // style: TextStyle( // fontSize: 14, // color: Colors.black26, // ), // ), // ], // ), // ), // Container( // margin: EdgeInsets.symmetric(horizontal: 13, vertical: 10), // width: double.infinity, // child: DashedRect( // color: Color(0xffe6e6e6), // strokeWidth: 2, // gap: 5, // ), // ), // _teamIncomeModel == null || // !(_teamIncomeModel.data.incomes != null && // _teamIncomeModel.data.incomes.length > 0) // ? Container( // width: 140, // height: 130, // child: Image.asset(ShopImageName.income_nodata), // margin: EdgeInsets.symmetric(horizontal: 30), // ) // : Container( // child: Column(children: _itemList()), // ) // ], // ), // // height: height+500, // ), // ); // } // _itemList() { // List widgetList = []; // for (var i = 0; i < _teamIncomeModel.data.incomes.length; i++) { // widgetList.add(_itemWidget(_teamIncomeModel.data.incomes[i], // isFirst: i == 0, // isLast: i == _teamIncomeModel.data.incomes.length - 1)); // } // return widgetList; // } // _itemWidget(Incomes income, {bool isFirst = false, bool isLast = false}) { // // DateTime time = DateTime.parse(income.month); // DateFormat sourceFormat = DateFormat("yyyy-MM"); // DateTime time = sourceFormat.parse(income.month); // return Container( // margin: EdgeInsets.symmetric(horizontal: 30), // height: 130, // child: Stack( // children: [ // Positioned( // left: 0, // right: 0, // top: 10, // bottom: 10, // child: Container( // padding: EdgeInsets.all(13), // decoration: BoxDecoration( // color: Color(0xfff7f8fa), // borderRadius: BorderRadius.circular(5)), // child: Column( // children: [ // Row( // children: [ // RichText( // text: TextSpan(children: [ // TextSpan( // text: time.month.toString(), // style: TextStyle(color: Colors.black, fontSize: 18), // ), // TextSpan( // text: "月", // style: TextStyle(color: Colors.black, fontSize: 13), // ) // ])), // Spacer(), // RichText( // text: TextSpan(children: [ // TextSpan( // text: "总收益:", // style: TextStyle(color: Colors.black26, fontSize: 14), // ), // TextSpan( // text: income.totalIncome.toStringAsFixed(2), // style: // TextStyle(color: AppColor.redColor, fontSize: 14), // ) // ])), // ], // ), // Spacer(), // Row( // children: [ // _textColumn( // titleColor: Color(0xff666666), // titleAligment: Alignment.centerLeft, // titleText: "自购收益", // infoText: income.myIncome.toStringAsFixed(2), // ), // Spacer(), // _textColumn( // titleColor: Color(0xff666666), // titleAligment: Alignment.centerLeft, // titleText: "导购收益", // infoText: income.shareIncome.toStringAsFixed(2), // ), // _teamIncomeModel.data.roleVisable // ? Spacer() // : Container(), // _teamIncomeModel.data.roleVisable // ? _textColumn( // titleColor: UserLevelTool.roleLevelEnum( // _teamIncomeModel?.data?.roleLevel) == // UserRoleLevel.Master // ? Colors.black26 // : Color(0xff666666), // titleAligment: Alignment.centerLeft, // titleText: "团队收益", // infoText: income.teamIncome < 0 // ? "未结算" // : income.teamIncome.toStringAsFixed(2), // infoColor: UserLevelTool.roleLevelEnum( // _teamIncomeModel?.data?.roleLevel) == // UserRoleLevel.Master // ? Colors.black26 // : income.teamIncome < 0 // ? AppColor.redColor // : Colors.black, // infoFontSize: income.teamIncome < 0 ? 12 : 16) // : Container() // ], // ) // ], // ), // ), // ), // Positioned( // left: 10, // top: 0, // width: 3, // height: 19, // child: Offstage( // offstage: isFirst, // child: Container( // decoration: BoxDecoration( // borderRadius: BorderRadius.only( // bottomLeft: Radius.circular(2), // bottomRight: Radius.circular(2)), // color: AppColor.redColor), // ))), // Positioned( // right: 10, // top: 0, // width: 3, // height: 19, // child: Offstage( // offstage: isFirst, // child: Container( // decoration: BoxDecoration( // borderRadius: BorderRadius.only( // bottomLeft: Radius.circular(2), // bottomRight: Radius.circular(2)), // color: AppColor.redColor), // ))), // Positioned( // left: 10, // bottom: 0, // width: 3, // height: 19, // child: Offstage( // offstage: isLast, // child: Container( // decoration: BoxDecoration( // borderRadius: BorderRadius.only( // topLeft: Radius.circular(2), // topRight: Radius.circular(2)), // color: AppColor.redColor), // ))), // Positioned( // right: 10, // bottom: 0, // width: 3, // height: 19, // child: Offstage( // offstage: isLast, // child: Container( // decoration: BoxDecoration( // borderRadius: BorderRadius.only( // topLeft: Radius.circular(2), // topRight: Radius.circular(2)), // color: AppColor.redColor), // ))), // ], // ), // ); // } // _getShopIncome() async { // ResultData resultData = await HttpManager.post(ShopApi.shop_addup_income, { // "userId": UserManager.instance.user.info.id, // "year": TextUtils.isEmpty(_selectYearValue) // ? DateTime.now().year.toString() // : _selectYear, // }); // if (!resultData.result) { // showError(resultData.msg); // return; // } // TeamIncomeModel model = TeamIncomeModel.fromJson(resultData.data); // if (model.code != HttpStatus.SUCCESS) { // showError(model.msg); // return; // } // _teamIncomeModel = model; // setState(() {}); // } _getAccumulate() async { _model = await UserBenefitFunc.accmulate(); setState(() {}); } _getMonthIncome(int year) async { _models = await UserBenefitFunc.monthIncome(year: year); setState(() {}); } _textColumn( {String titleText = "", Color titleColor = Colors.black54, double titleFontSize = 14, Alignment titleAligment = Alignment.centerLeft, String infoText = "", Color infoColor = Colors.black, double infoFontSize = 20, Alignment infoAligment = Alignment.centerLeft}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: titleAligment, child: Text( titleText, style: TextStyle(color: titleColor, fontSize: titleFontSize), ), ), Container(height: 5), Container( alignment: infoAligment, child: Text( infoText, style: TextStyle(color: infoColor, fontSize: infoFontSize), ), ) ], ); } } _buildGridColumn( BuildContext context, { String title, String value, int index, bool show = false, }) { if (!show) return null; return MaterialButton( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, padding: EdgeInsets.zero, onPressed: () { _goToNextPage(index, context); }, child: Align( child: [ [ title.text.color(Color(0xff3a3943)).size(14.rsp).make(), CustomImageButton( child: Image.asset(R.ASSETS_SHOP_HELPER_PNG, width: 12.rw, height: 12.rw), onPressed: () => _openQuestDialog(index, title, context), ), ].row(), 3.hb, value.text.color(Color(0xFF333333)).size(20.rsp).make(), ].column( crossAlignment: CrossAxisAlignment.start, alignment: MainAxisAlignment.center, ), alignment: Alignment.centerLeft, ), ); } _goToNextPage(int index, BuildContext context) => CRoute.push( context, UserBenefitSubPage(type: UserBenefitPageType.values[index]), ); _openQuestDialog(int index, String title, BuildContext context) { String content = ''; switch (index) { case 0: content = '自购并确认收货后获得的商品佣金。'; break; case 1: content = '''您的直属会员下单并确认收货后,您获得的佣金。 直属会员:您的团队成员中,若某个会员与您之间的链路没有店主或店铺角色,则该会员称为您的直属会员。'''; break; case 2: content = '每月22日结算您团队上一个自然月确认收货的订单,按团队销售额的3%计算收益。'; break; case 3: content = '每月22日结算您推荐的团队上一个自然月确认收货的订单,按团队销售额的4%计算收益。'; break; case 4: content = '每月22日结算您可获取平台奖励的团队的上一个自然月确认收货的订单,按团队销售额的5%计算收益。'; break; } showDialog( context: context, builder: (context) => NormalContentDialog( title: title, content: content.text.color(Color(0xFF333333)).center.make(), items: [], deleteItem: '确定', type: NormalTextDialogType.delete, listener: (_) => Navigator.pop(context), deleteListener: () => Navigator.pop(context), ), ); } /* @override Widget buildContext(BuildContext context, {store}) { return Scaffold( appBar: CustomAppBar( themeData: AppThemes.themeDataGrey.appBarTheme, elevation: 0, title: "累计收入", bottom: PreferredSize( preferredSize: Size.fromHeight(44), child: TabBar( controller: _tabController, unselectedLabelColor: Colors.black, labelColor: AppColor.themeColor, indicatorColor: AppColor.themeColor, indicatorSize: TabBarIndicatorSize.label, isScrollable: false, labelPadding: EdgeInsets.all(0), labelStyle: AppTextStyle.generate(14, fontWeight: FontWeight.w500), tabs: [ Tab(text:"团队收入", ), Tab(text:"提成收入", ), ]), ), ), body: CacheTabBarView( controller: _tabController, children: [ TeamIncomeWidget(), CommissionIncomeWidget(), // Container() // FocusPage(), // // FocusPage(), // RecommendPage(), ],), ); } */