parent
1cc4c4d465
commit
222fea9473
@ -0,0 +1,197 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:flustars/flustars.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
|
import 'package:aku_community/base/base_style.dart';
|
||||||
|
|
||||||
|
part 'new_renovation_list_model.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class NewRenovationListModel extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final String roomName;
|
||||||
|
final int status;
|
||||||
|
final String constructionUnit;
|
||||||
|
final String director;
|
||||||
|
final String directorTel;
|
||||||
|
final String expectedBegin;
|
||||||
|
final String expectedEnd;
|
||||||
|
final String? actualBegin;
|
||||||
|
final String? actualEnd;
|
||||||
|
final String? rejectReason;
|
||||||
|
final String? reviewerName;
|
||||||
|
final String? auditDate;
|
||||||
|
final String? trackerName;
|
||||||
|
final String? applicationCheckDate;
|
||||||
|
final int? isQualified;
|
||||||
|
final String createName;
|
||||||
|
final String createDate;
|
||||||
|
final List<CheckVoList?> checkVoList;
|
||||||
|
NewRenovationListModel({
|
||||||
|
required this.id,
|
||||||
|
required this.roomName,
|
||||||
|
required this.status,
|
||||||
|
required this.constructionUnit,
|
||||||
|
required this.director,
|
||||||
|
required this.directorTel,
|
||||||
|
required this.expectedBegin,
|
||||||
|
required this.expectedEnd,
|
||||||
|
this.actualBegin,
|
||||||
|
this.actualEnd,
|
||||||
|
this.rejectReason,
|
||||||
|
this.reviewerName,
|
||||||
|
this.auditDate,
|
||||||
|
this.trackerName,
|
||||||
|
this.applicationCheckDate,
|
||||||
|
this.isQualified,
|
||||||
|
required this.createName,
|
||||||
|
required this.createDate,
|
||||||
|
required this.checkVoList,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props {
|
||||||
|
return [
|
||||||
|
id,
|
||||||
|
roomName,
|
||||||
|
status,
|
||||||
|
constructionUnit,
|
||||||
|
director,
|
||||||
|
directorTel,
|
||||||
|
expectedBegin,
|
||||||
|
expectedEnd,
|
||||||
|
actualBegin,
|
||||||
|
actualEnd,
|
||||||
|
rejectReason,
|
||||||
|
reviewerName,
|
||||||
|
auditDate,
|
||||||
|
trackerName,
|
||||||
|
applicationCheckDate,
|
||||||
|
isQualified,
|
||||||
|
createName,
|
||||||
|
createDate,
|
||||||
|
checkVoList,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
factory NewRenovationListModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$NewRenovationListModelFromJson(json);
|
||||||
|
|
||||||
|
String get statusString {
|
||||||
|
switch (this.status) {
|
||||||
|
case 1:
|
||||||
|
return '申请中';
|
||||||
|
case 2:
|
||||||
|
return '装修中';
|
||||||
|
case 3:
|
||||||
|
return '申请驳回';
|
||||||
|
// case 4:
|
||||||
|
// return '装修中';
|
||||||
|
case 5:
|
||||||
|
return '申请完工检查';
|
||||||
|
case 6:
|
||||||
|
return '完工检查中';
|
||||||
|
case 7:
|
||||||
|
return '检查通过';
|
||||||
|
case 8:
|
||||||
|
return '检查不通过';
|
||||||
|
default:
|
||||||
|
return '未知';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color get statusColor {
|
||||||
|
switch (this.status) {
|
||||||
|
case 1:
|
||||||
|
return kPrimaryColor;
|
||||||
|
case 2:
|
||||||
|
return Colors.green;
|
||||||
|
case 3:
|
||||||
|
return Colors.red;
|
||||||
|
// case 4:
|
||||||
|
// return ktextPrimary;
|
||||||
|
case 5:
|
||||||
|
return kPrimaryColor;
|
||||||
|
case 6:
|
||||||
|
return ktextSubColor;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
return Colors.green;
|
||||||
|
case 8:
|
||||||
|
return Colors.red;
|
||||||
|
default:
|
||||||
|
return ktextPrimary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get expectBginString =>
|
||||||
|
DateUtil.formatDateStr(this.expectedBegin, format: 'yyyy-MM-dd HH:mm');
|
||||||
|
|
||||||
|
String get expectEndString =>
|
||||||
|
DateUtil.formatDateStr(this.expectedEnd, format: 'yyyy-MM-dd HH:mm');
|
||||||
|
|
||||||
|
String get actualBginString => DateUtil.formatDateStr(this.actualBegin ?? '',
|
||||||
|
format: 'yyyy-MM-dd HH:mm');
|
||||||
|
|
||||||
|
String get actualEndString =>
|
||||||
|
DateUtil.formatDateStr(this.actualEnd ?? '', format: 'yyyy-MM-dd HH:mm');
|
||||||
|
String get expectSlot =>
|
||||||
|
'${expectBginString}-${DateUtil.formatDateStr(this.expectedEnd, format: 'HH:mm')}';
|
||||||
|
String get actualSlot =>
|
||||||
|
'${actualBginString}-${DateUtil.formatDateStr(this.actualEnd ?? '', format: 'HH:mm')}';
|
||||||
|
|
||||||
|
String get qualitfied {
|
||||||
|
switch (this.isQualified) {
|
||||||
|
case 1:
|
||||||
|
return '合格';
|
||||||
|
case 2:
|
||||||
|
return '不合格';
|
||||||
|
default:
|
||||||
|
return '未知';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class CheckVoList extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final int decorationNewId;
|
||||||
|
final String detail;
|
||||||
|
final int isQualified;
|
||||||
|
final String createName;
|
||||||
|
final String createDate;
|
||||||
|
CheckVoList({
|
||||||
|
required this.id,
|
||||||
|
required this.decorationNewId,
|
||||||
|
required this.detail,
|
||||||
|
required this.isQualified,
|
||||||
|
required this.createName,
|
||||||
|
required this.createDate,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props {
|
||||||
|
return [
|
||||||
|
id,
|
||||||
|
decorationNewId,
|
||||||
|
detail,
|
||||||
|
isQualified,
|
||||||
|
createName,
|
||||||
|
createDate,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
factory CheckVoList.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$CheckVoListFromJson(json);
|
||||||
|
String get qualitfied {
|
||||||
|
switch (this.isQualified) {
|
||||||
|
case 1:
|
||||||
|
return '合格';
|
||||||
|
case 2:
|
||||||
|
return '不合格';
|
||||||
|
default:
|
||||||
|
return '未知';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'new_renovation_list_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
NewRenovationListModel _$NewRenovationListModelFromJson(
|
||||||
|
Map<String, dynamic> json) {
|
||||||
|
return NewRenovationListModel(
|
||||||
|
id: json['id'] as int,
|
||||||
|
roomName: json['roomName'] as String,
|
||||||
|
status: json['status'] as int,
|
||||||
|
constructionUnit: json['constructionUnit'] as String,
|
||||||
|
director: json['director'] as String,
|
||||||
|
directorTel: json['directorTel'] as String,
|
||||||
|
expectedBegin: json['expectedBegin'] as String,
|
||||||
|
expectedEnd: json['expectedEnd'] as String,
|
||||||
|
actualBegin: json['actualBegin'] as String?,
|
||||||
|
actualEnd: json['actualEnd'] as String?,
|
||||||
|
rejectReason: json['rejectReason'] as String?,
|
||||||
|
reviewerName: json['reviewerName'] as String?,
|
||||||
|
auditDate: json['auditDate'] as String?,
|
||||||
|
trackerName: json['trackerName'] as String?,
|
||||||
|
applicationCheckDate: json['applicationCheckDate'] as String?,
|
||||||
|
isQualified: json['isQualified'] as int?,
|
||||||
|
createName: json['createName'] as String,
|
||||||
|
createDate: json['createDate'] as String,
|
||||||
|
checkVoList: (json['checkVoList'] as List<dynamic>)
|
||||||
|
.map((e) => CheckVoList.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckVoList _$CheckVoListFromJson(Map<String, dynamic> json) {
|
||||||
|
return CheckVoList(
|
||||||
|
id: json['id'] as int,
|
||||||
|
decorationNewId: json['decorationNewId'] as int,
|
||||||
|
detail: json['detail'] as String,
|
||||||
|
isQualified: json['isQualified'] as int,
|
||||||
|
createName: json['createName'] as String,
|
||||||
|
createDate: json['createDate'] as String,
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,198 @@
|
|||||||
|
import 'package:aku_community/base/base_style.dart';
|
||||||
|
import 'package:aku_community/constants/api.dart';
|
||||||
|
import 'package:aku_community/utils/network/base_model.dart';
|
||||||
|
import 'package:aku_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_community/widget/bee_divider.dart';
|
||||||
|
import 'package:aku_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:aku_community/widget/buttons/bottom_button.dart';
|
||||||
|
import 'package:aku_community/widget/others/bee_input_row.dart';
|
||||||
|
import 'package:aku_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:aku_community/widget/picker/bee_date_picker.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flustars/flustars.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
import 'package:aku_community/extensions/widget_list_ext.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class NewRenovationAddPage extends StatefulWidget {
|
||||||
|
NewRenovationAddPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NewRenovationAddPageState createState() => _NewRenovationAddPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NewRenovationAddPageState extends State<NewRenovationAddPage> {
|
||||||
|
late TextEditingController _unitController;
|
||||||
|
late TextEditingController _directorController;
|
||||||
|
late TextEditingController _telController;
|
||||||
|
DateTime? startDate;
|
||||||
|
DateTime? endDate;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_unitController = TextEditingController();
|
||||||
|
_directorController = TextEditingController();
|
||||||
|
_telController = TextEditingController();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_unitController.dispose();
|
||||||
|
_directorController.dispose();
|
||||||
|
_telController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '申请装修',
|
||||||
|
body: ListView(
|
||||||
|
children: [
|
||||||
|
32.w.heightBox,
|
||||||
|
_buildInputCard(),
|
||||||
|
_datePick(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
bottomNavi: BottomButton(
|
||||||
|
onPressed: () async {
|
||||||
|
if (UserTool.appProveider.selectedHouse?.status == 4) {
|
||||||
|
BaseModel baseModel =
|
||||||
|
await NetUtil().post(API.manager.insertNewRenovation,
|
||||||
|
params: {
|
||||||
|
"estateId":
|
||||||
|
UserTool.appProveider.selectedHouse!.estateId,
|
||||||
|
"constructionUnit": _unitController.text,
|
||||||
|
"director": _directorController.text,
|
||||||
|
"directorTel": _telController.text,
|
||||||
|
"expectedBegin": DateUtil.formatDate(startDate),
|
||||||
|
"expectedEnd": DateUtil.formatDate(endDate)
|
||||||
|
},
|
||||||
|
showMessage: true);
|
||||||
|
|
||||||
|
if (baseModel.status ?? false) {
|
||||||
|
Get.back();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: '您未拥有通过审核的房产!');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: '立即申请'.text.size(32.sp).color(ktextPrimary).bold.make()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildInputCard() {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(color: Colors.white),
|
||||||
|
padding: EdgeInsets.all(32.w),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
BeeInputRow(
|
||||||
|
title: '装修公司名称',
|
||||||
|
controller: _unitController,
|
||||||
|
hintText: '请输入装修公司名称'),
|
||||||
|
BeeInputRow(
|
||||||
|
title: '负责人姓名',
|
||||||
|
controller: _directorController,
|
||||||
|
hintText: '请输入负责人姓名'),
|
||||||
|
BeeInputRow(
|
||||||
|
title: '负责人电话', controller: _telController, hintText: '请输入联系电话'),
|
||||||
|
].sepWidget(separate: 40.w.heightBox),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _datePick() {
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 32.w),
|
||||||
|
width: double.infinity,
|
||||||
|
color: Colors.white,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'预约时间',
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
).pSymmetric(h: 32.w),
|
||||||
|
SizedBox(
|
||||||
|
height: 120.w,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
MaterialButton(
|
||||||
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||||
|
height: 120.w,
|
||||||
|
onPressed: () async {
|
||||||
|
DateTime _currentTime = DateTime.now();
|
||||||
|
DateTime? date = await BeeDatePicker.pick(
|
||||||
|
_currentTime.add(Duration(minutes: 60)),
|
||||||
|
mode: CupertinoDatePickerMode.dateAndTime,
|
||||||
|
min: _currentTime.add(Duration(minutes: 30)),
|
||||||
|
max: _currentTime.add(Duration(days: 30)),
|
||||||
|
);
|
||||||
|
if (date != null) {
|
||||||
|
startDate = date;
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
startDate == null
|
||||||
|
? '请选择开始时间'
|
||||||
|
: DateUtil.formatDate(
|
||||||
|
startDate,
|
||||||
|
format: 'yyyy-MM-dd HH:mm',
|
||||||
|
),
|
||||||
|
style: TextStyle(
|
||||||
|
color: ktextSubColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
).expand(),
|
||||||
|
Icon(Icons.arrow_forward),
|
||||||
|
MaterialButton(
|
||||||
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||||
|
height: 120.w,
|
||||||
|
onPressed: () async {
|
||||||
|
DateTime? date = await BeeDatePicker.pick(
|
||||||
|
startDate == null
|
||||||
|
? DateTime.now().add(Duration(minutes: 90))
|
||||||
|
: startDate!.add(Duration(minutes: 30)),
|
||||||
|
min: startDate == null
|
||||||
|
? DateTime.now().add(Duration(minutes: 60))
|
||||||
|
: startDate!.add(Duration(minutes: 30)),
|
||||||
|
max: startDate == null
|
||||||
|
? DateTime.now().add(Duration(days: 2))
|
||||||
|
: (startDate!).add(Duration(days: 2)),
|
||||||
|
mode: CupertinoDatePickerMode.dateAndTime,
|
||||||
|
);
|
||||||
|
if (date != null) {
|
||||||
|
endDate = date;
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
endDate == null
|
||||||
|
? '请选择结束时间'
|
||||||
|
: DateUtil.formatDate(
|
||||||
|
endDate,
|
||||||
|
format: 'yyyy-MM-dd HH:mm',
|
||||||
|
),
|
||||||
|
style: TextStyle(
|
||||||
|
color: ktextSubColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
).expand(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BeeDivider.horizontal(
|
||||||
|
indent: 32.w,
|
||||||
|
endIndent: 32.w,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,169 @@
|
|||||||
|
import 'package:aku_community/base/base_style.dart';
|
||||||
|
import 'package:aku_community/constants/api.dart';
|
||||||
|
import 'package:aku_community/models/new_renovation/new_renovation_list_model.dart';
|
||||||
|
import 'package:aku_community/pages/renovation_manage/new_renovation/new_renovation_detail_page.dart';
|
||||||
|
import 'package:aku_community/utils/network/base_model.dart';
|
||||||
|
import 'package:aku_community/utils/network/net_util.dart';
|
||||||
|
import 'package:aku_community/widget/bee_divider.dart';
|
||||||
|
import 'package:aku_community/widget/buttons/card_bottom_button.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class NewRenovationCard extends StatefulWidget {
|
||||||
|
final NewRenovationListModel model;
|
||||||
|
final VoidCallback callRefresh;
|
||||||
|
NewRenovationCard({Key? key, required this.model, required this.callRefresh})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NewRenovationCardState createState() => _NewRenovationCardState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NewRenovationCardState extends State<NewRenovationCard> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Get.to(() => NewRenovationDetailPage(model: widget.model));
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(24.w),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(8.w)),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
widget.model.roomName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 32.sp,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: ktextPrimary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
widget.model.statusString.text
|
||||||
|
.size(30.sp)
|
||||||
|
.color(widget.model.statusColor)
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
16.w.heightBox,
|
||||||
|
BeeDivider.horizontal(),
|
||||||
|
24.w.heightBox,
|
||||||
|
...<Widget>[
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'装修公司',
|
||||||
|
widget.model.constructionUnit.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'负责人姓名',
|
||||||
|
widget.model.director.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'负责人电话',
|
||||||
|
widget.model.directorTel.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'预计装修时间',
|
||||||
|
widget.model.expectSlot.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
..._nullableRowTile(
|
||||||
|
widget.model.actualEnd.isEmptyOrNull,
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'实际装修时间',
|
||||||
|
widget.model.actualSlot.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make())
|
||||||
|
].sepWidget(separate: 12.w.heightBox),
|
||||||
|
..._bottomWidgets(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> _bottomWidgets() {
|
||||||
|
return (widget.model.status != 2)
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
40.w.heightBox,
|
||||||
|
Row(
|
||||||
|
children: [Spacer(), ..._getButtons()],
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> _getButtons() {
|
||||||
|
List<CardBottomButton> buttons = [];
|
||||||
|
switch (widget.model.status) {
|
||||||
|
case 2:
|
||||||
|
buttons = [
|
||||||
|
CardBottomButton.yellow(
|
||||||
|
text: '申请完工检查',
|
||||||
|
onPressed: () async {
|
||||||
|
BaseModel baseModel =
|
||||||
|
await NetUtil().get(API.manager.applyCompleteRenovation,
|
||||||
|
params: {
|
||||||
|
"userDecorationNewId": widget.model.id,
|
||||||
|
},
|
||||||
|
showMessage: true);
|
||||||
|
if (baseModel.status ?? false) {
|
||||||
|
widget.callRefresh();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buttons = [];
|
||||||
|
}
|
||||||
|
return buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
_nullableRowTile(
|
||||||
|
bool isNull, String assetPath, String title, Widget content) {
|
||||||
|
return isNull
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
_rowTile(assetPath, title, content),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _rowTile(String assetPath, String titile, Widget content) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
assetPath,
|
||||||
|
width: 40.w,
|
||||||
|
height: 40.w,
|
||||||
|
),
|
||||||
|
12.w.widthBox,
|
||||||
|
titile.text.size(24.sp).color(ktextSubColor).make(),
|
||||||
|
Spacer(),
|
||||||
|
content,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,224 @@
|
|||||||
|
import 'package:aku_community/base/base_style.dart';
|
||||||
|
import 'package:aku_community/models/new_renovation/new_renovation_list_model.dart';
|
||||||
|
import 'package:aku_community/widget/bee_divider.dart';
|
||||||
|
import 'package:aku_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
|
||||||
|
class NewRenovationDetailPage extends StatefulWidget {
|
||||||
|
final NewRenovationListModel model;
|
||||||
|
NewRenovationDetailPage({Key? key, required this.model}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NewRenovationDetailPageState createState() =>
|
||||||
|
_NewRenovationDetailPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NewRenovationDetailPageState extends State<NewRenovationDetailPage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '装修详情',
|
||||||
|
body: ListView(
|
||||||
|
padding: EdgeInsets.all(32.w),
|
||||||
|
children: [
|
||||||
|
_renovationInfo(),
|
||||||
|
40.w.heightBox,
|
||||||
|
_contentWidget(),
|
||||||
|
..._checkWidge(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _contentWidget() {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(8.w)),
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
'装修反馈'.text.size(32.sp).color(ktextPrimary).bold.make(),
|
||||||
|
Spacer(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
16.w.heightBox,
|
||||||
|
BeeDivider.horizontal(),
|
||||||
|
20.w.heightBox,
|
||||||
|
(widget.model.rejectReason ?? '')
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(ktextPrimary)
|
||||||
|
.make(),
|
||||||
|
...widget.model.auditDate.isEmptyOrNull
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
40.w.heightBox,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Spacer(),
|
||||||
|
widget.model.auditDate!.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
...widget.model.checkVoList.isEmpty ? [] : [..._checkWidge()]
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> _checkWidge() {
|
||||||
|
return widget.model.checkVoList
|
||||||
|
.map((e) => Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(8.w)),
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 24.w, horizontal: 32.w),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
16.w.heightBox,
|
||||||
|
BeeDivider.horizontal(),
|
||||||
|
20.w.heightBox,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
'完工检查${widget.model.checkVoList.indexOf(e)}'
|
||||||
|
.text
|
||||||
|
.size(32.sp)
|
||||||
|
.color(ktextPrimary)
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
Spacer(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
12.w.heightBox,
|
||||||
|
e!.qualitfied.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(e.isQualified == 1 ? Colors.green : Colors.red)
|
||||||
|
.make(),
|
||||||
|
20.w.heightBox,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Spacer(),
|
||||||
|
(e.createDate)
|
||||||
|
.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _renovationInfo() {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(24.w),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(8.w)),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
widget.model.roomName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 32.sp,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: ktextPrimary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
widget.model.statusString.text
|
||||||
|
.size(30.sp)
|
||||||
|
.color(widget.model.statusColor)
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
16.w.heightBox,
|
||||||
|
BeeDivider.horizontal(),
|
||||||
|
24.w.heightBox,
|
||||||
|
...<Widget>[
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'装修公司',
|
||||||
|
widget.model.constructionUnit.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'负责人姓名',
|
||||||
|
widget.model.director.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'负责人电话',
|
||||||
|
widget.model.directorTel.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
_rowTile(
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'预计装修时间',
|
||||||
|
widget.model.expectSlot.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
..._nullableRowTile(
|
||||||
|
widget.model.actualEnd.isEmptyOrNull,
|
||||||
|
R.ASSETS_ICONS_APPOINTMENT_CODE_PNG,
|
||||||
|
'实际装修时间',
|
||||||
|
widget.model.actualSlot.text
|
||||||
|
.size(24.sp)
|
||||||
|
.color(ktextSubColor)
|
||||||
|
.make())
|
||||||
|
].sepWidget(separate: 12.w.heightBox),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_nullableRowTile(
|
||||||
|
bool isNull, String assetPath, String title, Widget content) {
|
||||||
|
return isNull
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
_rowTile(assetPath, title, content),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _rowTile(String assetPath, String titile, Widget content) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
assetPath,
|
||||||
|
width: 40.w,
|
||||||
|
height: 40.w,
|
||||||
|
),
|
||||||
|
12.w.widthBox,
|
||||||
|
titile.text.size(24.sp).color(ktextSubColor).make(),
|
||||||
|
Spacer(),
|
||||||
|
content,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
import 'package:aku_community/pages/renovation_manage/new_renovation/new_renovation_add_page.dart';
|
||||||
|
import 'package:aku_community/pages/renovation_manage/new_renovation/new_renovation_view.dart';
|
||||||
|
import 'package:aku_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:aku_community/widget/tab_bar/bee_tab_bar.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class NewRenovationPage extends StatefulWidget {
|
||||||
|
NewRenovationPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NewRenovationPageState createState() => _NewRenovationPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NewRenovationPageState extends State<NewRenovationPage>
|
||||||
|
with TickerProviderStateMixin {
|
||||||
|
List<String> _tabs = [
|
||||||
|
'申请中',
|
||||||
|
'装修中',
|
||||||
|
'申请驳回',
|
||||||
|
'申请完工检查',
|
||||||
|
'完工检查中',
|
||||||
|
'检查通过',
|
||||||
|
'检查未通过'
|
||||||
|
];
|
||||||
|
late TabController _tabController;
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_tabController = TabController(length: _tabs.length, vsync: this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_tabController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '装修管理',
|
||||||
|
appBarBottom: PreferredSize(
|
||||||
|
preferredSize: Size.fromHeight(88.w),
|
||||||
|
child: BeeTabBar(
|
||||||
|
controller: _tabController,
|
||||||
|
tabs: _tabs,
|
||||||
|
scrollable: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(
|
||||||
|
CupertinoIcons.plus_circle,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
onPressed: () {
|
||||||
|
Get.to(() => NewRenovationAddPage());
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
body: TabBarView(
|
||||||
|
children: List.generate(_tabs.length, (index) => _getViews(index)),
|
||||||
|
controller: _tabController,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_getViews(index) {
|
||||||
|
if (index > 2) {
|
||||||
|
return NewRenovationView(
|
||||||
|
index: index + 1,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return NewRenovationView(
|
||||||
|
index: index,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
import 'package:aku_community/constants/api.dart';
|
||||||
|
import 'package:aku_community/models/new_renovation/new_renovation_list_model.dart';
|
||||||
|
import 'package:aku_community/pages/renovation_manage/new_renovation/new_renovation_card.dart';
|
||||||
|
import 'package:aku_community/pages/things_page/widget/bee_list_view.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
|
||||||
|
class NewRenovationView extends StatefulWidget {
|
||||||
|
final int index;
|
||||||
|
NewRenovationView({Key? key, required this.index}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NewRenovationViewState createState() => _NewRenovationViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NewRenovationViewState extends State<NewRenovationView>
|
||||||
|
with AutomaticKeepAliveClientMixin {
|
||||||
|
late EasyRefreshController _refreshController;
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_refreshController = EasyRefreshController();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_refreshController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeListView(
|
||||||
|
path: API.manager.newRenovationList,
|
||||||
|
extraParams: {
|
||||||
|
"userDecorationNewStatus": widget.index + 1,
|
||||||
|
},
|
||||||
|
controller: _refreshController,
|
||||||
|
convert: (models) {
|
||||||
|
return models.tableList!
|
||||||
|
.map((e) => NewRenovationListModel.fromJson(e))
|
||||||
|
.toList();
|
||||||
|
},
|
||||||
|
builder: (items) {
|
||||||
|
return ListView.separated(
|
||||||
|
padding: EdgeInsets.all(32.w),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return NewRenovationCard(
|
||||||
|
model: items[index],
|
||||||
|
callRefresh: () {
|
||||||
|
_refreshController.callRefresh();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (_, __) {
|
||||||
|
return 24.w.heightBox;
|
||||||
|
},
|
||||||
|
itemCount: items.length);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get wantKeepAlive => true;
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
import 'package:aku_community/base/base_style.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:aku_community/utils/headers.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
class BeeInputRow extends StatefulWidget {
|
||||||
|
final String title;
|
||||||
|
final TextEditingController controller;
|
||||||
|
final List<TextInputFormatter>? formatters;
|
||||||
|
final String? hintText;
|
||||||
|
BeeInputRow(
|
||||||
|
{Key? key,
|
||||||
|
required this.title,
|
||||||
|
required this.controller,
|
||||||
|
this.formatters,
|
||||||
|
required this.hintText})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_BeeInputRowState createState() => _BeeInputRowState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BeeInputRowState extends State<BeeInputRow> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
widget.title.text.size(28.sp).color(ktextPrimary).make(),
|
||||||
|
32.w.heightBox,
|
||||||
|
TextField(
|
||||||
|
inputFormatters: widget.formatters,
|
||||||
|
controller: widget.controller,
|
||||||
|
textAlign: TextAlign.start,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: widget.hintText ?? '',
|
||||||
|
isDense: true,
|
||||||
|
contentPadding: EdgeInsets.zero,
|
||||||
|
enabledBorder: UnderlineInputBorder(
|
||||||
|
borderSide: BorderSide(color: Color(0xFFE8E8E8), width: 2.w),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 36.sp,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: ktextPrimary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:aku_community/provider/app_provider.dart';
|
||||||
|
import 'package:aku_community/provider/user_provider.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class UserTool {
|
||||||
|
static UserProvider get userProvider =>
|
||||||
|
Provider.of<UserProvider>(Get.context!, listen: false);
|
||||||
|
static AppProvider get appProveider => Provider.of<AppProvider>(Get.context!,listen: false);
|
||||||
|
}
|
Loading…
Reference in new issue