1,消息提醒模块新增需联网提示语

2,新增高级功能购买记录接口对接
3,已开通高级功能逻辑处理与优化
4,新增已开通高级功能的购买记录接口对接与布局
This commit is contained in:
Daisy 2024-04-30 11:24:47 +08:00
parent 606cbc76c7
commit 9873536b6e
15 changed files with 424 additions and 51 deletions

View File

@ -807,5 +807,6 @@
"已开通":"Have opened",
"该功能是高级功能,请开通后再使用":"This function is an advanced function. Please enable it before using it",
"常用程序":"Common Programs",
"该锁已被重置":"The lock has been reset"
"该锁已被重置":"The lock has been reset",
"记录":"Record"
}

View File

@ -806,5 +806,6 @@
"已开通":"已开通",
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序",
"该锁已被重置":"该锁已被重置"
"该锁已被重置":"该锁已被重置",
"记录":"记录"
}

View File

@ -809,5 +809,6 @@
"已开通":"已开通",
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序",
"该锁已被重置":"该锁已被重置"
"该锁已被重置":"该锁已被重置",
"记录":"记录"
}

View File

@ -53,6 +53,7 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/recipientInformation/re
import 'package:star_lock/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart';
import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_page.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart';
import 'common/safetyVerification/safetyVerification_page.dart';
@ -447,6 +448,8 @@ abstract class Routers {
static const seletKeyCyclicDatePage =
'/SeletKeyCyclicDatePage'; //
static const advancedFeaturesWebPage = '/advancedFeaturesWebPage'; //
static const advancedFunctionRecordPage =
'/advancedFunctionRecordPage'; //
}
abstract class AppRouters {
@ -1068,6 +1071,9 @@ abstract class AppRouters {
GetPage(name: Routers.addPalmPage, page: (() => const AddPalmPage())),
GetPage(
name: Routers.advancedFeaturesWebPage,
page: (() => AdvancedFeaturesWebPage()))
page: (() => AdvancedFeaturesWebPage())),
GetPage(
name: Routers.advancedFunctionRecordPage,
page: (() => const AdvancedFunctionRecordPage())),
];
}

View File

@ -152,6 +152,10 @@ class _MsgNotificationPageState extends State<MsgNotificationPage> {
SizedBox(width: 60.w, height: 50.h, child: _switch(4)))),
SizedBox(
height: 60.h,
),
Text(
'此模块功能需要锁联网后设置方可生效',
style: TextStyle(fontSize: 20.sp),
)
],
);

View File

