yangyang преди 2 години
родител
ревизия
8ac52d9ebe
променени са 30 файла, в които са добавени 1530 реда и са изтрити 688 реда
  1. 160 0
      lib/PhotoTool.dart
  2. 60 0
      lib/common/dialog/CloseTaskDialog.dart
  3. 3 0
      lib/common/event/RefreshPatrol.dart
  4. 25 26
      lib/common/style/TitleBar.dart
  5. 11 1
      lib/common/utils/ConstantString.dart
  6. 7 0
      lib/common/utils/DioUtil.dart
  7. 32 6
      lib/generated/json/base/json_convert_content.dart
  8. 3 1
      lib/generated/json/drop_menu_item_helper.dart
  9. 10 28
      lib/generated/json/equipment_info_entity_helper.dart
  10. 0 2
      lib/generated/json/equipment_list_entity_helper.dart
  11. 253 0
      lib/generated/json/patrol_job_detail_response_entity_helper.dart
  12. 0 103
      lib/home.dart
  13. 9 0
      lib/main.dart
  14. 58 4
      lib/model/maint_job_detail_response.dart
  15. 8 8
      lib/model/maint_pesonse_entity.dart
  16. 58 0
      lib/model/patrol_job_detail_response_entity.dart
  17. 1 0
      lib/page/device/device_manage_detail_page.dart
  18. 0 2
      lib/page/device/device_manage_page.dart
  19. 2 3
      lib/page/device/device_manage_update_page.dart
  20. 9 1
      lib/page/home/home_page.dart
  21. 5 4
      lib/page/login/login_page.dart
  22. 21 44
      lib/page/maint/maint_job_detail.dart
  23. 127 56
      lib/page/maint/maint_job_page.dart
  24. 176 173
      lib/page/patrol/patrol_job_detail.dart
  25. 151 0
      lib/page/patrol/patrol_job_list.dart
  26. 115 25
      lib/page/patrol/patrol_job_page.dart
  27. 58 56
      lib/page/repair/repair_page.dart
  28. 76 82
      lib/widget/MaintJobDrawer.dart
  29. 90 63
      lib/widget/PatrolJobDrawer.dart
  30. 2 0
      pubspec.yaml

+ 160 - 0
lib/PhotoTool.dart

