diff --git a/assets/static_fix/air1.png b/assets/static_fix/air1.png new file mode 100644 index 0000000..9f6bcf4 Binary files /dev/null and b/assets/static_fix/air1.png differ diff --git a/assets/static_fix/air2.png b/assets/static_fix/air2.png new file mode 100644 index 0000000..a721090 Binary files /dev/null and b/assets/static_fix/air2.png differ diff --git a/lib/mock_models/fix/fix_model.dart b/lib/mock_models/fix/fix_model.dart index 94effd1..3f1f6cd 100644 --- a/lib/mock_models/fix/fix_model.dart +++ b/lib/mock_models/fix/fix_model.dart @@ -1,6 +1,4 @@ import 'package:aku_community_manager/const/resource.dart'; -import 'package:aku_community_manager/mock_models/fix/fixer_model.dart'; -import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; import 'package:flutter/material.dart'; enum FIX_ENUM { @@ -51,6 +49,64 @@ class FixModel { static List initList() { return [ + FixModel( + title: '小区西大门车栏坏了,请物业尽快修理更换。', + dateStart: DateTime(2020, 10, 21, 7, 28, 56), + type: FIX_ENUM.WAIT_PICKUP, + imgs: [R.ASSETS_STATIC_FIX_AIR1_PNG, R.ASSETS_STATIC_FIX_AIR2_PNG], + detail: FixDetailModel( + userName: '杨建', + userPhoneNumber: '18882928888', + fixArea: 'B区', + type: FIX_PAYMENT_TYPE.FREE, + limit: FIX_DATE_LIMIT.HOUR_24, + subType: FIX_SUB_TYPE.NORMAL, + fixStatuses: [ + FixStatus(title: '申请保修', date: DateTime(2020, 10, 23, 10, 28, 56)), + FixStatus( + title: '分派给李保国师傅', date: DateTime(2020, 10, 23, 10, 32, 14)), + FixStatus(title: '师傅已接单', date: DateTime(2020, 10, 23, 10, 38, 26)), + ], + result: FixResult( + detail: '电饭煲插头没插', + material: '无', + imgs: [R.ASSETS_STATIC_FIX_FOOD_PNG], + ), + review: UserReviewInfo( + rate: 5, + content: '师傅太用心了', + ), + ), + ), + FixModel( + title: '家里空调坏了,请师傅抓紧时间尽快维修。', + dateStart: DateTime(2020, 10, 21, 7, 28, 56), + type: FIX_ENUM.PROCESSING, + imgs: [R.ASSETS_STATIC_FIX_AIR1_PNG, R.ASSETS_STATIC_FIX_AIR2_PNG], + detail: FixDetailModel( + userName: '杨建', + userPhoneNumber: '18882929292', + fixArea: 'A区', + type: FIX_PAYMENT_TYPE.FREE, + limit: FIX_DATE_LIMIT.HOUR_24, + subType: FIX_SUB_TYPE.NORMAL, + fixStatuses: [ + FixStatus(title: '申请保修', date: DateTime(2020, 10, 23, 10, 28, 56)), + FixStatus( + title: '分派给李保国师傅', date: DateTime(2020, 10, 23, 10, 32, 14)), + FixStatus(title: '师傅已接单', date: DateTime(2020, 10, 23, 10, 38, 26)), + ], + result: FixResult( + detail: '电饭煲插头没插', + material: '无', + imgs: [R.ASSETS_STATIC_FIX_FOOD_PNG], + ), + review: UserReviewInfo( + rate: 5, + content: '师傅太用心了', + ), + ), + ), FixModel( title: '家中电饭煲出问题了,请师傅速来。', dateStart: DateTime(2020, 10, 22, 9, 28, 56), diff --git a/lib/ui/sub_pages/business_and_fix/business_and_fix_detail_page.dart b/lib/ui/sub_pages/business_and_fix/business_and_fix_detail_page.dart new file mode 100644 index 0000000..a47b94c --- /dev/null +++ b/lib/ui/sub_pages/business_and_fix/business_and_fix_detail_page.dart @@ -0,0 +1,366 @@ +import 'package:aku_community_manager/const/resource.dart'; +import 'package:aku_community_manager/mock_models/fix/fix_model.dart'; +import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; +import 'package:aku_community_manager/provider/user_provider.dart'; +import 'package:aku_community_manager/style/app_style.dart'; +import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/widgets/common/aku_scaffold.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:aku_community_manager/tools/screen_tool.dart'; +import 'package:provider/provider.dart'; + +class BusinessAndFixDetailPage extends StatefulWidget { + final FixModel model; + BusinessAndFixDetailPage({Key key, this.model}) : super(key: key); + + @override + _BusinessAndFixDetailPageState createState() => + _BusinessAndFixDetailPageState(); +} + +class _BusinessAndFixDetailPageState extends State { + USER_ROLE get userRole { + final userProvider = Provider.of(context, listen: false); + return userProvider.userInfoModel.role; + } + + FixDetailModel get detailModel => widget.model.detail; + + String get fixType { + switch (detailModel.type) { + case FIX_PAYMENT_TYPE.FREE: + return '无偿服务'; + break; + case FIX_PAYMENT_TYPE.PAY: + return '有偿服务'; + break; + default: + return ''; + break; + } + } + + String get dateLimit { + switch (detailModel.limit) { + case FIX_DATE_LIMIT.HOUR_24: + return '24小时内处理'; + break; + case FIX_DATE_LIMIT.HOUR_12: + return '12小时内处理'; + break; + case FIX_DATE_LIMIT.HOUR_8: + return '8小时内处理'; + break; + default: + return ''; + break; + } + } + + String get subType { + switch (detailModel.subType) { + case FIX_SUB_TYPE.NORMAL: + return '一般单'; + break; + case FIX_SUB_TYPE.HURRY: + return '加急单'; + break; + default: + return ''; + break; + } + } + + Widget get fixTypeWidget { + if (userRole == USER_ROLE.MANAGER) { + return Text( + FixModel.managerRoleMap[widget.model.type], + style: TextStyle( + color: widget.model.type != FIX_ENUM.DONE + ? Color(0XFFFF4501) + : AppStyle.minorTextColor, + ), + ); + } else { + return Text( + FixModel.otherRoleMap[widget.model.type], + style: TextStyle( + color: widget.model.type != FIX_ENUM.DONE + ? Color(0XFFFF4501) + : AppStyle.minorTextColor, + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return AkuScaffold( + title: '报修详情', + body: ListView( + padding: EdgeInsets.symmetric(vertical: 16.w), + children: [ + _buildInfo(), + _buildType(), + _buildProcess(), + _buildResult(), + ], + ), + ); + } + + _buildInfo() { + return _buildRawBox( + title: '报修信息', + suffix: fixTypeWidget, + children: [ + AkuBox.h(16), + _buildTile( + R.ASSETS_MESSAGE_IC_PEOPLE_PNG, + '报修人', + widget.model.detail.userName, + ), + _buildTile( + R.ASSETS_MESSAGE_IC_PHONE_PNG, + '联系电话', + widget.model.detail.userPhoneNumber, + ), + _buildTile( + R.ASSETS_MESSAGE_IC_AREA_PNG, + '报修区域', + widget.model.detail.fixArea, + ), + AkuBox.h(8), + Text( + widget.model.title, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 28.w, + ), + ), + GridView( + padding: EdgeInsets.only(top: 16.w), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16.w, + mainAxisSpacing: 16.w, + ), + children: widget.model.imgs.map((e) { + return ClipRRect( + borderRadius: BorderRadius.circular(4.w), + child: (e is String) ? Image.asset(e) : Image.file(e), + ); + }).toList(), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + ), + ], + ); + } + + _buildType() { + return _buildRawBox( + title: '工单类型', + children: [ + _buildTypeTile('派单类型', fixType, false), + _buildTypeTile('工单时限', dateLimit, false), + _buildTypeTile('工单子类', subType, false), + ], + ); + } + + _buildProcess() { + return _buildRawBox( + title: '报修进程', + children: detailModel.fixStatuses.map((e) { + return _buildProcessTile( + e.title, + DateUtil.formatDate(e.date, format: 'yyyy-MM-dd HH:mm:ss'), + ); + }).toList(), + ); + } + + _buildResult() { + return _buildRawBox( + title: '处理情况', + spacing: 24, + children: [ + Text( + '处理描述', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.h(8), + Text( + detailModel.result.detail, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.w, + fontWeight: FontWeight.bold, + ), + ), + AkuBox.h(24), + Text( + '更换材料', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.h(8), + Text( + detailModel.result.material, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.w, + fontWeight: FontWeight.bold, + ), + ), + AkuBox.h(24), + Text( + '上传照片', + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + AkuBox.h(8), + GridView( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + ), + children: detailModel.result.imgs.map((e) { + return ClipRRect( + borderRadius: BorderRadius.circular(4.w), + child: (e is String) ? Image.asset(e) : Image.file(e), + ); + }).toList(), + ), + ], + ); + } + + Widget _buildTile(String asset, String title, String subTitle) { + return Row( + children: [ + AkuBox.h(56), + Image.asset( + asset, + height: 40.w, + width: 40.w, + ), + AkuBox.w(4), + Text( + title, + style: TextStyle( + fontSize: 28.sp, + color: AppStyle.minorTextColor, + ), + ), + Spacer(), + Text( + subTitle, + style: TextStyle( + fontSize: 28.sp, + color: AppStyle.primaryTextColor, + ), + ), + ], + ); + } + + Widget _buildTypeTile(String title, String content, bool canTap) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: canTap ? () {} : null, + child: Row( + children: [ + AkuBox.h(96), + Text( + title, + style: TextStyle( + fontSize: 28.sp, + color: AppStyle.primaryTextColor, + ), + ), + Spacer(), + Text( + content, + style: TextStyle( + fontSize: 28.sp, + fontWeight: FontWeight.bold, + color: AppStyle.primaryTextColor, + ), + ), + ], + ), + ), + ); + } + + Widget _buildProcessTile(String title, String date) { + return Row( + children: [ + AkuBox.h(56), + Text( + title, + style: TextStyle( + color: AppStyle.minorTextColor, + fontSize: 28.w, + ), + ), + Spacer(), + Text( + date, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontSize: 28.w, + ), + ), + ], + ); + } + + _buildRawBox({ + String title, + List children, + Widget suffix, + double spacing = 0, + }) { + return Container( + padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w), + color: Colors.white, + margin: EdgeInsets.only(bottom: 16.w), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + title, + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 36.sp, + ), + ), + Spacer(), + suffix ?? SizedBox(), + ], + ), + AkuBox.h(spacing), + ...children, + ], + ), + ); + } +} diff --git a/lib/ui/sub_pages/business_and_fix/business_fix_card.dart b/lib/ui/sub_pages/business_and_fix/business_fix_card.dart index 8eb11ba..7b912ec 100644 --- a/lib/ui/sub_pages/business_and_fix/business_fix_card.dart +++ b/lib/ui/sub_pages/business_and_fix/business_fix_card.dart @@ -3,9 +3,12 @@ import 'package:aku_community_manager/mock_models/users/user_info_model.dart'; import 'package:aku_community_manager/provider/user_provider.dart'; import 'package:aku_community_manager/style/app_style.dart'; import 'package:aku_community_manager/tools/widget_tool.dart'; +import 'package:aku_community_manager/ui/sub_pages/business_and_fix/business_and_fix_detail_page.dart'; +import 'package:aku_ui/common_widgets/aku_material_button.dart'; import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; import 'package:aku_community_manager/tools/screen_tool.dart'; +import 'package:get/get.dart'; import 'package:provider/provider.dart'; class BusinessFixCard extends StatefulWidget { @@ -17,13 +20,16 @@ class BusinessFixCard extends StatefulWidget { } class _BusinessFixCardState extends State { + USER_ROLE get userRole { + final userProvider = Provider.of(context, listen: false); + return userProvider.userInfoModel.role; + } + String get dateStart => DateUtil.formatDate(widget.model.dateStart, format: 'yyyy-MM-dd HH:mm:ss'); Widget get fixTypeWidget { - final userProvider = Provider.of(context, listen: false); - - if (userProvider.userInfoModel.role == USER_ROLE.MANAGER) { + if (userRole == USER_ROLE.MANAGER) { return Text( FixModel.managerRoleMap[widget.model.type], style: TextStyle( @@ -94,6 +100,7 @@ class _BusinessFixCardState extends State { ), AkuBox.h(16), _buildImgs(), + _buildBottomCard(), ], ), margin: EdgeInsets.symmetric( @@ -131,4 +138,111 @@ class _BusinessFixCardState extends State { ), ); } + + _buildBottomCard() { + switch (userRole) { + case USER_ROLE.FIXER: + if (widget.model.type == FIX_ENUM.DONE) return SizedBox(); + return Column( + children: [ + Divider( + height: 48.w, + ), + Row( + children: [ + Spacer(), + widget.model.type == FIX_ENUM.PROCESSING + ? MaterialButton( + padding: EdgeInsets.zero, + height: 64.w, + minWidth: 160.w, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4.w), + side: BorderSide( + width: 2.w, + color: AppStyle.primaryColor, + ), + ), + child: Text( + '申请延时', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 28.sp, + ), + ), + onPressed: () {}, + ) + : SizedBox(), + widget.model.type == FIX_ENUM.PROCESSING + ? AkuBox.w(24) + : SizedBox(), + widget.model.type == FIX_ENUM.PROCESSING + ? AkuMaterialButton( + onPressed: () {}, + radius: 4.w, + color: AppStyle.primaryColor, + minWidth: 160.w, + height: 64.w, + child: Text( + '处理完成', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 28.sp, + ), + ), + ) + : SizedBox(), + widget.model.type == FIX_ENUM.WAIT_PICKUP + ? AkuMaterialButton( + onPressed: () {}, + radius: 4.w, + color: AppStyle.primaryColor, + minWidth: 160.w, + height: 64.w, + child: Text( + '立即接单', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 28.sp, + ), + ), + ) + : SizedBox(), + ], + ), + ], + ); + break; + default: + return Column( + children: [ + Divider( + height: 48.w, + ), + Align( + alignment: Alignment.centerRight, + child: AkuMaterialButton( + height: 64.w, + onPressed: () { + Get.to(BusinessAndFixDetailPage(model: widget.model)); + }, + radius: 4, + color: AppStyle.primaryColor, + padding: EdgeInsets.symmetric(horizontal: 24.w), + child: Text( + '查看详情', + style: TextStyle( + color: AppStyle.primaryTextColor, + fontWeight: FontWeight.bold, + fontSize: 28.sp, + height: 40 / 28, + ), + ), + ), + ), + ], + ); + break; + } + } }