yangyang 2 éve
szülő
commit
dff27e5d71
31 módosított fájl, 2592 hozzáadás és 202 törlés
  1. 47 0
      lib/common/dialog/CloseTaskDialog.dart
  2. 3 0
      lib/common/event/RefreshMaintDetail.dart
  3. 3 0
      lib/common/event/RefreshMaintEdit.dart
  4. 3 0
      lib/common/event/RefreshMaintPage.dart
  5. 3 0
      lib/common/event/RefreshRepairAdd.dart
  6. 3 0
      lib/common/event/RefreshRepairDetail.dart
  7. 3 0
      lib/common/event/RefreshRepairPage.dart
  8. 15 0
      lib/common/style/TitleBar.dart
  9. 7 1
      lib/common/utils/ConstantString.dart
  10. 106 0
      lib/generated/json/base/json_convert_content.dart
  11. 175 0
      lib/generated/json/maint_items_list_response_entity_helper.dart
  12. 67 0
      lib/generated/json/maint_job_items_list_response_entity_helper.dart
  13. 237 0
      lib/generated/json/repair_detail_response_entity_helper.dart
  14. 46 0
      lib/model/maint_items_list_response_entity.dart
  15. 20 14
      lib/model/maint_job_detail_response.dart
  16. 17 0
      lib/model/maint_job_items_list_response_entity.dart
  17. 56 0
      lib/model/repair_detail_response_entity.dart
  18. 0 19
      lib/page/device/device_manage_page.dart
  19. 3 2
      lib/page/login/login_page.dart
  20. 134 68
      lib/page/maint/maint_job_detail.dart
  21. 371 0
      lib/page/maint/maint_job_edit.dart
  22. 18 17
      lib/page/maint/maint_job_list.dart
  23. 17 9
      lib/page/maint/maint_job_page.dart
  24. 234 0
      lib/page/maint/maint_job_select.dart
  25. 0 6
      lib/page/patrol/patrol_job_add.dart
  26. 1 1
      lib/page/patrol/patrol_job_select.dart
  27. 117 37
      lib/page/repair/repair_add_page.dart
  28. 574 0
      lib/page/repair/repair_detail.dart
  29. 25 25
      lib/page/repair/repair_job_device_list.dart
  30. 268 0
      lib/page/repair/repair_job_edit.dart
  31. 19 3
      lib/page/repair/repair_page.dart

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

@@ -56,5 +56,52 @@ class CloseTaskDialog {
               ));
         });
   }
+
+  static void showAlertDialog(
+      BuildContext context, _Back onPressed,String text) {
+    showDialog(
+        context: context,
+        barrierDismissible:false,
+        builder: (BuildContext context) {
+          return Theme(
+              data: ThemeData(
+                  dialogBackgroundColor: Colors.white,
+                  dialogTheme: DialogTheme(backgroundColor: Colors.white)),
+              child: CupertinoAlertDialog(
+                title: Text('提示'),
+                content: Column(
+                  children: <Widget>[
+                    SizedBox(
+                      height: 10,
+                    ),
+                    Container(
+                      padding: EdgeInsets.all(10),
+                      child: Text(text),
+                    )
+                  ],
+                ),
+                actions: <Widget>[
+                  CupertinoDialogAction(
+                    child: Text("取消"),
+                    onPressed: () {
+                      Navigator.pop(context);
+                    },
+                  ),
+                  CupertinoDialogAction(
+                    child: Text("确定"),
+                    onPressed: () {
+
+                        onPressed();
+                        Navigator.pop(context);
+                    },
+                  ),
+                ],
+              ));
+        });
+  }
 }
 typedef _CallBack = void Function(String msg);
+
+typedef _Back = void Function();
+
+

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

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

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

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

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

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

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

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

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

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

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

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

+ 15 - 0
lib/common/style/TitleBar.dart

@@ -31,6 +31,21 @@ class TitleBar {
     );
   }
 
+  // backCallAppbar(String title,VoidCallback callback) {
+  //   return AppBar(
+  //     title: Text(
+  //       title,
+  //       style: TextStyle(color: Colors.white, fontSize: 16),
+  //     ),
+  //     centerTitle: true,
+  //     leading: callback,
+  //     brightness: Brightness.light,
+  //     backgroundColor: Color(0xFF4875EC),
+  //     elevation: 0,
+  //     iconTheme: IconThemeData(color: Colors.white),
+  //   );
+  // }
+
   /**
    * 设置左侧按钮
    */

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