@ -0,0 +1,128 @@
class AdvancedFunctionRecordEntity {
int? errorCode;
String? description;
String? errorMsg;
Data? data;
AdvancedFunctionRecordEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
AdvancedFunctionRecordEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class Data {
int? pageNo;
int? pageSize;
int? total;
List<RecordItem>? recordList;
Data({this.pageNo, this.pageSize, this.total, this.recordList});
Data.fromJson(Map<String, dynamic> json) {
pageNo = json['pageNo'];
pageSize = json['pageSize'];
total = json['total'];
if (json['list'] != null) {
recordList = <RecordItem>[];
json['list'].forEach((v) {
recordList!.add(RecordItem.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['pageNo'] = pageNo;
data['pageSize'] = pageSize;
data['total'] = total;
if (recordList != null) {
data['list'] = recordList!.map((v) => v.toJson()).toList();
}
return data;
}
}
class RecordItem {
int? id;
int? userId;
String? orderNumber;
String? type;
int? recordType;
int? smsCount;
int? emailCount;
int? cloudauthCount;
int? vipLockCount;
int? vipYear;
int? isApply;
String? money;
String? createdAt;
String? updatedAt;
RecordItem(
{this.id,
this.userId,
this.orderNumber,
this.type,
this.recordType,
this.smsCount,
this.emailCount,
this.cloudauthCount,
this.vipLockCount,
this.vipYear,
this.isApply,
this.money,
this.createdAt,
this.updatedAt});
RecordItem.fromJson(Map<String, dynamic> json) {
id = json['id'];
userId = json['user_id'];
orderNumber = json['order_number'];
type = json['type'];
recordType = json['record_type'];
smsCount = json['sms_count'];
emailCount = json['email_count'];
cloudauthCount = json['cloudauth_count'];
vipLockCount = json['vip_lock_count'];
vipYear = json['vip_year'];
isApply = json['is_apply'];
money = json['money'];
createdAt = json['created_at'];
updatedAt = json['updated_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['user_id'] = userId;
data['order_number'] = orderNumber;
data['type'] = type;
data['record_type'] = recordType;
data['sms_count'] = smsCount;
data['email_count'] = emailCount;
data['cloudauth_count'] = cloudauthCount;
data['vip_lock_count'] = vipLockCount;
data['vip_year'] = vipYear;
data['is_apply'] = isApply;
data['money'] = money;
data['created_at'] = createdAt;
data['updated_at'] = updatedAt;
return data;
}
}

View File

@ -0,0 +1,20 @@
import 'dart:async';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';
class AdvancedFunctionRecordLogic extends BaseGetXController {
AdvancedFunctionRecordState state = AdvancedFunctionRecordState();
//
Future<void> getBuyRecordList() async {
var entity = await ApiRepository.to.advancedFunctionBuyRecordList(
type: 'vip', pageNo: 1, recordType: 10, pageSize: 10);
if (entity.errorCode!.codeIsSuccessful) {
state.buyRecordList.value = entity.data!.recordList!;
state.buyRecordList.refresh();
}
}
}

View File

@ -0,0 +1,97 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart';
import 'package:star_lock/tools/noData.dart';
import '../../../tools/titleAppBar.dart';
class AdvancedFunctionRecordPage extends StatefulWidget {
const AdvancedFunctionRecordPage({Key? key}) : super(key: key);
@override
State<AdvancedFunctionRecordPage> createState() =>
_AdvancedFunctionRecordPageState();
}
class _AdvancedFunctionRecordPageState
extends State<AdvancedFunctionRecordPage> {
final logic = Get.put(AdvancedFunctionRecordLogic());
final state = Get.find<AdvancedFunctionRecordLogic>().state;
@override
initState() {
super.initState();
logic.getBuyRecordList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: TitleAppBar(
barTitle: "记录".tr,
haveBack: true,
iconColor: Colors.black,
titleColor: Colors.black,
backgroundColor: Colors.white),
body: Container(
color: AppColors.mainBackgroundColor,
child: Obx(() => state.buyRecordList.isEmpty
? NoData()
: ListView.builder(
itemCount: state.buyRecordList.length,
itemBuilder: (context, index) {
return _recordKeyItem(state.buyRecordList[index]);
},
)),
));
}
Widget _recordKeyItem(RecordItem itemData) {
return Container(
color: Colors.white,
margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 10.h),
padding:
EdgeInsets.only(left: 20.w, right: 20.w, top: 16.h, bottom: 16.h),
child: Column(
children: [
Row(
children: [
Text(
itemData.createdAt!.length > 10
? itemData.createdAt!.substring(0, 10)
: itemData.createdAt!,
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor,
fontWeight: FontWeight.bold),
),
Expanded(child: Container()),
Text('${itemData.money}',
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor,
fontWeight: FontWeight.bold)),
],
),
SizedBox(
height: 8.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text('${itemData.vipLockCount}把锁/${itemData.vipYear}',
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 22.sp, color: AppColors.darkGrayTextColor))
],
),
],
),
);
}
}

View File

@ -0,0 +1,6 @@
import 'package:get/get.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart';
class AdvancedFunctionRecordState {
var buyRecordList = <RecordItem>[].obs;
}

View File

