diff --git a/assets/images/equipment_empty.png b/assets/images/equipment_empty.png new file mode 100644 index 00000000..b79a0c69 Binary files /dev/null and b/assets/images/equipment_empty.png differ diff --git a/lib/constants/api.dart b/lib/constants/api.dart index b89e52b3..6987472c 100644 --- a/lib/constants/api.dart +++ b/lib/constants/api.dart @@ -25,6 +25,8 @@ class API { static _Pay pay = _Pay(); static _House house = _House(); static _Bracelet bracelet = _Bracelet(); + + static _Intergral intergral = _Intergral(); } class _Bracelet { @@ -32,6 +34,14 @@ class _Bracelet { String get data => '/user/aqg/getData'; } +class _Intergral { + ///积分签到 + String get sign => '/user/points/sign'; + + ///获取积分页面详情 + String get info => '/user/points/getPointsInfo'; +} + class _Login { //查询所有小区信息 String get allCommunity => '/app/login/findAllCommunity'; diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 87fb349e..73573028 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -1056,6 +1056,10 @@ class $AssetsImagesGen { AssetGenImage get drawings => const AssetGenImage('assets/images/drawings.png'); + /// File path: assets/images/equipment_empty.png + AssetGenImage get equipmentEmpty => + const AssetGenImage('assets/images/equipment_empty.png'); + /// File path: assets/images/house_attestation.png AssetGenImage get houseAttestation => const AssetGenImage('assets/images/house_attestation.png'); diff --git a/lib/models/integral/clocked_record_list_model.dart b/lib/models/integral/clocked_record_list_model.dart index 5c8826d9..0a7e5842 100644 --- a/lib/models/integral/clocked_record_list_model.dart +++ b/lib/models/integral/clocked_record_list_model.dart @@ -4,15 +4,17 @@ part 'clocked_record_list_model.g.dart'; @JsonSerializable() class ClockedRecordListModel { - final int day; - final String date; - final int addIntegral; + final int id; + final int addNums; + final int serialNumber; + final String signDate; factory ClockedRecordListModel.fromJson(Map json) => _$ClockedRecordListModelFromJson(json); const ClockedRecordListModel({ - required this.day, - required this.date, - required this.addIntegral, + required this.id, + required this.addNums, + required this.serialNumber, + required this.signDate, }); } diff --git a/lib/models/integral/clocked_record_list_model.g.dart b/lib/models/integral/clocked_record_list_model.g.dart index 5033db87..f1d62405 100644 --- a/lib/models/integral/clocked_record_list_model.g.dart +++ b/lib/models/integral/clocked_record_list_model.g.dart @@ -9,7 +9,8 @@ part of 'clocked_record_list_model.dart'; ClockedRecordListModel _$ClockedRecordListModelFromJson( Map json) => ClockedRecordListModel( - day: json['day'] as int, - date: json['date'] as String, - addIntegral: json['addIntegral'] as int, + id: json['id'] as int, + addNums: json['addNums'] as int, + serialNumber: json['serialNumber'] as int, + signDate: json['signDate'] as String, ); diff --git a/lib/models/integral/integral_info_model.dart b/lib/models/integral/integral_info_model.dart new file mode 100644 index 00000000..5077276e --- /dev/null +++ b/lib/models/integral/integral_info_model.dart @@ -0,0 +1,23 @@ +import 'package:aku_new_community/models/integral/clocked_record_list_model.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'integral_info_model.g.dart'; + +@JsonSerializable() +class IntegralInfoModel { + final int points; + final String rewardSetting; + final int serialNumber; + final bool isSign; + final List signRecordList; + factory IntegralInfoModel.fromJson(Map json) => + _$IntegralInfoModelFromJson(json); + + const IntegralInfoModel({ + required this.points, + required this.rewardSetting, + required this.serialNumber, + required this.isSign, + required this.signRecordList, + }); +} diff --git a/lib/models/integral/integral_info_model.g.dart b/lib/models/integral/integral_info_model.g.dart new file mode 100644 index 00000000..917d6d2b --- /dev/null +++ b/lib/models/integral/integral_info_model.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'integral_info_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +IntegralInfoModel _$IntegralInfoModelFromJson(Map json) => + IntegralInfoModel( + points: json['points'] as int, + rewardSetting: json['rewardSetting'] as String, + serialNumber: json['serialNumber'] as int, + isSign: json['isSign'] as bool, + signRecordList: (json['signRecordList'] as List) + .map( + (e) => ClockedRecordListModel.fromJson(e as Map)) + .toList(), + ); diff --git a/lib/pages/personal/clock_in/clock_in_page.dart b/lib/pages/personal/clock_in/clock_in_page.dart index 7f5da0a8..094dbd8c 100644 --- a/lib/pages/personal/clock_in/clock_in_page.dart +++ b/lib/pages/personal/clock_in/clock_in_page.dart @@ -4,9 +4,12 @@ import 'package:aku_new_community/extensions/widget_list_ext.dart'; import 'package:aku_new_community/gen/assets.gen.dart'; import 'package:aku_new_community/models/integral/add_integral_config_model.dart'; import 'package:aku_new_community/models/integral/clocked_record_list_model.dart'; +import 'package:aku_new_community/models/integral/integral_info_model.dart'; import 'package:aku_new_community/pages/personal/clock_in/clock_success_dialog.dart'; +import 'package:aku_new_community/utils/network/net_util.dart'; import 'package:aku_new_community/widget/bee_back_button.dart'; import 'package:aku_new_community/widget/others/user_tool.dart'; +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -21,31 +24,39 @@ class ClockInPage extends StatefulWidget { } class _ClockInPageState extends State { - List _configs = [ - AddIntegralConfigModel(addIntegral: 1, hasClocked: false), - AddIntegralConfigModel(addIntegral: 2, hasClocked: false), - AddIntegralConfigModel(addIntegral: 3, hasClocked: false), - AddIntegralConfigModel(addIntegral: 5, hasClocked: false), - AddIntegralConfigModel(addIntegral: 8, hasClocked: false), - AddIntegralConfigModel(addIntegral: 15, hasClocked: false), - AddIntegralConfigModel(addIntegral: 50, hasClocked: false), - ]; + IntegralInfoModel? _integralModel; + List _configs = []; - List _records = [ - ClockedRecordListModel(day: 1, date: '2021-12-29 13:29:24', addIntegral: 1), - ClockedRecordListModel(day: 2, date: '2021-12-28 13:29:24', addIntegral: 2), - ClockedRecordListModel(day: 3, date: '2021-12-27 13:29:24', addIntegral: 3), - ClockedRecordListModel(day: 4, date: '2021-12-26 13:29:24', addIntegral: 5), - ClockedRecordListModel(day: 5, date: '2021-12-25 13:29:24', addIntegral: 8), - ClockedRecordListModel( - day: 6, date: '2021-12-24 13:29:24', addIntegral: 15), - ClockedRecordListModel( - day: 7, date: '2021-12-23 13:29:24', addIntegral: 50), - ClockedRecordListModel(day: 1, date: '2021-12-22 13:29:24', addIntegral: 1), - ]; + List _records = []; bool _openRemind = false; //演示用,之后删除 - bool get hasClocked => _configs[0].hasClocked; + bool get hasClocked => _integralModel?.isSign ?? false; + + Future getData() async { + var base = await NetUtil().get(API.intergral.info); + if (base.status ?? false) { + _integralModel = IntegralInfoModel.fromJson(base.data); + } else { + BotToast.showText(text: base.message!); + } + } + + @override + void initState() { + getData().then((value) { + if (_integralModel != null) { + _records = _integralModel!.signRecordList; + _configs = _integralModel!.rewardSetting + .split(',') + .mapIndexed((currentValue, index) => AddIntegralConfigModel( + addIntegral: int.parse(currentValue), + hasClocked: index < _integralModel!.serialNumber)) + .toList(); + setState(() {}); + } + }); + super.initState(); + } @override Widget build(BuildContext context) { @@ -94,7 +105,10 @@ class _ClockInPageState extends State { Text.rich( TextSpan(children: [ '已连续签到 '.textSpan.make(), - '1'.textSpan.size(40.sp).make(), + '${_integralModel?.serialNumber ?? 0}' + .textSpan + .size(40.sp) + .make(), ' 天'.textSpan.make(), ]), style: TextStyle( @@ -104,7 +118,9 @@ class _ClockInPageState extends State { ), 4.hb, Text( - '明日签到即可获得2积分', + '明日签到即可获得' + '${_configs.isNotEmpty ? _configs[_integralModel!.serialNumber != 7 ? _integralModel!.serialNumber : 0].addIntegral : 0}' + '积分', style: TextStyle( fontSize: 24.sp, color: Colors.black.withOpacity(0.45), @@ -132,7 +148,11 @@ class _ClockInPageState extends State { children: [ Assets.icons.intergral.image(width: 36.w, height: 36.w), 12.wb, - '123'.text.size(32.sp).white.make(), + '${_integralModel?.points ?? 0}' + .text + .size(32.sp) + .white + .make(), ], ), ), @@ -175,9 +195,9 @@ class _ClockInPageState extends State { width: 72.w, height: 40.w, child: Switch( - value: _openRemind, + value: UserTool.userProvider.userConfig.clockRemind, onChanged: (value) { - _openRemind = value; + UserTool.userProvider.changeClockRemind(); setState(() {}); }, )), @@ -201,12 +221,15 @@ class _ClockInPageState extends State { onPressed: hasClocked ? null : () async { - await Get.dialog(ClockSuccessDialog( - todayIntegral: _configs[0].addIntegral, - tomorrowIntegral: _configs[1].addIntegral)); - _configs[0] = AddIntegralConfigModel( - addIntegral: _configs[0].addIntegral, hasClocked: true); - setState(() {}); + var base = await NetUtil().get(API.intergral.sign); + if (base.status ?? false) { + await Get.dialog(ClockSuccessDialog( + todayIntegral: 1, tomorrowIntegral: 2)); + await UserTool.userProvider.changeTodayClocked(); + await getData(); + } else { + BotToast.showText(text: base.message!); + } }, elevation: 0, color: kPrimaryColor, @@ -246,9 +269,9 @@ class _ClockInPageState extends State { children: [ ..._records .mapIndexed((currentValue, index) => recordListTile( - currentValue.day, - currentValue.date, - currentValue.addIntegral)) + currentValue.serialNumber, + currentValue.signDate, + currentValue.addNums)) .toList(), Container( width: double.infinity, diff --git a/lib/pages/personal/personal_page.dart b/lib/pages/personal/personal_page.dart index a4f913c7..ab7e55b2 100644 --- a/lib/pages/personal/personal_page.dart +++ b/lib/pages/personal/personal_page.dart @@ -12,7 +12,9 @@ import 'package:aku_new_community/ui/profile/car_parking/car_parking_page.dart'; import 'package:aku_new_community/ui/profile/new_house/my_family_page.dart'; import 'package:aku_new_community/ui/profile/new_house/my_house_page.dart'; import 'package:aku_new_community/utils/headers.dart'; +import 'package:aku_new_community/utils/network/net_util.dart'; import 'package:aku_new_community/widget/others/user_tool.dart'; +import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; @@ -336,10 +338,16 @@ class _PersonalIndexState extends State Spacer(), MaterialButton( onPressed: () async { - await Get.dialog(ClockSuccessDialog( - todayIntegral: 1, tomorrowIntegral: 2)); - await UserTool.userProvider - .changeTodayClocked(); + var base = + await NetUtil().get(API.intergral.sign); + if (base.status ?? false) { + await Get.dialog(ClockSuccessDialog( + todayIntegral: 1, tomorrowIntegral: 2)); + await UserTool.userProvider + .changeTodayClocked(); + } else { + BotToast.showText(text: base.message!); + } }, elevation: 0, color: Colors.white, diff --git a/lib/pages/services/old_age/old_age_support_page_simple.dart b/lib/pages/services/old_age/old_age_support_page_simple.dart index 57dc49c7..f49a0642 100644 --- a/lib/pages/services/old_age/old_age_support_page_simple.dart +++ b/lib/pages/services/old_age/old_age_support_page_simple.dart @@ -1,6 +1,7 @@ import 'package:aku_new_community/constants/api.dart'; import 'package:aku_new_community/gen/assets.gen.dart'; import 'package:aku_new_community/models/bracelet/bracelet_model.dart'; +import 'package:aku_new_community/pages/services/old_age/add_equipment_page.dart'; import 'package:aku_new_community/pages/services/old_age/equipment_list_page.dart'; import 'package:aku_new_community/utils/network/net_util.dart'; import 'package:aku_new_community/widget/bee_divider.dart'; @@ -60,63 +61,68 @@ class _OldAgeSupportPageSimpleState extends State { .make(), ], ); - return BeeScaffold( - title: 'X5手环', - extendBody: true, - actions: [ - IconButton( - icon: Icon(CupertinoIcons.repeat), - iconSize: 30.w, - color: Colors.black, - onPressed: () { - Get.to(() => EquipmentListPage()); - }, - ) - ], - body: Container( - width: double.infinity, - height: double.infinity, - decoration: BoxDecoration( - image: DecorationImage( - alignment: Alignment.topCenter, - image: AssetImage(Assets.static.braceletHeader.path)), - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Colors.white, Color(0xFFC0E5DC).withOpacity(0.355)]), - ), - child: _model == null - ? Container() - : SafeArea( - child: ListView( - padding: EdgeInsets.symmetric(horizontal: 32.w), - children: [ - 400.w.heightBox, - open, - 16.w.heightBox, - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - '数据更新自 ${DateUtil.formatDate(_date!, format: DateFormats.full)}' - .text - .size(22.sp) - .color(Colors.black.withOpacity(0.25)) - .make(), - 40.w.heightBox, - ], - ), - 40.w.heightBox, - overview(), - 24.w.heightBox, - statusCard(), - 40.w.heightBox, - bottomCard(), - 40.w.heightBox, - ], - ), + return _model == null + ? _emptyScaffold() + : BeeScaffold( + title: 'X5手环', + extendBody: true, + actions: [ + IconButton( + icon: Icon(CupertinoIcons.repeat), + iconSize: 30.w, + color: Colors.black, + onPressed: () { + Get.to(() => EquipmentListPage()); + }, + ) + ], + body: Container( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration( + image: DecorationImage( + alignment: Alignment.topCenter, + image: AssetImage(Assets.static.braceletHeader.path)), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.white, + Color(0xFFC0E5DC).withOpacity(0.355) + ]), ), - ), - ); + child: _model == null + ? Container() + : SafeArea( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 32.w), + children: [ + 400.w.heightBox, + open, + 16.w.heightBox, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + '数据更新自 ${DateUtil.formatDate(_date!, format: DateFormats.full)}' + .text + .size(22.sp) + .color(Colors.black.withOpacity(0.25)) + .make(), + 40.w.heightBox, + ], + ), + 40.w.heightBox, + overview(), + 24.w.heightBox, + statusCard(), + 40.w.heightBox, + bottomCard(), + 40.w.heightBox, + ], + ), + ), + ), + ); } Future getData() async { @@ -517,4 +523,39 @@ class _OldAgeSupportPageSimpleState extends State { ), ); } + + Widget _emptyScaffold() { + return BeeScaffold( + title: '智慧养老', + body: SafeArea( + child: Center( + child: Column( + children: [ + Assets.images.equipmentEmpty.image(width: 480.w, height: 480.w), + '当前没有绑定任何设备' + .text + .size(28.sp) + .color(Colors.black.withOpacity(0.25)) + .make(), + ], + ), + ), + ), + bottomNavi: Padding( + padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w), + child: MaterialButton( + onPressed: () { + Get.to(() => AddEquipmentPage()); + }, + color: Color(0xFF5096F1), + padding: EdgeInsets.symmetric(vertical: 24.w), + minWidth: 686.w, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.w), + ), + child: '添加设备'.text.size(28.sp).white.make(), + ), + ), + ); + } }