@@ -34,7 +34,7 @@ class ConstantString {
 
   static const String query = "查询";
 
-  static const String close_job = "关闭任务";
+  static const String close_job = "关闭申请";
 
   static const String login_maint = "登记维保";
 
@@ -52,9 +52,15 @@ class ConstantString {
 
   static const String complete = "完成";
 
+  static const String completeRepair = "完成维修";
+
   static const String patrolAddNull = "请输入活选择结果";
 
   static const String newRepair = "新建保修单";
 
   static const String submit = "提交";
+
+  static const String save = "保存";
+
+  static const String repairOrder="维修接单";
 }

+ 106 - 0
lib/generated/json/base/json_convert_content.dart

@@ -6,6 +6,8 @@ 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/maint_items_list_response_entity_helper.dart';
+import 'package:deus_app/generated/json/maint_job_items_list_response_entity_helper.dart';
 import 'package:deus_app/generated/json/maint_job_list_response_entity_helper.dart';
 import 'package:deus_app/generated/json/patrol_job_detail_response_entity_helper.dart';
 import 'package:deus_app/generated/json/patrol_job_edit_emtity_entity_helper.dart';
@@ -13,6 +15,7 @@ import 'package:deus_app/generated/json/patrol_job_list_entity_entity_helper.dar
 import 'package:deus_app/generated/json/patrol_job_select_entity_entity_helper.dart';
 import 'package:deus_app/generated/json/personal_data_count_entity_helper.dart';
 import 'package:deus_app/generated/json/repair_bill_list_response_entity_helper.dart';
+import 'package:deus_app/generated/json/repair_detail_response_entity_helper.dart';
 import 'package:deus_app/generated/json/repair_query_device_response_entity_helper.dart';
 import 'package:deus_app/generated/json/upload_list_entity_entity_helper.dart';
 import 'package:deus_app/generated/json/user_response_entity_helper.dart';
@@ -20,6 +23,8 @@ 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/maint_items_list_response_entity.dart';
+import 'package:deus_app/model/maint_job_items_list_response_entity.dart';
 import 'package:deus_app/model/maint_job_list_response_entity.dart';
 import 'package:deus_app/model/patrol_job_detail_response_entity.dart';
 import 'package:deus_app/model/patrol_job_edit_emtity_entity.dart';
@@ -29,6 +34,7 @@ import 'package:deus_app/model/patrol_job_select_entity_entity.dart';
 import 'package:deus_app/model/patrol_response_entity.dart';
 import 'package:deus_app/model/personal_data_count_entity.dart';
 import 'package:deus_app/model/repair_bill_list_response_entity.dart';
+import 'package:deus_app/model/repair_detail_response_entity.dart';
 import 'package:deus_app/model/repair_query_device_response_entity.dart';
 import 'package:deus_app/model/upload_list_entity_entity.dart';
 import 'package:deus_app/model/user_response_entity.dart';
@@ -56,6 +62,10 @@ class JsonConvert<T> {
 				return repairBillListResponseDataListLogsFromJson(data as RepairBillListResponseDataListLogs, json) as T;
 			case RepairBillListResponseDataQuery:
 				return repairBillListResponseDataQueryFromJson(data as RepairBillListResponseDataQuery, json) as T;
+			case MaintJobItemsListResponseEntity:
+				return maintJobItemsListResponseEntityFromJson(data as MaintJobItemsListResponseEntity, json) as T;
+			case MaintJobItemsListResponseData:
+				return maintJobItemsListResponseDataFromJson(data as MaintJobItemsListResponseData, json) as T;
 			case PatrolJobSelectEntityEntity:
 				return patrolJobSelectEntityEntityFromJson(data as PatrolJobSelectEntityEntity, json) as T;
 			case PatrolJobSelectEntityData:
@@ -92,6 +102,14 @@ class JsonConvert<T> {
 				return userResponseDataUserMenuListFromJson(data as UserResponseDataUserMenuList, json) as T;
 			case UserResponseDataRoleList:
 				return userResponseDataRoleListFromJson(data as UserResponseDataRoleList, json) as T;
+			case MaintItemsListResponseEntity:
+				return maintItemsListResponseEntityFromJson(data as MaintItemsListResponseEntity, json) as T;
+			case MaintItemsListResponseData:
+				return maintItemsListResponseDataFromJson(data as MaintItemsListResponseData, json) as T;
+			case MaintItemsListResponseDataQuery:
+				return maintItemsListResponseDataQueryFromJson(data as MaintItemsListResponseDataQuery, json) as T;
+			case MaintItemsListResponseDataList:
+				return maintItemsListResponseDataListFromJson(data as MaintItemsListResponseDataList, json) as T;
 			case LoginResponseEntity:
 				return loginResponseEntityFromJson(data as LoginResponseEntity, json) as T;
 			case LoginResponseData:
@@ -106,6 +124,14 @@ class JsonConvert<T> {
 				return equipmentListDataEquipmentVOSFromJson(data as EquipmentListDataEquipmentVOS, json) as T;
 			case EquipmentListDataCountDTO:
 				return equipmentListDataCountDTOFromJson(data as EquipmentListDataCountDTO, json) as T;
+			case RepairDetailResponseEntity:
+				return repairDetailResponseEntityFromJson(data as RepairDetailResponseEntity, json) as T;
+			case RepairDetailResponseData:
+				return repairDetailResponseDataFromJson(data as RepairDetailResponseData, json) as T;
+			case RepairDetailResponseDataLogs:
+				return repairDetailResponseDataLogsFromJson(data as RepairDetailResponseDataLogs, json) as T;
+			case RepairDetailResponseDataDevice:
+				return repairDetailResponseDataDeviceFromJson(data as RepairDetailResponseDataDevice, json) as T;
 			case MaintJobListResponseEntity:
 				return maintJobListResponseEntityFromJson(data as MaintJobListResponseEntity, json) as T;
 			case MaintJobListResponseData:
@@ -147,6 +173,10 @@ class JsonConvert<T> {
 				return repairBillListResponseDataListLogsToJson(data as RepairBillListResponseDataListLogs);
 			case RepairBillListResponseDataQuery:
 				return repairBillListResponseDataQueryToJson(data as RepairBillListResponseDataQuery);
+			case MaintJobItemsListResponseEntity:
+				return maintJobItemsListResponseEntityToJson(data as MaintJobItemsListResponseEntity);
+			case MaintJobItemsListResponseData:
+				return maintJobItemsListResponseDataToJson(data as MaintJobItemsListResponseData);
 			case PatrolJobSelectEntityEntity:
 				return patrolJobSelectEntityEntityToJson(data as PatrolJobSelectEntityEntity);
 			case PatrolJobSelectEntityData:
@@ -183,6 +213,14 @@ class JsonConvert<T> {
 				return userResponseDataUserMenuListToJson(data as UserResponseDataUserMenuList);
 			case UserResponseDataRoleList:
 				return userResponseDataRoleListToJson(data as UserResponseDataRoleList);
+			case MaintItemsListResponseEntity:
+				return maintItemsListResponseEntityToJson(data as MaintItemsListResponseEntity);
+			case MaintItemsListResponseData:
+				return maintItemsListResponseDataToJson(data as MaintItemsListResponseData);
+			case MaintItemsListResponseDataQuery:
+				return maintItemsListResponseDataQueryToJson(data as MaintItemsListResponseDataQuery);
+			case MaintItemsListResponseDataList:
+				return maintItemsListResponseDataListToJson(data as MaintItemsListResponseDataList);
 			case LoginResponseEntity:
 				return loginResponseEntityToJson(data as LoginResponseEntity);
 			case LoginResponseData:
@@ -197,6 +235,14 @@ class JsonConvert<T> {
 				return equipmentListDataEquipmentVOSToJson(data as EquipmentListDataEquipmentVOS);
 			case EquipmentListDataCountDTO:
 				return equipmentListDataCountDTOToJson(data as EquipmentListDataCountDTO);
+			case RepairDetailResponseEntity:
+				return repairDetailResponseEntityToJson(data as RepairDetailResponseEntity);
+			case RepairDetailResponseData:
+				return repairDetailResponseDataToJson(data as RepairDetailResponseData);
+			case RepairDetailResponseDataLogs:
+				return repairDetailResponseDataLogsToJson(data as RepairDetailResponseDataLogs);
+			case RepairDetailResponseDataDevice:
+				return repairDetailResponseDataDeviceToJson(data as RepairDetailResponseDataDevice);
 			case MaintJobListResponseEntity:
 				return maintJobListResponseEntityToJson(data as MaintJobListResponseEntity);
 			case MaintJobListResponseData:
@@ -257,6 +303,12 @@ class JsonConvert<T> {
 		if(type == (RepairBillListResponseDataQuery).toString()){
 			return RepairBillListResponseDataQuery().fromJson(json);
 		}
+		if(type == (MaintJobItemsListResponseEntity).toString()){
+			return MaintJobItemsListResponseEntity().fromJson(json);
+		}
+		if(type == (MaintJobItemsListResponseData).toString()){
+			return MaintJobItemsListResponseData().fromJson(json);
+		}
 		if(type == (PatrolJobSelectEntityEntity).toString()){
 			return PatrolJobSelectEntityEntity().fromJson(json);
 		}
@@ -311,6 +363,18 @@ class JsonConvert<T> {
 		if(type == (UserResponseDataRoleList).toString()){
 			return UserResponseDataRoleList().fromJson(json);
 		}
+		if(type == (MaintItemsListResponseEntity).toString()){
+			return MaintItemsListResponseEntity().fromJson(json);
+		}
+		if(type == (MaintItemsListResponseData).toString()){
+			return MaintItemsListResponseData().fromJson(json);
+		}
+		if(type == (MaintItemsListResponseDataQuery).toString()){
+			return MaintItemsListResponseDataQuery().fromJson(json);
+		}
+		if(type == (MaintItemsListResponseDataList).toString()){
+			return MaintItemsListResponseDataList().fromJson(json);
+		}
 		if(type == (LoginResponseEntity).toString()){
 			return LoginResponseEntity().fromJson(json);
 		}
@@ -332,6 +396,18 @@ class JsonConvert<T> {
 		if(type == (EquipmentListDataCountDTO).toString()){
 			return EquipmentListDataCountDTO().fromJson(json);
 		}
+		if(type == (RepairDetailResponseEntity).toString()){
+			return RepairDetailResponseEntity().fromJson(json);
+		}
+		if(type == (RepairDetailResponseData).toString()){
+			return RepairDetailResponseData().fromJson(json);
+		}
+		if(type == (RepairDetailResponseDataLogs).toString()){
+			return RepairDetailResponseDataLogs().fromJson(json);
+		}
+		if(type == (RepairDetailResponseDataDevice).toString()){
+			return RepairDetailResponseDataDevice().fromJson(json);
+		}
 		if(type == (MaintJobListResponseEntity).toString()){
 			return MaintJobListResponseEntity().fromJson(json);
 		}
@@ -395,6 +471,12 @@ class JsonConvert<T> {
 		if(<RepairBillListResponseDataQuery>[] is M){
 			return data.map<RepairBillListResponseDataQuery>((e) => RepairBillListResponseDataQuery().fromJson(e)).toList() as M;
 		}
+		if(<MaintJobItemsListResponseEntity>[] is M){
+			return data.map<MaintJobItemsListResponseEntity>((e) => MaintJobItemsListResponseEntity().fromJson(e)).toList() as M;
+		}
+		if(<MaintJobItemsListResponseData>[] is M){
+			return data.map<MaintJobItemsListResponseData>((e) => MaintJobItemsListResponseData().fromJson(e)).toList() as M;
+		}
 		if(<PatrolJobSelectEntityEntity>[] is M){
 			return data.map<PatrolJobSelectEntityEntity>((e) => PatrolJobSelectEntityEntity().fromJson(e)).toList() as M;
 		}
@@ -449,6 +531,18 @@ class JsonConvert<T> {
 		if(<UserResponseDataRoleList>[] is M){
 			return data.map<UserResponseDataRoleList>((e) => UserResponseDataRoleList().fromJson(e)).toList() as M;
 		}
+		if(<MaintItemsListResponseEntity>[] is M){
+			return data.map<MaintItemsListResponseEntity>((e) => MaintItemsListResponseEntity().fromJson(e)).toList() as M;
+		}
+		if(<MaintItemsListResponseData>[] is M){
+			return data.map<MaintItemsListResponseData>((e) => MaintItemsListResponseData().fromJson(e)).toList() as M;
+		}
+		if(<MaintItemsListResponseDataQuery>[] is M){
+			return data.map<MaintItemsListResponseDataQuery>((e) => MaintItemsListResponseDataQuery().fromJson(e)).toList() as M;
+		}
+		if(<MaintItemsListResponseDataList>[] is M){
+			return data.map<MaintItemsListResponseDataList>((e) => MaintItemsListResponseDataList().fromJson(e)).toList() as M;
+		}
 		if(<LoginResponseEntity>[] is M){
 			return data.map<LoginResponseEntity>((e) => LoginResponseEntity().fromJson(e)).toList() as M;
 		}
@@ -470,6 +564,18 @@ class JsonConvert<T> {
 		if(<EquipmentListDataCountDTO>[] is M){
 			return data.map<EquipmentListDataCountDTO>((e) => EquipmentListDataCountDTO().fromJson(e)).toList() as M;
 		}
+		if(<RepairDetailResponseEntity>[] is M){
+			return data.map<RepairDetailResponseEntity>((e) => RepairDetailResponseEntity().fromJson(e)).toList() as M;
+		}
+		if(<RepairDetailResponseData>[] is M){
+			return data.map<RepairDetailResponseData>((e) => RepairDetailResponseData().fromJson(e)).toList() as M;
+		}
+		if(<RepairDetailResponseDataLogs>[] is M){
+			return data.map<RepairDetailResponseDataLogs>((e) => RepairDetailResponseDataLogs().fromJson(e)).toList() as M;
+		}
+		if(<RepairDetailResponseDataDevice>[] is M){
+			return data.map<RepairDetailResponseDataDevice>((e) => RepairDetailResponseDataDevice().fromJson(e)).toList() as M;
+		}
 		if(<MaintJobListResponseEntity>[] is M){
 			return data.map<MaintJobListResponseEntity>((e) => MaintJobListResponseEntity().fromJson(e)).toList() as M;
 		}

+ 175 - 0
lib/generated/json/maint_items_list_response_entity_helper.dart

@@ -0,0 +1,175 @@
+import 'package:deus_app/model/maint_items_list_response_entity.dart';
+
+maintItemsListResponseEntityFromJson(MaintItemsListResponseEntity 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 = MaintItemsListResponseData().fromJson(json['data']);
+	}
+	if (json['msg'] != null) {
+		data.msg = json['msg'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> maintItemsListResponseEntityToJson(MaintItemsListResponseEntity 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;
+}
+
+maintItemsListResponseDataFromJson(MaintItemsListResponseData data, Map<String, dynamic> json) {
+	if (json['total'] != null) {
+		data.total = json['total'] is String
+				? int.tryParse(json['total'])
+				: json['total'].toInt();
+	}
+	if (json['index'] != null) {
+		data.index = json['index'] is String
+				? int.tryParse(json['index'])
+				: json['index'].toInt();
+	}
+	if (json['size'] != null) {
+		data.size = json['size'] is String
+				? int.tryParse(json['size'])
+				: json['size'].toInt();
+	}
+	if (json['sortBy'] != null) {
+		data.sortBy = json['sortBy'];
+	}
+	if (json['sort'] != null) {
+		data.sort = json['sort'];
+	}
+	if (json['query'] != null) {
+		data.query = MaintItemsListResponseDataQuery().fromJson(json['query']);
+	}
+	if (json['list'] != null) {
+		data.xList = (json['list'] as List).map((v) => MaintItemsListResponseDataList().fromJson(v)).toList();
+	}
+	return data;
+}
+
+Map<String, dynamic> maintItemsListResponseDataToJson(MaintItemsListResponseData entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['total'] = entity.total;
+	data['index'] = entity.index;
+	data['size'] = entity.size;
+	data['sortBy'] = entity.sortBy;
+	data['sort'] = entity.sort;
+	data['query'] = entity.query.toJson();
+	data['list'] =  entity.xList.map((v) => v.toJson()).toList();
+	return data;
+}
+
+maintItemsListResponseDataQueryFromJson(MaintItemsListResponseDataQuery data, Map<String, dynamic> json) {
+	if (json['index'] != null) {
+		data.index = json['index'] is String
+				? int.tryParse(json['index'])
+				: json['index'].toInt();
+	}
+	if (json['size'] != null) {
+		data.size = json['size'] is String
+				? int.tryParse(json['size'])
+				: json['size'].toInt();
+	}
+	if (json['total'] != null) {
+		data.total = json['total'];
+	}
+	if (json['id'] != null) {
+		data.id = json['id'];
+	}
+	if (json['name'] != null) {
+		data.name = json['name'];
+	}
+	if (json['num'] != null) {
+		data.num = json['num'];
+	}
+	if (json['level'] != null) {
+		data.level = json['level'];
+	}
+	if (json['status'] != null) {
+		data.status = json['status'];
+	}
+	if (json['requirements'] != null) {
+		data.requirements = json['requirements'];
+	}
+	if (json['remarks'] != null) {
+		data.remarks = json['remarks'];
+	}
+	if (json['offset'] != null) {
+		data.offset = json['offset'];
+	}
+	if (json['limit'] != null) {
+		data.limit = json['limit'];
+	}
+	if (json['paramError'] != null) {
+		data.paramError = json['paramError'];
+	}
+	return data;
+}
+
+Map<String, dynamic> maintItemsListResponseDataQueryToJson(MaintItemsListResponseDataQuery entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['index'] = entity.index;
+	data['size'] = entity.size;
+	data['total'] = entity.total;
+	data['id'] = entity.id;
+	data['name'] = entity.name;
+	data['num'] = entity.num;
+	data['level'] = entity.level;
+	data['status'] = entity.status;
+	data['requirements'] = entity.requirements;
+	data['remarks'] = entity.remarks;
+	data['offset'] = entity.offset;
+	data['limit'] = entity.limit;
+	data['paramError'] = entity.paramError;
+	return data;
+}
+
+maintItemsListResponseDataListFromJson(MaintItemsListResponseDataList data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['num'] != null) {
+		data.num = json['num'].toString();
+	}
+	if (json['name'] != null) {
+		data.name = json['name'].toString();
+	}
+	if (json['level'] != null) {
+		data.level = json['level'] is String
+				? int.tryParse(json['level'])
+				: json['level'].toInt();
+	}
+	if (json['status'] != null) {
+		data.status = json['status'] is String
+				? int.tryParse(json['status'])
+				: json['status'].toInt();
+	}
+	if (json['requirements'] != null) {
+		data.requirements = json['requirements'].toString();
+	}
+	if (json['remarks'] != null) {
+		data.remarks = json['remarks'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> maintItemsListResponseDataListToJson(MaintItemsListResponseDataList entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['num'] = entity.num;
+	data['name'] = entity.name;
+	data['level'] = entity.level;
+	data['status'] = entity.status;
+	data['requirements'] = entity.requirements;
+	data['remarks'] = entity.remarks;
+	return data;
+}

+ 67 - 0
lib/generated/json/maint_job_items_list_response_entity_helper.dart

@@ -0,0 +1,67 @@
+import 'package:deus_app/model/maint_job_items_list_response_entity.dart';
+
+maintJobItemsListResponseEntityFromJson(MaintJobItemsListResponseEntity 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 = (json['data'] as List).map((v) => MaintJobItemsListResponseData().fromJson(v)).toList();
+	}
+	if (json['msg'] != null) {
+		data.msg = json['msg'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> maintJobItemsListResponseEntityToJson(MaintJobItemsListResponseEntity entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['code'] = entity.code;
+	data['data'] =  entity.data.map((v) => v.toJson()).toList();
+	data['msg'] = entity.msg;
+	return data;
+}
+
+maintJobItemsListResponseDataFromJson(MaintJobItemsListResponseData data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['num'] != null) {
+		data.num = json['num'].toString();
+	}
+	if (json['name'] != null) {
+		data.name = json['name'].toString();
+	}
+	if (json['level'] != null) {
+		data.level = json['level'] is String
+				? int.tryParse(json['level'])
+				: json['level'].toInt();
+	}
+	if (json['status'] != null) {
+		data.status = json['status'] is String
+				? int.tryParse(json['status'])
+				: json['status'].toInt();
+	}
+	if (json['requirements'] != null) {
+		data.requirements = json['requirements'].toString();
+	}
+	if (json['remarks'] != null) {
+		data.remarks = json['remarks'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> maintJobItemsListResponseDataToJson(MaintJobItemsListResponseData entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['num'] = entity.num;
+	data['name'] = entity.name;
+	data['level'] = entity.level;
+	data['status'] = entity.status;
+	data['requirements'] = entity.requirements;
+	data['remarks'] = entity.remarks;
+	return data;
+}

+ 237 - 0
lib/generated/json/repair_detail_response_entity_helper.dart

@@ -0,0 +1,237 @@
+import 'package:deus_app/model/repair_detail_response_entity.dart';
+
+repairDetailResponseEntityFromJson(RepairDetailResponseEntity 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 = RepairDetailResponseData().fromJson(json['data']);
+	}
+	if (json['msg'] != null) {
+		data.msg = json['msg'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> repairDetailResponseEntityToJson(RepairDetailResponseEntity 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;
+}
+
+repairDetailResponseDataFromJson(RepairDetailResponseData data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['repNum'] != null) {
+		data.repNum = json['repNum'].toString();
+	}
+	if (json['theme'] != null) {
+		data.theme = json['theme'].toString();
+	}
+	if (json['urg'] != null) {
+		data.urg = json['urg'] is String
+				? int.tryParse(json['urg'])
+				: json['urg'].toInt();
+	}
+	if (json['deviceName'] != null) {
+		data.deviceName = json['deviceName'];
+	}
+	if (json['deviceKey'] != null) {
+		data.deviceKey = json['deviceKey'];
+	}
+	if (json['treatment'] != null) {
+		data.treatment = json['treatment'] is String
+				? int.tryParse(json['treatment'])
+				: json['treatment'].toInt();
+	}
+	if (json['customerName'] != null) {
+		data.customerName = json['customerName'];
+	}
+	if (json['channelName'] != null) {
+		data.channelName = json['channelName'];
+	}
+	if (json['submitter'] != null) {
+		data.submitter = json['submitter'];
+	}
+	if (json['receiver'] != null) {
+		data.receiver = json['receiver'].toString();
+	}
+	if (json['maintainer'] != null) {
+		data.maintainer = json['maintainer'].toString();
+	}
+	if (json['orderRecTime'] != null) {
+		data.orderRecTime = json['orderRecTime'].toString();
+	}
+	if (json['applicant'] != null) {
+		data.applicant = json['applicant'].toString();
+	}
+	if (json['status'] != null) {
+		data.status = json['status'] is String
+				? int.tryParse(json['status'])
+				: json['status'].toInt();
+	}
+	if (json['deviceId'] != null) {
+		data.deviceId = json['deviceId'] is String
+				? int.tryParse(json['deviceId'])
+				: json['deviceId'].toInt();
+	}
+	if (json['instructions'] != null) {
+		data.instructions = json['instructions'].toString();
+	}
+	if (json['repResRemarks'] != null) {
+		data.repResRemarks = json['repResRemarks'].toString();
+	}
+	if (json['applicationTime'] != null) {
+		data.applicationTime = json['applicationTime'].toString();
+	}
+	if (json['completeTime'] != null) {
+		data.completeTime = json['completeTime'].toString();
+	}
+	if (json['repairImgUrls'] != null) {
+		data.repairImgUrls = (json['repairImgUrls'] as List).map((v) => v).toList().cast<String>();
+	}else{
+		data.repairImgUrls =[];
+	}
+	if (json['repairResUrls'] != null) {
+		data.repairResUrls = (json['repairResUrls'] as List).map((v) => v).toList().cast<String>();
+	}else{
+		data.repairResUrls =[];
+	}
+	if (json['logs'] != null) {
+		data.logs = (json['logs'] as List).map((v) => RepairDetailResponseDataLogs().fromJson(v)).toList();
+	}
+	if (json['device'] != null) {
+		data.device = RepairDetailResponseDataDevice().fromJson(json['device']);
+	}
+	return data;
+}
+
+Map<String, dynamic> repairDetailResponseDataToJson(RepairDetailResponseData entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['repNum'] = entity.repNum;
+	data['theme'] = entity.theme;
+	data['urg'] = entity.urg;
+	data['deviceName'] = entity.deviceName;
+	data['deviceKey'] = entity.deviceKey;
+	data['treatment'] = entity.treatment;
+	data['customerName'] = entity.customerName;
+	data['channelName'] = entity.channelName;
+	data['submitter'] = entity.submitter;
+	data['receiver'] = entity.receiver;
+	data['maintainer'] = entity.maintainer;
+	data['orderRecTime'] = entity.orderRecTime;
+	data['applicant'] = entity.applicant;
+	data['status'] = entity.status;
+	data['deviceId'] = entity.deviceId;
+	data['instructions'] = entity.instructions;
+	data['applicationTime'] = entity.applicationTime;
+	data['completeTime'] = entity.completeTime;
+	data['repairImgUrls'] = entity.repairImgUrls;
+	data['repResRemarks'] = entity.repResRemarks;
+	data['repairResUrls'] = entity.repairResUrls;
+	data['logs'] =  entity.logs.map((v) => v.toJson()).toList();
+	data['device'] = entity.device!.toJson();
+	return data;
+}
+
+repairDetailResponseDataLogsFromJson(RepairDetailResponseDataLogs data, Map<String, dynamic> json) {
+	if (json['createTime'] != null) {
+		data.createTime = json['createTime'].toString();
+	}
+	if (json['updateTime'] != null) {
+		data.updateTime = json['updateTime'].toString();
+	}
+	if (json['creator'] != null) {
+		data.creator = json['creator'] is String
+				? int.tryParse(json['creator'])
+				: json['creator'].toInt();
+	}
+	if (json['updater'] != null) {
+		data.updater = json['updater'] is String
+				? int.tryParse(json['updater'])
+				: json['updater'].toInt();
+	}
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['userName'] != null) {
+		data.userName = json['userName'].toString();
+	}
+	if (json['description'] != null) {
+		data.description = json['description'].toString();
+	}
+	if (json['repairBillId'] != null) {
+		data.repairBillId = json['repairBillId'] is String
+				? int.tryParse(json['repairBillId'])
+				: json['repairBillId'].toInt();
+	}
+	return data;
+}
+
+Map<String, dynamic> repairDetailResponseDataLogsToJson(RepairDetailResponseDataLogs entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['createTime'] = entity.createTime;
+	data['updateTime'] = entity.updateTime;
+	data['creator'] = entity.creator;
+	data['updater'] = entity.updater;
+	data['id'] = entity.id;
+	data['userName'] = entity.userName;
+	data['description'] = entity.description;
+	data['repairBillId'] = entity.repairBillId;
+	return data;
+}
+
+repairDetailResponseDataDeviceFromJson(RepairDetailResponseDataDevice data, Map<String, dynamic> json) {
+	if (json['id'] != null) {
+		data.id = json['id'] is String
+				? int.tryParse(json['id'])
+				: json['id'].toInt();
+	}
+	if (json['showName'] != null) {
+		data.showName = json['showName'].toString();
+	}
+	if (json['deviceName'] != null) {
+		data.deviceName = json['deviceName'].toString();
+	}
+	if (json['deviceKey'] != null) {
+		data.deviceKey = json['deviceKey'].toString();
+	}
+	if (json['repairBillId'] != null) {
+		data.repairBillId = json['repairBillId'];
+	}
+	if (json['prodName'] != null) {
+		data.prodName = json['prodName'].toString();
+	}
+	if (json['isRepaired'] != null) {
+		data.isRepaired = json['isRepaired'] is String
+				? int.tryParse(json['isRepaired'])
+				: json['isRepaired'].toInt();
+	}
+	if (json['completeTime'] != null) {
+		data.completeTime = json['completeTime'].toString();
+	}
+	return data;
+}
+
+Map<String, dynamic> repairDetailResponseDataDeviceToJson(RepairDetailResponseDataDevice entity) {
+	final Map<String, dynamic> data = new Map<String, dynamic>();
+	data['id'] = entity.id;
+	data['showName'] = entity.showName;
+	data['deviceName'] = entity.deviceName;
+	data['deviceKey'] = entity.deviceKey;
+	data['repairBillId'] = entity.repairBillId;
+	data['prodName'] = entity.prodName;
+	data['isRepaired'] = entity.isRepaired;
+	data['completeTime'] = entity.completeTime;
+	return data;
+}

+ 46 - 0
lib/model/maint_items_list_response_entity.dart

@@ -0,0 +1,46 @@
+import 'package:deus_app/generated/json/base/json_convert_content.dart';
+import 'package:deus_app/generated/json/base/json_field.dart';
+
+class MaintItemsListResponseEntity with JsonConvert<MaintItemsListResponseEntity> {
+	late int code;
+	late MaintItemsListResponseData data;
+	late String msg;
+}
+
+class MaintItemsListResponseData with JsonConvert<MaintItemsListResponseData> {
+	late int total;
+	late int index;
+	late int size;
+	late dynamic sortBy;
+	late dynamic sort;
+	late MaintItemsListResponseDataQuery query;
+	@JSONField(name: "list")
+	late List<MaintItemsListResponseDataList> xList;
+}
+
+class MaintItemsListResponseDataQuery with JsonConvert<MaintItemsListResponseDataQuery> {
+	late int index;
+	late int size;
+	late dynamic total;
+	late dynamic id;
+	late dynamic name;
+	late dynamic num;
+	late dynamic level;
+	late dynamic status;
+	late dynamic requirements;
+	late dynamic remarks;
+	late dynamic offset;
+	late dynamic limit;
+	late bool paramError;
+}
+
+class MaintItemsListResponseDataList with JsonConvert<MaintItemsListResponseDataList> {
+	late int id;
+	late String num;
+	late String name;
+	late int level;
+	late int status;
+	late String requirements;
+	late String remarks;
+	late bool isCheck=false;
+}

+ 20 - 14
lib/model/maint_job_detail_response.dart

@@ -37,7 +37,7 @@ class MaintJobDetailData {
   List<FileUrls>? fileUrls;
   String? creator;
   List<ItemsList>? itemsList;
-  List<Logs>? logs;
+  // List<Logs>? logs;
   String? maintStaffName;
   String? finishTime;
   String? prodCount;
@@ -58,7 +58,7 @@ class MaintJobDetailData {
         this.fileUrls,
         this.creator,
         this.itemsList,
-        this.logs,
+        // this.logs,
         this.maintStaffName,
         this.finishTime,
         this.prodCount,
@@ -83,12 +83,12 @@ class MaintJobDetailData {
       });
     }
     creator = json['creator'];
-    if (json['logs'] != null) {
-      logs = <Logs>[];
-      json['logs'].forEach((v) {
-        logs!.add(new Logs.fromJson(v));
-      });
-    }
+    // if (json['logs'] != null) {
+    //   logs = <Logs>[];
+    //   json['logs'].forEach((v) {
+    //     logs!.add(new Logs.fromJson(v));
+    //   });
+    // }
     maintStaffName = json['maintStaffName'];
     finishTime = json['finishTime'];
     prodCount = json['prodCount'];
@@ -124,9 +124,9 @@ class MaintJobDetailData {
     if (this.itemsList != null) {
       data['itemsList'] = this.itemsList!.map((v) => v.toJson()).toList();
     }
-    if (this.logs != null) {
-      data['logs'] = this.logs!.map((v) => v.toJson()).toList();
-    }
+    // if (this.logs != null) {
+    //   data['logs'] = this.logs!.map((v) => v.toJson()).toList();
+    // }
     data['maintStaffName'] = this.maintStaffName;
     data['finishTime'] = this.finishTime;
     data['prodCount'] = this.prodCount;
@@ -259,7 +259,11 @@ class DeviceList {
     deviceKey = json['deviceKey'];
     productName = json['productName'];
     productKey = json['productKey'];
-    finishTime = json['finishTime'];
+    if(null==json['finishTime']){
+      finishTime='暂无';
+    }else{
+      finishTime = json['finishTime'];
+    }
     maintPerson = json['maintPerson'];
     maintJobId = json['maintJobId'];
     isMainted = json['isMainted'];
@@ -285,7 +289,7 @@ class DeviceList {
 class ItemsList {
   int? id;
   int? level;
-  String? name;
+  String? name='';
   String? num;
   String? remarks;
   String? requirements;
@@ -296,7 +300,9 @@ class ItemsList {
   ItemsList.fromJson(Map<String, dynamic> json) {
     id = json['id'];
     level = json['level'];
-    name = json['name'];
+    if(null!=json['name']){
+      name = json['name'];
+    }
     num = json['num'];
     remarks = json['remarks'];
     requirements = json['requirements'];

+ 17 - 0
lib/model/maint_job_items_list_response_entity.dart

@@ -0,0 +1,17 @@
+import 'package:deus_app/generated/json/base/json_convert_content.dart';
+
+class MaintJobItemsListResponseEntity with JsonConvert<MaintJobItemsListResponseEntity> {
+	late int code;
+	late List<MaintJobItemsListResponseData> data;
+	late String msg;
+}
+
+class MaintJobItemsListResponseData with JsonConvert<MaintJobItemsListResponseData> {
+	late int id;
+	late String num;
+	late String name;
+	late int level;
+	late int status;
+	late String requirements;
+	late String remarks;
+}

+ 56 - 0
lib/model/repair_detail_response_entity.dart

@@ -0,0 +1,56 @@
+import 'package:deus_app/generated/json/base/json_convert_content.dart';
+
+class RepairDetailResponseEntity with JsonConvert<RepairDetailResponseEntity> {
+	late int code;
+	late RepairDetailResponseData data;
+	late String msg;
+}
+
+class RepairDetailResponseData with JsonConvert<RepairDetailResponseData> {
+	late int id;
+	late String repNum='';
+	String? theme;
+	int? urg;
+	String? deviceName;
+	late dynamic deviceKey;
+	late int treatment;
+	late dynamic customerName;
+	late dynamic channelName;
+	late dynamic submitter;
+	late String receiver;
+	late String maintainer='暂无';
+	late String orderRecTime='暂未接单';
+	late String applicant='';
+	late int status=-1;
+	late int deviceId;
+	String? instructions;
+	late String applicationTime='';
+	late String completeTime='暂未完成';
+	late List<String> repairImgUrls;
+	late List<String> repairResUrls;
+	String? repResRemarks;
+	late List<RepairDetailResponseDataLogs> logs;
+	RepairDetailResponseDataDevice? device;
+}
+
+class RepairDetailResponseDataLogs with JsonConvert<RepairDetailResponseDataLogs> {
+	late String createTime;
+	late String updateTime;
+	late int creator;
+	late int updater;
+	late int id;
+	late String userName;
+	late String description;
+	late int repairBillId;
+}
+
+class RepairDetailResponseDataDevice with JsonConvert<RepairDetailResponseDataDevice> {
+	late int id;
+	String? showName;
+	late String deviceName;
+	late String deviceKey;
+	late dynamic repairBillId;
+	late String prodName;
+	late int isRepaired;
+	late String completeTime;
+}

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

@@ -11,7 +11,6 @@ import 'package:deus_app/page/device/device_manage_detail_page.dart';
 import 'package:deus_app/widget/MyDrawer.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:pull_to_refresh/pull_to_refresh.dart';
 
 class DeviceManagePage extends StatefulWidget {
   static var routeName = '/DeviceManagePage';
@@ -30,28 +29,10 @@ class _DeviceManage extends State<DeviceManagePage> {
   dynamic _satus, _isEnabled;
 
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
-  RefreshController _refreshController =
-      RefreshController(initialRefresh: false);
 
   List<EquipmentListDataEquipmentVOS> equipmentVOS =
       <EquipmentListDataEquipmentVOS>[];
 
-  void _onRefresh() async {
-    // monitor network fetch
-    await Future.delayed(Duration(milliseconds: 1000));
-    // if failed,use refreshFailed()
-    _refreshController.refreshCompleted();
-  }
-
-  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(() {});
-    _refreshController.loadComplete();
-  }
-
   @override
   void initState() {
     super.initState();

+ 3 - 2
lib/page/login/login_page.dart

@@ -217,8 +217,9 @@ class _LoginPageState extends State<LoginPage> {
       StoreHelper.putStorage(ConstantString.name, entity.data.name);
       StoreHelper.putStorage(ConstantString.orgName, entity.data.orgName);
       StoreHelper.putStorage(ConstantString.phone, entity.data.phone);
-      await Navigator.pushNamed(context, HomePage.routeName);
-      Navigator.pop(context);
+      Navigator.pushAndRemoveUntil(context, MaterialPageRoute(
+          builder: (context) =>
+              HomePage()), (route) => false);
     }else{
       showToast(entity.msg);
     }

+ 134 - 68
lib/page/maint/maint_job_detail.dart

@@ -1,7 +1,13 @@
+import 'package:deus_app/common/dialog/CloseTaskDialog.dart';
+import 'package:deus_app/common/event/RefreshMaintDetail.dart';
+import 'package:deus_app/common/event/RefreshMaintPage.dart';
 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/ToastUtils.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/maint_job_detail_response.dart';
+import 'package:deus_app/page/maint/maint_job_list.dart';
 import 'package:flutter/material.dart';
 
 import '../../common/utils/DioUtil.dart';
@@ -31,6 +37,10 @@ List<FileUrls> fileUrls = <FileUrls>[];
 class _MaintJobDetail extends State<MaintJobDetail> {
   var id;
 
+  bool type = false;
+
+  var _event;
+
   _MaintJobDetail(this.id);
 
   _load() async {
@@ -43,11 +53,16 @@ class _MaintJobDetail extends State<MaintJobDetail> {
       deviceList.clear();
       deviceList.addAll(maintJobDetail.deviceList!);
       itemList.clear();
-      if(null!=maintJobDetail.itemsList){
+      if (null != maintJobDetail.itemsList) {
         itemList.addAll(maintJobDetail.itemsList!);
       }
       fileUrls.clear();
-      fileUrls.addAll(maintJobDetail.fileUrls!);
+      if(null!=maintJobDetail.fileUrls){
+        fileUrls.addAll(maintJobDetail.fileUrls!);
+      }
+      if (maintJobDetail.status == 1 || maintJobDetail.status == 3|| maintJobDetail.status == 4) {
+        type = true;
+      }
     });
   }
 
@@ -55,6 +70,17 @@ class _MaintJobDetail extends State<MaintJobDetail> {
   void initState() {
     super.initState();
     _load();
+    _event = eventBus.on<RefreshMaintDetail>().listen((event) {
+      setState(() {
+        _load();
+      });
+    });
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
   }
 
   @override
@@ -70,50 +96,67 @@ class _MaintJobDetail extends State<MaintJobDetail> {
                 children: _Ws(),
               ),
             ),
-            Container(
-              height: 50,
-              // flex: 7,
-              child: Row(
-                children: [
-                  Expanded(
-                    child: SizedBox(
-                      height: 50,
-                      child: TextButton(
-                        onPressed: () {},
-                        child: Text(ConstantString.close_job),
-                        style: ButtonStyle(
-                          backgroundColor: MaterialStateProperty.all<Color>(
-                              Color(0xFF4875EC)),
-                          shape: MaterialStateProperty.all(
-                              BeveledRectangleBorder(
-                                  borderRadius: BorderRadius.circular(0))),
-                          foregroundColor:
+            Visibility(
+            visible: type,
+            child: Container(
+                  height: 50,
+                  // flex: 7,
+                  child: Row(
+                    children: [
+                      Expanded(
+                        child: SizedBox(
+                          height: 50,
+                          child: TextButton(
+                            onPressed: () {
+                              CloseTaskDialog.showCupertinoAlertDialog(context,
+                                      (msg) {
+                                    closeJob(msg);
+                                  });
+                            },
+                            child: Text(ConstantString.close_task),
+                            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)
+                              // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                            ),
+                          ),
                         ),
                       ),
-                    ),
+                      Expanded(
+                          child: SizedBox(
+                            height: 50,
+                            child: TextButton(
+                              onPressed: () {
+                                // if (type) {
+                                Navigator.push(
+                                    context,
+                                    MaterialPageRoute(
+                                        builder: (context) => MaintlJobList(
+                                            responseData: maintJobDetail)));
+                                // }
+                              },
+                              child: Text(ConstantString.login_maint),
+                              style: ButtonStyle(
+                                backgroundColor:
+                                MaterialStateProperty.all<Color>(Colors.blue),
+                                foregroundColor:
+                                MaterialStateProperty.all<Color>(Colors.white),
+                                shape: MaterialStateProperty.all(BeveledRectangleBorder(
+                                    borderRadius: BorderRadius.circular(0))),
+                                // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                              ),
+                            ),
+                          )),
+                    ],
                   ),
-                  Expanded(
-                      child: SizedBox(
-                    height: 50,
-                    child: TextButton(
-                      onPressed: () {},
-                      child: Text(ConstantString.login_maint),
-                      style: ButtonStyle(
-                        backgroundColor:
-                            MaterialStateProperty.all<Color>(Colors.blue),
-                        foregroundColor:
-                            MaterialStateProperty.all<Color>(Colors.white),
-                        shape: MaterialStateProperty.all(BeveledRectangleBorder(
-                            borderRadius: BorderRadius.circular(0))),
-                        // padding: MaterialStateProperty.all(EdgeInsets.zero)
-                      ),
-                    ),
-                  )),
-                ],
-              ),
+                )
             )
+
           ],
         ));
   }
@@ -123,7 +166,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
     ws.add(_maintJobDetail(maintJobDetail));
     ws.add(_device());
     ws.add(_item());
-    if(null!=maintJobDetail.remarks){
+    if (null != maintJobDetail.remarks) {
       ws.add(_remark());
     }
     ws.add(_url());
@@ -151,13 +194,13 @@ class _MaintJobDetail extends State<MaintJobDetail> {
               padding: EdgeInsets.fromLTRB(3, 2, 3, 2),
               alignment: Alignment.centerLeft,
               child: Text(
-                maintJobDetail.status == 2
+                maintJobDetail.status == 0
                     ? '已关闭'
-                    : maintJobDetail.status == 3
+                    : maintJobDetail.status == 1
                         ? '执行中'
-                        : maintJobDetail.status == 5
+                        : maintJobDetail.status == 2
                             ? '已完成'
-                            : maintJobDetail.status == 1
+                            : maintJobDetail.status == 3
                                 ? '待执行'
                                 : maintJobDetail.status == 4
                                     ? '已逾期'
@@ -170,7 +213,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
                           : maintJobDetail.status == 3
                               ? Colors.orange
                               : maintJobDetail.status == 2
-                                  ? Colors.green
+                                  ? Colors.blue
                                   : Colors.black, //边框颜色
                 ),
               ),
@@ -182,7 +225,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
                           : maintJobDetail.status == 3
                               ? Colors.orange
                               : maintJobDetail.status == 2
-                                  ? Colors.green
+                                  ? Colors.blue
                                   : Colors.black, //边框颜色
                   width: 1.0, //边框粗细
                 ),
@@ -462,7 +505,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
           style: GSYConstant.normalTextActionWhiteBold,
         )),
         children: itemList.map((e) => _buildItem(e)).toList(),
-        initiallyExpanded: true);
+        initiallyExpanded: false);
   }
 
   Widget _buildItem(ItemsList item) {
@@ -472,23 +515,25 @@ class _MaintJobDetail extends State<MaintJobDetail> {
           margin: item.id == itemList[itemList.length - 1].id
               ? EdgeInsets.only(bottom: 0)
               : EdgeInsets.only(bottom: 5),
-          padding: const EdgeInsets.fromLTRB(12, 15, 15, 0),
+          padding: const EdgeInsets.fromLTRB(12, 10, 15, 10),
           decoration: BoxDecoration(color: Colors.white),
           child: Column(
             children: [
               Container(
                 alignment: Alignment.centerLeft,
-                child: Text(item.name!,
+                child: Text(item.name == null ? '' : item.name!,
                     style: TextStyle(
                         fontSize: GSYConstant.middleTextWhiteSize,
                         fontWeight: FontWeight.bold)),
               ),
-              // Divider(
-              //   height: 0.8,
-              //   indent: 10.0,
-              //   endIndent: 10.0,
-              //   color: Colors.grey,
-              // ),
+              Container(
+                margin: const EdgeInsets.fromLTRB(0, 10.0, 0, 0),
+                alignment: Alignment.centerLeft,
+                child: Text(
+                  item.requirements!,
+                  style: GSYConstant.smallTextLight,
+                ),
+              ),
             ],
           ),
         ));
@@ -502,7 +547,7 @@ class _MaintJobDetail extends State<MaintJobDetail> {
           style: GSYConstant.normalTextActionWhiteBold,
         )),
         children: [_buildRemark(maintJobDetail.remarks!)],
-        initiallyExpanded: true);
+        initiallyExpanded: false);
   }
 
   Widget _buildRemark(String patrolJobDetailData) {
@@ -515,8 +560,8 @@ class _MaintJobDetail extends State<MaintJobDetail> {
               Container(
                 margin: const EdgeInsets.fromLTRB(12, 15.0, 12, 15.0),
                 alignment: Alignment.centerLeft,
-                child: Text(patrolJobDetailData,
-                    style: TextStyle(fontSize: 14)),
+                child:
+                    Text(patrolJobDetailData, style: TextStyle(fontSize: 14)),
               )
             ],
           ),
@@ -531,18 +576,39 @@ class _MaintJobDetail extends State<MaintJobDetail> {
           style: GSYConstant.normalTextActionWhiteBold,
         )),
         children: [
-          Wrap(children: fileUrls.map((e) => _buildImage(e)).toList()),
+          Container(
+            width: double.infinity,
+            margin: EdgeInsets.only(bottom: 5),
+            padding: fileUrls.isNotEmpty?EdgeInsets.only(right: 12, top: 10):EdgeInsets.only(right: 0, top: 0),
+            color: Colors.white,
+            child: Wrap(children: fileUrls.map((e) => _buildImage(e)).toList()),
+            alignment: Alignment.centerLeft,
+          )
         ],
-        initiallyExpanded: true);
+        initiallyExpanded: false);
   }
 
   Widget _buildImage(FileUrls imageData) {
     return Container(
-        width: MediaQuery.of(context).size.width / 2,
-        margin: EdgeInsets.only(bottom: 5),
-        padding: EdgeInsets.only(left: 12, right: 12),
-        alignment: Alignment.center,
-        decoration: BoxDecoration(color: Colors.white),
-        child: Image.network(imageData.url!));
+        margin: EdgeInsets.only(left: 12, bottom: 10),
+        width: MediaQuery.of(context).size.width / 4,
+        height: MediaQuery.of(context).size.width / 4,
+        child: Image.network(
+          imageData.url!,
+          fit: BoxFit.fill,
+        ));
+  }
+
+  closeJob(String msg) async {
+    var result = await DioUtil().request('maintJob/close',
+        method: DioMethod.post, data: {'id': id, 'closeReason': msg});
+    if (0 == result['code']) {
+      setState(() {
+        eventBus.fire(RefreshMaintPage());
+        Navigator.pop(context);
+      });
+    } else {
+      showToast(result['msg']);
+    }
   }
 }

+ 371 - 0
lib/page/maint/maint_job_edit.dart

@@ -0,0 +1,371 @@
+import 'dart:io';
+
+import 'package:deus_app/PhotoTool.dart';
+import 'package:deus_app/common/event/RefreshMaintDetail.dart';
+import 'package:deus_app/common/event/RefreshMaintEdit.dart';
+import 'package:deus_app/common/event/RefreshMaintPage.dart';
+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/generated/json/maint_job_items_list_response_entity_helper.dart';
+import 'package:deus_app/generated/json/upload_list_entity_entity_helper.dart';
+import 'package:deus_app/main.dart';
+import 'package:deus_app/model/maint_job_items_list_response_entity.dart';
+import 'package:deus_app/model/upload_list_entity_entity.dart';
+import 'package:deus_app/page/maint/maint_job_select.dart';
+import 'package:dio/dio.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:wechat_assets_picker/wechat_assets_picker.dart';
+
+
+class MairintJobEdit extends StatefulWidget {
+
+  static var routeName = "/PatrolJobEdit";
+
+  var id;
+  @override
+  State createState() {
+    return _MairintJobEdit(id);
+  }
+  MairintJobEdit({super.key, @required this.id});
+}
+
+class _MairintJobEdit extends State<MairintJobEdit> {
+
+  List<MaintJobItemsListResponseData> patrolItemVOS = <MaintJobItemsListResponseData>[];
+
+  List<AssetEntity> imageFiles = [];
+
+  List<int>mList=[];
+
+  var id;
+
+  var _event;
+
+  String note='';
+
+  _MairintJobEdit(this.id);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        resizeToAvoidBottomInset: false,
+        appBar: TitleBar().backAppbar("维保任务详情"),
+        backgroundColor: const Color(0xfff2f2f2),
+        body: Column(
+          children: [
+            Expanded(
+              // flex: 7,
+              child: ListView(
+                children: _Ws(),
+              ),
+            ),
+            Container(
+              height: 50,
+              // flex: 7,
+              child: Row(
+                children: [
+                  Expanded(
+                    child: SizedBox(
+                      height: 50,
+                      child: TextButton(
+                        onPressed: () {},
+                        child: Text(ConstantString.back),
+                        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)
+                        ),
+                      ),
+                    ),
+                  ),
+                  Expanded(
+                      child: SizedBox(
+                        height: 50,
+                        child: TextButton(
+                          onPressed: () {
+                            if(imageFiles.isNotEmpty){
+                              uploadList();
+                            }else{
+                              patrolJobRemark();
+                            }
+                          },
+                          child: Text(ConstantString.complete),
+                          style: ButtonStyle(
+                            backgroundColor:
+                            MaterialStateProperty.all<Color>(Colors.blue),
+                            foregroundColor:
+                            MaterialStateProperty.all<Color>(Colors.white),
+                            shape: MaterialStateProperty.all(BeveledRectangleBorder(
+                                borderRadius: BorderRadius.circular(0))),
+                            // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                          ),
+                        ),
+                      )),
+                ],
+              ),
+            )
+          ],
+        ));
+  }
+
+  List<Widget> _Ws() {
+    List<Widget> ws = [];
+    ws.add(_mainPatrolAdd());
+    ws.addAll(_item());
+    ws.add(_notes());
+    ws.add(_picture());
+    // ws.add(_url());
+    return ws;
+  }
+
+  Widget _picture(){
+    return Container(
+        child: Column(
+          children: [
+            Container(
+              height: 50,
+              padding: EdgeInsets.only(left: 12),
+              alignment: Alignment.centerLeft,
+              child: Text('巡检图片',style: TextStyle(
+                color: Colors.black,
+                fontSize: GSYConstant.TextSize15,
+              )),
+            ),
+            Container(
+              // padding: EdgeInsets.only(left: 12,right: 12),
+              decoration: BoxDecoration(color: Colors.white),
+              child: PhotoTool(imageCount: 5, lineCount: 5, addCall: (List<AssetEntity> _imageFiles){
+                imageFiles.addAll(_imageFiles);
+              }, removeCall:(int index){
+                imageFiles.remove(index);
+              }),
+            )
+          ],
+        )
+    );
+  }
+
+  Widget _notes(){
+    return Container(
+      child: Column(
+        children: <Widget>[
+          Container(
+            height: 50,
+            padding: EdgeInsets.only(left: 12),
+            alignment: Alignment.centerLeft,
+            child: Text('任务结果备注',style: TextStyle(
+              color: Colors.black,
+              fontSize: GSYConstant.TextSize15,
+            )),
+          ),
+          Container(
+            padding: EdgeInsets.only(left: 12,right: 12,bottom: 12),
+            decoration: BoxDecoration(color: Colors.white),
+            child: Column(
+              children: [
+                const SizedBox(
+                  height: 10,
+                ),
+                TextField(
+                  maxLines: 5,
+                  decoration: InputDecoration(border: OutlineInputBorder()),
+                  style: TextStyle(fontSize: 14),
+                  onChanged: (value) {
+                    note = value;
+                  },
+                )
+              ],
+            ),
+          )
+        ],
+      ),
+    );
+  }
+
+  Widget _mainPatrolAdd(){
+    return Column(
+      children: [
+        Container(
+          padding: EdgeInsets.fromLTRB(12,0, 12, 0),
+          height: 50,
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              const Text(
+                '维保项目:',
+                style: TextStyle(
+                  color: Colors.black,
+                  fontSize: GSYConstant.TextSize15,
+                ),
+              ),
+              Container(
+                child: TextButton(
+                  onPressed: () {
+                    Navigator.push(
+                        context,
+                        MaterialPageRoute(
+                            builder: (context) =>
+                                MaintJobSelect(id: id,)));
+                  },
+                  child: Row(
+                    children: [
+                      new Icon(Icons.add),
+                      new Text(
+                        '添加项目',
+                        style: TextStyle(
+                          color: Colors.blue,
+                          fontSize: GSYConstant.TextSize15,
+                        ),
+                        textAlign: TextAlign.right,
+                      )
+                    ],
+                  ),
+                ),
+              ),
+            ],
+          ),
+        )
+      ],
+    );
+  }
+
+  List<Widget> _item() {
+    return patrolItemVOS.map((e) => _buildItem(e)).toList();
+  }
+
+  Widget _buildItem(MaintJobItemsListResponseData item) {
+    return FractionallySizedBox(
+        widthFactor: 1,
+        child: Container(
+          padding: const EdgeInsets.fromLTRB(12, 0, 15, 5),
+          decoration: BoxDecoration(color: Colors.white),
+          child: Column(
+            children: [
+              Container(
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    Text(item.name,
+                        style: TextStyle(
+                            fontSize: GSYConstant.middleTextWhiteSize,
+                            fontWeight: FontWeight.bold)),
+                    IconButton(onPressed: (){
+                      deletePatrolItem(item.id);
+                    }, icon: new Icon(Icons.delete))
+                  ],
+                ),
+
+              ),
+              Container(
+                margin: const EdgeInsets.fromLTRB(0, 10.0, 0, 0),
+                alignment: Alignment.centerLeft,
+                child: Text(
+                  item.requirements,
+                  style: GSYConstant.smallTextLight,
+                ),
+              ),
+              const SizedBox(
+                height: 5,
+              ),
+              Divider(
+                height: 0.8,
+                color: Colors.grey,
+              ),
+            ],
+          ),
+        ));
+  }
+
+  patrolItem() async {
+    var result = await DioUtil().request('maintJob/app-items-list',
+        method: DioMethod.get, params: {'maintJobId': id});
+    if (0 == result['code']) {
+      MaintJobItemsListResponseEntity jobEdit=maintJobItemsListResponseEntityFromJson(MaintJobItemsListResponseEntity(),result);
+      setState(() {
+        patrolItemVOS.clear();
+        patrolItemVOS.addAll(jobEdit.data);
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  @override
+  void initState() {
+    super.initState();
+    patrolItem();
+    _event = eventBus.on<RefreshMaintEdit>().listen((event) {
+      setState(() {
+        patrolItem();
+      });
+    });
+  }
+
+  deletePatrolItem(int itemId) async {
+    var result = await DioUtil().request('maintJob/deleteItems',
+        method: DioMethod.post, data: {'id': itemId,'jobId':id});
+    if (result['code'] == 0) {
+      setState(() {
+        patrolItem();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
+
+  uploadList() async {
+    List<MultipartFile> files = [];
+    for (var element in imageFiles) {
+      File? imgFile = await element.file;
+      String? s=imgFile?.path;
+      MultipartFile file =MultipartFile.fromFileSync(s!);
+      files.add(file);
+    }
+    var formData =FormData.fromMap({
+      'files': files
+    });
+    var result = await DioUtil().request('uploadImg/uploadList',
+        method: DioMethod.post, data: formData);
+    if (result['code'] == 0) {
+      UploadListEntityEntity data=uploadListEntityEntityFromJson(UploadListEntityEntity(), result);
+      setState(() {
+        mList.clear();
+        mList.addAll(data.data);
+        patrolJobRemark();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  patrolJobRemark() async {
+    var result = await DioUtil().request('maintJob/complete',
+        method: DioMethod.post, data: {'id': id,'fileIds':mList,'remarks':note});
+    if (result['code'] == 0) {
+      setState(() {
+        eventBus.fire(RefreshMaintDetail());
+        eventBus.fire(RefreshMaintPage());
+        Navigator.of(context)..pop()..pop();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+
+}

+ 18 - 17
lib/page/maint/maint_job_list.dart

@@ -3,12 +3,12 @@ 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:deus_app/page/patrol/patrol_job_edit.dart';
+import 'package:deus_app/model/maint_job_detail_response.dart';
+import 'package:deus_app/page/maint/maint_job_edit.dart';
 import 'package:flutter/material.dart';
 
 class MaintlJobList extends StatefulWidget {
-  final PatrolJobDetailResponseData responseData;
+  final MaintJobDetailData responseData;
 
   const MaintlJobList({super.key, required this.responseData});
 
@@ -19,14 +19,14 @@ class MaintlJobList extends StatefulWidget {
 }
 
 class _MaintlJobList extends State<MaintlJobList> {
-  PatrolJobDetailResponseData responseData;
+  MaintJobDetailData responseData;
 
   _MaintlJobList(this.responseData);
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-        appBar: TitleBar().backAppbar("巡检设备详情"),
+        appBar: TitleBar().backAppbar("维保设备详情"),
         backgroundColor: const Color(0xfff2f2f2),
         body: Stack(
           children: [
@@ -49,7 +49,7 @@ class _MaintlJobList extends State<MaintlJobList> {
                   child:  Container(
                       margin: EdgeInsets.only(bottom: 60),
                       child: ListView.builder(
-                        itemCount: responseData.equipmentVOS.length,
+                        itemCount: responseData.deviceList!.length,
                         itemBuilder: (context, index) {
                           return Container(
                               margin: EdgeInsets.only(top: 12, left: 10, right: 10),
@@ -64,14 +64,14 @@ class _MaintlJobList extends State<MaintlJobList> {
                                       child: Row(
                                           mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                           children: [
-                                            Text(responseData.equipmentVOS[index].showName,
+                                            Text(responseData.deviceList![index].showName!,
                                                 style: GSYConstant.smallTextBold),
                                             Text(
                                               responseData
-                                                  .equipmentVOS[index].isComplete==0?'未完成':'已完成',
+                                                  .deviceList![index].isMainted==0?'未完成':'已完成',
                                               style: TextStyle(
                                                   fontSize: GSYConstant.smallTextSize,
-                                                  color: responseData.equipmentVOS[index].isComplete==0?Colors.red:Colors.blue),
+                                                  color: responseData.deviceList![index].isMainted==0?Colors.red:Colors.blue),
                                             ),
                                           ]),
                                     ),
@@ -88,7 +88,7 @@ class _MaintlJobList extends State<MaintlJobList> {
                                             ),
                                             Container(
                                               child: Text(
-                                                responseData.equipmentVOS[index].itemCompleteTime,
+                                                responseData.deviceList![index].finishTime!,
                                                 style: GSYConstant.smallTextLight,
                                                 textAlign: TextAlign.right,
                                               ),
@@ -126,7 +126,7 @@ class _MaintlJobList extends State<MaintlJobList> {
                           context,
                           MaterialPageRoute(
                               builder: (context) =>
-                                  PatrolJobEdit(id: responseData.id)));
+                                  MairintJobEdit(id: responseData.id)));
                     }
                   },
                   style: ButtonStyle(
@@ -148,13 +148,13 @@ class _MaintlJobList extends State<MaintlJobList> {
   }
 
   completeEquipment(int index) async {
-    if (responseData.equipmentVOS[index].isComplete == 0) {
-      var result = await DioUtil().request("patrolJob/completeEquipment",
+    if (responseData.deviceList![index].isMainted == 0) {
+      var result = await DioUtil().request("maintJob/device",
           method: DioMethod.post,
-          data: {'id': responseData.equipmentVOS[index].id});
+          data: {'id': responseData.deviceList![index].id});
       if (result['code'] == 0) {
         setState(() {
-          responseData.equipmentVOS[index].isComplete = 1;
+          responseData.deviceList![index].isMainted = 1;
         });
       } else {
         showToast(result['msg']);
@@ -164,12 +164,13 @@ class _MaintlJobList extends State<MaintlJobList> {
 
   bool next(){
     bool isNext=true;
-    for (var element in responseData.equipmentVOS) {
-      if(element.isComplete==0){
+    for (var element in responseData.deviceList!) {
+      if(element.isMainted==0){
         isNext=false;
         break;
       }
     }
     return isNext;
   }
+  
 }

+ 17 - 9
lib/page/maint/maint_job_page.dart

@@ -1,6 +1,8 @@
 //巡检任务列表
+import 'package:deus_app/common/event/RefreshMaintPage.dart';
 import 'package:deus_app/common/style/TitleBar.dart';
 import 'package:deus_app/common/utils/ToastUtils.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/maint_pesonse_entity.dart';
 import 'package:deus_app/page/maint/maint_job_detail.dart';
 import 'package:flutter/cupertino.dart';
@@ -37,6 +39,8 @@ class _MaintJobPage extends State<MaintJobPage> {
   String _device = '', _num = '';
   dynamic _stase;
 
+  var _event;
+
   _load() async {
     var result = await DioUtil().request('maintJob/list',
         method: DioMethod.post,
@@ -61,22 +65,15 @@ class _MaintJobPage extends State<MaintJobPage> {
   }
 
   void _onRefresh() async {
-    // monitor network fetch
-    // await Future.delayed(Duration(milliseconds: 1000));
-    // if failed,use refreshFailed()
     if (mounted) {
       setState(() {
-        index = 0;
+        index = 1;
         _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 (maintJobList.total! > maint_job_list.length) {
@@ -91,9 +88,14 @@ class _MaintJobPage extends State<MaintJobPage> {
 
   @override
   void initState() {
-    // TODO: implement initState
     super.initState();
     _load();
+    _event = eventBus.on<RefreshMaintPage>().listen((event) {
+      setState(() {
+        index=1;
+        _load();
+      });
+    });
   }
 
   @override
@@ -320,4 +322,10 @@ class _MaintJobPage extends State<MaintJobPage> {
           },
         ));
   }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
 }

+ 234 - 0
lib/page/maint/maint_job_select.dart

@@ -0,0 +1,234 @@
+import 'package:deus_app/common/event/RefreshMaintEdit.dart';
+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/generated/json/maint_items_list_response_entity_helper.dart';
+import 'package:deus_app/main.dart';
+import 'package:deus_app/model/maint_items_list_response_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+
+class MaintJobSelect extends StatefulWidget {
+
+  var id;
+
+  @override
+  State createState() {
+    return _MaintlJobSelect(id);
+  }
+  MaintJobSelect({super.key, required this.id});
+}
+
+class _MaintlJobSelect extends State<MaintJobSelect> {
+
+  var id;
+
+  _MaintlJobSelect(this.id);
+
+  final RefreshController _refreshController =
+      RefreshController(initialRefresh: false);
+  int index = 1;
+
+  List<MaintItemsListResponseDataList> patrolItemModelVOS = [];
+
+  MaintItemsListResponseEntity jobEdit = MaintItemsListResponseEntity();
+
+  @override
+  void initState() {
+    super.initState();
+    patrolItemModel();
+  }
+
+  patrolItemModel() async {
+    var result = await DioUtil().request('maintItems/app-list',
+        method: DioMethod.post, data: {'index': index, 'size': 20});
+    _refreshController.loadComplete();
+    _refreshController.refreshCompleted();
+    if (0 == result['code']) {
+      setState(() {
+        jobEdit = maintItemsListResponseEntityFromJson(
+            MaintItemsListResponseEntity(), result);
+        patrolItemModelVOS.clear();
+        patrolItemModelVOS.addAll(jobEdit.data.xList);
+      });
+    } else {
+      if (index > 1) {
+        index--;
+      }
+      showToast(result['msg']);
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        appBar: TitleBar().backAppbar("选择巡检项目"),
+        backgroundColor: const Color(0xfff2f2f2),
+        body: Stack(
+          children: [
+            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: patrolItemModelVOS.length,
+                itemBuilder: (context, index) {
+                  return _patrol_job_list(index);
+                },
+              ),
+            )),
+            Positioned(
+              left: 0,
+              right: 0,
+              bottom:0,
+              // flex: 7,
+              child:SizedBox(
+                height: 50,
+                width: double.infinity,
+                child: TextButton(
+                  onPressed: () {
+                    addItems();
+                  },
+                  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.save),
+                ),
+              ),
+            )
+          ],
+        ));
+  }
+
+  void _onRefresh() async {
+    if (mounted) {
+      setState(() {
+        index = 1;
+        patrolItemModel();
+      });
+    }
+  }
+
+  void _onLoading() async {
+    if (mounted) {
+      setState(() {
+        if (jobEdit.data.total > patrolItemModelVOS.length) {
+          index++;
+          patrolItemModel();
+        } else {
+          _refreshController.loadNoData();
+        }
+      });
+    }
+  }
+
+  Widget _patrol_job_list(int 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(
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    Text(patrolItemModelVOS[index].name,
+                        style: TextStyle(
+                            fontSize: GSYConstant.middleTextWhiteSize,
+                            fontWeight: FontWeight.bold)),
+                    Checkbox(
+                      value: patrolItemModelVOS[index].isCheck,
+                      activeColor: Colors.blue,
+                      onChanged: (bool? value) {
+                        setState(() {
+                          patrolItemModelVOS[index].isCheck=value!;
+                        });
+                      },
+                    ),
+                  ],
+                ),
+
+              ),
+              Container(
+                margin: const EdgeInsets.fromLTRB(0, 10.0, 0, 0),
+                alignment: Alignment.centerLeft,
+                child: Text(
+                  patrolItemModelVOS[index].requirements,
+                  style: GSYConstant.smallTextLight,
+                ),
+              ),
+              const SizedBox(
+                height: 5,
+              ),
+            ],
+          ),
+          onTap: () {
+            // Navigator.push(
+            //     context,
+            //     MaterialPageRoute(
+            //         builder: (context) =>
+            //             PatrolJobAdd(responseData: patrolItemModelVOS[index], id: id,)));
+          },
+        ));
+  }
+
+  addItems() async {
+    List<int>mList=[];
+    for (var value in patrolItemModelVOS) {
+      if(value.isCheck){
+        mList.add(value.id);
+      }
+    }
+    if(mList.isEmpty){
+      showToast("请选择维保项目");
+      return;
+    }
+    var result = await DioUtil().request('maintJob/addItems',
+        method: DioMethod.post, data: {'jobId': id,'maintItemsIds':mList});
+    if (result['code'] == 0) {
+      setState(() {
+        eventBus.fire(RefreshMaintEdit());
+        Navigator.pop(context);
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+}

+ 0 - 6
lib/page/patrol/patrol_job_add.dart

@@ -200,12 +200,6 @@ class _PatrolJobAdd extends State<PatrolJobAdd> {
               child: TextButton(
                 onPressed: () {
                   appAddItem();
-                  // Navigator.push(
-                  //     context,
-                  //     MaterialPageRoute(
-                  //         builder: (context) =>
-                  //             PatrolJobEdit(id: responseData.id)));
-                  // Navigator.pushAndRemoveUntil()
                 },
                 style: ButtonStyle(
                   backgroundColor: MaterialStateProperty.all<Color>(

+ 1 - 1
lib/page/patrol/patrol_job_select.dart

@@ -109,7 +109,7 @@ class _PatrolJobSelect extends State<PatrolJobSelect> {
   void _onRefresh() async {
     if (mounted) {
       setState(() {
-        index = 0;
+        index = 1;
         patrolItemModel();
       });
     }

+ 117 - 37
lib/page/repair/repair_add_page.dart

@@ -1,8 +1,18 @@
+import 'dart:io';
+
 import 'package:deus_app/PhotoTool.dart';
+import 'package:deus_app/common/event/RefreshRepairPage.dart';
 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/generated/json/upload_list_entity_entity_helper.dart';
+import 'package:deus_app/main.dart';
+import 'package:deus_app/model/repair_query_device_response_entity.dart';
+import 'package:deus_app/model/upload_list_entity_entity.dart';
 import 'package:deus_app/page/repair/repair_job_device_list.dart';
+import 'package:dio/dio.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:wechat_assets_picker/wechat_assets_picker.dart';
@@ -21,6 +31,9 @@ class _RepairAddPage extends State<RepairAddPage> {
   int groupValue = 1;
   String note='',theme='';
   List<AssetEntity> imageFiles = [];
+  List<int>mList=[];
+  var _event;
+  RepairQueryDeviceResponseDataList _dataList=RepairQueryDeviceResponseDataList();
 
   @override
   Widget build(BuildContext context) {
@@ -48,7 +61,15 @@ class _RepairAddPage extends State<RepairAddPage> {
               width: double.infinity,
               child: TextButton(
                 onPressed: () {
-
+                  if(isAddDevice){
+                    if(imageFiles.isNotEmpty){
+                      uploadList();
+                    }else{
+                      patrolJobRemark();
+                    }
+                  }else{
+                    showToast('请选择设备');
+                  }
                 },
                 style: ButtonStyle(
                   backgroundColor: MaterialStateProperty.all<Color>(
@@ -66,11 +87,24 @@ class _RepairAddPage extends State<RepairAddPage> {
         ]));
   }
 
+  @override
+  void initState() {
+    super.initState();
+    _event = eventBus.on<RepairQueryDeviceResponseDataList>().listen((event) {
+      setState(() {
+        _dataList=event;
+        isAddDevice=true;
+      });
+    });
+  }
+  bool isAddDevice=false;
   List<Widget> _Ws() {
     List<Widget> ws = [];
     ws.add(_basicInformation());
     ws.add(_patrolAddTitle());
-    // ws.add(_patrolAdd());
+    if(isAddDevice){
+      ws.add(_patrolAdd());
+    }
     ws.add(_notes());
     return ws;
   }
@@ -269,12 +303,12 @@ class _RepairAddPage extends State<RepairAddPage> {
 
   Widget _patrolAdd() {
     return Container(
-      padding: EdgeInsets.only(top: 12, bottom: 12, left: 12, right: 12),
+      padding: EdgeInsets.only(top: 15, bottom: 15, left: 12, right: 12),
       color: Colors.white,
       child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
         Container(
           child: Text(
-            '',
+            _dataList.showName,
             style: const TextStyle(
               color: Colors.black,
               fontSize: GSYConstant.middleTextWhiteSize,
@@ -284,42 +318,88 @@ class _RepairAddPage extends State<RepairAddPage> {
         ),
         Container(
           padding: EdgeInsets.only(top: 3, bottom: 3, left: 5, right: 5),
-          child: Text(""
-              // equipmentVOS[index].status == 0
-              //     ? '在线'
-              //     : equipmentVOS[index].status == 1
-              //     ? '离线'
-              //     : equipmentVOS[index].status == 2
-              //     ? '未激活'
-              //     : '未知',
-              // textAlign: TextAlign.right,
-              // style: TextStyle(
-              //   color: equipmentVOS[index].status == 0
-              //       ? Colors.blue
-              //       : equipmentVOS[index].status == 1
-              //       ? Colors.orange
-              //       : equipmentVOS[index].status == 2
-              //       ? Colors.red
-              //       : Colors.black,
-              //   fontSize: GSYConstant.minTextSize,
-              // ),
+          child: Text(
+            _dataList.status == 0
+                  ? '在线'
+                  : _dataList.status == 1
+                  ? '离线'
+                  : _dataList.status == 2
+                  ? '未激活'
+                  : '未知',
+              textAlign: TextAlign.right,
+              style: TextStyle(
+                color: _dataList.status == 0
+                    ? Colors.blue
+                    : _dataList.status == 1
+                    ? Colors.orange
+                    : _dataList.status == 2
+                    ? Colors.red
+                    : Colors.black,
+                fontSize: GSYConstant.minTextSize,
+              ),
               ),
-          // decoration: BoxDecoration(
-          //   border: new Border.all(
-          //     color: equipmentVOS[index].status == 0
-          //         ? Colors.blue
-          //         : equipmentVOS[index].status == 1
-          //         ? Colors.orange
-          //         : equipmentVOS[index].status == 2
-          //         ? Colors.red
-          //         : Colors.black, //边框颜色
-          //     width: 1.0, //边框粗细
-          //   ),
-          //   borderRadius: const BorderRadius.all(
-          //       const Radius.circular(3.0)), //边框的弧度
-          // ),
+          decoration: BoxDecoration(
+            border: new Border.all(
+              color: _dataList.status == 0
+                  ? Colors.blue
+                  : _dataList.status == 1
+                  ? Colors.orange
+                  : _dataList.status == 2
+                  ? Colors.red
+                  : Colors.black, //边框颜色
+              width: 1.0, //边框粗细
+            ),
+            borderRadius: const BorderRadius.all(
+                const Radius.circular(3.0)), //边框的弧度
+          ),
         )
       ]),
     );
   }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
+
+  patrolJobRemark() async {
+    var result = await DioUtil().request('repair-bill/create',
+        method: DioMethod.post, data: {'deviceId': _dataList.id,'repairImgIds':mList,'instructions':note,
+          'urg':groupValue,'theme':theme});
+    if (result['code'] == 0) {
+      setState(() {
+        eventBus.fire(RefreshRepairPage());
+        Navigator.pop(context);
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  uploadList() async {
+    List<MultipartFile> files = [];
+    for (var element in imageFiles) {
+      File? imgFile = await element.file;
+      String? s=imgFile?.path;
+      MultipartFile file =MultipartFile.fromFileSync(s!);
+      files.add(file);
+    }
+    var formData =FormData.fromMap({
+      'files': files
+    });
+    var result = await DioUtil().request('uploadImg/uploadList',
+        method: DioMethod.post, data: formData);
+    if (result['code'] == 0) {
+      UploadListEntityEntity data=uploadListEntityEntityFromJson(UploadListEntityEntity(), result);
+      setState(() {
+        mList.clear();
+        mList.addAll(data.data);
+        patrolJobRemark();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
 }

+ 574 - 0
lib/page/repair/repair_detail.dart

@@ -0,0 +1,574 @@
+import 'package:deus_app/common/dialog/CloseTaskDialog.dart';
+import 'package:deus_app/common/event/RefreshRepairDetail.dart';
+import 'package:deus_app/common/event/RefreshRepairPage.dart';
+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/generated/json/repair_detail_response_entity_helper.dart';
+import 'package:deus_app/main.dart';
+import 'package:deus_app/model/repair_detail_response_entity.dart';
+import 'package:deus_app/page/repair/repair_job_edit.dart';
+import 'package:flutter/material.dart';
+
+class RepairDetail extends StatefulWidget {
+  var id;
+
+  RepairDetail({super.key, required this.id});
+
+  @override
+  State createState() {
+    return _RepairDetail(id);
+  }
+}
+
+class _RepairDetail extends State<RepairDetail> {
+  var id;
+
+  bool type = false;
+
+  RepairDetailResponseData responseData = RepairDetailResponseData();
+
+  List<String> repairImgUrls = [];
+  List<String> repairResUrls = [];
+
+  String buttonText='';
+
+  var _event;
+
+  bool isClose=false;
+
+  _RepairDetail(this.id);
+
+  @override
+  void initState() {
+    super.initState();
+    _load();
+    _event = eventBus.on<RefreshRepairDetail>().listen((event) {
+      setState(() {
+        _load();
+      });
+    });
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      resizeToAvoidBottomInset: false,
+      appBar: TitleBar().backAppbar("报修详情"),
+      backgroundColor: const Color(0xfff2f2f2),
+      body: Stack(
+        children: [
+          Container(
+            margin: EdgeInsets.only(bottom: type ? 60 : 0),
+            child: ListView(
+              children: _Ws(),
+            ),
+          ),
+          Visibility(
+              visible: type,
+              child: Positioned(
+                left: 0,
+                right: 0,
+                bottom: 0,
+                // flex: 7,
+                child: Row(
+                  children: [
+                    Visibility(
+                      visible: isClose,
+                      child: Expanded(
+                        child: SizedBox(
+                          height: 50,
+                          child: TextButton(
+                            onPressed: () {
+                              CloseTaskDialog.showCupertinoAlertDialog(context,
+                                      (msg) {
+                                    closeJob(msg);
+                                  });
+                            },
+                            style: ButtonStyle(
+                              backgroundColor: MaterialStateProperty.all<Color>(
+                                  Colors.blue),
+                              shape: MaterialStateProperty.all(
+                                  BeveledRectangleBorder(
+                                      borderRadius: BorderRadius.circular(0))),
+                              foregroundColor: MaterialStateProperty.all<Color>(
+                                  Colors.white),
+                              // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                            ),
+                            child: const Text(ConstantString.close_job),
+                          ),
+                        ),
+                      ),
+                    ),
+
+                    Expanded(
+                        child: SizedBox(
+                          height: 50,
+                          child: TextButton(
+                            onPressed: () {
+                              if (type) {
+                                if('维修接单'==buttonText){
+                                  CloseTaskDialog.showAlertDialog(context, () {
+                                    receive();
+                                  }, '确认维修接单么?');
+                                }else if('开始维修'==buttonText){
+                                  CloseTaskDialog.showAlertDialog(context, () {
+                                    start();
+                                  }, '确认后不支持更换维修人员');
+                                }else{
+                                  Navigator.push(
+                                      context,
+                                      MaterialPageRoute(
+                                          builder: (context) =>
+                                              RepairJobEdit(responseData: responseData)));
+                                }
+
+                              }
+                            },
+                            style: ButtonStyle(
+                              backgroundColor:
+                              MaterialStateProperty.all<Color>(Color(0xFF4875EC)),
+                              foregroundColor:
+                              MaterialStateProperty.all<Color>(Colors.white),
+                              shape: MaterialStateProperty.all(
+                                  BeveledRectangleBorder(
+                                      borderRadius: BorderRadius.circular(0))),
+                              // padding: MaterialStateProperty.all(EdgeInsets.zero)
+                            ),
+                            child: Text(buttonText),
+                          ),
+                        )),
+                  ],
+                ),
+              ))
+        ],
+      ),
+    );
+  }
+
+  List<Widget> _Ws() {
+    List<Widget> ws = [];
+    ws.add(_patrolJobDetail(responseData));
+    ws.add(_basicInformation());
+    ws.add(_notes());
+    ws.add(_img());
+    return ws;
+  }
+
+  Widget _notes() {
+    return Column(children: [
+      Container(
+        height: 50,
+        padding: EdgeInsets.only(left: 12),
+        alignment: Alignment.centerLeft,
+        child: const Text(
+          '维修结果备注:',
+          style: TextStyle(
+            color: Colors.black,
+            fontSize: GSYConstant.TextSize15,
+          ),
+        ),
+      ),
+      Container(
+        color: Colors.white,
+        padding: EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
+        alignment: Alignment.centerLeft,
+        child: Text(
+          responseData.repResRemarks == null
+              ? '无'
+              : responseData.repResRemarks!,
+          style: const TextStyle(
+            color: Colors.black,
+            fontSize: GSYConstant.TextSize15,
+          ),
+        ),
+      ),
+    ]);
+  }
+
+  Widget _img() {
+    return Column(children: [
+      Container(
+        height: 50,
+        padding: EdgeInsets.only(left: 12),
+        alignment: Alignment.centerLeft,
+        child: const Text(
+          '维修图片:',
+          style: TextStyle(
+            color: Colors.black,
+            fontSize: GSYConstant.TextSize15,
+          ),
+        ),
+      ),
+      Container(
+        width: double.infinity,
+        margin: EdgeInsets.only(bottom: 5),
+        padding: repairResUrls.isNotEmpty?EdgeInsets.only(right: 12, top: 10):EdgeInsets.only(right: 0, top: 0),
+        color: Colors.white,
+        child: Wrap(
+            children: repairResUrls.map((e) => _buildImage(e)).toList()),
+        alignment: Alignment.centerLeft,
+      )
+    ]);
+  }
+
+  Widget _basicInformation() {
+    return Column(children: [
+      Container(
+        height: 50,
+        padding: EdgeInsets.only(left: 12),
+        alignment: Alignment.centerLeft,
+        child: const Text(
+          '基本信息:',
+          style: TextStyle(
+            color: Colors.black,
+            fontSize: GSYConstant.TextSize15,
+          ),
+        ),
+      ),
+      Container(
+        color: Colors.white,
+        padding: EdgeInsets.only(left: 12, right: 12, top: 15, bottom: 15),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                const Text(
+                  '紧急程度:',
+                  style: GSYConstant.smallTextLight,
+                ),
+                Text(
+                  responseData.urg == 1 ? "一般" : "紧急",
+                  style: GSYConstant.smallTextLight,
+                  textAlign: TextAlign.right,
+                ),
+              ],
+            ),
+            const SizedBox(
+              height: 12,
+            ),
+            Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
+              const Text(
+                '报修设备:',
+                style: GSYConstant.smallTextLight,
+              ),
+              Text(
+                responseData.device == null
+                    ? ''
+                    : responseData.device!.showName!,
+                style: GSYConstant.smallTextLight,
+                textAlign: TextAlign.right,
+              ),
+            ]),
+            const SizedBox(
+              height: 12,
+            ),
+            Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
+              const Text(
+                '报修说明:',
+                style: GSYConstant.smallTextLight,
+              ),
+              Text(
+                responseData.instructions == null
+                    ? '无'
+                    : responseData.instructions!,
+                style: GSYConstant.smallTextLight,
+                textAlign: TextAlign.right,
+              ),
+            ]),
+            const SizedBox(
+              height: 12,
+            ),
+            const Text(
+              '图片说明:',
+              style: GSYConstant.smallTextLight,
+              textAlign: TextAlign.left,
+            ),
+            const SizedBox(
+              height: 10,
+            ),
+            Container(
+              width: double.infinity,
+              // margin: EdgeInsets.only(bottom: 5),
+              // padding: fileUrls.isNotEmpty?EdgeInsets.only(right: 12, top: 10):EdgeInsets.only(right: 0, top: 0),
+              color: Colors.white,
+              child: Wrap(
+                  children: repairImgUrls.map((e) => _buildImage(e)).toList()),
+              alignment: Alignment.centerLeft,
+            )
+          ],
+        ),
+      )
+    ]);
+  }
+
+  Widget _buildImage(String imageData) {
+    return Container(
+        margin: EdgeInsets.only(left: 12, bottom: 10),
+        width: MediaQuery.of(context).size.width / 4,
+        height: MediaQuery.of(context).size.width / 4,
+        child: Image.network(
+          imageData,
+          fit: BoxFit.fill,
+        ));
+  }
+
+  Widget _patrolJobDetail(RepairDetailResponseData patrolJobDetailData) {
+    return Column(
+      children: [
+        Row(
+          children: [
+            Container(
+              margin: EdgeInsets.only(top: 10, left: 12),
+              // padding: EdgeInsets.fromLTRB(12, 0, 0, 0),
+              alignment: Alignment.bottomLeft,
+              child: Text(
+                patrolJobDetailData.theme == null
+                    ? '暂无'
+                    : patrolJobDetailData.theme!,
+                style: TextStyle(
+                    fontSize: GSYConstant.middleTextWhiteSize,
+                    fontWeight: FontWeight.bold),
+              ),
+            ),
+            Container(
+              margin: const EdgeInsets.only(top: 10, left: 10),
+              padding: const EdgeInsets.fromLTRB(3, 2, 3, 2),
+              alignment: Alignment.centerLeft,
+              decoration: BoxDecoration(
+                border: Border.all(
+                  color: patrolJobDetailData.status == 1 ||
+                          patrolJobDetailData.status == 2
+                      ? Colors.red
+                      : patrolJobDetailData.status == 3
+                          ? Colors.orange
+                          : patrolJobDetailData.status == 4 ||
+                                  patrolJobDetailData.status == 5
+                              ? Colors.blue
+                              : Colors.black, //边框颜色
+                  width: 1.0, //边框粗细
+                ),
+                borderRadius:
+                    const BorderRadius.all(const Radius.circular(3.0)), //边框的弧度
+              ),
+              child: Text(
+                patrolJobDetailData.status == 1
+                    ? '待接单'
+                    : patrolJobDetailData.status == 2
+                        ? '待执行'
+                        : patrolJobDetailData.status == 3
+                            ? '维修中'
+                            : patrolJobDetailData.status == 4
+                                ? '已关闭'
+                                : patrolJobDetailData.status == 5
+                                    ? '已完成'
+                                    : '未知',
+                style: TextStyle(
+                  fontSize: GSYConstant.minTextSize,
+                  color: patrolJobDetailData.status == 1 ||
+                          patrolJobDetailData.status == 2
+                      ? Colors.red
+                      : patrolJobDetailData.status == 3
+                          ? Colors.orange
+                          : patrolJobDetailData.status == 4 ||
+                                  patrolJobDetailData.status == 5
+                              ? Colors.blue
+                              : Colors.black, //边框颜色
+                ),
+              ),
+            )
+          ],
+        ),
+        Container(
+          margin: const EdgeInsets.only(top: 10, left: 12, bottom: 12),
+          alignment: Alignment.centerLeft,
+          child: Text(
+            '报修单号:  ' + patrolJobDetailData.repNum,
+            style: TextStyle(
+              fontSize: GSYConstant.smallTextSize,
+            ),
+          ),
+        ),
+        // Divider(
+        //   height: 0.8,
+        //   indent: 5.0,
+        //   endIndent: 5.0,
+        //   color: Colors.grey,
+        // ),
+        Container(
+          decoration: BoxDecoration(color: Colors.white),
+          child: Column(
+            children: [
+              Container(
+                padding: EdgeInsets.fromLTRB(12, 15, 12, 0),
+                alignment: Alignment.centerLeft,
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    new Text(
+                      '申请人:',
+                      style: GSYConstant.smallTextLight,
+                    ),
+                    Container(
+                      child: Text(
+                        patrolJobDetailData.applicant,
+                        style: GSYConstant.smallTextLight,
+                        textAlign: TextAlign.right,
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+              Container(
+                padding: EdgeInsets.fromLTRB(12, 12, 12, 0),
+                child: Row(
+                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  children: [
+                    new Text(
+                      '申请时间:',
+                      style: GSYConstant.smallTextLight,
+                    ),
+                    Container(
+                      child: Text(
+                        patrolJobDetailData.applicationTime,
+                        style: GSYConstant.smallTextLight,
+                        textAlign: TextAlign.right,
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+              Container(
+                  padding: EdgeInsets.fromLTRB(12, 12, 12, 0),
+                  child: Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        new Text(
+                          '维修人员:',
+                          style: GSYConstant.smallTextLight,
+                        ),
+                        Container(
+                          child: Text(
+                            patrolJobDetailData.maintainer,
+                            style: GSYConstant.smallTextLight,
+                            textAlign: TextAlign.right,
+                          ),
+                        ),
+                      ])),
+              Container(
+                  padding: EdgeInsets.fromLTRB(12, 12, 12, 0),
+                  child: Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        new Text(
+                          '接单时间:',
+                          style: GSYConstant.smallTextLight,
+                        ),
+                        Container(
+                          child: Text(
+                            patrolJobDetailData.orderRecTime,
+                            style: GSYConstant.smallTextLight,
+                            textAlign: TextAlign.right,
+                          ),
+                        ),
+                      ])),
+              Container(
+                  padding: EdgeInsets.fromLTRB(12, 12, 12, 15),
+                  child: Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        const Text(
+                          '完成时间:',
+                          style: GSYConstant.smallTextLight,
+                        ),
+                        Text(
+                          patrolJobDetailData.completeTime,
+                          style: GSYConstant.smallTextLight,
+                          textAlign: TextAlign.right,
+                        ),
+                      ])),
+            ],
+          ),
+        ),
+      ],
+    );
+  }
+
+  _load() async {
+    var result = await DioUtil().request('repair-bill/app-detail',
+        method: DioMethod.post, data: {'id': id});
+    RepairDetailResponseEntity patrolJobResponse =
+        repairDetailResponseEntityFromJson(
+            RepairDetailResponseEntity(), result);
+    if (patrolJobResponse.code == 0) {
+      setState(() {
+        responseData = patrolJobResponse.data;
+        repairImgUrls.clear();
+        repairImgUrls.addAll(responseData.repairImgUrls);
+        repairResUrls.clear();
+        repairResUrls.addAll(responseData.repairResUrls);
+        if (responseData.status == 1 || responseData.status == 2|| responseData.status == 3) {
+          type = true;
+          if(responseData.status == 1){
+            isClose=true;
+            buttonText='维修接单';
+          }else if(responseData.status==2){
+            isClose=false;
+            buttonText='开始维修';
+          }else if(responseData.status==3){
+            buttonText='登记维修';
+          }
+        }
+      });
+    } else {
+      showToast(patrolJobResponse.msg);
+    }
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
+
+  closeJob(String msg) async {
+    var result = await DioUtil().request('patrolJob/closeJob',
+        method: DioMethod.post, data: {'id': id, 'closeReason': msg});
+    if (0 == result['code']) {
+      setState(() {
+        eventBus.fire(RefreshRepairPage());
+        Navigator.pop(context);
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  receive() async {
+    var result = await DioUtil().request('repair-bill/receive',
+        method: DioMethod.post, data: {'id': id});
+    if (0 == result['code']) {
+      setState(() {
+        _load();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  start() async {
+    var result = await DioUtil().request('repair-bill/start',
+        method: DioMethod.post, data: {'id': id});
+    if (0 == result['code']) {
+      setState(() {
+        _load();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+}

+ 25 - 25
lib/page/repair/repair_job_device_list.dart

@@ -3,35 +3,36 @@ import 'package:deus_app/common/style/gsy_style.dart';
 import 'package:deus_app/common/utils/DioUtil.dart';
 import 'package:deus_app/common/utils/ToastUtils.dart';
 import 'package:deus_app/generated/json/repair_query_device_response_entity_helper.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/repair_query_device_response_entity.dart';
 import 'package:flutter/material.dart';
 
 class RepairJobDeviceList extends StatefulWidget {
-
   @override
   State createState() {
     return new _RepairJobDeviceList();
   }
-
 }
 
 class _RepairJobDeviceList extends State<RepairJobDeviceList> {
+  RepairQueryDeviceResponseEntity data = RepairQueryDeviceResponseEntity();
 
-  RepairQueryDeviceResponseEntity data=RepairQueryDeviceResponseEntity();
+  List<RepairQueryDeviceResponseDataList> mList = [];
 
-  List<RepairQueryDeviceResponseDataList>mList=[];
 
   @override
   void initState() {
     super.initState();
     patrolItemModel();
   }
+
+
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      appBar: TitleBar().backAppbar("添加巡检项目"),
-        body: Expanded(
-        child: Container(
+        appBar: TitleBar().backAppbar("添加巡检项目"),
+        backgroundColor: const Color(0xfff2f2f2),
+        body: Container(
           child: ListView.builder(
             itemCount: mList.length,
             itemBuilder: (context, index) {
@@ -62,19 +63,19 @@ class _RepairJobDeviceList extends State<RepairJobDeviceList> {
                                   mList[index].status == 0
                                       ? '在线'
                                       : mList[index].status == 1
-                                      ? '离线'
-                                      : mList[index].status == 2
-                                      ? '未激活'
-                                      : '未知',
+                                          ? '离线'
+                                          : mList[index].status == 2
+                                              ? '未激活'
+                                              : '未知',
                                   textAlign: TextAlign.right,
                                   style: TextStyle(
                                     color: mList[index].status == 0
                                         ? Colors.blue
                                         : mList[index].status == 1
-                                        ? Colors.orange
-                                        : mList[index].status == 2
-                                        ? Colors.red
-                                        : Colors.black,
+                                            ? Colors.orange
+                                            : mList[index].status == 2
+                                                ? Colors.red
+                                                : Colors.black,
                                     fontSize: GSYConstant.minTextSize,
                                   ),
                                 ),
@@ -83,10 +84,10 @@ class _RepairJobDeviceList extends State<RepairJobDeviceList> {
                                     color: mList[index].status == 0
                                         ? Colors.blue
                                         : mList[index].status == 1
-                                        ? Colors.orange
-                                        : mList[index].status == 2
-                                        ? Colors.red
-                                        : Colors.black, //边框颜色
+                                            ? Colors.orange
+                                            : mList[index].status == 2
+                                                ? Colors.red
+                                                : Colors.black, //边框颜色
                                     width: 1.0, //边框粗细
                                   ),
                                   borderRadius: const BorderRadius.all(
@@ -100,19 +101,18 @@ class _RepairJobDeviceList extends State<RepairJobDeviceList> {
                       ],
                     ),
                     onTap: () {
-
+                      eventBus.fire(mList[index]);
+                      Navigator.pop(context);
                     },
                   ));
             },
           ),
-        )
-        )
-    );
+        ));
   }
 
   patrolItemModel() async {
     var result = await DioUtil().request('repair-bill/query-device',
-        method: DioMethod.post, data: {'index': 1, 'size': 50});
+        method: DioMethod.post, data: {'query': {}});
     if (0 == result['code']) {
       setState(() {
         data = repairQueryDeviceResponseEntityFromJson(
@@ -124,4 +124,4 @@ class _RepairJobDeviceList extends State<RepairJobDeviceList> {
       showToast(result['msg']);
     }
   }
-}
+}

+ 268 - 0
lib/page/repair/repair_job_edit.dart

@@ -0,0 +1,268 @@
+import 'dart:io';
+
+import 'package:deus_app/PhotoTool.dart';
+import 'package:deus_app/common/event/RefreshRepairDetail.dart';
+import 'package:deus_app/common/event/RefreshRepairPage.dart';
+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/generated/json/upload_list_entity_entity_helper.dart';
+import 'package:deus_app/main.dart';
+import 'package:deus_app/model/maint_job_items_list_response_entity.dart';
+import 'package:deus_app/model/repair_detail_response_entity.dart';
+import 'package:deus_app/model/upload_list_entity_entity.dart';
+import 'package:dio/dio.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:wechat_assets_picker/wechat_assets_picker.dart';
+
+
+class RepairJobEdit extends StatefulWidget {
+
+  static var routeName = "/PatrolJobEdit";
+
+  RepairDetailResponseData responseData;
+  @override
+  State createState() {
+    return _RepairJobEdit(responseData);
+  }
+  RepairJobEdit({super.key, required this.responseData});
+}
+
+class _RepairJobEdit extends State<RepairJobEdit> {
+
+  List<MaintJobItemsListResponseData> patrolItemVOS = <MaintJobItemsListResponseData>[];
+
+  List<AssetEntity> imageFiles = [];
+
+  List<int>mList=[];
+
+  RepairDetailResponseData responseData;
+
+  var _event;
+
+  String note='';
+
+  _RepairJobEdit(this.responseData);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        resizeToAvoidBottomInset: false,
+        appBar: TitleBar().backAppbar("登记维修"),
+        backgroundColor: const Color(0xfff2f2f2),
+        body: Column(
+          children: [
+            Expanded(
+              // flex: 7,
+              child: ListView(
+                children: _Ws(),
+              ),
+            ),
+            Container(
+              height: 50,
+              // flex: 7,
+              child: Row(
+                children: [
+                  Expanded(
+                    child: SizedBox(
+                      height: 50,
+                      child: TextButton(
+                        onPressed: () {
+                          if(imageFiles.isNotEmpty){
+                            uploadList();
+                          }else{
+                            patrolJobRemark();
+                          }
+                        },
+                        child: Text(ConstantString.completeRepair),
+                        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)
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            )
+          ],
+        ));
+  }
+
+  List<Widget> _Ws() {
+    List<Widget> ws = [];
+    ws.add(_mainPatrolAdd());
+    ws.add(_notes());
+    ws.add(_picture());
+    // ws.add(_url());
+    return ws;
+  }
+
+  Widget _picture(){
+    return Container(
+        child: Column(
+          children: [
+            Container(
+              height: 50,
+              padding: EdgeInsets.only(left: 12),
+              alignment: Alignment.centerLeft,
+              child: Text('巡检图片',style: TextStyle(
+                color: Colors.black,
+                fontSize: GSYConstant.TextSize15,
+              )),
+            ),
+            Container(
+              // padding: EdgeInsets.only(left: 12,right: 12),
+              decoration: BoxDecoration(color: Colors.white),
+              child: PhotoTool(imageCount: 5, lineCount: 5, addCall: (List<AssetEntity> _imageFiles){
+                imageFiles.addAll(_imageFiles);
+              }, removeCall:(int index){
+                imageFiles.remove(index);
+              }),
+            )
+          ],
+        )
+    );
+  }
+
+  Widget _notes(){
+    return Container(
+      child: Column(
+        children: <Widget>[
+          Container(
+            height: 50,
+            padding: EdgeInsets.only(left: 12),
+            alignment: Alignment.centerLeft,
+            child: Text('任务结果备注',style: TextStyle(
+              color: Colors.black,
+              fontSize: GSYConstant.TextSize15,
+            )),
+          ),
+          Container(
+            padding: EdgeInsets.only(left: 12,right: 12,bottom: 12),
+            decoration: BoxDecoration(color: Colors.white),
+            child: Column(
+              children: [
+                const SizedBox(
+                  height: 10,
+                ),
+                TextField(
+                  maxLines: 5,
+                  decoration: InputDecoration(border: OutlineInputBorder()),
+                  style: TextStyle(fontSize: 14),
+                  onChanged: (value) {
+                    note = value;
+                  },
+                )
+              ],
+            ),
+          )
+        ],
+      ),
+    );
+  }
+
+  Widget _mainPatrolAdd(){
+    return Column(
+      children: [
+        Container(
+          padding: EdgeInsets.fromLTRB(12,0, 12, 0),
+          alignment: Alignment.centerLeft,
+          height: 50,
+          child: Text(
+                '设备信息:',
+                style: TextStyle(
+                  color: Colors.black,
+                  fontSize: GSYConstant.TextSize15,
+                ),
+          ),
+        ),
+        Container(
+          // padding: const EdgeInsets.fromLTRB(30.0, 0.0, 0.0, 0.0),
+          alignment: Alignment.centerLeft,
+          color: Colors.white,
+          padding: EdgeInsets.fromLTRB(12,15, 12, 15),
+          child: Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                Text(responseData.deviceName!,
+                    style: GSYConstant.smallTextBold),
+                Text(
+                  '未维修',
+                  style: TextStyle(
+                      fontSize: GSYConstant.smallTextSize,
+                      color: Colors.red),
+                ),
+              ]),
+        ),
+      ],
+    );
+  }
+
+  @override
+  void initState() {
+    super.initState();
+    // patrolItem();
+    // _event = eventBus.on<RefreshMaintEdit>().listen((event) {
+    //   setState(() {
+    //     patrolItem();
+    //   });
+    // });
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
+
+  uploadList() async {
+    List<MultipartFile> files = [];
+    for (var element in imageFiles) {
+      File? imgFile = await element.file;
+      String? s=imgFile?.path;
+      MultipartFile file =MultipartFile.fromFileSync(s!);
+      files.add(file);
+    }
+    var formData =FormData.fromMap({
+      'files': files
+    });
+    var result = await DioUtil().request('uploadImg/uploadList',
+        method: DioMethod.post, data: formData);
+    if (result['code'] == 0) {
+      UploadListEntityEntity data=uploadListEntityEntityFromJson(UploadListEntityEntity(), result);
+      setState(() {
+        mList.clear();
+        mList.addAll(data.data);
+        patrolJobRemark();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+  patrolJobRemark() async {
+    var result = await DioUtil().request('repair-bill/app-complete',
+        method: DioMethod.post, data: {'id': responseData.id,'repairResIds':mList,'remarks':note});
+    if (result['code'] == 0) {
+      setState(() {
+        eventBus.fire(RefreshRepairDetail());
+        eventBus.fire(RefreshRepairPage());
+        Navigator.of(context).pop();
+      });
+    } else {
+      showToast(result['msg']);
+    }
+  }
+
+
+}

+ 19 - 3
lib/page/repair/repair_page.dart

@@ -1,9 +1,11 @@
 //巡检任务列表
+import 'package:deus_app/common/event/RefreshRepairPage.dart';
 import 'package:deus_app/common/style/TitleBar.dart';
 import 'package:deus_app/generated/json/repair_bill_list_response_entity_helper.dart';
+import 'package:deus_app/main.dart';
 import 'package:deus_app/model/repair_bill_list_response_entity.dart';
-import 'package:deus_app/page/patrol/patrol_job_detail.dart';
 import 'package:deus_app/page/repair/repair_add_page.dart';
+import 'package:deus_app/page/repair/repair_detail.dart';
 import 'package:deus_app/widget/RepairJobDrawer.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -39,6 +41,7 @@ class _RepairPage extends State<RepairPage> {
   dynamic _status;
   String _theme = '';
   String _repNum = '';
+  var _event;
 
   _load() async {
     var result = await DioUtil()
@@ -67,16 +70,28 @@ class _RepairPage extends State<RepairPage> {
   }
 
   @override
+  void dispose() {
+    super.dispose();
+    _event.cancel();
+  }
+
+  @override
   void initState() {
     super.initState();
     _load();
+    _event = eventBus.on<RefreshRepairPage>().listen((event) {
+      setState(() {
+        index=1;
+        _load();
+      });
+    });
   }
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
         key: _scaffoldKey,
-        appBar: TitleBar().drawAppBar(ConstantString.patrolJobText, () {
+        appBar: TitleBar().drawAppBar(ConstantString.repairJobText, () {
           _scaffoldKey.currentState?.openEndDrawer();
         }),
         endDrawer: RepairJobDrawer(
@@ -352,7 +367,7 @@ class _RepairPage extends State<RepairPage> {
                 context,
                 MaterialPageRoute(
                     builder: (context) =>
-                        new PatrolJobDetail(id: patrolJobData.id)));
+                        new RepairDetail(id: patrolJobData.id)));
           },
         ));
   }
@@ -377,4 +392,5 @@ class _RepairPage extends State<RepairPage> {
       });
     }
   }
+
 }