@ -0,0 +1,64 @@
class ValueAddedServicesHighFunctionEntity {
int? errorCode;
String? description;
String? errorMsg;
Data? data;
ValueAddedServicesHighFunctionEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
ValueAddedServicesHighFunctionEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class Data {
int? emailCount;
int? smsCount;
int? cloudauthCount;
int? vipStatus;
int? vipLockCount;
String? vipExpireAt;
Data(
{this.emailCount,
this.smsCount,
this.cloudauthCount,
this.vipStatus,
this.vipLockCount,
this.vipExpireAt});
Data.fromJson(Map<String, dynamic> json) {
emailCount = json['email_count'];
smsCount = json['sms_count'];
cloudauthCount = json['cloudauth_count'];
vipStatus = json['vip_status'];
vipLockCount = json['vip_lock_count'];
vipExpireAt = json['vip_expire_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['email_count'] = emailCount;
data['sms_count'] = smsCount;
data['cloudauth_count'] = cloudauthCount;
data['vip_status'] = vipStatus;
data['vip_lock_count'] = vipLockCount;
data['vip_expire_at'] = vipExpireAt;
return data;
}
}

View File

@ -12,6 +12,9 @@ class ValueAddedServicesHighFunctionLogic extends BaseGetXController {
//
Future<void> getServiceUserPackage() async {
var entity = await ApiRepository.to.getServiceUserPackage();
if (entity.errorCode!.codeIsSuccessful) {}
if (entity.errorCode!.codeIsSuccessful) {
state.vipExpireDate.value = entity.data!.vipExpireAt!;
state.vipExpireDate.refresh();
}
}
}

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart';
import '../../../appRouters.dart';
@ -33,7 +34,7 @@ class _ValueAddedServicesHighFunctionPageState
return Scaffold(
backgroundColor: Colors.white,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.advancedFunction!.tr,
barTitle: "高级功能".tr,
haveBack: true,
iconColor: Colors.black,
titleColor: Colors.black,
@ -67,52 +68,60 @@ class _ValueAddedServicesHighFunctionPageState
topRight: Radius.circular(30.h),
),
),
child: Stack(
alignment: AlignmentDirectional.centerStart,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.center,
child: GestureDetector(
onTap: () {
Get.toNamed(Routers.advancedFunctionRecordPage);
},
child: Container(
color: Colors.transparent,
child: Stack(
alignment: AlignmentDirectional.centerStart,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
Row(
mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"已开通".tr,
style:
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"已开通".tr,
style: TextStyle(
fontSize: 24.sp, fontWeight: FontWeight.w600),
),
SizedBox(height: 5.h),
Obx(() => Text(
"${TranslationLoader.lanKeys!.periodValidity!.tr}:${state.vipExpireDate.value}",
style: TextStyle(
fontSize: 20.sp, fontWeight: FontWeight.w600),
)),
], //
),
SizedBox(height: 5.h),
Text(
"${TranslationLoader.lanKeys!.periodValidity!.tr}:2023-07-29",
style:
TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600),
),
], //
],
),
Positioned(
bottom: 0.h,
right: 0.w,
child: Container(
width: 90.w,
height: 50.h,
decoration: BoxDecoration(
color: const Color(0xFFBDCDDF),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.h),
bottomLeft: Radius.circular(30.h),
),
),
child: Center(
child: Text(
TranslationLoader.lanKeys!.record!.tr,
style: TextStyle(fontSize: 22.sp),
)),
)),
],
),
Positioned(
bottom: 0.h,
right: 0.w,
child: Container(
width: 90.w,
height: 50.h,
decoration: BoxDecoration(
color: const Color(0xFFBDCDDF),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.h),
bottomLeft: Radius.circular(30.h),
),
),
child: Center(
child: Text(
TranslationLoader.lanKeys!.record!.tr,
style: TextStyle(fontSize: 22.sp),
)),
)),
],
),
),
);
}

View File

@ -1 +1,5 @@
class ValueAddedServicesHighFunctionState {}
import 'package:get/get.dart';
class ValueAddedServicesHighFunctionState {
var vipExpireDate = ''.obs;
}

View File

@ -785,8 +785,7 @@ class ApiProvider extends BaseProvider {
jsonEncode({
'lockId': lockId,
}),
isUnShowLoading: true
);
isUnShowLoading: true);
//
Future<Response> setLockDiagnoseData(
@ -1999,6 +1998,22 @@ class ApiProvider extends BaseProvider {
//
Future<Response> getServiceUserPackage() =>
post(getServiceUserPackageURL.toUrl, jsonEncode({}));
//
Future<Response> advancedFunctionBuyRecordList(
String type,
int pageNo,
int recordType,
int pageSize,
) =>
post(
getBuyRecordListURL.toUrl,
jsonEncode({
'type': type,
'pageNo': pageNo,
'pageSize': pageSize,
'record_type': recordType,
}));
}
extension ExtensionString on String {

View File

@ -27,6 +27,8 @@ import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList/keyList
import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart';
import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_entity.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRealName/face_authentication_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/buy_record_list_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_record_list_entity.dart';
@ -2024,8 +2026,20 @@ class ApiRepository {
}
//
Future<AdvancedFeaturesWebEntity> getServiceUserPackage() async {
Future<ValueAddedServicesHighFunctionEntity> getServiceUserPackage() async {
final res = await apiProvider.getServiceUserPackage();
return AdvancedFeaturesWebEntity.fromJson(res.body);
return ValueAddedServicesHighFunctionEntity.fromJson(res.body);
}
//
Future<AdvancedFunctionRecordEntity> advancedFunctionBuyRecordList({
required String type,
required int pageNo,
required int recordType,
required int pageSize,
}) async {
final res = await apiProvider.advancedFunctionBuyRecordList(
type, pageNo, recordType, pageSize);
return AdvancedFunctionRecordEntity.fromJson(res.body);
}
}