import 'package:aku_community/models/life_pay/life_pay_list_model.dart'; import 'package:aku_community/utils/network/base_list_model.dart'; import 'package:aku_community/widget/bee_divider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:bot_toast/bot_toast.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:get/get.dart' hide Response; import 'package:provider/provider.dart'; import 'package:velocity_x/velocity_x.dart'; import 'package:aku_community/base/base_style.dart'; import 'package:aku_community/constants/api.dart'; import 'package:aku_community/pages/life_pay/life_pay_record_page.dart'; import 'package:aku_community/pages/life_pay/pay_finish_page.dart'; import 'package:aku_community/pages/life_pay/pay_util.dart'; import 'package:aku_community/pages/life_pay/widget/life_pay_detail_page.dart'; import 'package:aku_community/provider/app_provider.dart'; import 'package:aku_community/utils/bee_parse.dart'; import 'package:aku_community/utils/headers.dart'; import 'package:aku_community/utils/network/base_model.dart'; import 'package:aku_community/utils/network/net_util.dart'; import 'package:aku_community/widget/bee_scaffold.dart'; import 'package:aku_community/widget/buttons/bee_check_radio.dart'; import 'package:aku_community/widget/others/house_head_card.dart'; class LifePayPage extends StatefulWidget { LifePayPage({Key? key}) : super(key: key); @override _LifePayPageState createState() => _LifePayPageState(); } class SelectPay { double payTotal; //费用 int payCount; //项数 List ids; //存储选中的主键id数组 SelectPay( {required this.payCount, required this.payTotal, required this.ids}); } class _LifePayPageState extends State { EasyRefreshController? _controller; List _selectYears = []; //选择的年份,存储其数组下标 List _models = []; // List _selectPay = []; //辅助计算总费用数组 储存下级页面传递出来的已选费用参数 // double _totalCost = 0; //总费用 // // int _count = 0; //费用项数 // List _ids = []; //存储选中的主键id数组 int _page = 0; int _size = 10; List _selectModels = []; //选中的models bool get allSelect => ((_models.length == _selectYears.length) && (_models.length != 0)); SelectPay get total { int count = 0; double price = 0; List ids = []; for (var i in _selectYears) { SelectPay _select = selectCount(_selectModels[i]); count += _select.payCount; price += _select.payTotal; ids.addAll(_select.ids); } return SelectPay(payCount: count, payTotal: price, ids: ids); } SelectPay selectCount(LifePayListModel model) { int count = 0; double price = 0; List ids = []; model.dailyPaymentTypeVos.forEach((element) { element.detailedVoList.forEach((element) { element.detailsVoList.forEach((element) { count++; price += element.costPrice; ids.add(element.id); }); }); }); return SelectPay(payCount: count, payTotal: price, ids: ids); } @override void initState() { super.initState(); _controller = EasyRefreshController(); } @override void dispose() { _controller?.dispose(); BotToast.closeAllLoading(); super.dispose(); } Widget _buildCard(LifePayListModel model, int index) { SelectPay _select = selectCount(_selectModels[index]); return Container( padding: EdgeInsets.symmetric(vertical: 20.w), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8.w), color: kForeGroundColor), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( onTap: () { setState(() { if (_selectYears.contains(index)) { _selectYears.remove(index); // _totalCost -= (_selectPay[index].payTotal); // _count -= (_selectPay[index].payCount); // _selectPay[index].ids.forEach((element) { // _ids.remove(element); // }); } else { _selectYears.add(index); // _totalCost += (_selectPay[index].payTotal); // _count += (_selectPay[index].payCount); // _ids.addAll(_selectPay[index].ids); } }); }, child: BeeCheckRadio( value: index, groupValue: _selectYears, ), ), ], ), 24.w.widthBox, Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ '${BeeParse.getCustomYears(model.years)}(${model.years})' .text .color(ktextSubColor) .size(28.sp) .make(), 24.w.heightBox, '待缴:${model.paymentNum}项 已选${_select.payCount}项' .text .color(ktextPrimary) .size(28.sp) .make(), 24.w.heightBox, RichText( text: TextSpan( text: '合计:', style: TextStyle( color: ktextPrimary, fontSize: 28.sp, fontWeight: FontWeight.bold), children: [ TextSpan( text: '¥ ${_select.payTotal.toStringAsFixed(2)}', style: TextStyle( color: kDangerColor, fontSize: 28.sp, fontWeight: FontWeight.bold)), ])) ], ).expand(), Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ GestureDetector( onTap: () async { if (_selectYears.contains(index)) { // _totalCost -= _selectPay[index].payTotal; // _count -= _selectPay[index].payCount; // _selectPay[index].ids.forEach((element) { // _ids.remove(element); // }); } dynamic payMent = await (Get.to(() => LifePayDetailPage( model: _models[index], selectModel: _selectModels[index], year: model.years, ))); if (payMent.runtimeType == LifePayListModel) { _selectModels[index] = payMent; } // _selectPay[index].payCount = payMent[0]; // _selectPay[index].payTotal = payMent[1]; // _selectPay[index].ids = payMent[2]; // if (_selectYears.contains(index)) { // _totalCost += _selectPay[index].payTotal; // _count += _selectPay[index].payCount; // } setState(() {}); }, child: Container( decoration: BoxDecoration( color: Color(0xFF2A2A2A), borderRadius: BorderRadius.circular(22.w), ), padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 8.w), child: '选择明细'.text.color(Colors.white).size(22.sp).make(), ), ), ], ), ], ), ); } // double getPayTotal(LifePayListModel list) { // num total = 0; // if (list.dailyPaymentTypeVos != null) { // for (var item in list.dailyPaymentTypeVos!) { // for (var v in item.detailedVoList!) { // total += v.paymentPrice ?? 0; // } // } // } // return total as double; // } // List getIds(LifePayListModel list) { // List _list = []; // if (list.dailyPaymentTypeVos != null) { // for (var item in list.dailyPaymentTypeVos!) { // for (var v in item.detailedVoList!) { // _list.addAll(_findIds(v.detailsVoList ?? [])); // } // } // } // return _list; // } // List _findIds(List list) { // List _list = []; // list.forEach((element) { // _list.add(element.id!); // }); // return _list; // } // _allSelectOption() { // //若已全选则清空已选年份数组 // if (_models.length == _selectYears.length) { // _selectYears.clear(); // _ids.clear(); // _totalCost = 0; // _count = 0; // } else { // for (var i = 0; i < _models.length; i++) { // if (!_selectYears.contains(i)) { // _selectYears.add(i); // } // } // _totalCost = 0; // _count = 0; // _ids.clear(); // for (var item in _selectPay) { // _totalCost += item.payTotal; // _count += item.payCount; // _ids.addAll(item.ids); // } // } // setState(() {}); // } Widget _payButton() { return MaterialButton( elevation: 0, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(37.w)), color: kPrimaryColor, padding: EdgeInsets.symmetric(horizontal: 50.w, vertical: 15.w), onPressed: () async { Function cancel = BotToast.showLoading(); BaseModel baseModel = await NetUtil().post('/user/alipay/dailyPaymentAlipay', params: { "ids": total.ids, "payType": 1, //暂时写死 等待后续补充 "payPrice": total.payTotal }); if (baseModel.status ?? false) { bool result = await PayUtil() .callAliPay(baseModel.message!, API.pay.dailPayMentCheck); if (result) { Get.off(PayFinishPage()); } } cancel(); }, child: '去缴费'.text.black.size(32.sp).bold.make(), ); } @override Widget build(BuildContext context) { final appProvider = Provider.of(context); return BeeScaffold( title: '生活缴费', actions: [ InkWell( onTap: () { Get.to(() => LifePayRecordPage()); }, child: Container( padding: EdgeInsets.fromLTRB(32.w, 28.w, 32.w, 20.w), alignment: Alignment.center, child: '缴费记录'.text.black.size(28.sp).make(), ), ), ], body: EasyRefresh( firstRefresh: true, header: MaterialHeader(), controller: _controller, onRefresh: () async { _page = 1; _size = 10; BaseListModel baseListModel = await NetUtil() .getList(API.manager.dailyPaymentList, params: { "pageNum": _page, "size": _size, 'estateId': appProvider.selectedHouse!.estateId }); _models = baseListModel.tableList! .map((e) => LifePayListModel.fromJson(e)) .toList(); // _selectPay.clear(); _selectYears.clear(); _selectModels = _models .map((e) => LifePayListModel.fromJson(e.toJson())) .toList(); for (var i = 0; i < _selectModels.length; i++) { _selectYears.add(i); } // _totalCost = 0; // _count = 0; // _selectPay.addAll(_models // .map((e) => SelectPay( // payCount: e.dailyPaymentTypeVos!.length, // payTotal: getPayTotal(e), // ids: getIds(e))) // .toList()); if (mounted) setState(() {}); }, child: Column( children: [ HouseHeadCard( onChanged: () { _controller!.callRefresh(); }, context: context), 16.w.heightBox, Container( padding: EdgeInsets.all(32.w), width: double.infinity, color: kForeGroundColor, constraints: BoxConstraints(minHeight: 20.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ '缴费账单'.text.color(ktextPrimary).size(28.sp).make(), ...List.generate(_models.length, (index) => _buildCard(_models[index], index)) .sepWidget(separate: BeeDivider.horizontal()), ], ), ), ], ), ), bottomNavi: Container( color: kForeGroundColor, padding: EdgeInsets.fromLTRB( 32.w, 16.w, 32.w, 12.w + MediaQuery.of(context).padding.bottom), child: Row( children: [ GestureDetector( onTap: () { // _allSelectOption(); if (allSelect) { _selectYears.clear(); setState(() {}); } else { _selectYears.clear(); for (var i = 0; i < _selectModels.length; i++) { _selectYears.add(i); } setState(() {}); } }, child: AnimatedContainer( duration: Duration(milliseconds: 300), decoration: BoxDecoration( border: Border.all( width: 1.w, color: allSelect ? kPrimaryColor : kDarkSubColor), color: allSelect ? kPrimaryColor : Colors.transparent, borderRadius: BorderRadius.circular(20.w)), curve: Curves.easeInOutCubic, width: 40.w, height: 40.w, child: allSelect ? Icon( CupertinoIcons.check_mark, size: 25.w, color: Colors.white, ) : SizedBox(), ).material(color: Colors.transparent), ), Spacer(), Column( crossAxisAlignment: CrossAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ RichText( text: TextSpan( text: '合计:', style: TextStyle( color: ktextPrimary, fontSize: 32.sp, fontWeight: FontWeight.bold), children: [ TextSpan( text: '¥${total.payTotal.toStringAsFixed(2)}', style: TextStyle( color: kDangerColor, fontSize: 32.sp, fontWeight: FontWeight.bold)), ])), '已选${total.payCount}项' .text .color(ktextSubColor) .size(20.sp) .make(), ], ), 24.w.widthBox, _payButton(), ], ), ), ); } }