对接多个收益接口

master
laiiihz 5 years ago
parent ab14b46f30
commit 94314caf0f

@ -37,4 +37,13 @@ class UserAPI {
///
///````
String get monthDetail => '/v2/app/user/income/day_income';
///
String get groupDetail => '/v2/app/user/income/team_month_income';
///
String get recommendDetail => '/v2/app/user/income/recommend_month_income';
///
String get platformDetail => '/v2/app/user/income/reward_month_income';
}

@ -2,6 +2,7 @@ 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_extra_detail_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';
@ -65,4 +66,29 @@ class UserBenefitFunc {
.map((e) => UserBenefitMonthDetailModel.fromJson(e))
.toList();
}
static Future<UserBenefitExtraDetailModel> extraDetail({
UserBenefitPageType type,
DateTime date,
}) async {
String path = '';
switch (type) {
case UserBenefitPageType.TEAM:
path = APIV2.userAPI.groupDetail;
break;
case UserBenefitPageType.RECOMMEND:
path = APIV2.userAPI.recommendDetail;
break;
case UserBenefitPageType.PLATFORM:
path = APIV2.userAPI.platformDetail;
break;
default:
break;
}
ResultData result = await HttpManager.post(
path,
{'month': DateUtil.formatDate(date, format: 'yyyy-MM')},
);
return UserBenefitExtraDetailModel.fromJson(result.data);
}
}