@@ -0,0 +1,160 @@
+import 'dart:io';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
+import 'package:wechat_assets_picker/wechat_assets_picker.dart';
+
+class PhotoTool extends StatefulWidget {
+  @required final int imageCount;//最多几张
+  @required  final int lineCount;//一行几个
+  //注:最好把图片和文字这些都拿出来,方便更改,这里就不搞了
+  const PhotoTool({required this.imageCount,required this.lineCount});
+  @override
+  _PhotoToolState createState() => _PhotoToolState();
+}
+
+class _PhotoToolState extends State<PhotoTool> {
+  List<AssetEntity> _imageFiles = [];
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      color: Colors.white,
+      child: Padding(
+        padding: const EdgeInsets.all(16.0),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            RichText(
+              text: TextSpan(
+                text: '说明:',
+                style: Theme.of(context).textTheme.subtitle2,
+                children: [
+                  TextSpan(
+                    text: '(说明:上传图片,最多${widget.imageCount}张)',
+                    style: Theme.of(context)
+                        .textTheme
+                        .bodyText2
+                        ?.copyWith(color: Colors.grey),
+                  ),
+                ],
+              ),
+            ),
+            SizedBox(height: 16.0),
+            StaggeredGridView.countBuilder(
+              shrinkWrap: true,
+              crossAxisCount: widget.lineCount,
+              itemCount: _imageFiles.length == widget.imageCount
+                  ? _imageFiles.length
+                  : _imageFiles.length + 1,
+              physics: NeverScrollableScrollPhysics(),
+              itemBuilder: (BuildContext context, int index) {
+                if (_imageFiles.length < widget.imageCount && index == 0) {
+                  return InkWell(
+                    onTap: () => _onPickImage(),
+                    child: Container(
+                      padding: EdgeInsets.all(5),
+                      child: Container(
+                        decoration: BoxDecoration(
+                          borderRadius: BorderRadius.circular(5.0),
+                          color: Color(0xFFF6F7F8),
+                        ),
+                        child: Center(
+                          child: Icon(
+                            Icons.add,
+                            color: Color(0xFFB4B4B4),
+                            size: 40,
+                          ),
+                        ),
+                      ),
+                    ),
+                  );
+                } else {
+                  return Stack(
+                    children: [
+                      Container(
+                        padding: EdgeInsets.all(5),
+                        child: InkWell(
+                          child: FutureBuilder<File?>(
+                            future: _imageFiles[_imageFiles.length < widget.imageCount ? index - 1 : index].file,
+                            builder: (context, snapshot) {
+                              return snapshot.connectionState ==
+                                  ConnectionState.done
+                                  ? Container(
+                                decoration: BoxDecoration(
+                                  shape: BoxShape.rectangle,
+                                  borderRadius:
+                                  BorderRadius.circular(6.0),
+                                  image: DecorationImage(
+                                    image: FileImage(File(snapshot.data!.path)),
+                                    fit: BoxFit.cover,
+                                  ),
+                                ),
+                              )
+                                  : Container(
+                                decoration: BoxDecoration(
+                                  shape: BoxShape.rectangle,
+                                  borderRadius:
+                                  BorderRadius.circular(6.0),
+                                  color: Color(0xFFF6F7F8),
+                                ),
+                                child: Center(
+                                  child: CupertinoActivityIndicator(),
+                                ),
+                              );
+                            },
+                          ),
+                        ),
+                      ),
+                      InkWell(
+                        onTap: () => _deleteImage(
+                            _imageFiles.length < widget.imageCount
+                                ? index - 1
+                                : index),
+                        child: Container(
+                          decoration: BoxDecoration(
+                            borderRadius: BorderRadius.circular(99.0),
+                            color: Colors.red,
+                          ),
+                          padding: EdgeInsets.all(2.0),
+                          child: Icon(
+                            Icons.close,
+                            size: 20.0,
+                            color: Colors.white,
+                          ),
+                        ),
+                      ),
+                    ],
+                  );
+                }
+              },
+              staggeredTileBuilder: (int index) =>
+              new StaggeredTile.count(1, 1),
+              mainAxisSpacing: 4.0,
+              crossAxisSpacing: 4.0,
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+  /// 选择图片
+  _onPickImage() async {
+    List<AssetEntity>? assets = await AssetPicker.pickAssets(
+      context,
+      pickerConfig:AssetPickerConfig(maxAssets:widget.imageCount - _imageFiles.length,themeColor: Theme.of(context).primaryColor, requestType: RequestType.image,)
+    );
+    if (assets == null || assets.length <= 0) return;
+    setState(() {
+      _imageFiles.addAll(assets);
+    });
+  }
+  /// 删除图片
+  _deleteImage(int index) {
+    if (_imageFiles == null || _imageFiles.length <= index) return;
+    setState(() {
+      _imageFiles.removeAt(index);
+    });
+  }
+}

+ 60 - 0
lib/common/dialog/CloseTaskDialog.dart

@@ -0,0 +1,60 @@
+import 'package:deus_app/common/utils/CommonUtils.dart';
+import 'package:deus_app/common/utils/ConstantString.dart';
+import 'package:deus_app/common/utils/ToastUtils.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class CloseTaskDialog {
+
+  static void showCupertinoAlertDialog(
+      BuildContext context, _CallBack onPressed) {
+    String result = '';
+    showDialog(
+        context: context,
+        barrierDismissible:false,
+        builder: (BuildContext context) {
+          return Theme(
+              data: ThemeData(
+                  dialogBackgroundColor: Colors.white,
+                  dialogTheme: DialogTheme(backgroundColor: Colors.white)),
+              child: CupertinoAlertDialog(
+                title: Text(ConstantString.close_task),
+                content: Column(
+                  children: <Widget>[
+                    SizedBox(
+                      height: 10,
+                    ),
+                    new TextField(
+                      maxLines: 3,
+                      decoration: InputDecoration(border: OutlineInputBorder()),
+                      style: TextStyle(fontSize: 14),
+                      onChanged: (value) {
+                        result = value;
+                      },
+                    )
+                  ],
+                ),
+                actions: <Widget>[
+                  CupertinoDialogAction(
+                    child: Text("取消"),
+                    onPressed: () {
+                      Navigator.pop(context);
+                    },
+                  ),
+                  CupertinoDialogAction(
+                    child: Text("确定"),
+                    onPressed: () {
+                      if (!CommonUtils.validationInput(result)) {
+                        showToast(ConstantString.notesNull);
+                      } else {
+                        onPressed(result);
+                        Navigator.pop(context);
+                      }
+                    },
+                  ),
+                ],
+              ));
+        });
+  }
+}
+typedef _CallBack = void Function(String msg);

+ 3 - 0
lib/common/event/RefreshPatrol.dart

@@ -0,0 +1,3 @@
+class RefreshPatrol{
+
+}

+ 25 - 26
lib/common/style/TitleBar.dart

@@ -34,32 +34,32 @@ class TitleBar {
   /**
    * 设置左侧按钮
    */
-  _leading(BuildContext context, VoidCallback onPressed) {
-    return Column(
-      mainAxisAlignment: MainAxisAlignment.center,
-      crossAxisAlignment: CrossAxisAlignment.start,
-      children: <Widget>[
-        Container(
-          width: 44,
-          padding: EdgeInsets.all(0),
-          child: new IconButton(
-            padding: EdgeInsets.only(left: 16, right: 16),
-//            icon: Image.asset(
-//              'assets/images/ic_black_left_arrow.png',
-//              fit: BoxFit.contain,
-//              width: 16,
-//              height: 16,
-//            ),
-            icon: Icon(Icons.chevron_left),
-            onPressed: () {
-              if (onPressed == null) {
-                _popThis(context);
-              } else {
-                onPressed();
-              }
-            },
+  textAppBar(String title, String text, VoidCallback rightButtonClick) {
+    return AppBar(
+      centerTitle: true,
+      titleSpacing: 0,
+      elevation: 0,
+      backgroundColor: Color(0xFF4875EC),
+      leading: BackButton(),
+      // 返回按钮
+      title: Text(
+        title,
+        style: TextStyle(fontSize: 16),
+      ),
+      automaticallyImplyLeading: false,
+      // 标题
+      actions: <Widget>[
+        TextButton(
+          // action button
+          onPressed: rightButtonClick,
+          style: ButtonStyle(
+            padding: MaterialStateProperty.all(const EdgeInsets.only(
+                left: 10, right: 20, top: 10, bottom: 10)),
+            foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
           ),
-        ),
+          // action button
+          child: Text(text,style: const TextStyle( fontSize: 15)),
+        )
       ],
     );
   }
@@ -79,7 +79,6 @@ class TitleBar {
       automaticallyImplyLeading: false,
       // 标题
       actions: <Widget>[
-
         new IconButton(
           // action button
           padding: EdgeInsets.only(right: 20),

+ 11 - 1
lib/common/utils/ConstantString.dart

@@ -15,7 +15,7 @@ class ConstantString {
 
   static const String patrolJobTitle = "巡检任务来自于'巡检计划管理',计划信息请登录pc端查看";
   static const String maintJobTitle = "维保任务来自于'维保计划管理',计划信息请登录pc端查看";
-
+  static const String patrolListTitle = "请针对以下设备进行巡检记录";
 
   static const String loadingText = "努力加载中···";
 
@@ -36,4 +36,14 @@ class ConstantString {
   static const String close_job = "关闭任务";
 
   static const String login_maint = "登记维保";
+
+  static const String close_task="关闭任务";
+
+  static const String registration="登记巡检";
+
+  static const String complete_inspection="完成巡检";
+
+  static const String notesNull = "请输入备注";
+
+  static const String next = "下一步";
 }

+ 7 - 0
lib/common/utils/DioUtil.dart

@@ -1,6 +1,8 @@
 import 'package:deus_app/common/local/StoreHelper.dart';
 import 'package:deus_app/common/utils/ConstantString.dart';
 import 'package:dio/dio.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:pretty_dio_logger/pretty_dio_logger.dart';
 
 /// 请求方法
 enum DioMethod {
@@ -40,6 +42,8 @@ class DioUtil {
     // 添加拦截器
     _dio.interceptors.add(InterceptorsWrapper(
         onRequest: _onRequest, onResponse: _onResponse, onError: _onError));
+    _dio.interceptors.add(PrettyDioLogger(requestHeader: true, requestBody:
+    true, responseHeader: true));
   }
 
   /// 请求拦截器
@@ -95,6 +99,7 @@ class DioUtil {
       DioMethod.patch: 'patch',
       DioMethod.head: 'head'
     };
+    EasyLoading.show(status: 'loading...');
     options ??= Options(method: _methodValues[method]);
     try {
       Response response;
@@ -105,8 +110,10 @@ class DioUtil {
           options: options,
           onSendProgress: onSendProgress,
           onReceiveProgress: onReceiveProgress);
+      EasyLoading.dismiss();
         return response.data;
     } on DioError catch (e) {
+      EasyLoading.dismiss();
       // showToast(e.message);
       return e.response?.data;
     }

+ 32 - 6
lib/generated/json/base/json_convert_content.dart

@@ -6,12 +6,14 @@ import 'package:deus_app/generated/json/drop_menu_item_helper.dart';
 import 'package:deus_app/generated/json/equipment_info_entity_helper.dart';
 import 'package:deus_app/generated/json/equipment_list_entity_helper.dart';
 import 'package:deus_app/generated/json/login_response_entity_helper.dart';
+import 'package:deus_app/generated/json/patrol_job_detail_response_entity_helper.dart';
 import 'package:deus_app/generated/json/personal_data_count_entity_helper.dart';
 import 'package:deus_app/generated/json/user_response_entity_helper.dart';
 import 'package:deus_app/model/drop_menu_item.dart';
 import 'package:deus_app/model/equipment_info_entity.dart';
 import 'package:deus_app/model/equipment_list_entity.dart';
 import 'package:deus_app/model/login_response_entity.dart';
+import 'package:deus_app/model/patrol_job_detail_response_entity.dart';
 // This file is automatically generated. DO NOT EDIT, all your changes would be lost.
 import 'package:deus_app/model/patrol_response_entity.dart';
 import 'package:deus_app/model/personal_data_count_entity.dart';
@@ -54,6 +56,12 @@ class JsonConvert<T> {
 				return personalDataCountEntityFromJson(data as PersonalDataCountEntity, json) as T;
 			case PersonalDataCountData:
 				return personalDataCountDataFromJson(data as PersonalDataCountData, json) as T;
+			case PatrolJobDetailResponseData:
+				return patrolJobDetailResponseDataFromJson(data as PatrolJobDetailResponseData, json) as T;
+			case PatrolJobDetailResponseDataPatrolItemVOS:
+				return patrolJobDetailResponseDataPatrolItemVOSFromJson(data as PatrolJobDetailResponseDataPatrolItemVOS, json) as T;
+			case PatrolJobDetailResponseDataEquipmentVOS:
+				return patrolJobDetailResponseDataEquipmentVOSFromJson(data as PatrolJobDetailResponseDataEquipmentVOS, json) as T;
 			case DropMenuItem:
 				return dropMenuItemFromJson(data as DropMenuItem, json) as T;
 			case EquipmentInfoEntity:
@@ -91,6 +99,12 @@ class JsonConvert<T> {
 				return personalDataCountEntityToJson(data as PersonalDataCountEntity);
 			case PersonalDataCountData:
 				return personalDataCountDataToJson(data as PersonalDataCountData);
+			case PatrolJobDetailResponseData:
+				return patrolJobDetailResponseDataToJson(data as PatrolJobDetailResponseData);
+			case PatrolJobDetailResponseDataPatrolItemVOS:
+				return patrolJobDetailResponseDataPatrolItemVOSToJson(data as PatrolJobDetailResponseDataPatrolItemVOS);
+			case PatrolJobDetailResponseDataEquipmentVOS:
+				return patrolJobDetailResponseDataEquipmentVOSToJson(data as PatrolJobDetailResponseDataEquipmentVOS);
 			case DropMenuItem:
 				return dropMenuItemToJson(data as DropMenuItem);
 			case EquipmentInfoEntity:
@@ -109,9 +123,6 @@ class JsonConvert<T> {
 		if(type == (PatrolJobDataVO).toString()){
 			return PatrolJobDataVO().fromJson(json);
 		}
-		if(type == (PatrolJobDetailResponseEntity).toString()){
-			return PatrolJobDetailResponseEntity().fromJson(json);
-		}
 		if(type == (PatrolJobDeviceResponseData).toString()){
 			return PatrolJobDeviceResponseData().fromJson(json);
 		}
@@ -157,6 +168,15 @@ class JsonConvert<T> {
 		if(type == (PersonalDataCountData).toString()){
 			return PersonalDataCountData().fromJson(json);
 		}
+		if(type == (PatrolJobDetailResponseData).toString()){
+			return PatrolJobDetailResponseData().fromJson(json);
+		}
+		if(type == (PatrolJobDetailResponseDataPatrolItemVOS).toString()){
+			return PatrolJobDetailResponseDataPatrolItemVOS().fromJson(json);
+		}
+		if(type == (PatrolJobDetailResponseDataEquipmentVOS).toString()){
+			return PatrolJobDetailResponseDataEquipmentVOS().fromJson(json);
+		}
 		if(type == (EquipmentInfoEntity).toString()){
 			return EquipmentInfoEntity().fromJson(json);
 		}
@@ -175,9 +195,6 @@ class JsonConvert<T> {
 		if(<PatrolJobDataVO>[] is M){
 			return data.map<PatrolJobDataVO>((e) => PatrolJobDataVO().fromJson(e)).toList() as M;
 		}
-		if(<PatrolJobDetailResponseEntity>[] is M){
-			return data.map<PatrolJobDetailResponseEntity>((e) => PatrolJobDetailResponseEntity().fromJson(e)).toList() as M;
-		}
 		if(<UserResponseEntity>[] is M){
 			return data.map<UserResponseEntity>((e) => UserResponseEntity().fromJson(e)).toList() as M;
 		}
@@ -217,6 +234,15 @@ class JsonConvert<T> {
 		if(<PersonalDataCountData>[] is M){
 			return data.map<PersonalDataCountData>((e) => PersonalDataCountData().fromJson(e)).toList() as M;
 		}
+		if(<PatrolJobDetailResponseData>[] is M){
+			return data.map<PatrolJobDetailResponseData>((e) => PatrolJobDetailResponseData().fromJson(e)).toList() as M;
+		}
+		if(<PatrolJobDetailResponseDataPatrolItemVOS>[] is M){
+			return data.map<PatrolJobDetailResponseDataPatrolItemVOS>((e) => PatrolJobDetailResponseDataPatrolItemVOS().fromJson(e)).toList() as M;
+		}
+		if(<PatrolJobDetailResponseDataEquipmentVOS>[] is M){
+			return data.map<PatrolJobDetailResponseDataEquipmentVOS>((e) => PatrolJobDetailResponseDataEquipmentVOS().fromJson(e)).toList() as M;
+		}
 		if(<EquipmentInfoEntity>[] is M){
 			return data.map<EquipmentInfoEntity>((e) => EquipmentInfoEntity().fromJson(e)).toList() as M;
 		}

+ 3 - 1
lib/generated/json/drop_menu_item_helper.dart

@@ -5,7 +5,9 @@ dropMenuItemFromJson(DropMenuItem data, Map<String, dynamic> json) {
 		data.label = json['label'];
 	}
 	if (json['value'] != null) {
-		data.value = json['value'];
+		data.value = json['value'] is String
+				? int.tryParse(json['value'])
+				: json['value'].toInt();
 	}
 	return data;
 }

+ 10 - 28
lib/generated/json/equipment_info_entity_helper.dart

@@ -34,8 +34,6 @@ equipmentInfoDataFromJson(EquipmentInfoData data, Map<String, dynamic> json) {
 	}
 	if (json['showName'] != null) {
 		data.showName = json['showName'].toString();
-	}else{
-		data.showName=json['name'].toString();
 	}
 	if (json['deviceKey'] != null) {
 		data.deviceKey = json['deviceKey'].toString();
@@ -94,9 +92,7 @@ equipmentInfoDataFromJson(EquipmentInfoData data, Map<String, dynamic> json) {
 		data.lastUpdateOn = json['lastUpdateOn'];
 	}
 	if (json['activationOn'] != null) {
-		data.activationOn = json['activationOn'];
-	}else{
-		data.activationOn ="暂无";
+		data.activationOn = json['activationOn'].toString();
 	}
 	if (json['positionId'] != null) {
 		data.positionId = json['positionId'];
@@ -106,45 +102,31 @@ equipmentInfoDataFromJson(EquipmentInfoData data, Map<String, dynamic> json) {
 	}
 	if (json['speedA'] != null) {
 		data.speedA = json['speedA'].toString();
-	}else{
-    data.speedA="暂无";
-  }
+	}
 	if (json['speedB'] != null) {
 		data.speedB = json['speedB'].toString();
-	}else{
-    data.speedB="暂无";
-  }
+	}
 	if (json['finenessA'] != null) {
 		data.finenessA = json['finenessA'].toString();
-	}else{
-    data.finenessA="暂无";
-  }
+	}
 	if (json['finenessB'] != null) {
 		data.finenessB = json['finenessB'].toString();
-	}else{
-    data.finenessB="暂无";
-  }
+	}
 	if (json['holeCountA'] != null) {
 		data.holeCountA = json['holeCountA'].toString();
-	}else{
-    data.holeCountA="暂无";
-  }
+	}
 	if (json['holeCountB'] != null) {
 		data.holeCountB = json['holeCountB'].toString();
-	}else{
-    data.holeCountB="暂无";
-  }
+	}
 	if (json['activePeriod'] != null) {
 		data.activePeriod = json['activePeriod'];
 	}
 	if (json['createdOn'] != null) {
 		data.createdOn = json['createdOn'].toString();
 	}
-  if (json['lastOnlineOn'] != null) {
-    data.lastOnlineOn = json['lastOnlineOn'].toString();
-  }else{
-    data.lastOnlineOn ="未知";
-  }
+	if (json['lastOnlineOn'] != null) {
+		data.lastOnlineOn = json['lastOnlineOn'].toString();
+	}
 	if (json['iotId'] != null) {
 		data.iotId = json['iotId'].toString();
 	}

+ 0 - 2
lib/generated/json/equipment_list_entity_helper.dart

@@ -81,8 +81,6 @@ equipmentListDataEquipmentVOSFromJson(EquipmentListDataEquipmentVOS data, Map<St
 	}
 	if (json['showName'] != null) {
 		data.showName = json['showName'].toString();
-	}else{
-		data.showName =data.name;
 	}
 	if (json['deviceKey'] != null) {
 		data.deviceKey = json['deviceKey'].toString();

+ 253 - 0
lib/generated/json/patrol_job_detail_response_entity_helper.dart

@@ -0,0 +1,253 @@
+import 'package:deus_app/model/patrol_job_detail_response_entity.dart';
+
+patrolJobDetailResponseEntityFromJson(PatrolJobDetailResponseEntity data, Map<String, dynamic> json) {
+	if (json['code'] != null) {
+		data.code = json['code'] is String
+				? int.tryParse(json['code'])
+				: json['code'].toInt();
+	}
+	if (json['data'] != null) {
+		data.data = PatrolJobDetailResponseData().fromJson(json['data']);
+	}
+	if (json['msg'] != null) {
+		data.msg = json['msg'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> patrolJobDetailResponseEntityToJson(PatrolJobDetailResponseEntity entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['code'] = entity.code;
+	data['data'] = entity.data.toJson();
+	data['msg'] = entity.msg;
+	return data;
+}
+
+patrolJobDetailResponseDataFromJson(PatrolJobDetailResponseData data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['name'] != null) {
+		data.name = json['name'].toString();
+	}
+	if (json['number'] != null) {
+		data.number = json['number'].toString();
+	}
+	if (json['planName'] != null) {
+		data.planName = json['planName'];
+	}
+	if (json['planNumber'] != null) {
+		data.planNumber = json['planNumber'];
+	}
+	if (json['termType'] != null) {
+		data.termType = json['termType'];
+	}
+	if (json['personnelId'] != null) {
+		data.personnelId = json['personnelId'] is String
+				? int.tryParse(json['personnelId'])
+				: json['personnelId'].toInt();
+	}
+	if (json['personnel'] != null) {
+		data.personnel = json['personnel'].toString();
+	}else{
+		data.personnel ='';
+	}
+	if (json['remarks'] != null) {
+		data.remarks = json['remarks'].toString();
+	}else{
+		data.remarks ='';
+	}
+	if (json['finishTime'] != null) {
+		data.finishTime = json['finishTime'].toString();
+	}else{
+		data.finishTime ='';
+	}
+	if (json['fileUrls'] != null) {
+		data.fileUrls = (json['fileUrls'] as List).map((v) => v.toString()).toList().cast<String>();
+	}else{
+		data.fileUrls =<String>[];
+	}
+	if (json['startDate'] != null) {
+		data.startDate = json['startDate'].toString();
+	}else{
+		data.startDate ='';
+	}
+	if (json['endDate'] != null) {
+		data.endDate = json['endDate'].toString();
+	}else{
+		data.endDate ='';
+	}
+	if (json['status'] != null) {
+		data.status = json['status'] is String
+				? int.tryParse(json['status'])
+				: json['status'].toInt();
+	}
+	if (json['closeReason'] != null) {
+		data.closeReason = json['closeReason'];
+	}
+	if (json['customerName'] != null) {
+		data.customerName = json['customerName'];
+	}
+	if (json['channelName'] != null) {
+		data.channelName = json['channelName'];
+	}
+	if (json['closeUser'] != null) {
+		data.closeUser = json['closeUser'];
+	}
+	if (json['closeUserName'] != null) {
+		data.closeUserName = json['closeUserName'];
+	}
+	if (json['closeTime'] != null) {
+		data.closeTime = json['closeTime'];
+	}
+	if (json['createTime'] != null) {
+		data.createTime = json['createTime'].toString();
+	}
+	if (json['creator'] != null) {
+		data.creator = json['creator'] is String
+				? int.tryParse(json['creator'])
+				: json['creator'].toInt();
+	}
+	if (json['creatorName'] != null) {
+		data.creatorName = json['creatorName'].toString();
+	}
+	if (json['patrolItemVOS'] != null) {
+		data.patrolItemVOS = (json['patrolItemVOS'] as List).map((v) => PatrolJobDetailResponseDataPatrolItemVOS().fromJson(v)).toList();
+	}
+	if (json['equipmentVOS'] != null) {
+		data.equipmentVOS = (json['equipmentVOS'] as List).map((v) => PatrolJobDetailResponseDataEquipmentVOS().fromJson(v)).toList();
+	}
+	return data;
+}
+
+Map<String, dynamic> patrolJobDetailResponseDataToJson(PatrolJobDetailResponseData entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['name'] = entity.name;
+	data['number'] = entity.number;
+	data['planName'] = entity.planName;
+	data['planNumber'] = entity.planNumber;
+	data['termType'] = entity.termType;
+	data['personnelId'] = entity.personnelId;
+	data['personnel'] = entity.personnel;
+	data['remarks'] = entity.remarks;
+	data['finishTime'] = entity.finishTime;
+	data['fileUrls'] = entity.fileUrls;
+	data['startDate'] = entity.startDate;
+	data['endDate'] = entity.endDate;
+	data['status'] = entity.status;
+	data['closeReason'] = entity.closeReason;
+	data['customerName'] = entity.customerName;
+	data['channelName'] = entity.channelName;
+	data['closeUser'] = entity.closeUser;
+	data['closeUserName'] = entity.closeUserName;
+	data['closeTime'] = entity.closeTime;
+	data['createTime'] = entity.createTime;
+	data['creator'] = entity.creator;
+	data['creatorName'] = entity.creatorName;
+	data['patrolItemVOS'] =  entity.patrolItemVOS.map((v) => v.toJson()).toList();
+	data['equipmentVOS'] =  entity.equipmentVOS.map((v) => v.toJson()).toList();
+	return data;
+}
+
+patrolJobDetailResponseDataPatrolItemVOSFromJson(PatrolJobDetailResponseDataPatrolItemVOS data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'].toString();
+	}
+	if (json['number'] != null) {
+		data.number = json['number'].toString();
+	}
+	if (json['name'] != null) {
+		data.name = json['name'].toString();
+	}
+	if (json['requirement'] != null) {
+		data.requirement = json['requirement'].toString();
+	}
+	if (json['result'] != null) {
+		data.result = json['result'].toString();
+	}
+	if (json['patrolJobId'] != null) {
+		data.patrolJobId = json['patrolJobId'] is String
+				? int.tryParse(json['patrolJobId'])
+				: json['patrolJobId'].toInt();
+	}
+	if (json['results'] != null) {
+		data.results = json['results'];
+	}
+	return data;
+}
+
+Map<String, dynamic> patrolJobDetailResponseDataPatrolItemVOSToJson(PatrolJobDetailResponseDataPatrolItemVOS entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['number'] = entity.number;
+	data['name'] = entity.name;
+	data['requirement'] = entity.requirement;
+	data['result'] = entity.result;
+	data['patrolJobId'] = entity.patrolJobId;
+	data['results'] = entity.results;
+	return data;
+}
+
+patrolJobDetailResponseDataEquipmentVOSFromJson(PatrolJobDetailResponseDataEquipmentVOS data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['equipmentId'] != null) {
+		data.equipmentId = json['equipmentId'] is String
+				? int.tryParse(json['equipmentId'])
+				: json['equipmentId'].toInt();
+	}
+	if (json['name'] != null) {
+		data.name = json['name'].toString();
+	}
+	if (json['showName'] != null) {
+		data.showName = json['showName'].toString();
+	}else{
+		data.showName = json['name'].toString();
+	}
+	if (json['deviceKey'] != null) {
+		data.deviceKey = json['deviceKey'].toString();
+	}
+	if (json['productName'] != null) {
+		data.productName = json['productName'].toString();
+	}
+	if (json['itemCompleteTime'] != null) {
+		data.itemCompleteTime = json['itemCompleteTime'].toString();
+	}else{
+		data.itemCompleteTime = "暂无";
+	}
+	if (json['itemPerson'] != null) {
+		data.itemPerson = json['itemPerson'].toString();
+	}
+	if (json['patrolJobId'] != null) {
+		data.patrolJobId = json['patrolJobId'] is String
+				? int.tryParse(json['patrolJobId'])
+				: json['patrolJobId'].toInt();
+	}
+	if (json['isComplete'] != null) {
+		data.isComplete = json['isComplete'] is String
+				? int.tryParse(json['isComplete'])
+				: json['isComplete'].toInt();
+	}
+	return data;
+}
+
+Map<String, dynamic> patrolJobDetailResponseDataEquipmentVOSToJson(PatrolJobDetailResponseDataEquipmentVOS entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['equipmentId'] = entity.equipmentId;
+	data['name'] = entity.name;
+	data['showName'] = entity.showName;
+	data['deviceKey'] = entity.deviceKey;
+	data['productName'] = entity.productName;
+	data['itemCompleteTime'] = entity.itemCompleteTime;
+	data['itemPerson'] = entity.itemPerson;
+	data['patrolJobId'] = entity.patrolJobId;
+	data['isComplete'] = entity.isComplete;
+	return data;
+}

+ 0 - 103
lib/home.dart

@@ -1,103 +0,0 @@
-import 'package:flutter/material.dart';
-
-class FMHomeVC extends StatefulWidget {
-  @override
-  FMHomeState createState() => FMHomeState();
-}
-
-class FMHomeState extends State<FMHomeVC> {
-  var funcLists = [];
-
-  @override
-  void initState() {
-    super.initState();
-
-    initData();
-  }
-
-  void initData() {
-    funcLists.add(
-        {"name": "基础组件", "desc": "在构建您的第一个Flutter应用程序之前,您绝对需要了解这些widget。"});
-    funcLists.add({
-      "name": "Material Components",
-      "desc": "实现了Material Design 指南的视觉、效果、motion-rich的widget。"
-    });
-    funcLists.add({
-      "name": "Cupertino(iOS风格的widget)",
-      "desc": "用于当前iOS设计语言的美丽和高保真widget。"
-    });
-    funcLists.add({
-      "name": "Layout",
-      "desc": "排列其它widget的columns、rows、grids和其它的layouts。"
-    });
-    funcLists.add({"name": "Text", "desc": "文本显示和样式。"});
-    funcLists.add({"name": "Assets、图片、Icons", "desc": "管理assets, 显示图片和Icon。"});
-    funcLists.add({
-      "name": "Input",
-      "desc": "Material Components 和 Cupertino中获取用户输入的widget。"
-    });
-    funcLists.add({"name": "动画和Motion", "desc": "在您的应用中使用动画。查看Flutter中的动画总览。"});
-    funcLists.add({"name": "交互模型", "desc": "响应触摸事件并将用户路由到不同的页面视图(View)。"});
-    funcLists.add({"name": "样式", "desc": "管理应用的主题,使应用能够响应式的适应屏幕尺寸或添加填充。"});
-    funcLists.add(
-        {"name": "绘制和效果", "desc": "Widget将视觉效果应用到其子组件,而不改变它们的布局、大小和位置。"});
-    funcLists.add({"name": "Async", "desc": "Flutter应用的异步模型。"});
-    funcLists.add({"name": "滚动", "desc": "滚动一个拥有多个子组件的父组件。"});
-    funcLists.add({"name": "辅助功能", "desc": "给你的App添加辅助功能(这是一个正在进行的工作)。"});
-
-    print(funcLists);
-
-    setState(() {
-
-    });
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    // TODO: implement build
-
-    return Container(
-      child: Scaffold(
-        backgroundColor: Colors.white,
-        appBar: AppBar(
-          backgroundColor: Colors.lightBlue,
-          title: Text("Widgets 目录"),
-        ),
-        body: Center(
-          child: ListView.builder(
-            padding: const EdgeInsets.all(15.0),
-            itemCount: funcLists.length,
-            itemBuilder: (context, index) {
-              var func = funcLists[index];
-              return ListTile(
-                contentPadding: const EdgeInsets.all(10.0),
-                title: Text(
-                  "${func["name"]}",
-                  style: TextStyle(
-                    fontSize: 20,
-                    color: Colors.black,
-                  ),
-                ),
-                subtitle: Text(
-                  "${func["desc"]}",
-                  style: TextStyle(
-                    fontSize: 15,
-                    color: Colors.grey,
-                  ),
-                ),
-                onTap: () {
-                  Navigator.push(
-                    context,
-                    MaterialPageRoute(builder: (context) {
-                      return FMHomeVC();
-                    }),
-                  );
-                },
-              );
-            },
-          ),
-        ),
-      ),
-    );
-  }
-}

+ 9 - 0
lib/main.dart

@@ -3,12 +3,18 @@ import 'package:deus_app/page/home/home_page.dart';
 import 'package:deus_app/page/login/login_page.dart';
 import 'package:deus_app/page/maint/maint_job_page.dart';
 import 'package:deus_app/page/patrol/patrol_job_page.dart';
+import 'package:deus_app/page/repair/repair_page.dart';
+import 'package:event_bus/event_bus.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
 
 void main() {
   runApp(const MyApp());
 }
 
+//创建EventBus对象
+final EventBus eventBus = EventBus();
+
 class MyApp extends StatelessWidget {
   const MyApp({super.key});
 
@@ -32,6 +38,7 @@ class MyApp extends StatelessWidget {
       ),
       // home: const MyHomePage(title: 'Flutter Demo Home Page'),
       home: LoginPage(),
+      builder: EasyLoading.init(),
       routes: <String, WidgetBuilder>{
         // 对应路由/NavigatorPushNamedPage
         HomePage.routeName: (BuildContext context) =>
@@ -42,6 +49,8 @@ class MyApp extends StatelessWidget {
             DeviceManagePage(),
         MaintJobPage.routeName: (BuildContext context) =>
             MaintJobPage(),
+        RepairPage.routeName: (BuildContext context) =>
+            RepairPage(),
       },
     );
   }

+ 58 - 4
lib/model/maint_job_detail_response.dart

@@ -40,7 +40,7 @@ class MaintJobDetailData {
   String? closeTime;
   List<FileUrls>? fileUrls;
   String? creator;
-  String? itemsList;
+  List<ItemsList>? itemsList;
   List<MaintEquipmentVOList>? maintEquipmentVOList;
   List<Logs>? logs;
   String? customer;
@@ -48,6 +48,7 @@ class MaintJobDetailData {
   int? prodCount;
   String? maintStaffName;
   String? finishTime;
+  List<DeviceList>? deviceList;
 
   @override
   String toString() {
@@ -77,6 +78,7 @@ class MaintJobDetailData {
         this.channel,
         this.prodCount,
         this.maintStaffName,
+        this.deviceList,
         this.finishTime});
 
   MaintJobDetailData.fromJson(Map<String, dynamic> json) {
@@ -100,13 +102,22 @@ class MaintJobDetailData {
       });
     }
     creator = json['creator'];
-    itemsList = json['itemsList'];
+    if (json['itemsList'] != null) {
+      itemsList = <ItemsList>[];
+      json['itemsList'].forEach((v) { itemsList!.add(new ItemsList.fromJson(v)); });
+    }
     if (json['maintEquipmentVOList'] != null) {
       maintEquipmentVOList = <MaintEquipmentVOList>[];
       json['maintEquipmentVOList'].forEach((v) {
         maintEquipmentVOList!.add(new MaintEquipmentVOList.fromJson(v));
       });
     }
+    if (json['deviceList'] != null) {
+      deviceList = <DeviceList>[];
+      json['deviceList'].forEach((v) {
+        deviceList!.add(new DeviceList.fromJson(v));
+      });
+    }
     if (json['logs'] != null) {
       logs = <Logs>[];
       json['logs'].forEach((v) {
@@ -139,11 +150,16 @@ class MaintJobDetailData {
       data['fileUrls'] = this.fileUrls!.map((v) => v.toJson()).toList();
     }
     data['creator'] = this.creator;
-    data['itemsList'] = this.itemsList;
+    if (this.itemsList != null) {
+      data['itemsList'] = this.itemsList!.map((v) => v.toJson()).toList();
+    }
     if (this.maintEquipmentVOList != null) {
       data['maintEquipmentVOList'] =
           this.maintEquipmentVOList!.map((v) => v.toJson()).toList();
     }
+    if (this.deviceList != null) {
+      data['deviceList'] = this.deviceList!.map((v) => v.toJson()).toList();
+    }
     if (this.logs != null) {
       data['logs'] = this.logs!.map((v) => v.toJson()).toList();
     }
@@ -258,7 +274,11 @@ class DeviceList {
   DeviceList.fromJson(Map<String, dynamic> json) {
     id = json['id'];
     name = json['name'];
-    showName = json['showName'];
+    if(json['showName']!=null){
+      showName = json['showName'];
+    }else{
+      showName = json['name'];
+    }
     deviceKey = json['deviceKey'];
     authType = json['authType'];
     isEnable = json['isEnable'];
@@ -375,4 +395,38 @@ class Logs {
     data['maintJobId'] = this.maintJobId;
     return data;
   }
+}
+
+class ItemsList {
+  int? id;
+  int? level;
+  String? name;
+  String? num;
+  String? remarks;
+  String? requirements;
+  int? status;
+
+  ItemsList({this.id, this.level, this.name, this.num, this.remarks, this.requirements, this.status});
+
+  ItemsList.fromJson(Map<String, dynamic> json) {
+    id = json['id'];
+    level = json['level'];
+    name = json['name'];
+    num = json['num'];
+    remarks = json['remarks'];
+    requirements = json['requirements'];
+    status = json['status'];
+  }
+
+  Map<String, dynamic> toJson() {
+    final Map<String, dynamic> data = new Map<String, dynamic>();
+    data['id'] = this.id;
+    data['level'] = this.level;
+    data['name'] = this.name;
+    data['num'] = this.num;
+    data['remarks'] = this.remarks;
+    data['requirements'] = this.requirements;
+    data['status'] = this.status;
+    return data;
+  }
 }

+ 8 - 8
lib/model/maint_pesonse_entity.dart

@@ -100,15 +100,15 @@ class MaintJobVO {
   String? startTime;
   String? endTime;
   int? cycleType;
-  Null? planRemarks;
-  Null? closeReason;
-  Null? closePerson;
-  Null? closeTime;
-  Null? fileUrls;
+  String? planRemarks;
+  String? closeReason;
+  String? closePerson;
+  String? closeTime;
+  String? fileUrls;
   String? creator;
-  Null? itemsList;
-  Null? maintEquipmentVOList;
-  Null? logs;
+  String? itemsList;
+  String? maintEquipmentVOList;
+  String? logs;
   String? customer;
   String? channel;
   int? prodCount;

+ 58 - 0
lib/model/patrol_job_detail_response_entity.dart

@@ -0,0 +1,58 @@
+import 'package:deus_app/generated/json/base/json_convert_content.dart';
+
+class PatrolJobDetailResponseEntity with JsonConvert<PatrolJobDetailResponseEntity> {
+	late int code;
+	late PatrolJobDetailResponseData data;
+	late String msg;
+}
+
+class PatrolJobDetailResponseData with JsonConvert<PatrolJobDetailResponseData> {
+	late int id;
+	late String name='';
+	late String number;
+	late String planName;
+	late String planNumber;
+	late dynamic termType;
+	late int personnelId;
+	late String personnel;
+	late String remarks='';
+	late String finishTime='';
+	late List<String> fileUrls;
+	late String startDate;
+	late String endDate;
+	late int status;
+	late dynamic closeReason;
+	late dynamic customerName;
+	late dynamic channelName;
+	late dynamic closeUser;
+	late dynamic closeUserName;
+	late dynamic closeTime;
+	late String createTime;
+	late int creator;
+	late String creatorName;
+	late List<PatrolJobDetailResponseDataPatrolItemVOS> patrolItemVOS;
+	late List<PatrolJobDetailResponseDataEquipmentVOS> equipmentVOS;
+}
+
+class PatrolJobDetailResponseDataPatrolItemVOS with JsonConvert<PatrolJobDetailResponseDataPatrolItemVOS> {
+	late String id;
+	late String number;
+	late String name;
+	late String requirement;
+	late String result;
+	late int patrolJobId;
+	late dynamic results;
+}
+
+class PatrolJobDetailResponseDataEquipmentVOS with JsonConvert<PatrolJobDetailResponseDataEquipmentVOS> {
+	late int id;
+	late int equipmentId;
+	late String name;
+	late String showName;
+	late String deviceKey;
+	late String productName;
+	late String itemCompleteTime;
+	late String itemPerson;
+	late int patrolJobId;
+	late int isComplete;
+}

+ 1 - 0
lib/page/device/device_manage_detail_page.dart

@@ -4,6 +4,7 @@ import 'package:deus_app/common/utils/DioUtil.dart';
 import 'package:deus_app/common/utils/LoadingDialogHelper.dart';
 import 'package:deus_app/common/utils/ToastUtils.dart';
 import 'package:deus_app/generated/json/equipment_info_entity_helper.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/equipment_info_entity.dart';
 import 'package:deus_app/page/device/device_manage_update_page.dart';
 import 'package:flutter/material.dart';

+ 0 - 2
lib/page/device/device_manage_page.dart

@@ -269,8 +269,6 @@ class _DeviceManage extends State<DeviceManagePage> {
     }
   }
 
-
-
   equipmentInfo(int id) async{
     var result = await DioUtil().request("equipment/equipmentInfo",method: DioMethod.get,params: {'id':id});
     EquipmentInfoEntity entity=equipmentInfoEntityFromJson(EquipmentInfoEntity(), result);

+ 2 - 3
lib/page/device/device_manage_update_page.dart

@@ -3,9 +3,9 @@ import 'package:deus_app/common/style/gsy_style.dart';
 import 'package:deus_app/common/utils/ConstantString.dart';
 import 'package:deus_app/common/utils/DioUtil.dart';
 import 'package:deus_app/common/utils/ToastUtils.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/equipment_info_entity.dart';
 import 'package:deus_app/widget/gsy_flex_button.dart';
-import 'package:event_bus/event_bus.dart';
 import 'package:flutter/material.dart';
 
 class DeviceManageUpdatePage extends StatefulWidget {
@@ -21,8 +21,7 @@ class DeviceManageUpdatePage extends StatefulWidget {
   }
 }
 
-//创建EventBus对象
-final EventBus eventBus = EventBus();
+
 
 class _DeviceManageUpdatePage extends State<DeviceManageUpdatePage>{
 

+ 9 - 1
lib/page/home/home_page.dart

@@ -5,6 +5,7 @@ import 'package:deus_app/common/utils/ToastUtils.dart';
 import 'package:deus_app/generated/json/personal_data_count_entity_helper.dart';
 import 'package:deus_app/model/personal_data_count_entity.dart';
 import 'package:deus_app/page/patrol/patrol_job_page.dart';
+import 'package:deus_app/page/repair/repair_page.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 
@@ -20,6 +21,8 @@ class HomePage extends StatefulWidget {
   _MineViewPageState createState() => _MineViewPageState();
 }
 
+
+
 class _MineViewPageState extends State<HomePage> {
   List items = [
     {"name": "今日维保任务", "num": 0},
@@ -41,7 +44,11 @@ class _MineViewPageState extends State<HomePage> {
       "image": "images/patrol_inspect.png",
       'jump': PatrolJobPage.routeName
     },
-    {"name": "保修管理", "image": "images/maintenance_manage.png", 'jump': ''},
+    {
+      "name": "报修管理",
+      "image": "images/maintenance_manage.png",
+      'jump': RepairPage.routeName
+    },
   ];
 
   int alarmCount = 0;
@@ -57,6 +64,7 @@ class _MineViewPageState extends State<HomePage> {
         await DioUtil().request("personalData/count", method: DioMethod.post);
     PersonalDataCountEntity entity =
         personalDataCountEntityFromJson(PersonalDataCountEntity(), result);
+
     if (entity.code == 0) {
       setState(() {
         items.clear();

+ 5 - 4
lib/page/login/login_page.dart

@@ -9,9 +9,9 @@ import 'package:deus_app/model/user_response_entity.dart';
 import 'package:deus_app/page/home/home_page.dart';
 import 'package:deus_app/widget/gsy_flex_button.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
 
 import '../../common/utils/ConstantString.dart';
-import '../../common/utils/LoadingDialogHelper.dart';
 import '../../generated/json/login_response_entity_helper.dart';
 
 // import 'package:deus_app/common/utils/common_utils.dart';
@@ -191,7 +191,8 @@ class _LoginPageState extends State<LoginPage> {
     if (!CommonUtils.validationInput(_username)) {
       showToast(ConstantString.loginNull);
     } else {
-      LoadingDialogHelper.showLoading(context);
+      // LoadingDialogHelper.showLoading(context);
+      // EasyLoading.show(status: 'loading...');
       var result = await DioUtil().request('auth/login',
           method: DioMethod.post,
           data: {'username': _username, 'password': _password});
@@ -202,7 +203,7 @@ class _LoginPageState extends State<LoginPage> {
         debugPrint(loginResponseEntity.data.token);
         getInfo();
       } else {
-        LoadingDialogHelper.dismissLoading(context);
+        EasyLoading.dismiss();
         showToast(loginResponseEntity.msg);
       }
     }
@@ -210,7 +211,7 @@ class _LoginPageState extends State<LoginPage> {
   getInfo() async{
     var result = await DioUtil().request('user/current-user',
         method: DioMethod.post);
-    LoadingDialogHelper.dismissLoading(context);
+    // LoadingDialogHelper.dismissLoading(context);
     UserResponseEntity entity=userResponseEntityFromJson(UserResponseEntity(), result);
     if(entity.code==0){
       StoreHelper.putStorage(ConstantString.name, entity.data.name);

+ 21 - 44
lib/page/maint/maint_job_detail.dart

@@ -74,7 +74,8 @@ List<String> sexSelects = ['男', '女', '奥特曼'];
 DropMenuItem sexSelect = DropMenuItem('男', 1);
 
 MaintJobDetailData maintJobDetail = MaintJobDetailData();
-List<MaintEquipmentVOList> maintEquipmentVOList = <MaintEquipmentVOList>[];
+List<DeviceList> deviceList = <DeviceList>[];
+List<ItemsList> itemList=<ItemsList>[];
 
 class _MaintJobDetail extends State<MaintJobDetail> {
 
@@ -82,23 +83,23 @@ class _MaintJobDetail extends State<MaintJobDetail> {
   _MaintJobDetail(this.id);
 
   _load() async {
-    var result = await DioUtil().request('maintJob/detail',
+    var result = await DioUtil().request('maintJob/app-detail',
         method: DioMethod.post, params: {'id':id});
-
     MaintJobDetailResponse maintJobDetailResponse = MaintJobDetailResponse.fromJson(result);
-    maintJobDetail = maintJobDetailResponse.data!;
-
+    setState(() {
+      maintJobDetail = maintJobDetailResponse.data!;
+      deviceList.clear();
+      deviceList.addAll(maintJobDetail.deviceList!);
+      itemList.clear();
+      itemList.addAll(maintJobDetail.itemsList!);
+    });
   }
 
   @override
   void initState() {
     // TODO: implement initState
     super.initState();
-    Future.delayed(
-        Duration.zero,
-            () => setState(() {
-          _load();
-        }));
+    _load();
   }
 
 
@@ -409,11 +410,11 @@ class _MaintJobDetail extends State<MaintJobDetail> {
               '维保设备',
               style: GSYConstant.normalTextActionWhiteBold,
             )),
-        children: device_list.map((e) => _buildDevice(e)).toList(),
+        children: deviceList.map((e) => _buildDevice(e)).toList(),
         initiallyExpanded: true);
   }
 
-  Widget _buildDevice(PatrolJobDeviceData device) {
+  Widget _buildDevice(DeviceList device) {
     return FractionallySizedBox(
         widthFactor: 1,
         child: Container(
@@ -425,11 +426,6 @@ class _MaintJobDetail extends State<MaintJobDetail> {
           child: Column(
             children: [
               Container(
-                // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 0.0),
-                alignment: Alignment.centerLeft,
-                child: Text(device.showName, style: GSYConstant.smallTextBold),
-              ),
-              Container(
                 margin: const EdgeInsets.only(top: 10),
                 // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 0.0),
                 child: Row(
@@ -437,32 +433,12 @@ class _MaintJobDetail extends State<MaintJobDetail> {
                     children: [
                       new Text(
                         '设备名称:',
-                        style: GSYConstant.smallTextLight,
-                      ),
-                      Container(
-                        child: Text(
-                          device.name,
-                          style: GSYConstant.smallTextLight,
-                          textAlign: TextAlign.right,
-                        ),
-                      ),
-                    ]),
-              ),
-              Container(
-                margin: const EdgeInsets.only(top: 10),
-                // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 0.0),
-                // alignment: Alignment.centerLeft,
-                child: Row(
-                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                    children: [
-                      new Text(
-                        'deviceKey:',
-                        style: GSYConstant.smallTextLight,
+                        style: GSYConstant.smallTextBold,
                       ),
                       Container(
                         child: Text(
-                          device.deviceKey,
-                          style: GSYConstant.smallTextLight,
+                          device.showName!,
+                          style: GSYConstant.smallTextBold,
                           textAlign: TextAlign.right,
                         ),
                       ),
@@ -481,7 +457,8 @@ class _MaintJobDetail extends State<MaintJobDetail> {
                       ),
                       Container(
                         child: Text(
-                          device.itemCompleteTime,
+                          "",
+                          // device.itemCompleteTime,
                           style: GSYConstant.smallTextLight,
                           textAlign: TextAlign.right,
                         ),
@@ -506,11 +483,11 @@ class _MaintJobDetail extends State<MaintJobDetail> {
               '维保项目',
               style: GSYConstant.normalTextActionWhiteBold,
             )),
-        children: item_list.map((e) => _buildItem(e)).toList(),
+        children: itemList.map((e) => _buildItem(e)).toList(),
         initiallyExpanded: true);
   }
 
-  Widget _buildItem(PatrolJobItemData item) {
+  Widget _buildItem(ItemsList item) {
     return FractionallySizedBox(
         widthFactor: 1,
         child: Container(
@@ -523,7 +500,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
             children: [
               Container(
                 alignment: Alignment.centerLeft,
-                child: Text(item.name,
+                child: Text(item.name!,
                     style: TextStyle(
                         fontSize: GSYConstant.middleTextWhiteSize,
                         fontWeight: FontWeight.bold)),

+ 127 - 56
lib/page/maint/maint_job_page.dart

@@ -2,16 +2,15 @@
 import 'package:deus_app/common/style/TitleBar.dart';
 import 'package:deus_app/model/maint_pesonse_entity.dart';
 import 'package:deus_app/page/maint/maint_job_detail.dart';
-import 'package:deus_app/page/patrol/patrol_job_detail.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+
 import '../../common/style/gsy_style.dart';
 import '../../common/utils/ConstantString.dart';
 import '../../common/utils/DioUtil.dart';
-import '../../common/utils/ToastUtils.dart';
-import '../../model/patrol_response_entity.dart';
 import '../../widget/MaintJobDrawer.dart';
 
-
 class MaintJobPage extends StatefulWidget {
   const MaintJobPage({super.key});
 
@@ -23,31 +22,70 @@ class MaintJobPage extends StatefulWidget {
   }
 }
 
-List<MaintJobVO> maint_job_list = [];
+List<MaintJobVO> maint_job_list = <MaintJobVO>[];
+
+int index = 1;
+
 class _MaintJobPage extends State<MaintJobPage> {
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
+  final RefreshController _refreshController =
+      RefreshController(initialRefresh: false);
 
-  _load() async {
-    var result = await DioUtil().request('maintJob/list',
-        method: DioMethod.post, data: {'query': {}, 'index': 1, 'size': 5});
+  MaintJobList maintJobList = MaintJobList();
 
+  String _device = '', _num = '';
+  dynamic _stase;
 
-    MaintJobResponse maintJobResponse= MaintJobResponse.fromJson(result);
+  _load() async {
+    var result = await DioUtil().request('maintJob/list',
+        method: DioMethod.post,
+        data: {'query': {'jobName':_device,'jobNum':_num,'status':_stase}, 'index': index, 'size': 20});
+    _refreshController.loadComplete();
+    _refreshController.refreshCompleted();
+    MaintJobResponse maintJobResponse = MaintJobResponse.fromJson(result);
+    maintJobList = maintJobResponse.data!;
+    setState(() {
+      if(index==1){
+        maint_job_list.clear();
+      }
+      maint_job_list.addAll(maintJobList.list!);
+    });
+  }
 
-    MaintJobList maintJobList = maintJobResponse.data!;
+  void _onRefresh() async {
+    // monitor network fetch
+    // await Future.delayed(Duration(milliseconds: 1000));
+    // if failed,use refreshFailed()
+    if (mounted) {
+      setState(() {
+        index = 0;
+        _load();
+      });
+    }
+  }
 
-    maint_job_list = maintJobList.list!;
+  void _onLoading() async {
+    // monitor network fetch
+    // await Future.delayed(Duration(milliseconds: 1000));
+    // if failed,use loadFailed(),if no data return,use LoadNodata()
+    // items.add((items.length+1).toString());
+    if (mounted) {
+      setState(() {
+        if (maintJobList.total! > maint_job_list.length) {
+          index++;
+          _load();
+        } else {
+          _refreshController.loadNoData();
+        }
+      });
+    }
   }
 
   @override
   void initState() {
     // TODO: implement initState
     super.initState();
-    Future.delayed(
-        Duration.zero,
-            () => setState(() {
-          _load();
-        }));
+    _load();
   }
 
   @override
@@ -58,20 +96,24 @@ class _MaintJobPage extends State<MaintJobPage> {
           _scaffoldKey.currentState?.openEndDrawer();
         }),
         endDrawer: MaintJobDrawer(
-          callback: (index, str) {
-            showToast(str);
+          callback: (String device, String num, dynamic stase) {
+            _device = device;
+            _num = num;
+            _stase = stase;
+            index = 0;
+            _load();
           },
         ),
         //抽屉
         backgroundColor: const Color(0xfff2f2f2),
         body: Column(
           children: [
-            SizedBox(
+            const SizedBox(
               height: 10,
             ),
             Row(
               mainAxisAlignment: MainAxisAlignment.start,
-              children: [
+              children: const [
                 SizedBox(
                   width: 15,
                 ),
@@ -81,13 +123,43 @@ class _MaintJobPage extends State<MaintJobPage> {
             ),
             Expanded(
                 child: Container(
-                    child: ListView.builder(
-                      itemCount: maint_job_list.length,
-                      itemBuilder: (context, index) {
-                        MaintJobVO maintJobVO = maint_job_list[index];
-                        return _maint_job_list(maintJobVO);
-                      },
-                    )))
+                    child: SmartRefresher(
+              enablePullDown: true,
+              enablePullUp: true,
+              header: WaterDropHeader(),
+              footer: CustomFooter(
+                builder: (BuildContext context, LoadStatus? mode) {
+                  Widget body;
+                  if (mode == LoadStatus.idle) {
+                    body = Text("上拉加载");
+                  } else if (mode == LoadStatus.loading) {
+                    body = CupertinoActivityIndicator();
+                  } else if (mode == LoadStatus.failed) {
+                    body = Text("加载失败!点击重试!");
+                  } else if (mode == LoadStatus.canLoading) {
+                    body = Text("松手,加载更多!");
+                  } else {
+                    body = Text("没有更多数据了!");
+                  }
+                  return Container(
+                    height: 55.0,
+                    child: Center(child: body),
+                  );
+                },
+              ),
+              controller: _refreshController,
+              onRefresh: _onRefresh,
+              onLoading: _onLoading,
+              // child:Expanded(
+              //     child: Container(
+              child: ListView.builder(
+                itemCount: maint_job_list.length,
+                itemBuilder: (context, index) {
+                  MaintJobVO maintJobVO = maint_job_list[index];
+                  return _maint_job_list(maintJobVO);
+                },
+              ),
+            )))
           ],
         ));
   }
@@ -113,42 +185,40 @@ class _MaintJobPage extends State<MaintJobPage> {
                 ),
                 Container(
                   padding:
-                  EdgeInsets.only(top: 3, bottom: 3, left: 5, right: 5),
+                      EdgeInsets.only(top: 3, bottom: 3, left: 5, right: 5),
                   child: Text(
-                    maintJobVO.status == 2
+                    maintJobVO.status == 0
                         ? '已关闭'
-                        : maintJobVO.status == 3
-                        ? '执行中'
-                        : maintJobVO.status == 5
-                        ? '已完成'
                         : maintJobVO.status == 1
-                        ? '待执行'
-                        : maintJobVO.status == 4
-                        ? '已逾期'
-                        : '未知',
+                            ? '执行中'
+                            : maintJobVO.status == 2
+                                ? '已完成'
+                                : maintJobVO.status == 3
+                                    ? '待执行'
+                                    : maintJobVO.status == 4
+                                        ? '已逾期'
+                                        : '未知',
                     textAlign: TextAlign.right,
                     style: TextStyle(
-                      color:
-                      maintJobVO.status == 0 || maintJobVO.status == 4
+                      color: maintJobVO.status == 0 || maintJobVO.status == 4
                           ? Colors.red
                           : maintJobVO.status == 3
-                          ? Colors.orange
-                          : maintJobVO.status == 2
-                          ? Colors.green
-                          : Colors.black, //边框颜色
+                              ? Colors.orange
+                              : maintJobVO.status == 2
+                                  ? Colors.blue
+                                  : Colors.black, //边框颜色
                       fontSize: GSYConstant.minTextSize,
                     ),
                   ),
                   decoration: BoxDecoration(
                     border: new Border.all(
-                      color:
-                      maintJobVO.status == 0 || maintJobVO.status == 4
+                      color: maintJobVO.status == 0 || maintJobVO.status == 4
                           ? Colors.red
                           : maintJobVO.status == 3
-                          ? Colors.orange
-                          : maintJobVO.status == 2
-                          ? Colors.green
-                          : Colors.black, //边框颜色
+                              ? Colors.orange
+                              : maintJobVO.status == 2
+                                  ? Colors.blue
+                                  : Colors.black, //边框颜色
                       width: 1.0, //边框粗细
                     ),
                     borderRadius: const BorderRadius.all(
@@ -165,7 +235,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     '任务编号:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -175,7 +245,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -189,7 +259,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     '任务开始时间:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -199,7 +269,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -213,7 +283,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     '任务结束时间:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -223,7 +293,7 @@ class _MaintJobPage extends State<MaintJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -237,7 +307,8 @@ class _MaintJobPage extends State<MaintJobPage> {
             Navigator.push(
                 context,
                 MaterialPageRoute(
-                    builder: (context) => new MaintJobDetail(id:maintJobVO.id)));
+                    builder: (context) =>
+                        new MaintJobDetail(id: maintJobVO.id)));
           },
         ));
   }

Файловите разлики са ограничени, защото са твърде много
+ 176 - 173
lib/page/patrol/patrol_job_detail.dart


+ 151 - 0
lib/page/patrol/patrol_job_list.dart

@@ -0,0 +1,151 @@
+import 'package:deus_app/common/style/TitleBar.dart';
+import 'package:deus_app/common/style/gsy_style.dart';
+import 'package:deus_app/common/utils/ConstantString.dart';
+import 'package:deus_app/common/utils/DioUtil.dart';
+import 'package:deus_app/common/utils/ToastUtils.dart';
+import 'package:deus_app/model/patrol_job_detail_response_entity.dart';
+import 'package:flutter/material.dart';
+
+class PatrolJobList extends StatefulWidget {
+  final PatrolJobDetailResponseData responseData;
+
+  const PatrolJobList({super.key, required this.responseData});
+
+  @override
+  State createState() {
+    return _PatrolJobList(responseData);
+  }
+}
+
+class _PatrolJobList extends State<PatrolJobList> {
+  PatrolJobDetailResponseData responseData;
+
+  _PatrolJobList(this.responseData);
+
+  @override
+  Widget build(BuildContext context) {
+    // TODO: implement build
+    return Scaffold(
+        appBar: TitleBar().backAppbar(context, "巡检设备详情"),
+        backgroundColor: const Color(0xfff2f2f2),
+        body: Column(
+          children: [
+            SizedBox(
+              height: 10,
+            ),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.start,
+              children: [
+                SizedBox(
+                  width: 15,
+                ),
+                Text(ConstantString.patrolJobTitle,
+                    style: GSYConstant.smallActionLightText),
+              ],
+            ),
+            Expanded(child: Container(
+                margin: EdgeInsets.only(bottom: 60),
+                child: ListView.builder(
+                  itemCount: responseData.equipmentVOS.length,
+                  itemBuilder: (context, index) {
+                    return Container(
+                        margin: EdgeInsets.only(top: 12, left: 10, right: 10),
+                        padding: EdgeInsets.only(top: 12, bottom: 10),
+                        color: Colors.white,
+                        child: ListTile(
+                          title: Column(
+                            children: [
+                              Container(
+                                // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 0.0),
+                                alignment: Alignment.centerLeft,
+                                child: Row(
+                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                    children: [
+                                      Text(responseData.equipmentVOS[index].showName,
+                                          style: GSYConstant.smallTextBold),
+                                      Text(
+                                        responseData
+                                            .equipmentVOS[index].isComplete==0?'未完成':'已完成',
+                                        style: TextStyle(
+                                            fontSize: GSYConstant.smallTextSize,
+                                            color: responseData.equipmentVOS[index].isComplete==0?Colors.red:Colors.blue),
+                                      ),
+                                    ]),
+                              ),
+                              Container(
+                                margin: const EdgeInsets.only(top: 10),
+                                // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 10.0),
+                                // alignment: Alignment.centerLeft,
+                                child: Row(
+                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                    children: [
+                                      new Text(
+                                        '完成时间:',
+                                        style: GSYConstant.smallTextLight,
+                                      ),
+                                      Container(
+                                        child: Text(
+                                          responseData.equipmentVOS[index].itemCompleteTime,
+                                          style: GSYConstant.smallTextLight,
+                                          textAlign: TextAlign.right,
+                                        ),
+                                      ),
+                                    ]),
+                              ),
+                              SizedBox(
+                                height: 5,
+                              ),
+                            ],
+                          ),
+                          onTap: () {
+                            completeEquipment(index);
+                          },
+                        ));
+                  },
+                )
+            )),
+            Positioned(
+              left: 0,
+              right: 0,
+              bottom:0,
+              // flex: 7,
+              child:SizedBox(
+              height: 50,
+              width: double.infinity,
+              child: TextButton(
+                onPressed: () {
+
+                },
+                style: ButtonStyle(
+                  backgroundColor: MaterialStateProperty.all<Color>(
+                      Color(0xFF4875EC)),
+                  shape: MaterialStateProperty.all(
+                      BeveledRectangleBorder(
+                          borderRadius: BorderRadius.circular(0))),
+                  foregroundColor:
+                  MaterialStateProperty.all<Color>(Colors.white),
+                  // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                ),
+                child: const Text(ConstantString.next),
+              ),
+            ),
+            )
+          ],
+        ));
+  }
+
+  completeEquipment(int index) async {
+    if (responseData.equipmentVOS[index].isComplete == 0) {
+      var result = await DioUtil().request("patrolJob/completeEquipment",
+          method: DioMethod.post,
+          data: {'id': responseData.equipmentVOS[index].id});
+      if (result['code'] == 0) {
+        setState(() {
+          responseData.equipmentVOS[index].isComplete = 1;
+        });
+      } else {
+        showToast(result['msg']);
+      }
+    }
+  }
+}

+ 115 - 25
lib/page/patrol/patrol_job_page.dart

@@ -1,7 +1,12 @@
 //巡检任务列表
+import 'package:deus_app/common/event/RefreshPatrol.dart';
 import 'package:deus_app/common/style/TitleBar.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/page/patrol/patrol_job_detail.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+
 import '../../common/style/gsy_style.dart';
 import '../../common/utils/ConstantString.dart';
 import '../../common/utils/DioUtil.dart';
@@ -20,20 +25,34 @@ class PatrolJobPage extends StatefulWidget {
   }
 }
 
-List<PatrolJobData> patrol_job_list = [];
+List<PatrolJobData> patrol_job_list = <PatrolJobData>[];
 
 PatrolJobData query = PatrolJobData();
 
 class _PatrolJobPage extends State<PatrolJobPage> {
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
+  final RefreshController _refreshController =
+  RefreshController(initialRefresh: false);
+  int index = 1;
+  PatrolJobResponse patrolJobResponse=PatrolJobResponse();
+  var _event;
 
   _load() async {
     var result = await DioUtil().request('patrolJob/appPatrolJobList',
-        method: DioMethod.post, data: {'query': query, 'index': 1, 'size': 5});
-
-    PatrolJobResponse patrolJobResponse = PatrolJobResponse.fromJson(result);
-    print(patrolJobResponse);
-    patrol_job_list = patrolJobResponse.data!.patrolJobVOS!;
+        method: DioMethod.post, data: {'query': query, 'index': 1, 'size': 20});
+    _refreshController.loadComplete();
+    _refreshController.refreshCompleted();
+    patrolJobResponse = PatrolJobResponse.fromJson(result);
+    if(patrolJobResponse.code==0){
+      setState(() {
+        if(index==0){
+          patrol_job_list.clear();
+        }
+        patrol_job_list.addAll(patrolJobResponse.data!.patrolJobVOS!);
+      });
+    }else{
+      showToast(patrolJobResponse.msg!);
+    }
     //var patrolJobResponse = PatrolJobResponse.fromJson(result);
     //print(patrolJobResponse);
   }
@@ -42,11 +61,13 @@ class _PatrolJobPage extends State<PatrolJobPage> {
   void initState() {
     // TODO: implement initState
     super.initState();
-    Future.delayed(
-        Duration.zero,
-        () => setState(() {
-              _load();
-            }));
+    _load();
+    _event = eventBus.on<RefreshPatrol>().listen((event) {
+      setState(() {
+        index=0;
+        _load();
+      });
+    });
   }
 
   @override
@@ -56,11 +77,15 @@ class _PatrolJobPage extends State<PatrolJobPage> {
         appBar: TitleBar().drawAppBar(ConstantString.patrolJobText, () {
           _scaffoldKey.currentState?.openEndDrawer();
         }),
-        endDrawer: PatrolJobDrawer(
-          callback: (index, str) {
-            showToast(str);
-          },
-        ),
+        endDrawer: PatrolJobDrawer(callback: (String deviceName, String deviceNo,dynamic stase,dynamic termType){
+          setState(() {
+            query.name=deviceName;
+            query.number=deviceNo;
+            query.status=stase;
+            query.termType=termType;
+            _load();
+          });
+        }),
         //抽屉
         backgroundColor: const Color(0xfff2f2f2),
         body: Column(
@@ -80,12 +105,40 @@ class _PatrolJobPage extends State<PatrolJobPage> {
             ),
             Expanded(
                 child: Container(
+                    child: SmartRefresher(
+                        enablePullDown: true,
+                        enablePullUp: true,
+                        header: WaterDropHeader(),
+                        footer: CustomFooter(
+                          builder: (BuildContext context, LoadStatus? mode) {
+                            Widget body;
+                            if (mode == LoadStatus.idle) {
+                              body = Text("上拉加载");
+                            } else if (mode == LoadStatus.loading) {
+                              body = CupertinoActivityIndicator();
+                            } else if (mode == LoadStatus.failed) {
+                              body = Text("加载失败!点击重试!");
+                            } else if (mode == LoadStatus.canLoading) {
+                              body = Text("松手,加载更多!");
+                            } else {
+                              body = Text("没有更多数据了!");
+                            }
+                            return Container(
+                              height: 55.0,
+                              child: Center(child: body),
+                            );
+                          },
+                        ),
+                        controller: _refreshController,
+                        onRefresh: _onRefresh,
+                        onLoading: _onLoading,
                     child: ListView.builder(
               itemCount: patrol_job_list.length,
               itemBuilder: (context, index) {
                 PatrolJobData patrolJobData = patrol_job_list[index];
                 return _patrol_job_list(patrolJobData);
               },
+                    ),
             )))
           ],
         ));
@@ -133,7 +186,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                               : patrolJobData.status == 1
                                   ? Colors.orange
                                   : patrolJobData.status == 2
-                                      ? Colors.green
+                                      ? Colors.blue
                                       : Colors.black, //边框颜色
                       fontSize: GSYConstant.minTextSize,
                     ),
@@ -146,7 +199,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                               : patrolJobData.status == 1
                                   ? Colors.orange
                                   : patrolJobData.status == 2
-                                      ? Colors.green
+                                      ? Colors.blue
                                       : Colors.black, //边框颜色
                       width: 1.0, //边框粗细
                     ),
@@ -164,7 +217,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     '任务编号:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -174,7 +227,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -188,7 +241,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     '任务开始时间:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -198,7 +251,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -212,7 +265,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     '任务结束时间:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -222,7 +275,7 @@ class _PatrolJobPage extends State<PatrolJobPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -236,8 +289,45 @@ class _PatrolJobPage extends State<PatrolJobPage> {
             Navigator.push(
                 context,
                 MaterialPageRoute(
-                    builder: (context) => new PatrolJobDetail(id:patrolJobData.id)));
+                    builder: (context) =>
+                        new PatrolJobDetail(id: patrolJobData.id)));
           },
         ));
   }
+
+  void _onRefresh() async {
+    // monitor network fetch
+    // await Future.delayed(Duration(milliseconds: 1000));
+    // if failed,use refreshFailed()
+    if (mounted) {
+      setState(() {
+        index = 0;
+        _load();
+      });
+    }
+  }
+
+  void _onLoading() async {
+    // monitor network fetch
+    // await Future.delayed(Duration(milliseconds: 1000));
+    // if failed,use loadFailed(),if no data return,use LoadNodata()
+    // items.add((items.length+1).toString());
+    if (mounted) {
+      setState(() {
+        if (patrolJobResponse.data!.total! > patrol_job_list.length) {
+          index++;
+          _load();
+        } else {
+          _refreshController.loadNoData();
+        }
+      });
+    }
+  }
+
+  @override
+  void dispose() {
+    // TODO: implement dispose
+    super.dispose();
+    _event.cancel();
+  }
 }

+ 58 - 56
lib/page/repair/repair_page.dart

@@ -2,12 +2,12 @@
 import 'package:deus_app/common/style/TitleBar.dart';
 import 'package:deus_app/page/patrol/patrol_job_detail.dart';
 import 'package:flutter/material.dart';
+
 import '../../common/style/gsy_style.dart';
 import '../../common/utils/ConstantString.dart';
 import '../../common/utils/DioUtil.dart';
 import '../../common/utils/ToastUtils.dart';
 import '../../model/patrol_response_entity.dart';
-import '../../widget/PatrolJobDrawer.dart';
 
 class RepairPage extends StatefulWidget {
   const RepairPage({super.key});
@@ -20,19 +20,23 @@ class RepairPage extends StatefulWidget {
   }
 }
 
-List<PatrolJobData> patrol_job_list = [];
-
+List<PatrolJobData> patrol_job_list = <PatrolJobData>[];
 
 class _RepairPage extends State<RepairPage> {
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
   _load() async {
     var result = await DioUtil().request('patrolJob/appPatrolJobList',
-        method: DioMethod.post, data: {'query': {}, 'index': 1, 'size': 5});
-
+        method: DioMethod.post, data: {'query': {}, 'index': 1, 'size': 20});
     PatrolJobResponse patrolJobResponse = PatrolJobResponse.fromJson(result);
-    print(patrolJobResponse);
-    patrol_job_list = patrolJobResponse.data!.patrolJobVOS!;
+    if (patrolJobResponse.code == 0) {
+      setState(() {
+        patrol_job_list.clear();
+        patrol_job_list.addAll(patrolJobResponse.data!.patrolJobVOS!);
+      });
+    } else {
+      showToast(patrolJobResponse.msg!);
+    }
     //var patrolJobResponse = PatrolJobResponse.fromJson(result);
     //print(patrolJobResponse);
   }
@@ -41,11 +45,7 @@ class _RepairPage extends State<RepairPage> {
   void initState() {
     // TODO: implement initState
     super.initState();
-    Future.delayed(
-        Duration.zero,
-            () => setState(() {
-          _load();
-        }));
+    _load();
   }
 
   @override
@@ -55,11 +55,11 @@ class _RepairPage extends State<RepairPage> {
         appBar: TitleBar().drawAppBar(ConstantString.patrolJobText, () {
           _scaffoldKey.currentState?.openEndDrawer();
         }),
-        endDrawer: PatrolJobDrawer(
-          callback: (index, str) {
-            showToast(str);
-          },
-        ),
+        // endDrawer: PatrolJobDrawer(
+        //   callback: (index, str) {
+        //     showToast(str);
+        //   },
+        // ),
         //抽屉
         backgroundColor: const Color(0xfff2f2f2),
         body: Column(
@@ -67,12 +67,12 @@ class _RepairPage extends State<RepairPage> {
             Expanded(
                 child: Container(
                     child: ListView.builder(
-                      itemCount: patrol_job_list.length,
-                      itemBuilder: (context, index) {
-                        PatrolJobData patrolJobData = patrol_job_list[index];
-                        return _patrol_job_list(patrolJobData);
-                      },
-                    )))
+              itemCount: patrol_job_list.length,
+              itemBuilder: (context, index) {
+                PatrolJobData patrolJobData = patrol_job_list[index];
+                return _patrol_job_list(patrolJobData);
+              },
+            )))
           ],
         ));
   }
@@ -98,42 +98,42 @@ class _RepairPage extends State<RepairPage> {
                 ),
                 Container(
                   padding:
-                  EdgeInsets.only(top: 3, bottom: 3, left: 5, right: 5),
+                      EdgeInsets.only(top: 3, bottom: 3, left: 5, right: 5),
                   child: Text(
                     patrolJobData.status == 0
                         ? '已关闭'
                         : patrolJobData.status == 1
-                        ? '执行中'
-                        : patrolJobData.status == 2
-                        ? '已完成'
-                        : patrolJobData.status == 3
-                        ? '待执行'
-                        : patrolJobData.status == 4
-                        ? '已逾期'
-                        : '未知',
+                            ? '执行中'
+                            : patrolJobData.status == 2
+                                ? '已完成'
+                                : patrolJobData.status == 3
+                                    ? '待执行'
+                                    : patrolJobData.status == 4
+                                        ? '已逾期'
+                                        : '未知',
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color:
-                      patrolJobData.status == 0 || patrolJobData.status == 4
-                          ? Colors.red
-                          : patrolJobData.status == 1
-                          ? Colors.orange
-                          : patrolJobData.status == 2
-                          ? Colors.green
-                          : Colors.black, //边框颜色
+                          patrolJobData.status == 0 || patrolJobData.status == 4
+                              ? Colors.red
+                              : patrolJobData.status == 1
+                                  ? Colors.orange
+                                  : patrolJobData.status == 2
+                                      ? Colors.green
+                                      : Colors.black, //边框颜色
                       fontSize: GSYConstant.minTextSize,
                     ),
                   ),
                   decoration: BoxDecoration(
                     border: new Border.all(
                       color:
-                      patrolJobData.status == 0 || patrolJobData.status == 4
-                          ? Colors.red
-                          : patrolJobData.status == 1
-                          ? Colors.orange
-                          : patrolJobData.status == 2
-                          ? Colors.green
-                          : Colors.black, //边框颜色
+                          patrolJobData.status == 0 || patrolJobData.status == 4
+                              ? Colors.red
+                              : patrolJobData.status == 1
+                                  ? Colors.orange
+                                  : patrolJobData.status == 2
+                                      ? Colors.green
+                                      : Colors.black, //边框颜色
                       width: 1.0, //边框粗细
                     ),
                     borderRadius: const BorderRadius.all(
@@ -150,7 +150,7 @@ class _RepairPage extends State<RepairPage> {
                     '报修单号:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -160,7 +160,7 @@ class _RepairPage extends State<RepairPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -174,7 +174,7 @@ class _RepairPage extends State<RepairPage> {
                     '报修设备:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -184,7 +184,7 @@ class _RepairPage extends State<RepairPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -198,7 +198,7 @@ class _RepairPage extends State<RepairPage> {
                     '申请时间:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -208,11 +208,12 @@ class _RepairPage extends State<RepairPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
-              ]),SizedBox(
+              ]),
+              SizedBox(
                 height: 10,
               ),
               Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
@@ -221,7 +222,7 @@ class _RepairPage extends State<RepairPage> {
                     '申请人:',
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -231,7 +232,7 @@ class _RepairPage extends State<RepairPage> {
                     textAlign: TextAlign.right,
                     style: TextStyle(
                       color: GSYColors.primaryLightValue,
-                      fontSize: GSYConstant.middleTextWhiteSize,
+                      fontSize: GSYConstant.smallTextSize,
                     ),
                   ),
                 ),
@@ -245,7 +246,8 @@ class _RepairPage extends State<RepairPage> {
             Navigator.push(
                 context,
                 MaterialPageRoute(
-                    builder: (context) => new PatrolJobDetail(id:patrolJobData.id)));
+                    builder: (context) =>
+                        new PatrolJobDetail(id: patrolJobData.id)));
           },
         ));
   }

+ 76 - 82
lib/widget/MaintJobDrawer.dart

@@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
 import '../model/drop_menu_item.dart';
 
 class MaintJobDrawer extends StatefulWidget {
-
   final _CallBack callback;
 
   const MaintJobDrawer({super.key, required this.callback});
@@ -14,20 +13,18 @@ class MaintJobDrawer extends StatefulWidget {
   State createState() {
     return _maintJobDrawer();
   }
-
 }
 
-DropMenuItem boy = DropMenuItem('男', 1);
-DropMenuItem girl = DropMenuItem('女', 2);
-DropMenuItem sexSelect = DropMenuItem('男', 1);
-List<DropMenuItem> sexMenuItems = [boy, girl];
-
-typedef _CallBack = void Function(int selectIndex, String selectStr);
+DropMenuItem not = DropMenuItem('已关闭', 0);
+DropMenuItem close = DropMenuItem('已完成', 2);
+DropMenuItem on = DropMenuItem('执行中', 1);
+DropMenuItem overdue = DropMenuItem('待执行', 3);
+DropMenuItem complete = DropMenuItem('已逾期', 4);
+List<DropMenuItem> sexMenuItems = [not, close, on, overdue, complete];
 
+typedef _CallBack = void Function(String device, String name,dynamic stase);
 
 class _maintJobDrawer extends State<MaintJobDrawer> {
-
-
   @override
   Widget build(BuildContext context) {
     return Drawer(
@@ -39,7 +36,7 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
           crossAxisAlignment: CrossAxisAlignment.start,
           children: <Widget>[
             Padding(
-              padding: const EdgeInsets.only(top: 50.0, left: 10, right: 10),
+              padding: const EdgeInsets.only(top: 65.0, left: 10, right: 10),
               child: Row(children: [
                 Expanded(
                   flex: 2,
@@ -61,7 +58,9 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
                       ),
                       style: TextStyle(fontSize: 14),
                       onChanged: (value) {
-                        _name = value;
+                        setState(() {
+                          _name = value;
+                        });
                       },
                     ),
                   ),
@@ -90,63 +89,9 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
                       decoration: InputDecoration(border: OutlineInputBorder()),
                       style: TextStyle(fontSize: 14),
                       onChanged: (value) {
-                        _number = value;
-                      },
-                    ),
-                  ),
-                  flex: 7,
-                ),
-              ]),
-            ),Padding(
-              padding: const EdgeInsets.only(top: 20.0, left: 10, right: 10),
-              child: Row(children: [
-                Expanded(
-                  flex: 2,
-                  child: Text(
-                    '计划名称',
-                    style: TextStyle(
-                      color: Colors.black,
-                      fontSize: GSYConstant.minTextSize,
-                      fontWeight: FontWeight.bold,
-                    ),
-                  ),
-                ),
-                Expanded(
-                  child: Container(
-                    height: 40,
-                    child: TextField(
-                      decoration: InputDecoration(border: OutlineInputBorder()),
-                      style: TextStyle(fontSize: 14),
-                      onChanged: (value) {
-                        _planName = value;
-                      },
-                    ),
-                  ),
-                  flex: 7,
-                ),
-              ]),
-            ),Padding(
-              padding: const EdgeInsets.only(top: 20.0, left: 10, right: 10),
-              child: Row(children: [
-                Expanded(
-                  flex: 2,
-                  child: Text(
-                    '计划编号',
-                    style: TextStyle(
-                      color: Colors.black,
-                      fontSize: GSYConstant.minTextSize,
-                      fontWeight: FontWeight.bold,
-                    ),
-                  ),
-                ),
-                Expanded(
-                  child: Container(
-                    height: 40,
-                    child: TextField(
-                      decoration: InputDecoration(border: OutlineInputBorder()),
-                      style: TextStyle(fontSize: 14),
-                      onChanged: (value) {
-                        _planNumber = value;
+                        setState(() {
+                          _number = value;
+                        });
                       },
                     ),
                   ),
@@ -171,19 +116,62 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
                 Expanded(
                   flex: 7,
                   child: Container(
-                    child: dropDownButtonsColumn(sexMenuItems, '性别', jobMenu),
+                    child: dropDownButtonsColumn(sexMenuItems, '请选择任务状态'),
                   ),
                 ),
               ]),
             ),
-
+            SizedBox(
+              height: 80,
+            ),
+            Row(
+              crossAxisAlignment: CrossAxisAlignment.end,
+              mainAxisAlignment: MainAxisAlignment.end,
+              children: [
+                TextButton(
+                  onPressed: () {
+                    Navigator.pop(context);
+                  },
+                  child: Text(ConstantString.cancel),
+                  style: ButtonStyle(
+                      backgroundColor:
+                      MaterialStateProperty.all<Color>(Color(0xFF4875EC)),
+                      foregroundColor:
+                      MaterialStateProperty.all<Color>(Colors.white),
+                      minimumSize: MaterialStateProperty.all(Size(80, 40)),
+                      padding: MaterialStateProperty.all(EdgeInsets.zero)),
+                ),
+                SizedBox(
+                  width: 20,
+                ),
+                TextButton(
+                  onPressed: () {
+                    if (widget.callback != null) {
+                      widget.callback(_name,_number,satus);
+                      Navigator.pop(context);
+                    }
+                  },
+                  child: Text(ConstantString.query),
+                  style: ButtonStyle(
+                      backgroundColor:
+                      MaterialStateProperty.all<Color>(Color(0xFF4875EC)),
+                      foregroundColor:
+                      MaterialStateProperty.all<Color>(Colors.white),
+                      minimumSize: MaterialStateProperty.all(Size(80, 40)),
+                      padding: MaterialStateProperty.all(EdgeInsets.zero)),
+                ),
+                SizedBox(
+                  width: 20,
+                ),
+              ],
+            )
           ],
         ),
       ),
     );
   }
 
-  Widget dropDownButtonsColumn(List<DropMenuItem> list, String hint, DropMenuItem select) {
+  Widget dropDownButtonsColumn(List<DropMenuItem> list, String hint) {
     return Container(
       height: 40,
       //gives the height of the dropdown button
@@ -195,16 +183,16 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
           width: 1.0, //边框粗细
         ),
         borderRadius:
-        const BorderRadius.all(const Radius.circular(4.0)), //边框的弧度
+            const BorderRadius.all(const Radius.circular(4.0)), //边框的弧度
       ),
       // padding: const EdgeInsets.symmetric(horizontal: 13), //you can include padding to control the menu items
       child: Theme(
           data: Theme.of(context).copyWith(
-            // canvasColor: Colors.white, // background color for the dropdown items
+              // canvasColor: Colors.white, // background color for the dropdown items
               buttonTheme: ButtonTheme.of(context).copyWith(
-                alignedDropdown:
+            alignedDropdown:
                 true, //If false (the default), then the dropdown's menu will be wider than its button.
-              )),
+          )),
           child: DropdownButtonHideUnderline(
             // to hide the default underline of the dropdown button
             child: DropdownButton<String>(
@@ -225,18 +213,24 @@ class _maintJobDrawer extends State<MaintJobDrawer> {
               ),
               // setting hint
               onChanged: (String? value) {
+                key = value;
                 setState(() {
-                  select.label = value; // saving the selected value
+                  for (var element in list) {
+                    if (value == element.label) {
+                      satus = element.value; // saving the selected value
+                    }
+                  }
                 });
               },
-              value: select.label, // displaying the selected value
+              value: key, // displaying the selected value
             ),
           )),
     );
   }
 
-  String  _name = '',_number = '', _planName = '', _planNumber = '';
-  int _status = 1,_termType = 1;
-  DropMenuItem jobMenu = DropMenuItem('男', 1);
+  String _name = '', _number = '';
 
-}
+  dynamic satus = null;
+
+  String? key;
+}

+ 90 - 63
lib/widget/PatrolJobDrawer.dart

@@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
 import '../model/drop_menu_item.dart';
 
 class PatrolJobDrawer extends StatefulWidget {
-
   final _CallBack callback;
 
   const PatrolJobDrawer({super.key, required this.callback});
@@ -14,20 +13,23 @@ class PatrolJobDrawer extends StatefulWidget {
   State createState() {
     return _patrolJobDrawer();
   }
-
 }
 
-DropMenuItem boy = DropMenuItem('男', 1);
-DropMenuItem girl = DropMenuItem('女', 2);
-DropMenuItem sexSelect = DropMenuItem('男', 1);
-List<DropMenuItem> sexMenuItems = [boy, girl];
+DropMenuItem not = DropMenuItem('已关闭', 0);
+DropMenuItem close = DropMenuItem('已完成', 2);
+DropMenuItem on = DropMenuItem('执行中', 1);
+DropMenuItem overdue = DropMenuItem('待执行', 3);
+DropMenuItem complete = DropMenuItem('已逾期', 4);
+List<DropMenuItem> sexMenuItems = [not, close, on, overdue, complete];
 
-typedef _CallBack = void Function(int selectIndex, String selectStr);
+DropMenuItem day = DropMenuItem('日计划', 0);
+DropMenuItem circumference = DropMenuItem('周计划', 1);
+DropMenuItem month = DropMenuItem('月计划', 2);
+List<DropMenuItem> sexMenuItems2 = [day, circumference, month];
 
+typedef _CallBack = void Function(String deviceName, String deviceNo,dynamic stase,dynamic termType);
 
 class _patrolJobDrawer extends State<PatrolJobDrawer> {
-
-
   @override
   Widget build(BuildContext context) {
     return Drawer(
@@ -39,7 +41,7 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
           crossAxisAlignment: CrossAxisAlignment.start,
           children: <Widget>[
             Padding(
-              padding: const EdgeInsets.only(top: 50.0, left: 10, right: 10),
+              padding: const EdgeInsets.only(top: 65.0, left: 10, right: 10),
               child: Row(children: [
                 Expanded(
                   flex: 2,
@@ -61,7 +63,7 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
                       ),
                       style: TextStyle(fontSize: 14),
                       onChanged: (value) {
-                        _name = value;
+                        name = value;
                       },
                     ),
                   ),
@@ -90,20 +92,21 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
                       decoration: InputDecoration(border: OutlineInputBorder()),
                       style: TextStyle(fontSize: 14),
                       onChanged: (value) {
-                        _number = value;
+                        no = value;
                       },
                     ),
                   ),
                   flex: 7,
                 ),
               ]),
-            ),Padding(
+            ),
+            Padding(
               padding: const EdgeInsets.only(top: 20.0, left: 10, right: 10),
               child: Row(children: [
                 Expanded(
                   flex: 2,
                   child: Text(
-                    '计划名称',
+                    '任务状态',
                     style: TextStyle(
                       color: Colors.black,
                       fontSize: GSYConstant.minTextSize,
@@ -112,45 +115,10 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
                   ),
                 ),
                 Expanded(
-                  child: Container(
-                    height: 40,
-                    child: TextField(
-                      decoration: InputDecoration(border: OutlineInputBorder()),
-                      style: TextStyle(fontSize: 14),
-                      onChanged: (value) {
-                        _planName = value;
-                      },
-                    ),
-                  ),
                   flex: 7,
-                ),
-              ]),
-            ),Padding(
-              padding: const EdgeInsets.only(top: 20.0, left: 10, right: 10),
-              child: Row(children: [
-                Expanded(
-                  flex: 2,
-                  child: Text(
-                    '计划编号',
-                    style: TextStyle(
-                      color: Colors.black,
-                      fontSize: GSYConstant.minTextSize,
-                      fontWeight: FontWeight.bold,
-                    ),
-                  ),
-                ),
-                Expanded(
                   child: Container(
-                    height: 40,
-                    child: TextField(
-                      decoration: InputDecoration(border: OutlineInputBorder()),
-                      style: TextStyle(fontSize: 14),
-                      onChanged: (value) {
-                        _planNumber = value;
-                      },
-                    ),
+                    child: dropDownButtonsColumn(sexMenuItems, '请选择任务状态', 0),
                   ),
-                  flex: 7,
                 ),
               ]),
             ),
@@ -160,7 +128,7 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
                 Expanded(
                   flex: 2,
                   child: Text(
-                    '任务状态',
+                    '周期规则',
                     style: TextStyle(
                       color: Colors.black,
                       fontSize: GSYConstant.minTextSize,
@@ -171,19 +139,63 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
                 Expanded(
                   flex: 7,
                   child: Container(
-                    child: dropDownButtonsColumn(sexMenuItems, '性别', jobMenu),
+                    child: dropDownButtonsColumn(sexMenuItems2, '请选择周期规则', 1),
                   ),
                 ),
               ]),
             ),
+            SizedBox(
+              height: 80,
+            ),
+            Row(
+              crossAxisAlignment: CrossAxisAlignment.end,
+              mainAxisAlignment: MainAxisAlignment.end,
+              children: [
+                TextButton(
+                  onPressed: () {
+                    Navigator.pop(context);
+                  },
+                  child: Text(ConstantString.cancel),
+                  style: ButtonStyle(
+                      backgroundColor:
+                      MaterialStateProperty.all<Color>(Color(0xFF4875EC)),
+                      foregroundColor:
+                      MaterialStateProperty.all<Color>(Colors.white),
+                      minimumSize: MaterialStateProperty.all(Size(80, 40)),
+                      padding: MaterialStateProperty.all(EdgeInsets.zero)),
+                ),
 
+                SizedBox(
+                  width: 20,
+                ),
+                TextButton(
+                  onPressed: () {
+                    if (widget.callback != null) {
+                      widget.callback(name,no,satus,termType);
+                      Navigator.pop(context);
+                    }
+                  },
+                  child: Text(ConstantString.query),
+                  style: ButtonStyle(
+                      backgroundColor:
+                      MaterialStateProperty.all<Color>(Color(0xFF4875EC)),
+                      foregroundColor:
+                      MaterialStateProperty.all<Color>(Colors.white),
+                      minimumSize: MaterialStateProperty.all(Size(80, 40)),
+                      padding: MaterialStateProperty.all(EdgeInsets.zero)),
+                ),
+                SizedBox(
+                  width: 20,
+                ),
+              ],
+            )
           ],
         ),
       ),
     );
   }
 
-  Widget dropDownButtonsColumn(List<DropMenuItem> list, String hint, DropMenuItem select) {
+  Widget dropDownButtonsColumn(List<DropMenuItem> list, String hint, int type) {
     return Container(
       height: 40,
       //gives the height of the dropdown button
@@ -195,16 +207,16 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
           width: 1.0, //边框粗细
         ),
         borderRadius:
-        const BorderRadius.all(const Radius.circular(4.0)), //边框的弧度
+            const BorderRadius.all(const Radius.circular(4.0)), //边框的弧度
       ),
       // padding: const EdgeInsets.symmetric(horizontal: 13), //you can include padding to control the menu items
       child: Theme(
           data: Theme.of(context).copyWith(
-            // canvasColor: Colors.white, // background color for the dropdown items
+              // canvasColor: Colors.white, // background color for the dropdown items
               buttonTheme: ButtonTheme.of(context).copyWith(
-                alignedDropdown:
+            alignedDropdown:
                 true, //If false (the default), then the dropdown's menu will be wider than its button.
-              )),
+          )),
           child: DropdownButtonHideUnderline(
             // to hide the default underline of the dropdown button
             child: DropdownButton<String>(
@@ -225,18 +237,33 @@ class _patrolJobDrawer extends State<PatrolJobDrawer> {
               ),
               // setting hint
               onChanged: (String? value) {
+                if (0 == type) {
+                  key = value;
+                } else {
+                  key2 = value;
+                }
                 setState(() {
-                  select.label = value; // saving the selected value
+                  for (var element in list) {
+                    if (value == element.label) {
+                      if (type == 0) {
+                        satus = element.value; // saving the selected value
+                      } else {
+                        termType = element.value;
+                      }
+                    }
+                  }
                 });
               },
-              value: select.label, // displaying the selected value
+              value: type == 0 ? key : key2, // displaying the selected value
             ),
           )),
     );
   }
 
-  String  _name = '',_number = '', _planName = '', _planNumber = '';
-  int _status = 1,_termType = 1;
-  DropMenuItem jobMenu = DropMenuItem('男', 1);
+  dynamic satus = null;
+  dynamic termType = null;
+
+  String? key, key2;
 
-}
+  String name = '', no = '';
+}

+ 2 - 0
pubspec.yaml

@@ -63,6 +63,8 @@ dev_dependencies:
   wechat_assets_picker: ^8.0.0
   flutter_staggered_grid_view: ^0.4.1
   event_bus: ^2.0.0
+  pretty_dio_logger: ^1.1.1
+  flutter_easyloading: ^3.0.3
 # For information on the generic Dart part of this file, see the
 # following page: https://dart.dev/tools/pub/pubspec