diff --git a/lib/constants/api.dart b/lib/constants/api.dart index cae92a8c..61c59231 100644 --- a/lib/constants/api.dart +++ b/lib/constants/api.dart @@ -183,6 +183,9 @@ class _Manager { ///问卷调查:app问卷调查提交 String get questionnaireSubmit => '/user/questionnaire/submit'; + + ///生活缴费:缴费记录 + String get paymentRecord => '/user/dailyPayment/paymentRecord'; } class _Community { diff --git a/lib/model/manager/life_pay_record_model.dart b/lib/model/manager/life_pay_record_model.dart new file mode 100644 index 00000000..fea38101 --- /dev/null +++ b/lib/model/manager/life_pay_record_model.dart @@ -0,0 +1,44 @@ +class LifePayRecordModel { + int id; + String chargesTemplateDetailName; + String roomName; + String years; + int paidPrice; + String createDate; + int payType; + String code; + + LifePayRecordModel( + {this.id, + this.chargesTemplateDetailName, + this.roomName, + this.years, + this.paidPrice, + this.createDate, + this.payType, + this.code}); + + LifePayRecordModel.fromJson(Map json) { + id = json['id']; + chargesTemplateDetailName = json['chargesTemplateDetailName']; + roomName = json['roomName']; + years = json['years']; + paidPrice = json['paidPrice']; + createDate = json['createDate']; + payType = json['payType']; + code = json['code']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['chargesTemplateDetailName'] = this.chargesTemplateDetailName; + data['roomName'] = this.roomName; + data['years'] = this.years; + data['paidPrice'] = this.paidPrice; + data['createDate'] = this.createDate; + data['payType'] = this.payType; + data['code'] = this.code; + return data; + } +} diff --git a/lib/pages/event_activity/voting_detail_page.dart b/lib/pages/event_activity/voting_detail_page.dart index b41e03dd..5e0015d9 100644 --- a/lib/pages/event_activity/voting_detail_page.dart +++ b/lib/pages/event_activity/voting_detail_page.dart @@ -16,6 +16,7 @@ import 'package:akuCommunity/widget/bee_divider.dart'; import 'package:akuCommunity/widget/bee_scaffold.dart'; import 'package:akuCommunity/widget/buttons/bee_single_check.dart'; import 'package:akuCommunity/widget/buttons/bottom_button.dart'; +import 'package:velocity_x/velocity_x.dart'; class VotingDetailPage extends StatefulWidget { final int id; @@ -33,8 +34,8 @@ class _VotingDetailPageState extends State { // List _select = []; int _selectId; bool _hasVoted = false; - bool get isVoted { - if ((_model.status == 4) || _hasVoted) { + bool get finishVoted { + if ((_model.status == 4) || _hasVoted || (_model.status == 3)) { return true; } return false; @@ -76,16 +77,24 @@ class _VotingDetailPageState extends State { ); } + double _getPercent(num numerator, num denominator) { + if (denominator == 0) { + return 0; + } else { + return (numerator / denominator) * 100; + } + } + Widget _buildVoteCard(AppVoteCandidateVos model) { - double _percent = (model.total.toDouble()) / (_model.totals.toDouble()); + double _percent = _getPercent(model.total, _model.totals); return Container( padding: EdgeInsets.symmetric(vertical: 40.w), - constraints: BoxConstraints(maxHeight: 230.w), + // constraints: BoxConstraints(maxHeight: 230.w), child: Row( children: [ Container( alignment: Alignment.center, - width: 88.w, + width: 58.w, height: 150.w, //多选 // child: BeeCheckBox( @@ -104,7 +113,7 @@ class _VotingDetailPageState extends State { // // //暂时用单选 - child: _model.status == 3 || _model.status == 1 + child: finishVoted ? _unCheck() : GestureDetector( onTap: () { @@ -139,21 +148,22 @@ class _VotingDetailPageState extends State { // 10.w.heightBox, model.name.text.black.size(32.sp).make(), 33.w.heightBox, - isVoted && _model.status != 3 + finishVoted ? Row( children: [ SizedBox( - width: 280.w, + width: 290.w, child: LinearProgressIndicator( value: _percent, ), ), 8.w.widthBox, - '$_percent%' + '${_percent.toStringAsFixed(2)}%' .text .color(ktextSubColor) .size(24.sp) - .make(), + .make() + .expand(), ], ) : SizedBox() @@ -198,6 +208,7 @@ class _VotingDetailPageState extends State { Widget build(BuildContext context) { return BeeScaffold( title: '活动详情', + bodyColor: Colors.white, body: EasyRefresh( firstRefresh: true, controller: _refreshController, @@ -231,8 +242,11 @@ class _VotingDetailPageState extends State { Container( padding: EdgeInsets.fromLTRB(32.w, 50.w, 32.w, 0), decoration: BoxDecoration( - color: Color(0xFFD9D9D9), + color: Color(0xFFFAFAFA), borderRadius: BorderRadius.circular(8.w), + border: Border.all( + color: Color(0xFFD9D9D9), + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/life_pay/life_pay_page.dart b/lib/pages/life_pay/life_pay_page.dart index d32ebac1..c84b44aa 100644 --- a/lib/pages/life_pay/life_pay_page.dart +++ b/lib/pages/life_pay/life_pay_page.dart @@ -1,4 +1,5 @@ import 'package:akuCommunity/constants/app_values.dart'; +import 'package:akuCommunity/pages/life_pay/life_pay_record_page.dart'; import 'package:akuCommunity/provider/app_provider.dart'; import 'package:akuCommunity/ui/profile/house/pick_my_house_page.dart'; import 'package:flutter/cupertino.dart'; @@ -221,24 +222,24 @@ class _LifePayPageState extends State { return BeeScaffold( title: '生活缴费', actions: [ - //TODO 缴费记录 无接口 - // InkWell( - // onTap: () { - // LifePayRecordPage().to(); - // }, - // child: Container( - // padding: EdgeInsets.fromLTRB(32.w, 28.w, 32.w, 20.w), - // alignment: Alignment.center, - // child: '缴费记录'.text.black.size(28.sp).make(), - // ), - // ), + 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: BeeListView( path: API.manager.dailyPaymentList, controller: _controller, extraParams: {'estateId': appProvider.selectedHouse.estateId}, convert: (model) { - _selectPay = List.generate(model.tableList.length, + _selectPay = List.generate( + (_selectPay.length ?? 0) + model.tableList.length, (index) => SelectPay(payCount: 0, payTotal: 0.0)); return model.tableList .map((e) => LifePayModel.fromJson(e)) diff --git a/lib/pages/life_pay/life_pay_record_page.dart b/lib/pages/life_pay/life_pay_record_page.dart new file mode 100644 index 00000000..cf3e8374 --- /dev/null +++ b/lib/pages/life_pay/life_pay_record_page.dart @@ -0,0 +1,140 @@ +import 'package:akuCommunity/base/base_style.dart'; +import 'package:akuCommunity/constants/api.dart'; +import 'package:akuCommunity/model/manager/life_pay_record_model.dart'; +import 'package:akuCommunity/pages/things_page/widget/bee_list_view.dart'; +import 'package:akuCommunity/widget/bee_scaffold.dart'; +import 'package:flustars/flustars.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:velocity_x/velocity_x.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class LifePayRecordPage extends StatefulWidget { + LifePayRecordPage({Key key}) : super(key: key); + + @override + _LifePayRecordPageState createState() => _LifePayRecordPageState(); +} + +class _LifePayRecordPageState extends State { + EasyRefreshController _refreshController; + Map getPayType = {1: '支付宝', 2: '微信', 3: '现金', 4: 'pos'}; + @override + void initState() { + super.initState(); + _refreshController = EasyRefreshController(); + } + + @override + void dispose() { + _refreshController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return BeeScaffold( + title: '生活缴费', + body: BeeListView( + path: API.manager.paymentRecord, + controller: _refreshController, + convert: (models) { + return models.tableList + .map((e) => LifePayRecordModel.fromJson(e)) + .toList(); + }, + builder: (items) { + return ListView( + padding: EdgeInsets.symmetric(vertical: 32.w, horizontal: 32.w), + children: [ + '如果有疑问,请联系物业客服 ' + .richText + .withTextSpanChildren([ + '400-6754322' + .textSpan + .color(Color(0xFFFF8200)) + .size(24.sp) + .bold + .make() + ]) + .size(24.sp) + .color(ktextSubColor) + .make(), + 32.w.heightBox, + ...items.map((e) => _buildRecordCard(e)).toList() + ], + ); + }, + ), + ); + } + + Widget _buildRecordCard(LifePayRecordModel model) { + return Column( + children: [ + Row( + children: [ + model.chargesTemplateDetailName.text + .size(30.sp) + .color(ktextPrimary) + .bold + .make(), + Spacer(), + '${S.of(context).tempPlotName} ${model.roomName}' + .text + .size(24.sp) + .color(Color(0xFF999999)) + .make() + ], + ), + 50.w.heightBox, + Row( + children: [ + '${model.years}年'.text.color(ktextSubColor).size(24.sp).make(), + Spacer(), + '${model.paidPrice}' + .text + .color(Color(0xFFFC361D)) + .size(28.sp) + .bold + .make() + ], + ), + Row( + children: [ + '创建时间'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${DateUtil.formatDateStr(model.createDate, format: "yyyy/MM/dd HH:mm")}' + .text + .color(ktextPrimary) + .size(28.sp) + .make(), + ], + ), + Row( + children: [ + '付款方式'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${getPayType[model.payType]}' + .text + .color(ktextPrimary) + .size(28.sp) + .make(), + ], + ), + Row( + children: [ + '订单号'.text.color(ktextSubColor).size(28.sp).make(), + Spacer(), + '${model.code}'.text.color(ktextPrimary).size(28.sp).make(), + ], + ), + ], + ) + .box + .color(Colors.white) + .padding(EdgeInsets.symmetric(vertical: 32.w, horizontal: 20.w)) + .make(); + } +} diff --git a/lib/pages/life_pay/widget/life_pay_detail_page.dart b/lib/pages/life_pay/widget/life_pay_detail_page.dart index 3899fce4..4adee029 100644 --- a/lib/pages/life_pay/widget/life_pay_detail_page.dart +++ b/lib/pages/life_pay/widget/life_pay_detail_page.dart @@ -43,6 +43,27 @@ class _LifePayDetailPageState extends State { return listLength == _selectItems.length; } + @override + void initState() { + super.initState(); + for (var i = 0; i < widget.model.dailyPaymentTypeVos.length; i++) { + for (var j = 0; + j < widget.model.dailyPaymentTypeVos[i].detailedVoList.length; + j++) { + String id = widget.model.dailyPaymentTypeVos[i].id.toString() + + widget.model.dailyPaymentTypeVos[i].detailedVoList[j].groupId + .toString(); + if (!_selectItems.contains(id)) { + _selectItems.add(id); + _payNum += 1; + _payTotal += widget + .model.dailyPaymentTypeVos[i].detailedVoList[j].paymentPrice + .toDouble(); + } + } + } + } + Widget _buildTile(int groupId, int id, int years, double price) { return GestureDetector( onTap: () { @@ -76,10 +97,6 @@ class _LifePayDetailPageState extends State { .bold .make(), 24.w.widthBox, - Icon( - CupertinoIcons.chevron_forward, - size: 40.w, - ), ], ).material(color: Colors.transparent), ); @@ -133,36 +150,35 @@ class _LifePayDetailPageState extends State { children: [ GestureDetector( onTap: () { - setState(() { - if (isAllSelect) { - _selectItems.clear(); - _payNum = 0; - _payTotal = 0; - } else { - for (var i = 0; - i < widget.model.dailyPaymentTypeVos.length; - i++) { - for (var j = 0; - i < - widget.model.dailyPaymentTypeVos[i].detailedVoList - .length; - i++) { - String id = - widget.model.dailyPaymentTypeVos[i].id.toString() + - widget.model.dailyPaymentTypeVos[i] - .detailedVoList[j].groupId - .toString(); - if (!_selectItems.contains(id)) { - _selectItems.add(id); - _payNum += 1; - _payTotal += widget.model.dailyPaymentTypeVos[i] - .detailedVoList[j].paymentPrice - .toDouble(); - } + if (isAllSelect) { + _selectItems.clear(); + _payNum = 0; + _payTotal = 0; + } else { + for (var i = 0; + i < widget.model.dailyPaymentTypeVos.length; + i++) { + for (var j = 0; + j < + widget.model.dailyPaymentTypeVos[i].detailedVoList + .length; + j++) { + String id = + widget.model.dailyPaymentTypeVos[i].id.toString() + + widget.model.dailyPaymentTypeVos[i] + .detailedVoList[j].groupId + .toString(); + if (!_selectItems.contains(id)) { + _selectItems.add(id); + _payNum += 1; + _payTotal += widget.model.dailyPaymentTypeVos[i] + .detailedVoList[j].paymentPrice + .toDouble(); } } } - }); + } + setState(() {}); }, child: AnimatedContainer( duration: Duration(milliseconds: 300), @@ -207,6 +223,7 @@ class _LifePayDetailPageState extends State { '已选$_payNum项'.text.color(ktextSubColor).size(20.sp).make(), ], ), + 8.w.widthBox, MaterialButton( elevation: 0, shape: RoundedRectangleBorder( diff --git a/lib/pages/message_center_page/comment_message/comment_message_page.dart b/lib/pages/message_center_page/comment_message/comment_message_page.dart index 989c8192..70288fbc 100644 --- a/lib/pages/message_center_page/comment_message/comment_message_page.dart +++ b/lib/pages/message_center_page/comment_message/comment_message_page.dart @@ -1,4 +1,5 @@ import 'package:akuCommunity/model/common/img_model.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flustars/flustars.dart'; @@ -41,6 +42,24 @@ class _CommentMessagePageState extends State { return BeeDateUtil(DateUtil.getDateTime(time)).timeAgo; } + Widget _messageContent(CommentMessageModel model) { + if (model.type == 2) { + return Icon( + CupertinoIcons.heart, + size: 32.w, + ); + } else { + return ((model.respondentName?.isEmptyOrNull ?? true) + ? model.content + : '回复了${model.respondentName}:${model.content}') + .text + .black + .size(28.sp) + .isIntrinsic + .make(); + } + } + Widget buildCard(CommentMessageModel model) { return Container( width: double.infinity, @@ -66,14 +85,9 @@ class _CommentMessagePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ model.createName.text.black.size(36.sp).make(), - ((model.respondentName?.isEmptyOrNull ?? true) - ? model.content - : '回复了${model.respondentName}:${model.content}') - .text - .black - .size(28.sp) - .isIntrinsic - .make(), + 10.w.heightBox, + _messageContent(model), + 16.w.heightBox, getTime(model.createDate) .text .color(Color(0xFF999999)) diff --git a/lib/pages/message_center_page/message_center_page.dart b/lib/pages/message_center_page/message_center_page.dart index b2a906e4..25e97b74 100644 --- a/lib/pages/message_center_page/message_center_page.dart +++ b/lib/pages/message_center_page/message_center_page.dart @@ -109,8 +109,9 @@ class _MessageCenterPageState extends State { appProvider.messageCenterModel.commentTitle ?? '无评论通知消息', count: appProvider.messageCenterModel.commentCount ?? 0, onTap: () async { - // await NetUtil().dio.get(API.message.allReadComment); + await NetUtil().dio.get(API.message.allReadComment); Get.to(() => CommentMessagePage()); + setState(() {}); }, ), // _buildCard(