You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

540 lines
19 KiB

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../generated/l10n.dart';
import '../../../retrofit/business_api.dart';
import '../../../retrofit/data/base_data.dart';
import '../../../retrofit/data/phone_query_member_info.dart';
import '../../../utils/business_instance.dart';
import '../../../utils/flutter_utils.dart';
import '../../../view_widget/classic_header.dart';
import '../../../view_widget/custom_image.dart';
import '../../../view_widget/my_footer.dart';
import '../../../view_widget/settlement_tips_dialog.dart';
class MemberDetailsPage extends StatefulWidget {
final Map<String, dynamic> arguments;
MemberDetailsPage({this.arguments});
@override
State<StatefulWidget> createState() {
return _MemberDetailsPage();
}
}
class _MemberDetailsPage extends State<MemberDetailsPage> {
final RefreshController refreshController = RefreshController();
BusinessApiService businessService;
PhoneQueryMemberInfo phoneQueryMemberInfo;
String networkError = "";
int networkStatus = 0;
@override
void initState() {
super.initState();
queryMemberPhoneInfo(widget?.arguments["phoneNum"] ?? "");
}
///根据手机号搜索用户信息
queryMemberPhoneInfo(phoneNum, {isShow = true}) async {
try {
if (isShow)
EasyLoading.show(
status: S.current.zhengzaijiazai,
maskType: EasyLoadingMaskType.black);
if (businessService == null) {
businessService = BusinessApiService(Dio(),
context: context,
token: BusinessInstance.instance.businessToken,
tenant: BusinessInstance.instance.businessTenant,
storeId: widget.arguments["storeId"]);
}
BaseData<PhoneQueryMemberInfo> baseData = await businessService
.queryMemberInfo(
{"phoneNum": phoneNum, "isNewUser": false}).catchError((error) {
networkError = AppUtils.dioErrorTypeToString(error.type);
networkStatus = -1;
setState(() {});
refreshController.refreshFailed();
refreshController.loadFailed();
});
if (!mounted) return;
if (baseData != null && baseData.isSuccess) {
phoneQueryMemberInfo = baseData.data;
refreshController.loadComplete();
refreshController.refreshCompleted();
networkStatus = 1;
} else {
SmartDialog.showToast(baseData.msg, alignment: Alignment.center);
refreshController.refreshFailed();
refreshController.loadFailed();
}
} finally {
if (isShow) EasyLoading.dismiss();
setState(() {});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: MyAppBar(
title: "会员详情",
titleColor: Colors.black,
background: Colors.white,
leadingColor: Colors.black,
brightness: Brightness.dark,
),
body:
networkStatus == -1
? noNetwork() :
SmartRefresher(
controller: refreshController,
enablePullDown: true,
enablePullUp: false,
header: MyHeader(
color: Color(0xFF30415B),
),
footer: CustomFooter(
builder: (context, mode) {
return MyFooter(mode);
},
),
onRefresh: () {
queryMemberPhoneInfo(widget?.arguments["phoneNum"] ?? "",isShow: false);
},
physics: BouncingScrollPhysics(),
scrollController: ScrollController(),
child: Container(
padding: EdgeInsets.only(top:15.h,left: 16.w,right: 16.w),
child: Column(
children: [
vipPlate(),
vipFunction(),
vipRecord()
],
))));
}
///会员信息板块
Widget vipPlate() {
return Container(
width: double.infinity,
margin: EdgeInsets.only(bottom: 12.h),
padding: EdgeInsets.only(bottom: 15.h),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x0F06152E),
offset: Offset(0, 2),
blurRadius: 4,
spreadRadius: 0,
)
],
borderRadius: BorderRadius.circular(8),
),
child: Column(
children: [
Container(
width: double.infinity,
padding: EdgeInsets.only(left: 16.w, bottom: 33.h, top: 13.h),
margin: EdgeInsets.only(bottom: 10.h),
decoration: BoxDecoration(
color: Colors.white,
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Color(0xFF30415B), Color(0xFF5171A4)]),
borderRadius: BorderRadius.vertical(
top: Radius.circular(8),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 52.h,
height: 52.h,
margin: EdgeInsets.only(right: 15.w,),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
),
child:MImage(
(phoneQueryMemberInfo?.headimg ??
""),
width: double.infinity,
height: double.infinity,
fit: BoxFit.cover,
errorSrc: "assets/image/default_1.webp",
fadeSrc: "assets/image/default_1.webp",
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 8.h),
child: Text(
"会员名称:${phoneQueryMemberInfo?.nickName ?? ""}",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.white,
),
)),
Text(
"手机号:${phoneQueryMemberInfo?.phoneNum ?? ""}",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.white,
),
)
],
),
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(bottom: 7.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
"assets/image/bus_vip_balance.webp",
width: 24.h,
height: 24.h,
fit: BoxFit.fill,
),
Padding(
padding: EdgeInsets.only(left: 7.w),
child: Text(
"会员余额",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF252626),
),
))
],
)),
Text(
phoneQueryMemberInfo?.balance ?? "0.00",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF30415B),
),
)
],
)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: EdgeInsets.only(bottom: 7.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
"assets/image/bus_coupon.webp",
width: 20.w,
height: 18.h,
fit: BoxFit.fill,
),
Padding(
padding: EdgeInsets.only(left: 7.w),
child: Text(
"优惠券",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF252626),
),
))
],
)),
Text(
(phoneQueryMemberInfo?.useableConponList?.length ?? 0)
.toString(),
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF30415B),
),
)
],
)),
],
)
],
),
);
}
///会员功能
Widget vipFunction() {
return Container(
width: double.infinity,
margin: EdgeInsets.only(bottom: 12.h),
padding: EdgeInsets.only(bottom:17.h,top:27.h,),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x0F06152E),
offset: Offset(0, 2),
blurRadius: 4,
spreadRadius: 0,
)
],
borderRadius: BorderRadius.circular(8),
),
child:Row(
children: [
Expanded(
child:GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
Navigator.of(context)
.pushNamed('/router/vip_recharge_page', arguments: {
"storeId": widget.arguments["storeId"] ??"",
});
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(padding:EdgeInsets.only(bottom: 12.h),
child: Image.asset(
"assets/image/bus_home_syt.webp",
width: 26.w,
height: 23.h,
fit: BoxFit.fill,
)),
Text(
"会员充值",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF252626),
),
),
],
),
)),
Expanded(
child:GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
if(widget.arguments["storeId"] == "0"){
SmartDialog.show(
widget: SettlementTips(
() {
},
text: "当前为所有门店状态,收银操作时,请将门店切换至要消费的门店!",
color: Color(0xFF30415B),
));
}else{
Navigator.of(context)
.pushNamed('/router/cashier_page', arguments: {
"storeId": widget.arguments["storeId"] ??"",
"phone":widget?.arguments["phoneNum"] ?? ""
});
}
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(padding:EdgeInsets.only(bottom: 12.h),
child: Image.asset(
"assets/image/bus_home_hyyetj.webp",
width: 23.h,
height: 23.h,
fit: BoxFit.fill,
)),
Text(
"会员收银",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF252626),
),
),
],
))),
Spacer()
// Expanded(
// child:Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Padding(padding:EdgeInsets.only(bottom: 12.h),
// child: Image.asset(
// "assets/image/bus_vip_cc.webp",
// width: 24.h,
// height: 24.h,
// fit: BoxFit.fill,
// )),
// Text(
// "会员充次",
// style: TextStyle(
// fontSize: 14.sp,
// fontWeight: MyFontWeight.medium,
// color: Color(0xFF252626),
// ),
// ),
// ],
// )),
],
),
);
}
///会员消费/充值/充次记录
Widget vipRecord() {
return Container(
width: double.infinity,
margin: EdgeInsets.only(bottom: 12.h),
padding: EdgeInsets.only(bottom:17.h,top:11.h,left: 17.w,right: 16.w),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x0F06152E),
offset: Offset(0, 2),
blurRadius: 4,
spreadRadius: 0,
)
],
borderRadius: BorderRadius.circular(8),
),
child:Column(
children: [
vipRecordText("消费记录"),
Container(
width: double.infinity,
height: 1.h,
color: Color(0xFFEBECEF),
),
vipRecordText("充值记录"),
// Container(
// width: double.infinity,
// height: 1.h,
// color: Color(0xFFEBECEF),
// ),
// vipRecordText("充次记录"),
],
),
);
}
Widget vipRecordText(String text){
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
Navigator.of(context).pushNamed(
'/router/record_details',
arguments: {
"storeId": widget.arguments["storeId"],
"titleName":text,
"mid":phoneQueryMemberInfo?.sid ??"",
"title":text == "消费记录" ?"bill_tenant_balance":"bill_tenant_balance",
"category":text == "消费记录" ?"bill_cate_buy":"bill_cate_rechange",
});
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 16.h),
child: Row(
children: [
Expanded(
child: Text(
text,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF1A1A1A),
fontWeight: MyFontWeight.regular),
)),
Padding(padding: EdgeInsets.only(right: 9.w,),child: Image.asset(
"assets/image/icon_right_z.webp",
width: 16.h,
height: 16.h,
color: Color(0xFF353535),
)),
],
),
),
);
}
///网络错误
Widget noNetwork() {
return Container(
color: Colors.white,
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
networkError.substring(0, networkError.indexOf(",")),
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF0D0D0D),
fontWeight: MyFontWeight.bold),
),
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: Text(
"请检查网络设置或稍后重试",
style: TextStyle(
fontSize: 12.sp,
color: Color(0xFF7A797F),
fontWeight: MyFontWeight.regular),
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
queryMemberPhoneInfo(widget?.arguments["phoneNum"] ?? "");
},
child: Container(
decoration: BoxDecoration(
color: Color(0xFF30415B),
borderRadius: BorderRadius.circular(15),
),
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 3.h),
child: Text(
"重试",
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
fontWeight: MyFontWeight.regular),
)),
)
],
),
);
}
}