@ -0,0 +1,122 @@
import 'package:recook/utils/user_level_tool.dart';
class UserBenefitExtraDetailModel {
String code;
String msg;
Data data;
UserBenefitExtraDetailModel({this.code, this.msg, this.data});
UserBenefitExtraDetailModel.fromJson(Map<String, dynamic> json) {
code = json['code'];
msg = json['msg'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['code'] = this.code;
data['msg'] = this.msg;
if (this.data != null) {
data['data'] = this.data.toJson();
}
return data;
}
}
class Data {
List<UserIncome> userIncome;
num amount = 0;
num salesVolume;
num ratio;
int count;
int isSettlement;
Data(
{this.userIncome,
this.amount,
this.salesVolume,
this.ratio,
this.count,
this.isSettlement});
Data.fromJson(Map<String, dynamic> json) {
if (json['userIncome'] != null) {
userIncome = new List<UserIncome>();
json['userIncome'].forEach((v) {
userIncome.add(new UserIncome.fromJson(v));
});
} else {
userIncome = [];
}
amount = json['teamAmount'];
salesVolume = json['salesVolume'];
ratio = json['ratio'];
count = json['count'];
isSettlement = json['IsSettlement'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.userIncome != null) {
data['userIncome'] = this.userIncome.map((v) => v.toJson()).toList();
}
data['amount'] = this.amount;
data['salesVolume'] = this.salesVolume;
data['ratio'] = this.ratio;
data['count'] = this.count;
data['IsSettlement'] = this.isSettlement;
return data;
}
}
class UserIncome {
int userId;
String headImgUrl;
String nickname;
String phone;
String wechatNo;
String remarkName;
int count;
num amount;
int roleLevel;
UserRoleLevel get roleLevelEnum => UserLevelTool.roleLevelEnum(roleLevel);
UserIncome(
{this.userId,
this.headImgUrl,
this.nickname,
this.phone,
this.wechatNo,
this.remarkName,
this.count,
this.amount,
this.roleLevel});
UserIncome.fromJson(Map<String, dynamic> json) {
userId = json['userId'];
headImgUrl = json['headImgUrl'];
nickname = json['nickname'];
phone = json['phone'];
wechatNo = json['wechatNo'];
remarkName = json['remarkName'];
count = json['count'];
amount = json['amount'];
roleLevel = json['roleLevel'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['userId'] = this.userId;
data['headImgUrl'] = this.headImgUrl;
data['nickname'] = this.nickname;
data['phone'] = this.phone;
data['wechatNo'] = this.wechatNo;
data['remarkName'] = this.remarkName;
data['count'] = this.count;
data['amount'] = this.amount;
data['roleLevel'] = this.roleLevel;
return data;
}
}

@ -1,10 +1,15 @@
import 'dart:math';
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_extra_detail_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/widget/user_group_card.dart';
import 'package:recook/utils/user_level_tool.dart';
import 'package:recook/widgets/animated_rotate.dart';
import 'package:recook/widgets/bottom_time_picker.dart';
import 'package:recook/widgets/custom_app_bar.dart';
import 'package:recook/widgets/custom_painters/round_background_painter.dart';
@ -56,10 +61,13 @@ class _UserBenefitSubPageState extends State<UserBenefitSubPage> {
String _salesVolume = '';
String _count = '';
bool _itemReverse = false;
GSRefreshController _refreshController = GSRefreshController();
///
List<UserBenefitMonthDetailModel> _models = [];
UserBenefitExtraDetailModel _extraDetailModel;
///
Widget _buildCard() {
@ -167,25 +175,37 @@ class _UserBenefitSubPageState extends State<UserBenefitSubPage> {
}
///
Widget _buildMidCard({
String slot1 = '0',
String slot2 = '0',
String slot3 = '0',
}) {
Widget _buildMidCard() {
if (_extraDetailModel == null) return SizedBox();
return VxBox(
child: [
'$_title\(元)'.text.color(Colors.black54).size(18).make(),
slot1.text.color(Color(0xFF333333)).size(24).make(),
_extraDetailModel.data.amount
.toStringAsFixed(2)
.text
.color(Color(0xFF333333))
.size(24)
.make(),
36.hb,
[
[
'销售额(元)'.text.color(Colors.black54).size(14).make(),
slot2.text.color(Color(0xFF333333)).size(16).make(),
_extraDetailModel.data.salesVolume
.toStringAsFixed(2)
.text
.color(Color(0xFF333333))
.size(16)
.make(),
].column(crossAlignment: CrossAxisAlignment.start),
Spacer(),
[
'提成比例(%)'.text.color(Colors.black54).size(14).make(),
slot3.text.color(Color(0xFF333333)).size(16).make(),
_extraDetailModel.data.ratio
.toStringAsFixed(2)
.text
.color(Color(0xFF333333))
.size(16)
.make(),
].column(),
].row(),
].column(crossAlignment: CrossAxisAlignment.start),
@ -311,6 +331,7 @@ class _UserBenefitSubPageState extends State<UserBenefitSubPage> {
}
Widget _buildGroupItems() {
if (_extraDetailModel == null) return SizedBox();
return Stack(
children: [
_buildBackBar(),
@ -323,24 +344,54 @@ class _UserBenefitSubPageState extends State<UserBenefitSubPage> {
15.wb,
'团队贡献榜'.text.size(14.sp).color(Color(0xFF333333)).bold.make(),
Spacer(),
'团队人数:12'.text.size(14.sp).color(Color(0xFF333333)).bold.make(),
'团队人数:${_extraDetailModel.data.count}'
.text
.size(14.sp)
.color(Color(0xFF333333))
.bold
.make(),
10.wb,
MaterialButton(
minWidth: 0,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onPressed: () {},
child: Image.asset(
R.ASSETS_ASCSORT_PNG,
height: 15.w,
width: 15.w,
onPressed: () {
setState(() {
_itemReverse = !_itemReverse;
});
},
child: AnimatedRotate(
child: Image.asset(
R.ASSETS_ASCSORT_PNG,
height: 15.w,
width: 15.w,
),
angle: _itemReverse ? 0 : pi,
),
padding: EdgeInsets.symmetric(horizontal: 15.w),
),
],
),
10.hb,
ListView(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
reverse: _itemReverse,
children: _extraDetailModel.data.userIncome.map((e) {
bool hasExtraName = TextUtil.isEmpty(e.remarkName);
return UserGroupCard(
shopRole: UserLevelTool.roleLevelEnum(e.roleLevel),
wechatId: e.wechatNo ?? '',
name: '${e.nickname}${hasExtraName ? '' : e.remarkName}',
groupCount: e.count,
phone: e.phone ?? '',
headImg: e.headImgUrl ?? '',
);
}).toList(),
),
].column(),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(bottom: Radius.circular(5.w)),
boxShadow: [
BoxShadow(
offset: Offset(0, 2.w),
@ -411,6 +462,11 @@ class _UserBenefitSubPageState extends State<UserBenefitSubPage> {
_count = model.data.count.toStringAsFixed(2);
if (!_notSelfNotGUide) {
_models = await UserBenefitFunc.monthDetail(_date);
} else {
_extraDetailModel = await UserBenefitFunc.extraDetail(
type: widget.type,
date: _date,
);
}
setState(() {});
_refreshController.refreshCompleted();

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/utils/user_level_tool.dart';
import 'package:recook/widgets/custom_image_button.dart';
import 'package:velocity_x/velocity_x.dart';
@ -10,6 +11,7 @@ class UserGroupCard extends StatefulWidget {
final String phone;
final UserRoleLevel shopRole;
final int groupCount;
final String headImg;
//options
final bool flat;
@ -20,6 +22,7 @@ class UserGroupCard extends StatefulWidget {
@required this.phone,
@required this.shopRole,
@required this.groupCount,
@required this.headImg,
}) : flat = false,
super(key: key);
@ -30,6 +33,7 @@ class UserGroupCard extends StatefulWidget {
@required this.phone,
@required this.shopRole,
@required this.groupCount,
@required this.headImg,
}) : flat = true,
super(key: key);
@ -59,8 +63,14 @@ class _UserGroupCardState extends State<UserGroupCard> {
onPressed: () {},
child: VxBox(
child: [
CircleAvatar(
radius: 20.w,
ClipRRect(
borderRadius: BorderRadius.circular(20.w),
child: FadeInImage.assetNetwork(
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
image: Api.getImgUrl(widget.headImg),
height: 40.w,
width: 40.w,
),
),
10.wb,
<Widget>[
@ -68,27 +78,31 @@ class _UserGroupCardState extends State<UserGroupCard> {
child: [
widget.name.text.black.make(),
6.wb,
Image.asset(
R.ASSETS_INVITE_DETAIL_EDIT_PNG,
height: 12.w,
width: 12.w,
),
// Image.asset(
// R.ASSETS_INVITE_DETAIL_EDIT_PNG,
// height: 12.w,
// width: 12.w,
// ),
Spacer(),
].row(),
onTap: () {},
),
4.hb,
[
_buildTile(R.ASSETS_USER_ICON_WECHAT_PNG, 'WEIXINXXXX').expand(),
_buildTile(R.ASSETS_USER_ICON_PHONE_PNG, '18295849102X').expand(),
_buildTile(R.ASSETS_USER_ICON_WECHAT_PNG, widget.wechatId)
.expand(),
_buildTile(R.ASSETS_USER_ICON_PHONE_PNG, widget.phone).expand(),
].row(),
4.hb,
[
_buildTile(
UserLevelTool.getRoleLevelIcon(UserRoleLevel.Gold),
'WEIXINXXXX',
UserLevelTool.getRoleLevelIcon(widget.shopRole),
UserLevelTool.roleLevelWithEnum(widget.shopRole),
).expand(),
_buildTile(
R.ASSETS_USER_ICON_GROUP_PNG,
widget.groupCount.toString(),
).expand(),
_buildTile(R.ASSETS_USER_ICON_GROUP_PNG, '9').expand(),
].row(),
].column().expand(),
].row(crossAlignment: CrossAxisAlignment.start),

@ -0,0 +1,108 @@
import 'package:flutter/material.dart';
import 'package:recook/constants/api.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/utils/user_level_tool.dart';
class UserInviteCard extends StatelessWidget {
final String headerImg;
final String nickName;
final String phone;
final int groupCount;
final UserRoleLevel roleLevel;
const UserInviteCard(
{Key key,
this.headerImg,
this.nickName,
this.phone,
this.groupCount,
this.roleLevel})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.symmetric(
horizontal: rSize(15),
vertical: rSize(5),
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(rSize(5)),
color: Colors.white,
),
padding: EdgeInsets.all(rSize(12)),
child: Row(
children: [
Container(
width: rSize(46),
height: rSize(46),
decoration: BoxDecoration(
border: Border.all(
color: Color(0xFFFEC053),
width: rSize(1),
),
borderRadius: BorderRadius.circular(rSize(23)),
image: DecorationImage(
image: NetworkImage(
Api.getImgUrl(headerImg),
),
),
),
),
SizedBox(width: rSize(12)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
nickName,
style: TextStyle(
color: Color(0xFF333333),
fontSize: rSP(14),
),
),
SizedBox(height: rSize(6)),
Row(
children: [
Image.asset(
R.ASSETS_INVITE_DETAIL_PHONE_PNG,
height: rSize(12),
width: rSize(12),
),
SizedBox(width: rSize(5)),
Text(
phone,
style: TextStyle(
color: Color(0xFF999999),
fontSize: rSP(12),
),
),
SizedBox(width: rSize(20)),
],
),
Row(
children: [
Image.asset(
R.ASSETS_INVITE_DETAIL_EDIT_PNG,
height: rSize(12),
width: rSize(12),
),
SizedBox(width: rSize(5)),
Text(
phone,
style: TextStyle(
color: Color(0xFF999999),
fontSize: rSP(12),
),
),
// UserLevelTool
SizedBox(width: rSize(20)),
],
),
],
),
),
],
),
);
}
}

@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
///
class AnimatedRotate extends ImplicitlyAnimatedWidget {
final Widget child;
final Duration duration;
final Curve curve;
final double angle;
AnimatedRotate({
Key key,
@required this.child,
this.duration = const Duration(milliseconds: 400),
this.curve = Curves.easeInOutCubic,
@required this.angle,
}) : super(
key: key,
duration: duration,
curve: curve,
);
@override
ImplicitlyAnimatedWidgetState<ImplicitlyAnimatedWidget> createState() =>
_AnimatedRoateState();
}
class _AnimatedRoateState extends AnimatedWidgetBaseState<AnimatedRotate> {
Tween<double> _rotateTween;
@override
Widget build(BuildContext context) {
return Transform.rotate(
angle: _rotateTween.evaluate(animation),
child: widget.child,
);
}
@override
void forEachTween(visitor) {
_rotateTween = visitor(
_rotateTween,
widget.angle,
(dynamic value) => Tween<double>(begin: value),
);
}
}
Loading…
Cancel
Save