From ab14b46f308dee5316bcdbbc9b84f7c9ab9c1460 Mon Sep 17 00:00:00 2001 From: laiiihz Date: Fri, 15 Jan 2021 10:03:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=20=E5=AF=B9=E6=8E=A5=E6=9C=88=E5=BA=A6=E6=97=A5?= =?UTF-8?q?=E6=94=B6=E7=9B=8A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/constants/api_v2.dart | 5 ++ .../user/functions/user_benefit_func.dart | 16 ++++ .../user_benefit_month_detail_model.dart | 49 ++++++++++++ lib/pages/user/user_benefit_sub_page.dart | 75 +++++++++++++++---- test/model_test/user_benefit_models_test.dart | 30 ++++++++ test/test.dart | 7 ++ test/widget_test.dart | 30 -------- 7 files changed, 167 insertions(+), 45 deletions(-) create mode 100644 lib/pages/user/model/user_benefit_month_detail_model.dart create mode 100644 test/model_test/user_benefit_models_test.dart create mode 100644 test/test.dart delete mode 100644 test/widget_test.dart diff --git a/lib/constants/api_v2.dart b/lib/constants/api_v2.dart index 8314b84..c4e6e4d 100644 --- a/lib/constants/api_v2.dart +++ b/lib/constants/api_v2.dart @@ -32,4 +32,9 @@ class UserAPI { ///累计平台奖励 String get platformIncome => '/v2/app/user/income/reward_income'; + + ///月度日收益 + /// + ///包含`自购收益`和`导购收益` + String get monthDetail => '/v2/app/user/income/day_income'; } diff --git a/lib/pages/user/functions/user_benefit_func.dart b/lib/pages/user/functions/user_benefit_func.dart index 4369d59..c9b5d6f 100644 --- a/lib/pages/user/functions/user_benefit_func.dart +++ b/lib/pages/user/functions/user_benefit_func.dart @@ -1,7 +1,9 @@ +import 'package:common_utils/common_utils.dart'; import 'package:recook/constants/api_v2.dart'; import 'package:recook/manager/http_manager.dart'; import 'package:recook/pages/user/model/user_accumulate_model.dart'; import 'package:recook/pages/user/model/user_benefit_model.dart'; +import 'package:recook/pages/user/model/user_benefit_month_detail_model.dart'; import 'package:recook/pages/user/model/user_benefit_sub_model.dart'; import 'package:recook/pages/user/model/user_month_income_model.dart'; import 'package:recook/pages/user/user_benefit_sub_page.dart'; @@ -49,4 +51,18 @@ class UserBenefitFunc { ResultData result = await HttpManager.post(path, {}); return UserBenefitSubModel.fromJson(result.data, type); } + + static Future> monthDetail( + DateTime date) async { + ResultData result = await HttpManager.post( + APIV2.userAPI.monthDetail, + {'month': DateUtil.formatDate(date, format: 'yyyy-MM')}, + ); + if (result.data['data'] == null) + return []; + else + return (result.data['data'] as List) + .map((e) => UserBenefitMonthDetailModel.fromJson(e)) + .toList(); + } } diff --git a/lib/pages/user/model/user_benefit_month_detail_model.dart b/lib/pages/user/model/user_benefit_month_detail_model.dart new file mode 100644 index 0000000..3a25499 --- /dev/null +++ b/lib/pages/user/model/user_benefit_month_detail_model.dart @@ -0,0 +1,49 @@ +class UserBenefitMonthDetailModel { + int id; + int userId; + DateTime day; + num purchaseAmount; + num purchaseCount; + num purchaseSalesVolume; + num guideAmount; + int guideCount; + num guideSalesVolume; + + UserBenefitMonthDetailModel( + {this.id, + this.userId, + this.day, + this.purchaseAmount, + this.purchaseCount, + this.purchaseSalesVolume, + this.guideAmount, + this.guideCount, + this.guideSalesVolume}); + + UserBenefitMonthDetailModel.fromJson(Map json) { + id = json['id']; + userId = json['userId']; + int dayRaw = json['day']; + day = DateTime(dayRaw ~/ 10000, dayRaw % 10000 ~/ 100, dayRaw % 100); + purchaseAmount = json['purchaseAmount']; + purchaseCount = json['purchaseCount']; + purchaseSalesVolume = json['purchaseSalesVolume']; + guideAmount = json['guideAmount']; + guideCount = json['guideCount']; + guideSalesVolume = json['guideSalesVolume']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['userId'] = this.userId; + data['day'] = this.day; + data['purchaseAmount'] = this.purchaseAmount; + data['purchaseCount'] = this.purchaseCount; + data['purchaseSalesVolume'] = this.purchaseSalesVolume; + data['guideAmount'] = this.guideAmount; + data['guideCount'] = this.guideCount; + data['guideSalesVolume'] = this.guideSalesVolume; + return data; + } +} diff --git a/lib/pages/user/user_benefit_sub_page.dart b/lib/pages/user/user_benefit_sub_page.dart index 1893558..145b2de 100644 --- a/lib/pages/user/user_benefit_sub_page.dart +++ b/lib/pages/user/user_benefit_sub_page.dart @@ -2,6 +2,8 @@ import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; import 'package:recook/constants/header.dart'; import 'package:recook/pages/user/functions/user_benefit_func.dart'; +import 'package:recook/pages/user/model/user_benefit_month_detail_model.dart'; +import 'package:recook/pages/user/model/user_benefit_sub_model.dart'; import 'package:recook/utils/user_level_tool.dart'; import 'package:recook/widgets/bottom_time_picker.dart'; import 'package:recook/widgets/custom_app_bar.dart'; @@ -56,6 +58,9 @@ class _UserBenefitSubPageState extends State { GSRefreshController _refreshController = GSRefreshController(); + ///仅在自购和导购收益中可用 + List _models = []; + ///头部卡片 Widget _buildCard() { return Container( @@ -212,21 +217,24 @@ class _UserBenefitSubPageState extends State { TableRow _buildTableRow({ DateTime date, double volume, - int amount, + int count, double benefit, }) { return TableRow( children: [ _buildTableItem(DateUtil.formatDate(date, format: 'M月dd日')), _buildTableItem(volume.toStringAsFixed(2)), - _buildTableItem(amount.toString()), + _buildTableItem(count.toString()), _buildTableItem(benefit.toStringAsFixed(2), true), ], ); } ///表格 + /// + ///自购收益和导购收益的列表 _buildTable() { + if (_models.isEmpty) return SizedBox(); return Table( border: TableBorder( horizontalInside: BorderSide(color: Color(0xFFEEEEEE), width: 1.w), @@ -240,12 +248,28 @@ class _UserBenefitSubPageState extends State { _buildTableTitle('结算收益'), ], ), - _buildTableRow( - date: DateTime.now(), - volume: 100, - amount: 1, - benefit: 40, - ), + ..._models.map((e) { + double amount = 0; + double salesVolume = 0; + int count = 0; + if (widget.type == UserBenefitPageType.SELF) { + amount = e.purchaseAmount; + salesVolume = e.purchaseSalesVolume; + count = e.purchaseCount; + } + if (widget.type == UserBenefitPageType.GUIDE) { + amount = e.guideAmount; + salesVolume = e.guideSalesVolume; + count = e.guideCount; + } + + return _buildTableRow( + date: e.day, + volume: salesVolume, + count: count, + benefit: amount, + ); + }).toList(), ], ).material(color: Colors.white).pSymmetric(v: 10.w); } @@ -330,6 +354,21 @@ class _UserBenefitSubPageState extends State { ); } + Widget _buildTag() { + // if(_models.isEmpty)return SizedBox() + double benefitValue = 0; + if (widget.type == UserBenefitPageType.SELF) { + _models.forEach((element) => benefitValue += element.purchaseAmount); + } + if (widget.type == UserBenefitPageType.GUIDE) + _models.forEach((element) => benefitValue += element.guideAmount); + return '当月收益(瑞币):${benefitValue.toStringAsFixed(2)}' + .text + .color(Color(0xFF999999)) + .size(16.sp) + .make(); + } + @override void initState() { super.initState(); @@ -364,13 +403,16 @@ class _UserBenefitSubPageState extends State { body: RefreshWidget( controller: _refreshController, color: Colors.white, - onRefresh: () { - UserBenefitFunc.subInfo(widget.type).then((model) { - _amount = model.data.amount.toStringAsFixed(2); - _salesVolume = model.data.salesVolume.toStringAsFixed(2); - _count = model.data.count.toStringAsFixed(2); - setState(() {}); - }); + onRefresh: () async { + UserBenefitSubModel model = + await UserBenefitFunc.subInfo(widget.type); + _amount = model.data.amount.toStringAsFixed(2); + _salesVolume = model.data.salesVolume.toStringAsFixed(2); + _count = model.data.count.toStringAsFixed(2); + if (!_notSelfNotGUide) { + _models = await UserBenefitFunc.monthDetail(_date); + } + setState(() {}); _refreshController.refreshCompleted(); }, body: ListView( @@ -398,6 +440,7 @@ class _UserBenefitSubPageState extends State { submit: (time, type) { Navigator.maybePop(context); _date = time; + _refreshController.requestRefresh(); setState(() {}); }, timePickerTypes: [ @@ -421,6 +464,8 @@ class _UserBenefitSubPageState extends State { materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), Spacer(), + _notSelfNotGUide ? SizedBox() : _buildTag(), + 15.wb, ], ), _notSelfNotGUide ? _buildMidCard() : SizedBox(), diff --git a/test/model_test/user_benefit_models_test.dart b/test/model_test/user_benefit_models_test.dart new file mode 100644 index 0000000..69ac9dd --- /dev/null +++ b/test/model_test/user_benefit_models_test.dart @@ -0,0 +1,30 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:recook/pages/user/model/user_benefit_month_detail_model.dart'; + +class UserBenefitModelsTest { + static runTest() { + test('test userBenefit', () { + UserBenefitMonthDetailModel userBenefitModel = + UserBenefitMonthDetailModel.fromJson({ + "id": 2, + "userId": 6, + "day": 20201201, // 年月日 + "purchaseAmount": 0, // 自购收益 + "purchaseCount": 0, // 自购单数 + "purchaseSalesVolume": 0, // 自购销售额 + "guideAmount": 0, // 导购收益 + "guideCount": 0, // 导购单数 + "guideSalesVolume": 0 // 导购销售额 + }); + expect(userBenefitModel.day, DateTime(2020, 12, 1)); + expect(userBenefitModel.id, 2); + expect(userBenefitModel.userId, 6); + expect(userBenefitModel.purchaseAmount, 0); + expect(userBenefitModel.purchaseCount, 0); + expect(userBenefitModel.purchaseSalesVolume, 0); + expect(userBenefitModel.guideAmount, 0); + expect(userBenefitModel.guideCount, 0); + expect(userBenefitModel.guideSalesVolume, 0); + }); + } +} diff --git a/test/test.dart b/test/test.dart new file mode 100644 index 0000000..425d947 --- /dev/null +++ b/test/test.dart @@ -0,0 +1,7 @@ + + +import 'model_test/user_benefit_models_test.dart'; + +void main() { + UserBenefitModelsTest.runTest(); +} diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index d0755bd..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:recook/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp(null)); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}