浏览代码

原来已经完成的内容

半月迎风coder 5 年之前
父节点
当前提交
89cb9d6502
共有 37 个文件被更改,包括 5668 次插入7 次删除
  1. 538 0
      SolarStation.xcodeproj/project.pbxproj
  2. 二进制
      SolarStation.xcworkspace/xcuserdata/weclouds.xcuserdatad/UserInterfaceState.xcuserstate
  3. 171 0
      SolarStation/Controller/SSAccountVCtr.swift
  4. 5 0
      SolarStation/Info.plist
  5. 93 0
      SolarStation/KKWPickerView.swift
  6. 30 0
      SolarStation/LeftTitleButton.swift
  7. 50 0
      SolarStation/MainViewController.swift
  8. 2 2
      SolarStation/NetWorkBaseApi.swift
  9. 12 5
      SolarStation/NetWorkConfig.swift
  10. 1 0
      SolarStation/NetWorkManager.swift
  11. 84 0
      SolarStation/RootNavigationController.swift
  12. 233 0
      SolarStation/SSAlarmCell.swift
  13. 185 0
      SolarStation/SSAlarmHeader.swift
  14. 22 0
      SolarStation/SSLoginDataEngine.swift
  15. 172 0
      SolarStation/SSPickerView.swift
  16. 359 0
      SolarStation/SSReportVCtr.swift
  17. 22 0
      SolarStation/SSReportVCtr.xib
  18. 92 0
      SolarStation/SwiftPopup/SwiftPopup/SwiftPopup.swift
  19. 72 0
      SolarStation/SwiftPopup/SwiftPopup/SwiftPopupAnimation.swift
  20. 60 0
      SolarStation/SwiftPopup/SwiftPopup/SwiftPopupPresentationController.swift
  21. 296 0
      SolarStation/TranslucentView.swift
  22. 38 0
      SolarStation/View/SSAccoutCell.swift
  23. 75 0
      SolarStation/View/SSAccoutCell.xib
  24. 105 0
      SolarStation/moya/AlarmApi.swift
  25. 311 0
      SolarStation/moya/DeviceApi.swift
  26. 103 0
      SolarStation/moya/HomeApi.swift
  27. 661 0
      SolarStation/moya/HttpRequest.swift
  28. 64 0
      SolarStation/moya/LoginApi.swift
  29. 94 0
      SolarStation/moya/ProjectApi.swift
  30. 49 0
      SolarStation/moya/ProviderSupport.swift
  31. 226 0
      SolarStation/moya/StationApi.swift
  32. 92 0
      SolarStation/moya/model/AlarmApiModel.swift
  33. 621 0
      SolarStation/moya/model/DeviceApiModel.swift
  34. 217 0
      SolarStation/moya/model/HomeApiModel.swift
  35. 67 0
      SolarStation/moya/model/LoginApiModel.swift
  36. 92 0
      SolarStation/moya/model/ProjectApiModel.swift
  37. 354 0
      SolarStation/moya/model/StationApiModel.swift

+ 538 - 0
SolarStation.xcodeproj/project.pbxproj

@@ -7,6 +7,101 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		8347D44524F2024F00E10E49 /* SSLoginDataEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44424F2024F00E10E49 /* SSLoginDataEngine.swift */; };
+		8347D45624F2136C00E10E49 /* LoginApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44724F2136C00E10E49 /* LoginApi.swift */; };
+		8347D45724F2136C00E10E49 /* ProviderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44824F2136C00E10E49 /* ProviderSupport.swift */; };
+		8347D45824F2136C00E10E49 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44924F2136C00E10E49 /* HttpRequest.swift */; };
+		8347D45924F2136C00E10E49 /* ProjectApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44A24F2136C00E10E49 /* ProjectApi.swift */; };
+		8347D45A24F2136C00E10E49 /* AlarmApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44B24F2136C00E10E49 /* AlarmApi.swift */; };
+		8347D45B24F2136C00E10E49 /* ProjectApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44D24F2136C00E10E49 /* ProjectApiModel.swift */; };
+		8347D45C24F2136C00E10E49 /* LoginApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44E24F2136C00E10E49 /* LoginApiModel.swift */; };
+		8347D45D24F2136C00E10E49 /* HomeApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D44F24F2136C00E10E49 /* HomeApiModel.swift */; };
+		8347D45E24F2136C00E10E49 /* AlarmApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45024F2136C00E10E49 /* AlarmApiModel.swift */; };
+		8347D45F24F2136C00E10E49 /* DeviceApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45124F2136C00E10E49 /* DeviceApiModel.swift */; };
+		8347D46024F2136C00E10E49 /* StationApiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45224F2136C00E10E49 /* StationApiModel.swift */; };
+		8347D46124F2136C00E10E49 /* HomeApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45324F2136C00E10E49 /* HomeApi.swift */; };
+		8347D46224F2136C00E10E49 /* DeviceApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45424F2136C00E10E49 /* DeviceApi.swift */; };
+		8347D46324F2136C00E10E49 /* StationApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D45524F2136C00E10E49 /* StationApi.swift */; };
+		8347D46C24F258F800E10E49 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D46A24F258F800E10E49 /* MainViewController.swift */; };
+		8347D46D24F258F800E10E49 /* RootNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D46B24F258F800E10E49 /* RootNavigationController.swift */; };
+		8347D47324F2591000E10E49 /* SSAccountVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D46F24F2591000E10E49 /* SSAccountVCtr.swift */; };
+		8347D47424F2591000E10E49 /* SSAccoutCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8347D47124F2591000E10E49 /* SSAccoutCell.xib */; };
+		8347D47524F2591000E10E49 /* SSAccoutCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47224F2591000E10E49 /* SSAccoutCell.swift */; };
+		8347D48D24F2591A00E10E49 /* SSHomeVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47724F2591A00E10E49 /* SSHomeVCtr.swift */; };
+		8347D48E24F2591A00E10E49 /* SSMapVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47824F2591A00E10E49 /* SSMapVCtr.swift */; };
+		8347D48F24F2591A00E10E49 /* SSStationSearchVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47924F2591A00E10E49 /* SSStationSearchVCtr.swift */; };
+		8347D49024F2591A00E10E49 /* SKSearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47A24F2591A00E10E49 /* SKSearchController.swift */; };
+		8347D49124F2591A00E10E49 /* SKSearchEventsCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47B24F2591A00E10E49 /* SKSearchEventsCenter.swift */; };
+		8347D49224F2591A00E10E49 /* SSSearchResultVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47C24F2591A00E10E49 /* SSSearchResultVCtr.swift */; };
+		8347D49324F2591A00E10E49 /* 88-下.png in Resources */ = {isa = PBXBuildFile; fileRef = 8347D47E24F2591A00E10E49 /* 88-下.png */; };
+		8347D49424F2591A00E10E49 /* SSSearchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D47F24F2591A00E10E49 /* SSSearchCell.swift */; };
+		8347D49524F2591A00E10E49 /* SSElectricty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48024F2591A00E10E49 /* SSElectricty.swift */; };
+		8347D49624F2591A00E10E49 /* SSCalloutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48224F2591A00E10E49 /* SSCalloutView.swift */; };
+		8347D49724F2591A00E10E49 /* BubbleLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48324F2591A00E10E49 /* BubbleLayer.m */; };
+		8347D49824F2591A00E10E49 /* SSAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48424F2591A00E10E49 /* SSAnnotationView.swift */; };
+		8347D49924F2591A00E10E49 /* SSStationMapCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48624F2591A00E10E49 /* SSStationMapCell.swift */; };
+		8347D49A24F2591A00E10E49 /* SSBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48724F2591A00E10E49 /* SSBubbleView.swift */; };
+		8347D49B24F2591A00E10E49 /* SSMapVCtr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8347D48824F2591A00E10E49 /* SSMapVCtr.xib */; };
+		8347D49C24F2591A00E10E49 /* RectangleAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48A24F2591A00E10E49 /* RectangleAnnotationView.swift */; };
+		8347D49D24F2591A00E10E49 /* SSHomeItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D48B24F2591A00E10E49 /* SSHomeItem.swift */; };
+		8347D49E24F2591A00E10E49 /* SSHomeVCtr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8347D48C24F2591A00E10E49 /* SSHomeVCtr.xib */; };
+		8347D4D624F2593F00E10E49 /* SSStationMessageTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A024F2593E00E10E49 /* SSStationMessageTabView.swift */; };
+		8347D4D724F2593F00E10E49 /* SSStationHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A124F2593E00E10E49 /* SSStationHeaderCell.swift */; };
+		8347D4D824F2593F00E10E49 /* SSStationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A224F2593E00E10E49 /* SSStationListView.swift */; };
+		8347D4D924F2593F00E10E49 /* SSStationListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A324F2593E00E10E49 /* SSStationListCell.swift */; };
+		8347D4DA24F2593F00E10E49 /* SSRefreshPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A424F2593E00E10E49 /* SSRefreshPopView.swift */; };
+		8347D4DB24F2593F00E10E49 /* SSProjectVCtr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8347D4A524F2593E00E10E49 /* SSProjectVCtr.xib */; };
+		8347D4DC24F2593F00E10E49 /* SSCurveChartsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A624F2593E00E10E49 /* SSCurveChartsView.swift */; };
+		8347D4DD24F2593F00E10E49 /* SSAddNewProjectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A724F2593E00E10E49 /* SSAddNewProjectCell.swift */; };
+		8347D4DE24F2593F00E10E49 /* SSStationChartsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4A924F2593E00E10E49 /* SSStationChartsCell.swift */; };
+		8347D4DF24F2593F00E10E49 /* XYMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AA24F2593E00E10E49 /* XYMarkerView.swift */; };
+		8347D4E024F2593F00E10E49 /* BalloonMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AB24F2593E00E10E49 /* BalloonMarker.swift */; };
+		8347D4E124F2593F00E10E49 /* SSBatteryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AC24F2593E00E10E49 /* SSBatteryCell.swift */; };
+		8347D4E224F2593F00E10E49 /* SSEquipmentParamterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AD24F2593E00E10E49 /* SSEquipmentParamterCell.swift */; };
+		8347D4E324F2593F00E10E49 /* SSSolarPanelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AE24F2593E00E10E49 /* SSSolarPanelCell.swift */; };
+		8347D4E424F2593F00E10E49 /* RadarMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4AF24F2593E00E10E49 /* RadarMarkerView.swift */; };
+		8347D4E524F2593F00E10E49 /* SSEquipmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B024F2593E00E10E49 /* SSEquipmentCell.swift */; };
+		8347D4E624F2593F00E10E49 /* SSDataDetialCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B124F2593E00E10E49 /* SSDataDetialCell.swift */; };
+		8347D4E724F2593F00E10E49 /* SSLoadCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B224F2593E00E10E49 /* SSLoadCell.swift */; };
+		8347D4E824F2593F00E10E49 /* SSsDataViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B324F2593E00E10E49 /* SSsDataViewCell.swift */; };
+		8347D4E924F2593F00E10E49 /* SSEquipmentInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B424F2593E00E10E49 /* SSEquipmentInfoCell.swift */; };
+		8347D4EA24F2593F00E10E49 /* AddressRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B524F2593E00E10E49 /* AddressRow.swift */; };
+		8347D4EB24F2593F00E10E49 /* SSAddNewProjectVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B724F2593E00E10E49 /* SSAddNewProjectVCtr.swift */; };
+		8347D4EC24F2593F00E10E49 /* SSAddNewStionVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4B924F2593E00E10E49 /* SSAddNewStionVCtr.swift */; };
+		8347D4ED24F2593F00E10E49 /* SSBatteryInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4BC24F2593E00E10E49 /* SSBatteryInfoVCtr.swift */; };
+		8347D4EE24F2593F00E10E49 /* SSBaseInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4BD24F2593E00E10E49 /* SSBaseInfoVCtr.swift */; };
+		8347D4EF24F2593F00E10E49 /* SSLoadInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4BE24F2593E00E10E49 /* SSLoadInfoVCtr.swift */; };
+		8347D4F024F2593F00E10E49 /* SSBaseStaionInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4BF24F2593E00E10E49 /* SSBaseStaionInfoVCtr.swift */; };
+		8347D4F124F2593F00E10E49 /* SSBatteryPanelVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C024F2593E00E10E49 /* SSBatteryPanelVCtr.swift */; };
+		8347D4F224F2593F00E10E49 /* SSGeoInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C124F2593E00E10E49 /* SSGeoInfoVCtr.swift */; };
+		8347D4F324F2593F00E10E49 /* SSSurveyVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C224F2593E00E10E49 /* SSSurveyVCtr.swift */; };
+		8347D4F424F2593F00E10E49 /* SSStationVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C324F2593E00E10E49 /* SSStationVCtr.swift */; };
+		8347D4F524F2593F00E10E49 /* SSStationInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C424F2593E00E10E49 /* SSStationInfoVCtr.swift */; };
+		8347D4F624F2593F00E10E49 /* SSSeeDetailVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C624F2593E00E10E49 /* SSSeeDetailVCtr.swift */; };
+		8347D4F724F2593F00E10E49 /* SSAddEquiqmentVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C724F2593E00E10E49 /* SSAddEquiqmentVCtr.swift */; };
+		8347D4F824F2593F00E10E49 /* SSEquipInfoVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4C924F2593E00E10E49 /* SSEquipInfoVCtr.swift */; };
+		8347D4F924F2593F00E10E49 /* SSCurveVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4CA24F2593E00E10E49 /* SSCurveVCtr.swift */; };
+		8347D4FA24F2593F00E10E49 /* SSInverterSetVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4CC24F2593E00E10E49 /* SSInverterSetVCtr.swift */; };
+		8347D4FB24F2593F00E10E49 /* SSLoadParamSetVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4CD24F2593E00E10E49 /* SSLoadParamSetVCtr.swift */; };
+		8347D4FC24F2593F00E10E49 /* SSDeviceBatterySetVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4CE24F2593E00E10E49 /* SSDeviceBatterySetVCtr.swift */; };
+		8347D4FD24F2593F00E10E49 /* SSMonitoringVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4CF24F2593E00E10E49 /* SSMonitoringVCtr.swift */; };
+		8347D4FE24F2593F00E10E49 /* SSParamSettingVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D024F2593E00E10E49 /* SSParamSettingVCtr.swift */; };
+		8347D4FF24F2593F00E10E49 /* SSDataDetailVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D124F2593E00E10E49 /* SSDataDetailVCtr.swift */; };
+		8347D50024F2593F00E10E49 /* SSEquipmentVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D224F2593E00E10E49 /* SSEquipmentVCtr.swift */; };
+		8347D50124F2593F00E10E49 /* SSResfreshTimeVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D324F2593E00E10E49 /* SSResfreshTimeVCtr.swift */; };
+		8347D50224F2593F00E10E49 /* SSProjectVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D424F2593E00E10E49 /* SSProjectVCtr.swift */; };
+		8347D50324F2593F00E10E49 /* SSPickerVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D4D524F2593E00E10E49 /* SSPickerVCtr.swift */; };
+		8347D51124F2595200E10E49 /* LeftTitleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50424F2595100E10E49 /* LeftTitleButton.swift */; };
+		8347D51224F2595200E10E49 /* SSAlarmCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50524F2595100E10E49 /* SSAlarmCell.swift */; };
+		8347D51324F2595200E10E49 /* SSReportVCtr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50624F2595100E10E49 /* SSReportVCtr.swift */; };
+		8347D51424F2595200E10E49 /* SSPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50724F2595200E10E49 /* SSPickerView.swift */; };
+		8347D51524F2595200E10E49 /* KKWPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50824F2595200E10E49 /* KKWPickerView.swift */; };
+		8347D51624F2595200E10E49 /* SSAlarmHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50924F2595200E10E49 /* SSAlarmHeader.swift */; };
+		8347D51724F2595200E10E49 /* SSReportVCtr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8347D50A24F2595200E10E49 /* SSReportVCtr.xib */; };
+		8347D51824F2595200E10E49 /* SwiftPopup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50D24F2595200E10E49 /* SwiftPopup.swift */; };
+		8347D51924F2595200E10E49 /* SwiftPopupPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50E24F2595200E10E49 /* SwiftPopupPresentationController.swift */; };
+		8347D51A24F2595200E10E49 /* SwiftPopupAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D50F24F2595200E10E49 /* SwiftPopupAnimation.swift */; };
+		8347D51B24F2595200E10E49 /* TranslucentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8347D51024F2595200E10E49 /* TranslucentView.swift */; };
 		83495F4824E910200094F0BB /* NetWorkConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83495F4724E910200094F0BB /* NetWorkConfig.swift */; };
 		83495F4A24E910640094F0BB /* NetWorkBaseApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83495F4924E910640094F0BB /* NetWorkBaseApi.swift */; };
 		83495F4C24E9113A0094F0BB /* NetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83495F4B24E9113A0094F0BB /* NetWorkManager.swift */; };
@@ -45,6 +140,102 @@
 
 /* Begin PBXFileReference section */
 		4E366BFCAA7F428E6F0624CA /* Pods_SolarStation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SolarStation.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		8347D44424F2024F00E10E49 /* SSLoginDataEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSLoginDataEngine.swift; sourceTree = "<group>"; };
+		8347D44724F2136C00E10E49 /* LoginApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginApi.swift; sourceTree = "<group>"; };
+		8347D44824F2136C00E10E49 /* ProviderSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProviderSupport.swift; sourceTree = "<group>"; };
+		8347D44924F2136C00E10E49 /* HttpRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequest.swift; sourceTree = "<group>"; };
+		8347D44A24F2136C00E10E49 /* ProjectApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectApi.swift; sourceTree = "<group>"; };
+		8347D44B24F2136C00E10E49 /* AlarmApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlarmApi.swift; sourceTree = "<group>"; };
+		8347D44D24F2136C00E10E49 /* ProjectApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectApiModel.swift; sourceTree = "<group>"; };
+		8347D44E24F2136C00E10E49 /* LoginApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginApiModel.swift; sourceTree = "<group>"; };
+		8347D44F24F2136C00E10E49 /* HomeApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeApiModel.swift; sourceTree = "<group>"; };
+		8347D45024F2136C00E10E49 /* AlarmApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlarmApiModel.swift; sourceTree = "<group>"; };
+		8347D45124F2136C00E10E49 /* DeviceApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceApiModel.swift; sourceTree = "<group>"; };
+		8347D45224F2136C00E10E49 /* StationApiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StationApiModel.swift; sourceTree = "<group>"; };
+		8347D45324F2136C00E10E49 /* HomeApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeApi.swift; sourceTree = "<group>"; };
+		8347D45424F2136C00E10E49 /* DeviceApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceApi.swift; sourceTree = "<group>"; };
+		8347D45524F2136C00E10E49 /* StationApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StationApi.swift; sourceTree = "<group>"; };
+		8347D46A24F258F800E10E49 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
+		8347D46B24F258F800E10E49 /* RootNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootNavigationController.swift; sourceTree = "<group>"; };
+		8347D46F24F2591000E10E49 /* SSAccountVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAccountVCtr.swift; sourceTree = "<group>"; };
+		8347D47124F2591000E10E49 /* SSAccoutCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SSAccoutCell.xib; sourceTree = "<group>"; };
+		8347D47224F2591000E10E49 /* SSAccoutCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAccoutCell.swift; sourceTree = "<group>"; };
+		8347D47724F2591A00E10E49 /* SSHomeVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHomeVCtr.swift; sourceTree = "<group>"; };
+		8347D47824F2591A00E10E49 /* SSMapVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSMapVCtr.swift; sourceTree = "<group>"; };
+		8347D47924F2591A00E10E49 /* SSStationSearchVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationSearchVCtr.swift; sourceTree = "<group>"; };
+		8347D47A24F2591A00E10E49 /* SKSearchController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKSearchController.swift; sourceTree = "<group>"; };
+		8347D47B24F2591A00E10E49 /* SKSearchEventsCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKSearchEventsCenter.swift; sourceTree = "<group>"; };
+		8347D47C24F2591A00E10E49 /* SSSearchResultVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSearchResultVCtr.swift; sourceTree = "<group>"; };
+		8347D47E24F2591A00E10E49 /* 88-下.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "88-下.png"; sourceTree = "<group>"; };
+		8347D47F24F2591A00E10E49 /* SSSearchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSearchCell.swift; sourceTree = "<group>"; };
+		8347D48024F2591A00E10E49 /* SSElectricty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSElectricty.swift; sourceTree = "<group>"; };
+		8347D48224F2591A00E10E49 /* SSCalloutView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSCalloutView.swift; sourceTree = "<group>"; };
+		8347D48324F2591A00E10E49 /* BubbleLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BubbleLayer.m; sourceTree = "<group>"; };
+		8347D48424F2591A00E10E49 /* SSAnnotationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAnnotationView.swift; sourceTree = "<group>"; };
+		8347D48524F2591A00E10E49 /* BubbleLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BubbleLayer.h; sourceTree = "<group>"; };
+		8347D48624F2591A00E10E49 /* SSStationMapCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationMapCell.swift; sourceTree = "<group>"; };
+		8347D48724F2591A00E10E49 /* SSBubbleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBubbleView.swift; sourceTree = "<group>"; };
+		8347D48824F2591A00E10E49 /* SSMapVCtr.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SSMapVCtr.xib; sourceTree = "<group>"; };
+		8347D48A24F2591A00E10E49 /* RectangleAnnotationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RectangleAnnotationView.swift; sourceTree = "<group>"; };
+		8347D48B24F2591A00E10E49 /* SSHomeItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHomeItem.swift; sourceTree = "<group>"; };
+		8347D48C24F2591A00E10E49 /* SSHomeVCtr.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SSHomeVCtr.xib; sourceTree = "<group>"; };
+		8347D4A024F2593E00E10E49 /* SSStationMessageTabView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationMessageTabView.swift; sourceTree = "<group>"; };
+		8347D4A124F2593E00E10E49 /* SSStationHeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationHeaderCell.swift; sourceTree = "<group>"; };
+		8347D4A224F2593E00E10E49 /* SSStationListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationListView.swift; sourceTree = "<group>"; };
+		8347D4A324F2593E00E10E49 /* SSStationListCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationListCell.swift; sourceTree = "<group>"; };
+		8347D4A424F2593E00E10E49 /* SSRefreshPopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSRefreshPopView.swift; sourceTree = "<group>"; };
+		8347D4A524F2593E00E10E49 /* SSProjectVCtr.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SSProjectVCtr.xib; sourceTree = "<group>"; };
+		8347D4A624F2593E00E10E49 /* SSCurveChartsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSCurveChartsView.swift; sourceTree = "<group>"; };
+		8347D4A724F2593E00E10E49 /* SSAddNewProjectCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAddNewProjectCell.swift; sourceTree = "<group>"; };
+		8347D4A924F2593E00E10E49 /* SSStationChartsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationChartsCell.swift; sourceTree = "<group>"; };
+		8347D4AA24F2593E00E10E49 /* XYMarkerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XYMarkerView.swift; sourceTree = "<group>"; };
+		8347D4AB24F2593E00E10E49 /* BalloonMarker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalloonMarker.swift; sourceTree = "<group>"; };
+		8347D4AC24F2593E00E10E49 /* SSBatteryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBatteryCell.swift; sourceTree = "<group>"; };
+		8347D4AD24F2593E00E10E49 /* SSEquipmentParamterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSEquipmentParamterCell.swift; sourceTree = "<group>"; };
+		8347D4AE24F2593E00E10E49 /* SSSolarPanelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSolarPanelCell.swift; sourceTree = "<group>"; };
+		8347D4AF24F2593E00E10E49 /* RadarMarkerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadarMarkerView.swift; sourceTree = "<group>"; };
+		8347D4B024F2593E00E10E49 /* SSEquipmentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSEquipmentCell.swift; sourceTree = "<group>"; };
+		8347D4B124F2593E00E10E49 /* SSDataDetialCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSDataDetialCell.swift; sourceTree = "<group>"; };
+		8347D4B224F2593E00E10E49 /* SSLoadCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSLoadCell.swift; sourceTree = "<group>"; };
+		8347D4B324F2593E00E10E49 /* SSsDataViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSsDataViewCell.swift; sourceTree = "<group>"; };
+		8347D4B424F2593E00E10E49 /* SSEquipmentInfoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSEquipmentInfoCell.swift; sourceTree = "<group>"; };
+		8347D4B524F2593E00E10E49 /* AddressRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressRow.swift; sourceTree = "<group>"; };
+		8347D4B724F2593E00E10E49 /* SSAddNewProjectVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAddNewProjectVCtr.swift; sourceTree = "<group>"; };
+		8347D4B924F2593E00E10E49 /* SSAddNewStionVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAddNewStionVCtr.swift; sourceTree = "<group>"; };
+		8347D4BC24F2593E00E10E49 /* SSBatteryInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBatteryInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4BD24F2593E00E10E49 /* SSBaseInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBaseInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4BE24F2593E00E10E49 /* SSLoadInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSLoadInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4BF24F2593E00E10E49 /* SSBaseStaionInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBaseStaionInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4C024F2593E00E10E49 /* SSBatteryPanelVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSBatteryPanelVCtr.swift; sourceTree = "<group>"; };
+		8347D4C124F2593E00E10E49 /* SSGeoInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSGeoInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4C224F2593E00E10E49 /* SSSurveyVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSurveyVCtr.swift; sourceTree = "<group>"; };
+		8347D4C324F2593E00E10E49 /* SSStationVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationVCtr.swift; sourceTree = "<group>"; };
+		8347D4C424F2593E00E10E49 /* SSStationInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSStationInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4C624F2593E00E10E49 /* SSSeeDetailVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSeeDetailVCtr.swift; sourceTree = "<group>"; };
+		8347D4C724F2593E00E10E49 /* SSAddEquiqmentVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAddEquiqmentVCtr.swift; sourceTree = "<group>"; };
+		8347D4C924F2593E00E10E49 /* SSEquipInfoVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSEquipInfoVCtr.swift; sourceTree = "<group>"; };
+		8347D4CA24F2593E00E10E49 /* SSCurveVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSCurveVCtr.swift; sourceTree = "<group>"; };
+		8347D4CC24F2593E00E10E49 /* SSInverterSetVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSInverterSetVCtr.swift; sourceTree = "<group>"; };
+		8347D4CD24F2593E00E10E49 /* SSLoadParamSetVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSLoadParamSetVCtr.swift; sourceTree = "<group>"; };
+		8347D4CE24F2593E00E10E49 /* SSDeviceBatterySetVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSDeviceBatterySetVCtr.swift; sourceTree = "<group>"; };
+		8347D4CF24F2593E00E10E49 /* SSMonitoringVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSMonitoringVCtr.swift; sourceTree = "<group>"; };
+		8347D4D024F2593E00E10E49 /* SSParamSettingVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSParamSettingVCtr.swift; sourceTree = "<group>"; };
+		8347D4D124F2593E00E10E49 /* SSDataDetailVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSDataDetailVCtr.swift; sourceTree = "<group>"; };
+		8347D4D224F2593E00E10E49 /* SSEquipmentVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSEquipmentVCtr.swift; sourceTree = "<group>"; };
+		8347D4D324F2593E00E10E49 /* SSResfreshTimeVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSResfreshTimeVCtr.swift; sourceTree = "<group>"; };
+		8347D4D424F2593E00E10E49 /* SSProjectVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSProjectVCtr.swift; sourceTree = "<group>"; };
+		8347D4D524F2593E00E10E49 /* SSPickerVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSPickerVCtr.swift; sourceTree = "<group>"; };
+		8347D50424F2595100E10E49 /* LeftTitleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftTitleButton.swift; sourceTree = "<group>"; };
+		8347D50524F2595100E10E49 /* SSAlarmCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAlarmCell.swift; sourceTree = "<group>"; };
+		8347D50624F2595100E10E49 /* SSReportVCtr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSReportVCtr.swift; sourceTree = "<group>"; };
+		8347D50724F2595200E10E49 /* SSPickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSPickerView.swift; sourceTree = "<group>"; };
+		8347D50824F2595200E10E49 /* KKWPickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KKWPickerView.swift; sourceTree = "<group>"; };
+		8347D50924F2595200E10E49 /* SSAlarmHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSAlarmHeader.swift; sourceTree = "<group>"; };
+		8347D50A24F2595200E10E49 /* SSReportVCtr.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SSReportVCtr.xib; sourceTree = "<group>"; };
+		8347D50D24F2595200E10E49 /* SwiftPopup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftPopup.swift; sourceTree = "<group>"; };
+		8347D50E24F2595200E10E49 /* SwiftPopupPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftPopupPresentationController.swift; sourceTree = "<group>"; };
+		8347D50F24F2595200E10E49 /* SwiftPopupAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftPopupAnimation.swift; sourceTree = "<group>"; };
+		8347D51024F2595200E10E49 /* TranslucentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TranslucentView.swift; sourceTree = "<group>"; };
 		83495F4724E910200094F0BB /* NetWorkConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetWorkConfig.swift; sourceTree = "<group>"; };
 		83495F4924E910640094F0BB /* NetWorkBaseApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetWorkBaseApi.swift; sourceTree = "<group>"; };
 		83495F4B24E9113A0094F0BB /* NetWorkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetWorkManager.swift; sourceTree = "<group>"; };
@@ -105,6 +296,239 @@
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
+		8347D44624F2136C00E10E49 /* moya */ = {
+			isa = PBXGroup;
+			children = (
+				8347D44724F2136C00E10E49 /* LoginApi.swift */,
+				8347D44824F2136C00E10E49 /* ProviderSupport.swift */,
+				8347D44924F2136C00E10E49 /* HttpRequest.swift */,
+				8347D44A24F2136C00E10E49 /* ProjectApi.swift */,
+				8347D44B24F2136C00E10E49 /* AlarmApi.swift */,
+				8347D44C24F2136C00E10E49 /* model */,
+				8347D45324F2136C00E10E49 /* HomeApi.swift */,
+				8347D45424F2136C00E10E49 /* DeviceApi.swift */,
+				8347D45524F2136C00E10E49 /* StationApi.swift */,
+			);
+			path = moya;
+			sourceTree = "<group>";
+		};
+		8347D44C24F2136C00E10E49 /* model */ = {
+			isa = PBXGroup;
+			children = (
+				8347D44D24F2136C00E10E49 /* ProjectApiModel.swift */,
+				8347D44E24F2136C00E10E49 /* LoginApiModel.swift */,
+				8347D44F24F2136C00E10E49 /* HomeApiModel.swift */,
+				8347D45024F2136C00E10E49 /* AlarmApiModel.swift */,
+				8347D45124F2136C00E10E49 /* DeviceApiModel.swift */,
+				8347D45224F2136C00E10E49 /* StationApiModel.swift */,
+			);
+			path = model;
+			sourceTree = "<group>";
+		};
+		8347D46E24F2591000E10E49 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				8347D46F24F2591000E10E49 /* SSAccountVCtr.swift */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		8347D47024F2591000E10E49 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				8347D47124F2591000E10E49 /* SSAccoutCell.xib */,
+				8347D47224F2591000E10E49 /* SSAccoutCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		8347D47624F2591A00E10E49 /* controller */ = {
+			isa = PBXGroup;
+			children = (
+				8347D47724F2591A00E10E49 /* SSHomeVCtr.swift */,
+				8347D47824F2591A00E10E49 /* SSMapVCtr.swift */,
+				8347D47924F2591A00E10E49 /* SSStationSearchVCtr.swift */,
+				8347D47A24F2591A00E10E49 /* SKSearchController.swift */,
+				8347D47B24F2591A00E10E49 /* SKSearchEventsCenter.swift */,
+				8347D47C24F2591A00E10E49 /* SSSearchResultVCtr.swift */,
+			);
+			name = controller;
+			path = "../../桌面 - weclouds的MacBook Pro/桌面/Solar_Station_Project/SolarStationSwift/SolarStationSwift/Classes/Main/Home/controller";
+			sourceTree = "<group>";
+		};
+		8347D47D24F2591A00E10E49 /* view */ = {
+			isa = PBXGroup;
+			children = (
+				8347D47E24F2591A00E10E49 /* 88-下.png */,
+				8347D47F24F2591A00E10E49 /* SSSearchCell.swift */,
+				8347D48024F2591A00E10E49 /* SSElectricty.swift */,
+				8347D48124F2591A00E10E49 /* Map */,
+				8347D48624F2591A00E10E49 /* SSStationMapCell.swift */,
+				8347D48724F2591A00E10E49 /* SSBubbleView.swift */,
+				8347D48824F2591A00E10E49 /* SSMapVCtr.xib */,
+				8347D48924F2591A00E10E49 /* customMap */,
+				8347D48B24F2591A00E10E49 /* SSHomeItem.swift */,
+				8347D48C24F2591A00E10E49 /* SSHomeVCtr.xib */,
+			);
+			name = view;
+			path = "../../桌面 - weclouds的MacBook Pro/桌面/Solar_Station_Project/SolarStationSwift/SolarStationSwift/Classes/Main/Home/view";
+			sourceTree = "<group>";
+		};
+		8347D48124F2591A00E10E49 /* Map */ = {
+			isa = PBXGroup;
+			children = (
+				8347D48224F2591A00E10E49 /* SSCalloutView.swift */,
+				8347D48324F2591A00E10E49 /* BubbleLayer.m */,
+				8347D48424F2591A00E10E49 /* SSAnnotationView.swift */,
+				8347D48524F2591A00E10E49 /* BubbleLayer.h */,
+			);
+			path = Map;
+			sourceTree = "<group>";
+		};
+		8347D48924F2591A00E10E49 /* customMap */ = {
+			isa = PBXGroup;
+			children = (
+				8347D48A24F2591A00E10E49 /* RectangleAnnotationView.swift */,
+			);
+			path = customMap;
+			sourceTree = "<group>";
+		};
+		8347D49F24F2593E00E10E49 /* view */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4A024F2593E00E10E49 /* SSStationMessageTabView.swift */,
+				8347D4A124F2593E00E10E49 /* SSStationHeaderCell.swift */,
+				8347D4A224F2593E00E10E49 /* SSStationListView.swift */,
+				8347D4A324F2593E00E10E49 /* SSStationListCell.swift */,
+				8347D4A424F2593E00E10E49 /* SSRefreshPopView.swift */,
+				8347D4A524F2593E00E10E49 /* SSProjectVCtr.xib */,
+				8347D4A624F2593E00E10E49 /* SSCurveChartsView.swift */,
+				8347D4A724F2593E00E10E49 /* SSAddNewProjectCell.swift */,
+				8347D4A824F2593E00E10E49 /* StationMessageCell */,
+				8347D4B524F2593E00E10E49 /* AddressRow.swift */,
+			);
+			name = view;
+			path = "../../桌面 - weclouds的MacBook Pro/桌面/Solar_Station_Project/SolarStationSwift/SolarStationSwift/Classes/Main/Project/view";
+			sourceTree = "<group>";
+		};
+		8347D4A824F2593E00E10E49 /* StationMessageCell */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4A924F2593E00E10E49 /* SSStationChartsCell.swift */,
+				8347D4AA24F2593E00E10E49 /* XYMarkerView.swift */,
+				8347D4AB24F2593E00E10E49 /* BalloonMarker.swift */,
+				8347D4AC24F2593E00E10E49 /* SSBatteryCell.swift */,
+				8347D4AD24F2593E00E10E49 /* SSEquipmentParamterCell.swift */,
+				8347D4AE24F2593E00E10E49 /* SSSolarPanelCell.swift */,
+				8347D4AF24F2593E00E10E49 /* RadarMarkerView.swift */,
+				8347D4B024F2593E00E10E49 /* SSEquipmentCell.swift */,
+				8347D4B124F2593E00E10E49 /* SSDataDetialCell.swift */,
+				8347D4B224F2593E00E10E49 /* SSLoadCell.swift */,
+				8347D4B324F2593E00E10E49 /* SSsDataViewCell.swift */,
+				8347D4B424F2593E00E10E49 /* SSEquipmentInfoCell.swift */,
+			);
+			path = StationMessageCell;
+			sourceTree = "<group>";
+		};
+		8347D4B624F2593E00E10E49 /* controller */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4B724F2593E00E10E49 /* SSAddNewProjectVCtr.swift */,
+				8347D4B824F2593E00E10E49 /* SetupNewStation */,
+				8347D4BA24F2593E00E10E49 /* StationMessage */,
+				8347D4D424F2593E00E10E49 /* SSProjectVCtr.swift */,
+				8347D4D524F2593E00E10E49 /* SSPickerVCtr.swift */,
+			);
+			name = controller;
+			path = "../../桌面 - weclouds的MacBook Pro/桌面/Solar_Station_Project/SolarStationSwift/SolarStationSwift/Classes/Main/Project/controller";
+			sourceTree = "<group>";
+		};
+		8347D4B824F2593E00E10E49 /* SetupNewStation */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4B924F2593E00E10E49 /* SSAddNewStionVCtr.swift */,
+			);
+			path = SetupNewStation;
+			sourceTree = "<group>";
+		};
+		8347D4BA24F2593E00E10E49 /* StationMessage */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4BB24F2593E00E10E49 /* UpdateStationInfo */,
+				8347D4C224F2593E00E10E49 /* SSSurveyVCtr.swift */,
+				8347D4C324F2593E00E10E49 /* SSStationVCtr.swift */,
+				8347D4C424F2593E00E10E49 /* SSStationInfoVCtr.swift */,
+				8347D4C524F2593E00E10E49 /* Equipment */,
+			);
+			path = StationMessage;
+			sourceTree = "<group>";
+		};
+		8347D4BB24F2593E00E10E49 /* UpdateStationInfo */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4BC24F2593E00E10E49 /* SSBatteryInfoVCtr.swift */,
+				8347D4BD24F2593E00E10E49 /* SSBaseInfoVCtr.swift */,
+				8347D4BE24F2593E00E10E49 /* SSLoadInfoVCtr.swift */,
+				8347D4BF24F2593E00E10E49 /* SSBaseStaionInfoVCtr.swift */,
+				8347D4C024F2593E00E10E49 /* SSBatteryPanelVCtr.swift */,
+				8347D4C124F2593E00E10E49 /* SSGeoInfoVCtr.swift */,
+			);
+			path = UpdateStationInfo;
+			sourceTree = "<group>";
+		};
+		8347D4C524F2593E00E10E49 /* Equipment */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4C624F2593E00E10E49 /* SSSeeDetailVCtr.swift */,
+				8347D4C724F2593E00E10E49 /* SSAddEquiqmentVCtr.swift */,
+				8347D4C824F2593E00E10E49 /* EquipmentMessage */,
+				8347D4D224F2593E00E10E49 /* SSEquipmentVCtr.swift */,
+				8347D4D324F2593E00E10E49 /* SSResfreshTimeVCtr.swift */,
+			);
+			path = Equipment;
+			sourceTree = "<group>";
+		};
+		8347D4C824F2593E00E10E49 /* EquipmentMessage */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4C924F2593E00E10E49 /* SSEquipInfoVCtr.swift */,
+				8347D4CA24F2593E00E10E49 /* SSCurveVCtr.swift */,
+				8347D4CB24F2593E00E10E49 /* SetParam */,
+				8347D4CF24F2593E00E10E49 /* SSMonitoringVCtr.swift */,
+				8347D4D024F2593E00E10E49 /* SSParamSettingVCtr.swift */,
+				8347D4D124F2593E00E10E49 /* SSDataDetailVCtr.swift */,
+			);
+			path = EquipmentMessage;
+			sourceTree = "<group>";
+		};
+		8347D4CB24F2593E00E10E49 /* SetParam */ = {
+			isa = PBXGroup;
+			children = (
+				8347D4CC24F2593E00E10E49 /* SSInverterSetVCtr.swift */,
+				8347D4CD24F2593E00E10E49 /* SSLoadParamSetVCtr.swift */,
+				8347D4CE24F2593E00E10E49 /* SSDeviceBatterySetVCtr.swift */,
+			);
+			path = SetParam;
+			sourceTree = "<group>";
+		};
+		8347D50B24F2595200E10E49 /* SwiftPopup */ = {
+			isa = PBXGroup;
+			children = (
+				8347D50C24F2595200E10E49 /* SwiftPopup */,
+			);
+			path = SwiftPopup;
+			sourceTree = "<group>";
+		};
+		8347D50C24F2595200E10E49 /* SwiftPopup */ = {
+			isa = PBXGroup;
+			children = (
+				8347D50D24F2595200E10E49 /* SwiftPopup.swift */,
+				8347D50E24F2595200E10E49 /* SwiftPopupPresentationController.swift */,
+				8347D50F24F2595200E10E49 /* SwiftPopupAnimation.swift */,
+			);
+			path = SwiftPopup;
+			sourceTree = "<group>";
+		};
 		834BBA60248504FE00A2FD16 = {
 			isa = PBXGroup;
 			children = (
@@ -174,6 +598,7 @@
 			children = (
 				83F918F524A480B800252670 /* AppShare.swift */,
 				83F918F624A480B800252670 /* SolarStationConstant.swift */,
+				8347D44624F2136C00E10E49 /* moya */,
 				834C8BE724960F3E0088B9DB /* Network */,
 			);
 			name = Global;
@@ -192,6 +617,8 @@
 		83F918DC24A33C0D00252670 /* Main */ = {
 			isa = PBXGroup;
 			children = (
+				8347D46A24F258F800E10E49 /* MainViewController.swift */,
+				8347D46B24F258F800E10E49 /* RootNavigationController.swift */,
 				83F918EE24A47EAA00252670 /* Report */,
 				83F918EC24A47E9C00252670 /* Account */,
 				83F918EB24A47E9600252670 /* Project */,
@@ -207,6 +634,7 @@
 				83F918F024A47EEF00252670 /* 1-登录_iphonex@3x.png */,
 				83F918EF24A47EEF00252670 /* SSLoginVCtr.swift */,
 				83F918F124A47EEF00252670 /* SSLoginVCtr.xib */,
+				8347D44424F2024F00E10E49 /* SSLoginDataEngine.swift */,
 			);
 			name = Login;
 			sourceTree = "<group>";
@@ -214,6 +642,8 @@
 		83F918EA24A47E8C00252670 /* Home */ = {
 			isa = PBXGroup;
 			children = (
+				8347D47624F2591A00E10E49 /* controller */,
+				8347D47D24F2591A00E10E49 /* view */,
 			);
 			name = Home;
 			sourceTree = "<group>";
@@ -221,6 +651,8 @@
 		83F918EB24A47E9600252670 /* Project */ = {
 			isa = PBXGroup;
 			children = (
+				8347D4B624F2593E00E10E49 /* controller */,
+				8347D49F24F2593E00E10E49 /* view */,
 			);
 			name = Project;
 			sourceTree = "<group>";
@@ -228,6 +660,8 @@
 		83F918EC24A47E9C00252670 /* Account */ = {
 			isa = PBXGroup;
 			children = (
+				8347D46E24F2591000E10E49 /* Controller */,
+				8347D47024F2591000E10E49 /* View */,
 			);
 			name = Account;
 			sourceTree = "<group>";
@@ -235,6 +669,15 @@
 		83F918EE24A47EAA00252670 /* Report */ = {
 			isa = PBXGroup;
 			children = (
+				8347D50824F2595200E10E49 /* KKWPickerView.swift */,
+				8347D50424F2595100E10E49 /* LeftTitleButton.swift */,
+				8347D50524F2595100E10E49 /* SSAlarmCell.swift */,
+				8347D50924F2595200E10E49 /* SSAlarmHeader.swift */,
+				8347D50724F2595200E10E49 /* SSPickerView.swift */,
+				8347D50624F2595100E10E49 /* SSReportVCtr.swift */,
+				8347D50A24F2595200E10E49 /* SSReportVCtr.xib */,
+				8347D50B24F2595200E10E49 /* SwiftPopup */,
+				8347D51024F2595200E10E49 /* TranslucentView.swift */,
 			);
 			name = Report;
 			sourceTree = "<group>";
@@ -354,8 +797,14 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8347D47424F2591000E10E49 /* SSAccoutCell.xib in Resources */,
+				8347D49B24F2591A00E10E49 /* SSMapVCtr.xib in Resources */,
 				834BBA792485050300A2FD16 /* LaunchScreen.storyboard in Resources */,
+				8347D49324F2591A00E10E49 /* 88-下.png in Resources */,
+				8347D51724F2595200E10E49 /* SSReportVCtr.xib in Resources */,
+				8347D4DB24F2593F00E10E49 /* SSProjectVCtr.xib in Resources */,
 				83F918F324A47EEF00252670 /* 1-登录_iphonex@3x.png in Resources */,
+				8347D49E24F2591A00E10E49 /* SSHomeVCtr.xib in Resources */,
 				834BBA762485050300A2FD16 /* Assets.xcassets in Resources */,
 				83F918F424A47EEF00252670 /* SSLoginVCtr.xib in Resources */,
 				834BBA74248504FE00A2FD16 /* Main.storyboard in Resources */,
@@ -425,15 +874,104 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8347D51324F2595200E10E49 /* SSReportVCtr.swift in Sources */,
+				8347D4E324F2593F00E10E49 /* SSSolarPanelCell.swift in Sources */,
+				8347D51924F2595200E10E49 /* SwiftPopupPresentationController.swift in Sources */,
+				8347D4DA24F2593F00E10E49 /* SSRefreshPopView.swift in Sources */,
+				8347D4DC24F2593F00E10E49 /* SSCurveChartsView.swift in Sources */,
+				8347D51424F2595200E10E49 /* SSPickerView.swift in Sources */,
+				8347D45924F2136C00E10E49 /* ProjectApi.swift in Sources */,
+				8347D4DF24F2593F00E10E49 /* XYMarkerView.swift in Sources */,
+				8347D50124F2593F00E10E49 /* SSResfreshTimeVCtr.swift in Sources */,
+				8347D45724F2136C00E10E49 /* ProviderSupport.swift in Sources */,
+				8347D4ED24F2593F00E10E49 /* SSBatteryInfoVCtr.swift in Sources */,
+				8347D4FF24F2593F00E10E49 /* SSDataDetailVCtr.swift in Sources */,
+				8347D48F24F2591A00E10E49 /* SSStationSearchVCtr.swift in Sources */,
+				8347D45B24F2136C00E10E49 /* ProjectApiModel.swift in Sources */,
+				8347D4FC24F2593F00E10E49 /* SSDeviceBatterySetVCtr.swift in Sources */,
+				8347D46124F2136C00E10E49 /* HomeApi.swift in Sources */,
 				834BBA71248504FE00A2FD16 /* ViewController.swift in Sources */,
+				8347D4E924F2593F00E10E49 /* SSEquipmentInfoCell.swift in Sources */,
+				8347D4E624F2593F00E10E49 /* SSDataDetialCell.swift in Sources */,
+				8347D51524F2595200E10E49 /* KKWPickerView.swift in Sources */,
+				8347D50324F2593F00E10E49 /* SSPickerVCtr.swift in Sources */,
 				83F918F824A480B800252670 /* SolarStationConstant.swift in Sources */,
+				8347D4F724F2593F00E10E49 /* SSAddEquiqmentVCtr.swift in Sources */,
+				8347D49524F2591A00E10E49 /* SSElectricty.swift in Sources */,
+				8347D4F424F2593F00E10E49 /* SSStationVCtr.swift in Sources */,
+				8347D47524F2591000E10E49 /* SSAccoutCell.swift in Sources */,
+				8347D49C24F2591A00E10E49 /* RectangleAnnotationView.swift in Sources */,
+				8347D46224F2136C00E10E49 /* DeviceApi.swift in Sources */,
+				8347D4DE24F2593F00E10E49 /* SSStationChartsCell.swift in Sources */,
+				8347D46324F2136C00E10E49 /* StationApi.swift in Sources */,
+				8347D51B24F2595200E10E49 /* TranslucentView.swift in Sources */,
+				8347D50024F2593F00E10E49 /* SSEquipmentVCtr.swift in Sources */,
+				8347D4DD24F2593F00E10E49 /* SSAddNewProjectCell.swift in Sources */,
 				83F918F224A47EEF00252670 /* SSLoginVCtr.swift in Sources */,
+				8347D4EC24F2593F00E10E49 /* SSAddNewStionVCtr.swift in Sources */,
+				8347D49224F2591A00E10E49 /* SSSearchResultVCtr.swift in Sources */,
+				8347D49D24F2591A00E10E49 /* SSHomeItem.swift in Sources */,
+				8347D49024F2591A00E10E49 /* SKSearchController.swift in Sources */,
 				83495F4824E910200094F0BB /* NetWorkConfig.swift in Sources */,
+				8347D49924F2591A00E10E49 /* SSStationMapCell.swift in Sources */,
+				8347D4E024F2593F00E10E49 /* BalloonMarker.swift in Sources */,
+				8347D45A24F2136C00E10E49 /* AlarmApi.swift in Sources */,
+				8347D51624F2595200E10E49 /* SSAlarmHeader.swift in Sources */,
+				8347D4E524F2593F00E10E49 /* SSEquipmentCell.swift in Sources */,
+				8347D46024F2136C00E10E49 /* StationApiModel.swift in Sources */,
+				8347D51824F2595200E10E49 /* SwiftPopup.swift in Sources */,
+				8347D51224F2595200E10E49 /* SSAlarmCell.swift in Sources */,
+				8347D49124F2591A00E10E49 /* SKSearchEventsCenter.swift in Sources */,
+				8347D45824F2136C00E10E49 /* HttpRequest.swift in Sources */,
+				8347D49A24F2591A00E10E49 /* SSBubbleView.swift in Sources */,
+				8347D48D24F2591A00E10E49 /* SSHomeVCtr.swift in Sources */,
 				83F918F724A480B800252670 /* AppShare.swift in Sources */,
+				8347D4F124F2593F00E10E49 /* SSBatteryPanelVCtr.swift in Sources */,
+				8347D4F224F2593F00E10E49 /* SSGeoInfoVCtr.swift in Sources */,
+				8347D4FA24F2593F00E10E49 /* SSInverterSetVCtr.swift in Sources */,
+				8347D4EB24F2593F00E10E49 /* SSAddNewProjectVCtr.swift in Sources */,
+				8347D51A24F2595200E10E49 /* SwiftPopupAnimation.swift in Sources */,
+				8347D46C24F258F800E10E49 /* MainViewController.swift in Sources */,
+				8347D4F024F2593F00E10E49 /* SSBaseStaionInfoVCtr.swift in Sources */,
+				8347D4E424F2593F00E10E49 /* RadarMarkerView.swift in Sources */,
+				8347D50224F2593F00E10E49 /* SSProjectVCtr.swift in Sources */,
+				8347D49824F2591A00E10E49 /* SSAnnotationView.swift in Sources */,
+				8347D4D624F2593F00E10E49 /* SSStationMessageTabView.swift in Sources */,
 				83495F4C24E9113A0094F0BB /* NetWorkManager.swift in Sources */,
+				8347D4E824F2593F00E10E49 /* SSsDataViewCell.swift in Sources */,
+				8347D49424F2591A00E10E49 /* SSSearchCell.swift in Sources */,
+				8347D47324F2591000E10E49 /* SSAccountVCtr.swift in Sources */,
+				8347D4E724F2593F00E10E49 /* SSLoadCell.swift in Sources */,
+				8347D4D724F2593F00E10E49 /* SSStationHeaderCell.swift in Sources */,
+				8347D51124F2595200E10E49 /* LeftTitleButton.swift in Sources */,
+				8347D45D24F2136C00E10E49 /* HomeApiModel.swift in Sources */,
 				834BBA6D248504FE00A2FD16 /* AppDelegate.swift in Sources */,
 				83495F4A24E910640094F0BB /* NetWorkBaseApi.swift in Sources */,
+				8347D46D24F258F800E10E49 /* RootNavigationController.swift in Sources */,
+				8347D4E224F2593F00E10E49 /* SSEquipmentParamterCell.swift in Sources */,
+				8347D4F924F2593F00E10E49 /* SSCurveVCtr.swift in Sources */,
+				8347D4EA24F2593F00E10E49 /* AddressRow.swift in Sources */,
+				8347D4D924F2593F00E10E49 /* SSStationListCell.swift in Sources */,
+				8347D49724F2591A00E10E49 /* BubbleLayer.m in Sources */,
+				8347D45F24F2136C00E10E49 /* DeviceApiModel.swift in Sources */,
+				8347D4F624F2593F00E10E49 /* SSSeeDetailVCtr.swift in Sources */,
+				8347D45E24F2136C00E10E49 /* AlarmApiModel.swift in Sources */,
+				8347D4D824F2593F00E10E49 /* SSStationListView.swift in Sources */,
+				8347D4FE24F2593F00E10E49 /* SSParamSettingVCtr.swift in Sources */,
+				8347D4F824F2593F00E10E49 /* SSEquipInfoVCtr.swift in Sources */,
+				8347D45C24F2136C00E10E49 /* LoginApiModel.swift in Sources */,
+				8347D4FB24F2593F00E10E49 /* SSLoadParamSetVCtr.swift in Sources */,
+				8347D45624F2136C00E10E49 /* LoginApi.swift in Sources */,
+				8347D4F324F2593F00E10E49 /* SSSurveyVCtr.swift in Sources */,
+				8347D48E24F2591A00E10E49 /* SSMapVCtr.swift in Sources */,
+				8347D4FD24F2593F00E10E49 /* SSMonitoringVCtr.swift in Sources */,
 				834BBA6F248504FE00A2FD16 /* SceneDelegate.swift in Sources */,
+				8347D49624F2591A00E10E49 /* SSCalloutView.swift in Sources */,
+				8347D4F524F2593F00E10E49 /* SSStationInfoVCtr.swift in Sources */,
+				8347D4EF24F2593F00E10E49 /* SSLoadInfoVCtr.swift in Sources */,
+				8347D44524F2024F00E10E49 /* SSLoginDataEngine.swift in Sources */,
+				8347D4E124F2593F00E10E49 /* SSBatteryCell.swift in Sources */,
+				8347D4EE24F2593F00E10E49 /* SSBaseInfoVCtr.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

二进制
SolarStation.xcworkspace/xcuserdata/weclouds.xcuserdatad/UserInterfaceState.xcuserstate


+ 171 - 0
SolarStation/Controller/SSAccountVCtr.swift

@@ -0,0 +1,171 @@
+//
+//  SSAccountVCtr.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/10.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import UIKit
+import GYSide
+
+class SSAccountVCtr: UIViewController {
+   
+    lazy var tableView  = { () -> UITableView in
+        var tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 0.75 * KSCREENWIDTH, height: KSCREENHEIGHT - 100), style: .plain)
+        tableView.backgroundColor = UIColor.white
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.separatorInset = UIEdgeInsets.zero
+        return tableView
+    }()
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        requestData()
+        createUI()
+        
+        // Do any additional setup after loading the view.
+    }
+
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+    
+    let titleArray : NSArray = ["公司" ,"地址","项目","电站","设备"]
+    let dataArray :NSMutableArray = NSMutableArray()
+    
+
+    
+    func requestData()  {
+        let result  = AppShare.mCommon_loginInfo?.result
+        self.dataArray.add(result?.company ?? "")
+        self.dataArray.add(result?.address ?? "")
+        self.dataArray.add("")
+        self.dataArray.add("")
+        self.dataArray.add("")
+    }
+    
+    func createUI()  {
+        self.view.backgroundColor = UIColor.white
+        self.view.addSubview(self.tableView)
+        self.tableView.register(UINib.init(nibName: "SSAccoutCell", bundle: nil), forCellReuseIdentifier: "SSAccoutCell")
+        self.tableView.isScrollEnabled = false// 禁止滚动
+        self.tableView.separatorStyle = .none
+        let logOutBtn :UIButton  = UIButton(type: .custom)
+        logOutBtn.setTitle("退出登录", for: .normal)
+        logOutBtn.setTitleColor(UIColor.init(hexString: "35A0FF"), for: .normal)
+        logOutBtn.addTarget(self, action: #selector(SSAccountVCtr.logout), for: .touchUpInside)
+       logOutBtn.setShadow(opacity: 0.2)//设置阴影
+        self.view.addSubview(logOutBtn)
+        logOutBtn.snp.makeConstraints { (make) in
+            make.left.equalToSuperview()
+            make.right.equalToSuperview()
+            make.bottom.equalToSuperview()
+            make.height.equalTo(44)
+        }
+    }
+    
+    @objc func logout()  {
+        let vc = SSLoginVCtr()
+//跳转
+        var rootVC: UIViewController = (UIApplication.shared.keyWindow?.rootViewController)!
+        if ((rootVC.presentedViewController) != nil) {
+            rootVC  = rootVC.presentedViewController!
+        }
+        rootVC.presentedViewController?.dismiss(animated: true, completion: {
+            DispatchQueue.main.async {
+                rootVC.present(vc, animated: true, completion: nil)
+            }
+        })
+    }
+}
+
+extension SSAccountVCtr : UITableViewDelegate,UITableViewDataSource {
+    func numberOfSections(in tableView: UITableView) -> Int {
+        return 1
+    }
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return 5
+    }
+    
+    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+        return 80
+    }
+    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
+        return 200
+    }
+    
+    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+        let headerView = UIView()
+       // headerView.backgroundColor = UIColor.yellow
+        let headerIcon = UIImageView(frame: CGRect(x: 0, y: 50, width: 60, height: 60))
+        let  accontNameLabel = UILabel(frame: CGRect(x: 0, y: 110 + 12 , width: self.tableView.width, height: 20))
+        let roleLabel = UILabel(frame: CGRect(x: 0, y: 110 + 12 + 20  , width: self.tableView.width, height: 20))
+        //设置控件
+        headerIcon.layer.masksToBounds = true
+        headerIcon.layer.cornerRadius = 30
+       // headerIcon.backgroundColor = UIColor.red
+        headerIcon.centerX = self.tableView.centerX
+        let result = AppShare.mCommon_loginInfo?.result
+        let iconStr = ImageBase + (result?.logo)!
+       
+        log.debug(iconStr)
+        headerIcon.g_netImage(url: iconStr, placeholder: "默认头像")
+        
+        accontNameLabel.textAlignment = .center
+        accontNameLabel.textColor = UIColor.init(hexString: "444444")
+        accontNameLabel.font = UIFont.boldSystemFont(ofSize: 15)
+        accontNameLabel.text = AppShare.username
+        
+        roleLabel.textColor = UIColor.init(hexString: "888888")
+        roleLabel.font = UIFont.boldSystemFont(ofSize: 12)
+        roleLabel.textAlignment = .center
+        
+        
+        var role :String = ""
+        switch result?.role {
+        case "1":
+            role = "超级管理员"
+        case "2":
+            role = "主账号"
+        default:
+           role = "子账号"
+        }
+        roleLabel.text = role
+        headerView.addSubview(headerIcon)
+        headerView.addSubview(accontNameLabel)
+        headerView .addSubview(roleLabel)
+        
+       
+        return headerView
+    }
+
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell  = tableView.dequeueReusableCell(withIdentifier: "SSAccoutCell") as! SSAccoutCell
+        cell.selectionStyle = .none
+     
+        cell.mNameLabel = self.titleArray[indexPath.row] as! String
+        cell.mNameValue = self.dataArray[indexPath.row] as? String
+        return cell
+    }
+    
+    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
+          // Remove seperator inset
+        if cell.responds(to:#selector(setter: UITableViewCell.separatorInset)){
+            cell.separatorInset = UIEdgeInsets.zero
+        }
+        //Prevent the cell from inheriting the Table View's margin setting
+        if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
+            cell.preservesSuperviewLayoutMargins = false
+        }
+        //Explicity set youre cell's layout margins
+        if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
+            cell.layoutMargins = UIEdgeInsets.zero
+        }
+    }
+}
+
+
+

+ 5 - 0
SolarStation/Info.plist

@@ -60,5 +60,10 @@
 		<string>UIInterfaceOrientationLandscapeLeft</string>
 		<string>UIInterfaceOrientationLandscapeRight</string>
 	</array>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+	</dict>
 </dict>
 </plist>

+ 93 - 0
SolarStation/KKWPickerView.swift

@@ -0,0 +1,93 @@
+//
+//  KKWPickerView.swift
+//  SolarLamp
+//
+//  Created by weclouds on 2018/6/25.
+//  Copyright © 2018年 SolarLamp. All rights reserved.
+//
+
+import UIKit
+
+class KKWPickerView: UIView {
+    
+    //第一个时间,当前年份
+    var datePickerCallback:((String)->Void)?
+    var year : String?
+    var date  :String?
+    
+    
+    /*日期选择*/
+    lazy var datePicker = { () -> UIDatePicker in
+        var datePicker = UIDatePicker(frame: CGRect.init(x: 0, y: 44, width: UIScreen.main.bounds.size.width, height: 216))
+        datePicker.backgroundColor = UIColor.white
+        datePicker.datePickerMode = UIDatePickerMode.date
+        return datePicker
+    }()
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        createUI()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    
+    func createUI(){
+        self.backgroundColor = UIColor.white
+        let clearBtn  = UIButton.init(type: .custom)
+        clearBtn.setTitle("clear".localizedstr(), for: .normal)
+        clearBtn.setTitleColor(UIColor.black, for: .normal)
+        clearBtn.frame = CGRect.init(x: 0, y: 0, width: 80, height: 44)
+        clearBtn.addTarget(self, action: #selector(clearAction), for: .touchUpInside)
+        self.addSubview(clearBtn)
+        
+        let confirmBtn  = UIButton.init(type: .custom)
+        confirmBtn.setTitle("confirm".localizedstr(), for: .normal)
+        confirmBtn.setTitleColor(UIColor.black, for: .normal)
+        confirmBtn.frame = CGRect.init(x: UIScreen.main.bounds.size.width - 80, y: 0, width: 80, height: 44)
+        confirmBtn.addTarget(self, action: #selector(confirmAction), for: .touchUpInside)
+        self.addSubview(confirmBtn)
+        
+        self.addSubview(self.datePicker)
+          datePicker.addTarget(self, action: #selector(dateChanged(datePick:)), for: .valueChanged)
+        
+        let systemLanguage = getCurrentLanguage()
+        if systemLanguage == "cn" {
+                self.datePicker.locale = Locale(identifier: "zh_CN")
+        }else if systemLanguage == "en" {
+                self.datePicker.locale = Locale(identifier: "En")
+        }
+    }
+    public func getCurrentLanguage() -> String {
+        let preferredLang = Bundle.main.preferredLocalizations.first! as NSString
+        switch String(describing: preferredLang) {
+        case "en-US", "en-CN":
+            return "en"//英文
+        case "zh-Hans-US","zh-Hans-CN","zh-Hant-CN","zh-TW","zh-HK","zh-Hans":
+            return "cn"//中文
+        default:
+            return "en"
+        }
+    }
+    //日期选择其方法
+    @objc func dateChanged(datePick: UIDatePicker)  {
+        //更新提醒时间文本框
+        let formatter = DateFormatter()
+        //日期样式
+        formatter.dateFormat = "YYYY-MM-dd"
+       date = formatter.string(from: datePicker.date)
+    }
+    
+    @objc func clearAction()  {
+         self.datePickerCallback!("ALL")
+    }
+    @objc func confirmAction() {
+        let formatter = DateFormatter()
+        //日期样式
+        formatter.dateFormat = "YYYY-MM-dd"
+        print(formatter.string(from: datePicker.date))
+        self.datePickerCallback!(formatter.string(from: datePicker.date))
+    }
+}

+ 30 - 0
SolarStation/LeftTitleButton.swift

@@ -0,0 +1,30 @@
+//
+//  LeftTitleButton.swift
+//  SolarLamp
+//
+//  Created by weclouds on 2018/6/20.
+//  Copyright © 2018年 SolarLamp. All rights reserved.
+//
+
+import UIKit
+
+class LeftTitleButton: UIButton {
+
+   
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+    }
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    /**
+     *  这个方法里调整
+     */
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        
+        titleLabel?.frame.origin.x = 0
+        imageView?.frame.origin.x  = titleLabel!.frame.size.width
+    }
+}

+ 50 - 0
SolarStation/MainViewController.swift

@@ -0,0 +1,50 @@
+//
+//  MainViewController.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/8.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import UIKit
+
+class MainViewController: UITabBarController {
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        addChildViewcontrollers()
+        // Do any additional setup after loading the view.
+    }
+    func addChildViewcontrollers()   {
+        let home = createSubViewController(controller: SSHomeVCtr(), title: "首页", normalImage:"首页-未选中", selectedImage: "首页")
+        let project = createSubViewController(controller: SSProjectVCtr(), title: "项目", normalImage:"项目-未选中", selectedImage: "项目")
+        let report = createSubViewController(controller: SSReportVCtr(), title: "警报", normalImage:"警报-未选中", selectedImage: "警报")
+        let tabArray = [home,project,report]
+        self.viewControllers = tabArray
+    }
+    
+    func createSubViewController(controller:UIViewController,title:String,normalImage:String,selectedImage:String) -> RootNavigationController {
+        controller.title = title
+        let navi = RootNavigationController(rootViewController: controller)
+        navi.tabBarItem.title = title
+        navi.tabBarItem.image = UIImage(named: normalImage)
+        navi.tabBarItem.selectedImage = UIImage(named: selectedImage)
+        return navi
+    }
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+    
+
+    /*
+    // MARK: - Navigation
+
+    // In a storyboard-based application, you will often want to do a little preparation before navigation
+    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
+        // Get the new view controller using segue.destinationViewController.
+        // Pass the selected object to the new view controller.
+    }
+    */
+
+}

+ 2 - 2
SolarStation/NetWorkBaseApi.swift

@@ -20,7 +20,7 @@
 
  class MyDataEngine: Target {
 
-     class func changePhoneNumberInfo(withControl: AnyObject, orderNum: String, mobileNum: String, complate: @escaping complateClosure ){
+     class func changePhoneNumberInfo(3 orderNum: String, mobileNum: String, complate: @escaping complateClosure ){
      
          callRequestWithControl(control: withControl as! NSObject, path: "/order/detail", params: ["order_number":orderNum ,"mobile":mobileNum], type: .GET, onComplete: complate)
      }
@@ -100,7 +100,7 @@ extension Target: TargetType {
     var headers: [String : String]? {
     
         //公共参数
-        return ["api_version" : "1.0.0",]
+        return nil
     }
 
 }

+ 12 - 5
SolarStation/NetWorkConfig.swift

@@ -8,9 +8,19 @@
 
 import Foundation
 import UIKit
-
+/*
+ //正式环境 : https://station-iot.com/api/
+ //测试环境 :http://test.station-iot.com/api/
+ let moyaBase = "http://test.station-iot.com/api"
+ let ImageBase = "https://station-iot.com"
+ */
 //baseUrl
-let BaseUrl = "https://baidu.com"
+//正式环境 : https://station-iot.com/api/
+//测试环境 :http://test.station-iot.com/api/
+
+//let moyaBase = "https://station-iot.com/api"
+//let ImageBase = "https://station-iot.com"
+let BaseUrl = moyaBase
 
 //是否打印请求信息
 let NetWorkLog = true
@@ -25,6 +35,3 @@ let NetWorkSuccessCode = 0
 let NetWorkResMessageKey = "msg"
 
 
-class NetWorkConfig: NSObject {
-
-}

+ 1 - 0
SolarStation/NetWorkManager.swift

@@ -126,6 +126,7 @@ struct NetWorkManager {
             switch result {
                 
             case let .success(response):
+                
                 do {
                     //转JSON
                     let responseDict = try JSONSerialization.jsonObject(with: response.data)

+ 84 - 0
SolarStation/RootNavigationController.swift

@@ -0,0 +1,84 @@
+//
+//  RootNavigationController.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/8.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import UIKit
+
+class RootNavigationController: UINavigationController {
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+          setNavigationBar()
+        // Do any additional setup after loading the view.
+    }
+    func setNavigationBar()  {
+        let apperance = UINavigationBar.appearance()
+        //设置阴影
+       // apperance.shadowColor = UIColor.gray
+//        //设置半透明效果
+     self.navigationBar.isTranslucent = false
+        //将导航栏上按钮颜色
+        apperance.tintColor = UIColor.white
+        //设置图片作为导航栏的背景图片,设置了背景图片,导航栏就不透明了
+        var image = UIImage(named: "88.png")
+        var height :CGFloat
+        if UIDevice.current.isX(){
+            height = 88
+        }else{
+            height = 64
+        }
+        //裁剪图片
+       
+        UIGraphicsBeginImageContext(CGSize(width:KSCREENWIDTH , height: height))
+        image?.draw(in: CGRect.init(x: 0, y: 0, width: KSCREENWIDTH, height: height))
+        image = UIGraphicsGetImageFromCurrentImageContext()
+         UIGraphicsEndImageContext()
+//        apperance.setBackgroundImage(image, for: UIBarMetrics.default)
+        apperance.setBackgroundImage(image, for: UIBarPosition.any, barMetrics: UIBarMetrics.default)
+         apperance.shadowImage = UIImage()
+        //设置导航栏title格式
+        let dict  = [NSAttributedStringKey.foregroundColor:UIColor.white,NSAttributedStringKey.font:UIFont(name: "STHeitiSC-Light", size: 19) ]
+        apperance.titleTextAttributes = dict as Any as? [NSAttributedStringKey : Any]
+        let backAppearance = UIBarButtonItem.appearance()
+        //设置导航栏返回按钮
+        if #available(iOS 11, *){
+            backAppearance.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -200, vertical: -10), for: UIBarMetrics.default)
+            
+            let backButtonImage = UIImage(named: "icon_backarrow")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
+           
+            apperance.backIndicatorImage = backButtonImage
+            apperance.backIndicatorTransitionMaskImage = backButtonImage
+
+        }else {
+            //返回按钮没有文字
+            backAppearance.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -200, vertical: 0), for: UIBarMetrics.default)
+                    let backButtonImage = UIImage(named: "icon_backarrow")?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
+            backAppearance.setBackButtonBackgroundImage(backButtonImage?.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 32, bottom: 0, right: 0)), for: UIControlState.normal, barMetrics: UIBarMetrics.default)
+            
+        }
+    }
+    
+    
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+    
+
+    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
+        if self.viewControllers.count > 0 {
+            viewController.hidesBottomBarWhenPushed = true
+            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: self, action: #selector(RootNavigationController.backAction ))
+        }
+        super.pushViewController(viewController, animated: animated)
+    }
+   
+    @objc func backAction()  {
+       
+        self.navigationController?.popViewController(animated: true)
+    }
+}

文件差异内容过多而无法显示
+ 233 - 0
SolarStation/SSAlarmCell.swift


+ 185 - 0
SolarStation/SSAlarmHeader.swift

@@ -0,0 +1,185 @@
+//
+//  SSAlarmHeader.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/10/28.
+//  Copyright © 2018 weclouds. All rights reserved.
+//
+
+import UIKit
+
+extension UIButton{
+    
+    func ss_setTitle(_ title :String,state:UIControlState){
+         self.set(image: UIImage(named: "时间选择下拉"), title: title, titlePosition: .left, additionalSpacing: 15, state: state)
+    }
+    
+    func setRight()  {
+        self.setImage(UIImage(named: "时间选择下拉"), for: .normal)
+        self.titleEdgeInsets = UIEdgeInsetsMake(0, -((self.imageView?.size.width)!), 0,  (self.imageView?.image?.size.width)!)
+        self.imageEdgeInsets = UIEdgeInsetsMake(0, (self.titleLabel?.bounds.size.width)!, 0, -(self.titleLabel?.bounds.size.width)!)
+    }
+}
+
+class SSAlarmHeader: UIView {
+    
+    var timeStr :String?{
+        didSet{
+            timeBtn.ss_setTitle(timeStr!, state: .normal)
+        }
+    }
+    
+    var typeStr :String?{
+        didSet{
+            typeBtn.ss_setTitle(typeStr!, state: .normal)
+        }
+    }
+    
+    var markerStr :String?{
+        didSet{
+            markerBtn.ss_setTitle(markerStr!, state: .normal)
+        }
+    }
+    
+    var deviceStr :String?{
+        didSet{
+            deviceBtn.ss_setTitle(deviceStr!, state: .normal)
+        }
+    }
+    
+    var callTime: (()->Void)?
+    var callType : (()->Void)?
+    var callMarker :(()->Void)?
+    var callDevice : (()->Void)?
+    
+    lazy var timeBtn :UIButton = {
+        let timeBtn = UIButton(type: .custom)
+        timeBtn.ss_setTitle("时间", state: .normal)
+        timeBtn.setTitleColor(UIColor.gray, for: .normal)
+        timeBtn.titleLabel?.font = UIFont(name: KFontName, size: 13)
+        timeBtn.addTarget(self, action: #selector(clickTime), for: .touchUpInside)
+        return timeBtn
+    }()
+    
+    lazy var typeBtn : UIButton = {
+        let typeBtn = UIButton(type: .custom)
+        typeBtn.ss_setTitle("类型", state: .normal)
+        typeBtn.setTitleColor(UIColor.gray, for: .normal)
+        typeBtn.titleLabel?.font = UIFont(name: KFontName, size: 13)
+        typeBtn.addTarget(self, action: #selector(clickType), for: .touchUpInside)
+        return typeBtn
+    }()
+    
+    lazy var markerBtn: UIButton = {
+        let markerBtn = UIButton(type: .custom)
+        markerBtn.ss_setTitle("标注", state: .normal)
+        markerBtn.setTitleColor(UIColor.gray, for: .normal)
+        markerBtn.titleLabel?.font = UIFont(name: KFontName, size: 13)
+        markerBtn.addTarget(self, action: #selector(clickMarker), for: .touchUpInside)
+        return markerBtn
+    }()
+    
+    lazy var deviceBtn: UIButton = {
+        let deviceBtn = UIButton(type: .custom)
+        deviceBtn.ss_setTitle("全部设备", state: .normal)
+        deviceBtn.setTitleColor(UIColor.gray, for: .normal)
+        deviceBtn.titleLabel?.font = UIFont(name: KFontName, size: 13)
+        deviceBtn.addTarget(self, action: #selector(clickDevice), for: .touchUpInside)
+        return deviceBtn
+    }()
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+       createUI()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+}
+
+extension SSAlarmHeader{
+    
+    
+    //MARK :  创建UI
+    func createUI()  {
+        
+        //背景颜色
+        backgroundColor = UIColor.white
+        
+        let space = ( KSCREENWIDTH - 3 ) / 4
+        //分割线
+        for i in 0..<3 {
+            let lineView = UIView(frame: CGRect(x: space * CGFloat(i + 1), y: 10, width: 1, height: 29))
+            lineView.backgroundColor = UIColor(hexString: "E8E8E8")
+            addSubview(lineView)
+        }
+        
+        //底部分割线
+        let bottomLine = UIView()
+        bottomLine.backgroundColor = UIColor(hexString: "E8E8E8")
+        addSubview(bottomLine)
+        
+        bottomLine.snp.makeConstraints { (make) in
+            make.leading.trailing.equalToSuperview()
+            make.bottom.equalToSuperview()
+            make.height.equalTo(1)
+        }
+        
+        addSubview(timeBtn)
+        addSubview(typeBtn)
+        addSubview(markerBtn)
+        addSubview(deviceBtn)
+        
+        timeBtn.snp.makeConstraints { (make) in
+            make.leading.equalToSuperview().offset(6)
+            make.top.bottom.equalToSuperview()
+            make.width.equalTo((space - 12))
+        }
+        
+        typeBtn.snp.makeConstraints { (make) in
+            make.leading.equalToSuperview().offset(6 + space )
+            make.top.bottom.equalToSuperview()
+            make.width.equalTo((space - 12))
+        }
+        
+        markerBtn.snp.makeConstraints { (make) in
+            make.leading.equalToSuperview().offset(6 + 2 * space )
+            make.top.bottom.equalToSuperview()
+            make.width.equalTo((space - 12))
+        }
+        
+        deviceBtn.snp.makeConstraints { (make) in
+            make.leading.equalToSuperview().offset(6 + 3 * space)
+            make.top.bottom.equalToSuperview()
+            make.width.equalTo((space - 12))
+        }
+        
+    
+    }
+    
+    @objc func clickTime(_ sender:UIButton)  {
+        //sender.isSelected = !sender.isSelected
+        log.debug("time")
+          callTime!()
+    }
+    
+    @objc func clickType(_ sender:UIButton)  {
+       // sender.isSelected = !sender.isSelected
+       log.debug("type")
+       callType!()
+    }
+    
+    @objc func clickMarker(_ sender : UIButton)  {
+        //sender.isSelected = !sender.isSelected
+        log.debug("marker")
+        callMarker!()
+    }
+    
+    @objc func clickDevice(_ sender:UIButton)  {
+        //sender.isSelected = !sender.isSelected
+        log.debug("device")
+        callDevice!()
+    }
+}

+ 22 - 0
SolarStation/SSLoginDataEngine.swift

@@ -0,0 +1,22 @@
+//
+//  SSLoginDataEngine.swift
+//  SolarStation
+//
+//  Created by weclouds on 2020/8/23.
+//  Copyright © 2020 weclouds. All rights reserved.
+//
+
+import UIKit
+
+class SSLoginDataEngine: Target {
+   class func commonLogHttpRequest(withControl: AnyObject,username: String, client_key: String, password: String , os: String, complate: @escaping complateClosure)  {
+         let params = [
+         "username":username,
+         "client_key": client_key,
+         "password": "123456",
+         "os":os
+         ]
+    
+        callRequestWithControl(control: withControl as! NSObject, path: "/common/login", params: params, type: .POST, onComplete: complate)
+    }
+}

+ 172 - 0
SolarStation/SSPickerView.swift

@@ -0,0 +1,172 @@
+//
+//  SSPickerView.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/10/31.
+//  Copyright © 2018 weclouds. All rights reserved.
+//
+
+import UIKit
+
+class SSPickerView: UIView {
+
+    //回调
+    var callback:((String)->Void)?
+    var deviceCallback:((Device_data)->Void)?
+    
+    var clearCallback :(()->Void)?
+    
+    var isDevice: Bool?{
+        didSet{
+            
+        }
+    }
+    
+
+    
+    var pickerDataArr :[String]?
+    
+    //用户选择的值
+    var selectedValue :String?
+    var selectedDevice :Device_data?
+    lazy var pickerView: UIPickerView = {
+        let pickerView = UIPickerView(frame:CGRect.zero)
+        pickerView.delegate = self
+        pickerView.dataSource = self
+        return pickerView
+    }()
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        createUI()
+    }
+    
+    var deviceArr : [Device_data]?{
+        didSet{
+        
+            pickerView.reloadAllComponents()
+        }
+    }
+    
+    init(_ deviceArr :[Device_data]) {
+        super.init(frame: CGRect.zero)
+        self.isDevice = true
+        
+        var tempArr : [Device_data] =  [Device_data]()
+        let allDevice = Device_data(id: "ALL", model: "全部设备", type: nil, address:nil, sw_version: nil, hw_version: nil, serial_no: nil, status: nil, online: nil, pn_code: nil)
+        
+        tempArr.append(allDevice)
+        for device in deviceArr{
+            tempArr.append(device)
+        }
+      
+      self.deviceArr = tempArr
+          log.debug("全部设备 \(self.deviceArr)")
+        createUI()
+    }
+    
+    init(_ pickerDataArr : [String]) {
+        super.init(frame: CGRect.zero)
+        self.isDevice = false
+        self.pickerDataArr = pickerDataArr
+         createUI()
+    }
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+
+}
+
+extension SSPickerView{
+    func createUI()  {
+        self.backgroundColor = UIColor.white
+        let clearBtn  = UIButton.init(type: .custom)
+        clearBtn.setTitle("clear".localizedstr(), for: .normal)
+        clearBtn.setTitleColor(UIColor.black, for: .normal)
+        clearBtn.addTarget(self, action: #selector(clearAction), for: .touchUpInside)
+        self.addSubview(clearBtn)
+        
+        clearBtn.snp.makeConstraints { (make) in
+            make.leading.top.equalToSuperview()
+            make.width.equalTo(80)
+            make.height.equalTo(44)
+        }
+        
+        let confirmBtn  = UIButton.init(type: .custom)
+        confirmBtn.setTitle("confirm".localizedstr(), for: .normal)
+        confirmBtn.setTitleColor(UIColor.black, for: .normal)
+        confirmBtn.addTarget(self, action: #selector(confirmAction), for: .touchUpInside)
+        self.addSubview(confirmBtn)
+        
+        confirmBtn.snp.makeConstraints { (make) in
+            make.top.trailing.equalToSuperview()
+            make.width.equalTo(80)
+            make.height.equalTo(44)
+        }
+        
+        addSubview(pickerView)
+        pickerView.snp.makeConstraints { (make) in
+            make.top.equalTo(clearBtn.snp.bottom)
+            make.leading.trailing.bottom.equalToSuperview()
+        }
+    }
+    
+    @objc func clearAction()  {
+        clearCallback!()
+        
+        if isDevice! {
+              log.debug("清除\(selectedDevice)")
+        }else{
+              log.debug("清除\(selectedValue)")
+        }
+      
+    }
+    @objc func confirmAction() {
+        if isDevice! {
+            deviceCallback!(selectedDevice!)
+            log.debug("确认\(selectedDevice)")
+        }else{
+            callback!(selectedValue!)
+             log.debug("确认\(selectedValue)")
+        }
+        
+    }
+}
+
+extension SSPickerView:UIPickerViewDelegate,UIPickerViewDataSource{
+    func numberOfComponents(in pickerView: UIPickerView) -> Int {
+        return 1
+    }
+
+    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
+        
+        if isDevice! {
+            return (deviceArr?.count)!
+        }else{
+             return (pickerDataArr!.count)
+        }
+       
+    }
+
+    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
+        if isDevice! {
+            let device : Device_data = deviceArr![row]
+            return device.model
+        }else{
+             return (pickerDataArr?[row] )
+        }
+      
+    }
+    
+    //选择控件事件
+    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
+        if isDevice! {
+            selectedDevice = deviceArr?[row]
+        }else{
+              selectedValue = pickerDataArr?[row]
+        }
+      
+    }
+
+}

+ 359 - 0
SolarStation/SSReportVCtr.swift

@@ -0,0 +1,359 @@
+//
+//  SSReportVCtr.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/8.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import UIKit
+import SwiftyJSON
+
+
+class SSReportVCtr: UIViewController {
+    
+     let header = SSAlarmHeader()
+    
+    var navBarTitleBtn :UIButton?
+    
+    var menuView : FWMenuView?
+    
+    //电站数据
+    var mStation_getInfo :Station_getInfo?
+    
+    var stations:[HStation] = [HStation](){
+        didSet{
+            
+        }
+    }
+
+    
+    // 报警数据
+    var mAlarmInfo :Alarm_getInfo?
+    
+    var alarms : [AlarmData] = [AlarmData]()
+    
+    lazy  var translucentView :TranslucentView = {   () -> TranslucentView in
+        let tempView = TranslucentView.init(frame: CGRect.zero)
+        tempView.isHidden = true
+        return tempView
+    }()
+    //设置menu属性
+    lazy var vMenuProperty: FWMenuViewProperty = {
+        let vProperty = FWMenuViewProperty()
+        vProperty.contentHorizontalAlignment = .center
+        // vProperty.popupViewSize = CGSize(width: 300, height: 0)
+        vProperty.popupCustomAlignment = .topCenter
+        vProperty.popupAnimationType = .scale
+        vProperty.popupArrowStyle = .round
+        vProperty.touchWildToHide = "1"
+        vProperty.topBottomMargin = 10
+        vProperty.maskViewColor = UIColor(white: 0, alpha: 0.3)
+        vProperty.popupViewEdgeInsets = UIEdgeInsetsMake(KNavBarHeight, 0, 0, 0)
+        
+        return vProperty
+    }()
+    
+    
+    lazy var tableView: UITableView = {
+        let tableView  = UITableView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: KSCREENHEIGHT - KNavBarHeight - KTabbarHeight), style: .plain)
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.separatorStyle  = .none
+        tableView.backgroundColor = UIColor.clear
+        // 自适应cell height
+        tableView.estimatedRowHeight  =  UITableViewAutomaticDimension //自动计算
+        tableView.rowHeight = UITableViewAutomaticDimension
+        
+        //注册cell
+        tableView.register(SSAlarmCell.self, forCellReuseIdentifier: "cell")
+        return tableView
+    }()
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+   
+        createUI()
+        
+        station_getHttpRequest()
+        // Do any additional setup after loading the view.
+    }
+
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        // Dispose of any resources that can be recreated.
+    }
+
+}
+
+extension SSReportVCtr {
+    
+    func setupNavBar()  {
+        //1.设置阴影颜色
+        self.navigationController?.navigationBar.layer.shadowColor = UIColor.black.cgColor
+        //2.设置阴影偏移范围
+        self.navigationController?.navigationBar.layer.shadowOffset = CGSize(width: 0, height: 5)
+        //3.设置阴影颜色的透明度
+        self.navigationController?.navigationBar.layer.shadowOpacity = 0.2
+       // log.debug("proect.count \(projects.count)")
+        //4.设置按钮
+        self.navigationItem.title = ""
+        navigationItem.leftBarButtonItem = UIBarButtonItem.createBarbuttonItem(image: "搜索icon", highImage: "搜索icon", target: self, action: #selector(SSProjectVCtr.searchStation))
+        navigationItem.rightBarButtonItem = UIBarButtonItem.createBarbuttonItem(image: "地图icon", highImage: "地图icon", target: self, action: #selector(SSProjectVCtr.goToMap))
+        
+        navBarTitleBtn = UIButton(type: .custom)
+        navBarTitleBtn?.addTarget(self, action: #selector(showPopView), for: .touchUpInside)
+        navBarTitleBtn?.frame = CGRect(x: 0, y: 0, width: 150, height: KNavBarHeight)
+        navBarTitleBtn?.setImage(UIImage(named: "顶部下拉箭头"), for: .normal)
+        navBarTitleBtn?.layoutButton(style: YWButtonEdgeInsetsStyle.Right, imageTitleSpace: 5 )
+        
+        self.navigationItem.titleView = navBarTitleBtn
+    }
+    
+    func createUI()  {
+        setupNavBar()
+        menuView?.isProject = false
+        view.backgroundColor = UIColor(hexString: "F8F8F8")
+        view.addSubview(tableView)
+        //设置过滤
+        setFiltrationConditionView()
+    }
+    
+    //设置条件选择view
+    func setFiltrationConditionView()  {
+        //添加一个选择的半透明背景
+        let window = UIApplication.shared.keyWindow
+      //  let topSpace = Int(KNavBarHeight + 49)
+        window?.addSubview(self.translucentView)
+        self.translucentView.snp.makeConstraints{(make) in
+            make.top.equalToSuperview()
+            make.left.equalToSuperview()
+            make.right.equalToSuperview()
+            make.bottom.equalToSuperview()
+        }
+    }
+    
+    func translucenViewCallback()  {
+        
+        self.translucentView.touchCallback = {()->Void in
+            
+        }
+//        self.translucentView.deviceCallback = {[weak self](device) in
+//            self?.showTranslucetView(false)
+//            self?.header.deviceStr = device.model
+//        }
+//        self.translucentView.dateCallback = {[weak self](date) in
+//            self?.showTranslucetView(false)
+//            self?.header.deviceStr = date
+//        }
+//        self.translucentView.typeCallback = {[weak self](type) in
+//            self?.showTranslucetView(false)
+//            self?.header.typeStr = type
+//        }
+//        
+//        self.translucentView.markerCallback = {[weak self](marker) in
+//            self?.showTranslucetView(false)
+//            self?.header.markerStr = marker
+//        }
+    }
+    
+    
+    func showTranslucetView(_ hidden: Bool)  {
+        UIView.animate(withDuration: 0.25) {
+            self.translucentView.isHidden = !hidden
+        }
+    }
+    
+    
+    @objc func searchStation(){
+        log.debug("搜索电站")
+        let vc = SSStationSearchVCtr()
+        self.navigationController?.pushViewController(vc)
+    }
+    @objc func showPopView(){
+        showTranslucetView(false)
+        if (self.menuView?.visible)! {
+            self.menuView?.hide()
+        } else {
+            self.menuView?.show()
+        }
+    }
+}
+
+extension SSReportVCtr : UITableViewDelegate,UITableViewDataSource{
+    
+    func numberOfSections(in tableView: UITableView) -> Int {
+        return 1
+    }
+    
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return alarms.count
+    }
+    
+    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
+        return 49
+    }
+    
+    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+       
+        header.callTime = { () in
+            log.debug("时间  ")
+            
+            self.showTranslucetView(true)
+            //header.timeStr = "2018/10/29"
+            self.translucentView.setViewType(viewtype: .date)
+        }
+        header.callType = { () in
+            log.debug("类型")
+          //  header.typeStr = "aaa"
+            self.showTranslucetView(true)
+            self.translucentView.setViewType(viewtype: .type)
+        }
+        header.callMarker = {() in
+            log.debug("标注")
+           // header.markerStr = "未标记"
+            self.showTranslucetView(true)
+            self.translucentView.setViewType(viewtype: .marker)
+        }
+        header.callDevice = { () in
+            log.debug("设备")
+           /// header.deviceStr = "bbbb"
+            self.showTranslucetView(true)
+            self.translucentView.setViewType(viewtype: .device)
+        }
+        
+        return header
+    }
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        
+        var  cell  = tableView.dequeueReusableCell(withIdentifier: "cell") as? SSAlarmCell
+        if cell == nil{
+            cell = SSAlarmCell(style: .default, reuseIdentifier: "cell")
+        }
+        let model = alarms[indexPath.row]
+        cell?.model = model
+        cell?.selectionStyle = .none
+        return cell!
+    }
+    
+    
+}
+
+
+//HttpRequest
+extension SSReportVCtr{
+    func station_getHttpRequest(){
+        log.warning(Thread.current)
+        let username = AppShare.username
+        let client_key = AppShare.client_key
+        let  token  = AppShare.token
+        let os = AppShare.os
+        g_station_getHttpRequest(username, client_key: client_key, token: token, os: os, project_id: nil, lng_low: nil, lng_high: nil, lat_low: nil, lat_high: nil, keyword: nil, success: httpSuccess, fail: httpfail)
+        
+    }
+    func httpSuccess(_ json :JSON) {
+        //先清空数组
+        stations.removeAll()
+        mStation_getInfo = Station_getInfo.fromJSON(json)
+        stations = (mStation_getInfo?.result.stations)!
+        //tableView.reloadData()
+
+       /*进入界面的时候,如果沙盒里边没有数据,就取数组里边第一个数据;
+         如果有数据   就取沙盒里边的数据
+         */
+        if let station_name = stations.first?.station_name,let station_id = stations.first?.station_id {
+            let userDef = UserDefaults.standard
+            let save_station_id = userDef.object(forKey: "station_id")
+            let save_station_name  = userDef.object(forKey: "station_name")
+            
+            if save_station_id != nil   && save_station_name != nil {
+                //请求数据
+                alarm_getHttpRequest(save_station_id as! String)
+                self.translucentView.station_id = save_station_id as? String
+                //修改title
+                  navBarTitleBtn?.setTitle((save_station_name as! String), for: .normal)
+                 navBarTitleBtn?.layoutButton(style: YWButtonEdgeInsetsStyle.Right, imageTitleSpace: 5)
+                
+            }else{ //
+                
+                //请求数据
+                alarm_getHttpRequest(station_id)
+               self.translucentView.station_id = station_id
+                //修改title
+                navBarTitleBtn?.setTitle((station_name ), for: .normal)
+                navBarTitleBtn?.layoutButton(style: YWButtonEdgeInsetsStyle.Right, imageTitleSpace: 5)
+              
+            }
+            
+        }
+        
+        loadPopMenu()
+    }
+    
+    
+    //加载弹出菜单
+    func loadPopMenu(){
+        var itemTitles =  [String]()
+        itemTitles.removeAll()
+        for station in stations {
+            if let station_name = station.station_name{
+                itemTitles.append(station_name)
+            }
+        }
+        
+        log.debug()
+        menuView = FWMenuView.menu(itemTitles: itemTitles, itemImageNames: nil, itemBlock: { (popupView, index) in
+            print("Menu:点击了第\(index)个按钮")
+            let station : HStation = self.stations[index]
+            if let station_name = station.station_name,let station_id = station.station_id{
+                //修改navbartitleBtn
+                self.navBarTitleBtn?.setTitle(station_name, for: .normal)
+                self.navBarTitleBtn?.layoutButton(style: YWButtonEdgeInsetsStyle.Right, imageTitleSpace: 5)
+                
+                //保存到沙盒
+                let userDefault = UserDefaults.standard
+                userDefault.set(station_id, forKey: "station_id")
+                userDefault.set(station_name, forKey: "station_name")
+                
+                //请求数据
+                self.alarm_getHttpRequest(station_id)
+                self.translucentView.station_id = station_id
+                
+            }
+        }, property: vMenuProperty)
+    }
+    func httpfail(){
+        log.debug("失败")
+    }
+    
+    
+    //alarm_get
+    func alarm_getHttpRequest(_ station_id :String, project_id :String? = nil, date:String? = nil,alarm_type :String? = nil
+        ,label:String? = nil,device_id :String? = nil){
+        log.warning(Thread.current)
+        let username = AppShare.username
+        let client_key = AppShare.client_key
+        let  token  = AppShare.token
+        let os = AppShare.os
+        
+        g_alarm_getHttpRequest(username, client_key: client_key, token: token, os: os, station_id: station_id, project_id: project_id, date: date, alarm_type: alarm_type, label: label, device_id: device_id, success: alarm_getHttpSuccess, fail: alarm_getHttpfail)
+        
+    }
+    func alarm_getHttpSuccess(_ json :JSON) {
+        alarms.removeAll()
+        mAlarmInfo = Alarm_getInfo.fromJSON(json)
+        alarms = (mAlarmInfo?.result.alarms)!
+        
+        tableView.reloadData()
+    }
+    
+    
+ 
+    func  alarm_getHttpfail(){
+        log.debug("失败")
+    }
+}

+ 22 - 0
SolarStation/SSReportVCtr.xib

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="SSReportVCtr" customModuleProvider="target">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
+        </view>
+    </objects>
+</document>

+ 92 - 0
SolarStation/SwiftPopup/SwiftPopup/SwiftPopup.swift

@@ -0,0 +1,92 @@
+//
+//  SwiftPopup.swift
+//  SwiftPopup
+//
+//  Created by CatchZeng on 2018/1/8.
+//
+
+import UIKit
+import Foundation
+import SnapKit
+
+open class SwiftPopup: UIViewController {
+    
+    @IBInspectable public var backViewColor: UIColor = UIColor(white: 0.1, alpha: 0.5)
+    
+    // Custom animatedTransitioning
+    public var showAnimation: UIViewControllerAnimatedTransitioning? = SwiftPopupShowAnimation()
+    public var dismissAnimation: UIViewControllerAnimatedTransitioning? = SwiftPopupDismissAnimation()
+    
+    public var isShowing: Bool {
+        return mIsShowing
+    }
+    private var mIsShowing: Bool = false
+    
+    // MARK: Life Cycle
+    
+    public init() {
+        super.init(nibName: nil, bundle: nil)
+        commonInit()
+    }
+    
+    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
+        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
+        commonInit()
+    }
+    
+    public required init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+        commonInit()
+    }
+    
+    open override func viewDidLoad() {
+        super.viewDidLoad()
+        view.backgroundColor = UIColor.clear
+    }
+    
+    // MARK: Public Methods
+    
+    public func show(above viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController,
+                           completion: (()-> Void)? = nil) {
+        mIsShowing = true
+        
+        viewController?.present(self, animated: true, completion: completion)
+    }
+    
+    public func dismiss(completion: (()-> Void)? = nil) {
+        dismiss(animated: true) {
+            self.mIsShowing = false
+            completion?()
+        }
+    }
+    
+    // MARK: Private Methods
+    
+    fileprivate func commonInit() {
+        modalPresentationStyle = .custom
+        transitioningDelegate = self
+    }
+}
+
+extension SwiftPopup: UIViewControllerTransitioningDelegate {
+    
+    public func presentationController(forPresented presented: UIViewController,
+                                       presenting: UIViewController?,
+                                       source: UIViewController) -> UIPresentationController? {
+        let controller = SwiftPopupPresentationController(presentedViewController: presented,
+                                                       presenting: presenting)
+        controller.backViewColor = backViewColor
+        
+        return controller
+    }
+    
+    public func animationController(forPresented presented: UIViewController,
+                                    presenting: UIViewController,
+                                    source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
+        return showAnimation
+    }
+    
+    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
+        return dismissAnimation
+    }
+}

+ 72 - 0
SolarStation/SwiftPopup/SwiftPopup/SwiftPopupAnimation.swift

@@ -0,0 +1,72 @@
+//
+//  SwiftPopupAnimation.swift
+//  SwiftPopup
+//
+//  Created by CatchZeng on 2018/1/8.
+//
+
+import UIKit
+
+open class SwiftPopupShowAnimation: NSObject, UIViewControllerAnimatedTransitioning {
+    
+    public var duration: TimeInterval = 0.8
+    public var delay: TimeInterval = 0.0
+    public var springWithDamping: CGFloat = 0.8
+    public var springVelocity: CGFloat = 2.0
+    
+    open func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
+        return duration
+    }
+    
+    open func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
+        guard let toViewController = transitionContext.viewController( forKey: UITransitionContextViewControllerKey.to),
+            let toView = transitionContext.view( forKey: UITransitionContextViewKey.to)
+            else {
+            return
+        }
+        
+        let containerView = transitionContext.containerView
+        toView.frame = transitionContext.finalFrame(for: toViewController)
+        containerView.addSubview(toView)
+        
+        toView.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
+        UIView.animate(withDuration: duration,
+                       delay: delay,
+                       usingSpringWithDamping: springWithDamping,
+                       initialSpringVelocity: springVelocity,
+                       options: .curveEaseInOut, animations: {
+                        toView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
+        }) { (finished) in
+            transitionContext.completeTransition(finished)
+        }
+    }
+}
+
+open class SwiftPopupDismissAnimation: NSObject, UIViewControllerAnimatedTransitioning {
+    
+    public var duration: TimeInterval = 0.2
+    public var delay: TimeInterval = 0.0
+    
+    open func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
+        return duration
+    }
+    
+    open func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
+        guard let fromView = transitionContext.view( forKey: UITransitionContextViewKey.from)
+            else {
+                return
+        }
+        
+        UIView.animate(withDuration: duration,
+                       delay: delay,
+                       options: .curveEaseInOut,
+                       animations: {
+                        fromView.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
+                        fromView.alpha = 0.0
+        }) { (finished) in
+            fromView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
+            fromView.alpha = 1.0
+            transitionContext.completeTransition(finished)
+        }
+    }
+}

+ 60 - 0
SolarStation/SwiftPopup/SwiftPopup/SwiftPopupPresentationController.swift

@@ -0,0 +1,60 @@
+//
+//  SwiftPopupPresentationController.swift
+//  SwiftPopup
+//
+//  Created by CatchZeng on 2018/1/8.
+//
+
+import Foundation
+import SnapKit
+
+open class SwiftPopupPresentationController: UIPresentationController {
+    
+    public var backViewColor = UIColor(white: 0.1, alpha: 0.5) {
+        didSet {
+            backgroundView.backgroundColor = backViewColor
+        }
+    }
+    
+    private lazy var backgroundView = UIView(frame: CGRect.zero)
+    
+    // MARK: Override Methods
+    
+    override open func presentationTransitionWillBegin() {
+        if let containerView = containerView {
+            containerView.insertSubview(backgroundView, at: 0)
+            backgroundView.snp.makeConstraints { (make) in
+                make.edges.equalTo(containerView).inset(UIEdgeInsets.zero)
+            }
+            
+            excuteBackgroundAnimation()
+        }
+    }
+    
+    override open func dismissalTransitionWillBegin() {
+        excuteBackgroundDismissAnimation()
+    }
+    
+    override open var shouldRemovePresentersView: Bool {
+        return false
+    }
+    
+    // MARK: Private Methods
+    
+    fileprivate func excuteBackgroundAnimation() {
+        backgroundView.alpha = 0
+        if let coordinator = presentedViewController.transitionCoordinator {
+            coordinator.animate(alongsideTransition: { (_) in
+                self.backgroundView.alpha = 1
+            }, completion: nil)
+        }
+    }
+    
+    fileprivate func excuteBackgroundDismissAnimation() {
+        if let coordinator = presentedViewController.transitionCoordinator {
+            coordinator.animate(alongsideTransition: { _ in
+                self.backgroundView.alpha = 0
+            }, completion: nil)
+        }
+    }
+}

+ 296 - 0
SolarStation/TranslucentView.swift

@@ -0,0 +1,296 @@
+//
+//  TranslucentView.swift
+//  SolarLamp
+//
+//  Created by weclouds on 2018/6/21.
+//  Copyright © 2018年 SolarLamp. All rights reserved.
+//  加选择全部  选择日期的这个
+
+import UIKit
+import SwiftyJSON
+import Toast_Swift
+
+
+
+enum TranslucenViewType  {
+    case date // 时间
+    case type // 类型
+    case marker // 标注
+    case device // 设备
+}
+class TranslucentView: UIView{
+    //回调
+    var touchCallback: (() -> Void)?
+    var dateCallback:((String) ->Void)?
+    //
+    var typeCallback:((String)->Void)?
+    var markerCallback :((String)->Void)?
+    var deviceCallback :((Device_data)->Void)?
+    
+    var current : Int?
+    var project_current : Int?
+    var fault_current : Int?
+    var process_type_current :Int?
+    var ifSelected :Bool = false // 是否选中
+    var lastSelected : IndexPath?
+
+    var station_id :String?{
+        didSet{
+            if let station_id = station_id {
+               device_getHttpRequest(station_id)
+            }
+        }
+    }
+    //查询设备列表
+    var mDeviceGetInfo:Device_getInfo?
+    var devices  :[Device_data]? = [Device_data]()
+    //类型
+    lazy var typePicker: SSPickerView = {
+        let typePicker = SSPickerView(types)
+        return typePicker
+    }()
+    
+    //标注
+    lazy var markPicker: SSPickerView = {
+        let markPicker = SSPickerView(markers)
+        return markPicker
+    }()
+    
+    //设备
+    lazy var devicePicker: SSPickerView = {
+        let devicePicker = SSPickerView(devices!)
+        return devicePicker
+    }()
+    
+    /*日期选择*/
+    lazy var datePicker = { () -> KKWPickerView in
+        var datePicker = KKWPickerView(frame: CGRect.zero)
+        return datePicker
+    }()
+    
+    
+    // 数据
+    var types = ["类型","太阳能板反接","太阳能板工作点超压","太阳能板逆流","光伏输入端超压","光伏输入端短路","光伏输入端功率过大","外部环境温度过高","控制器温度过高","负载功率过大或负载过流","负载短路","蓄电池超压","蓄电池欠压","蓄电池过放"]
+    
+    //标注
+    var markers = ["标注","已标注","未标注"]
+   // 设备
+    //var devices = ["全部设备"]
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+      
+        createUI()
+    }
+
+    required init?(coder aDecoder: NSCoder) {
+      
+        fatalError("init(coder:) has not been implemented")
+     
+    }
+
+    
+    override func layoutSubviews() {
+        super .layoutSubviews()
+    }
+    
+    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
+        UIView.animate(withDuration: 0.25) {
+            
+            self.isHidden = true
+            self.hidenAllSubView()
+            self.touchCallback?()
+        }
+    }
+
+  open class  func addInWindow()  {
+        let translucentView = TranslucentView()
+        let window = UIApplication.shared.keyWindow
+      //  var topSpace = KNavBarHeight + 49
+        window?.addSubview(translucentView)
+        translucentView.snp.makeConstraints{(make) in
+            make.top.equalToSuperview()
+            make.left.equalToSuperview()
+            make.right.equalToSuperview()
+            make.bottom.equalToSuperview()
+        }
+    }
+
+    
+    
+    
+    
+    
+}
+
+
+extension TranslucentView{
+    
+    //回调
+    func doCallback()  {
+        datePicker.datePickerCallback = {[weak self](date) in
+            self?.dateCallback!(date)
+        }
+//        
+//        typePicker.callback = { [weak self](type) in
+//            self?.typeCallback!(type)
+//        }
+//        typePicker.clearCallback = {
+//            
+//        }
+//        markPicker.callback = {[weak self](marker) in
+//            self?.markerCallback!(marker)
+//        }
+//        markPicker.clearCallback = {
+//            
+//        }
+//        devicePicker.deviceCallback = {[weak self](device) in
+//            self?.deviceCallback!(device)
+//        }
+//        devicePicker.clearCallback = { () -> Void  in
+//            
+//        }
+        
+    }
+    
+    
+    func createUI()  {
+       // hidenAllSubView()
+        self.backgroundColor = UIColor(patternImage: UIImage(named: "translucet")!)
+        
+        addSubview(datePicker)
+        addSubview(typePicker)
+        addSubview(markPicker)
+        addSubview(devicePicker)
+        
+        datePicker.snp.remakeConstraints { (make) in
+            make.leading.trailing.equalToSuperview()
+            make.height.equalTo(216 + 44)
+            make.top.equalTo(self.snp.bottom)
+        }
+        typePicker.snp.remakeConstraints { (make) in
+            make.leading.trailing.equalToSuperview()
+            make.height.equalTo(216 + 44)
+            make.top.equalTo(self.snp.bottom)
+        }
+        markPicker.snp.remakeConstraints { (make) in
+            make.leading.trailing.equalToSuperview()
+            make.height.equalTo(216 + 44)
+            make.top.equalTo(self.snp.bottom)
+        }
+        devicePicker.snp.remakeConstraints { (make) in
+            make.leading.trailing.equalToSuperview()
+            make.height.equalTo(216 + 44)
+            make.top.equalTo(self.snp.bottom)
+        }
+        
+        //处理回调
+        doCallback()
+    }
+    
+    
+
+    func hidenAllSubView()  {
+        UIView.animate(withDuration: 0.25) {
+            self.datePicker.snp.remakeConstraints { (make) in
+                make.leading.trailing.equalToSuperview()
+                make.height.equalTo(216 + 44)
+                make.top.equalTo(self.snp.bottom)
+            }
+            self.typePicker.snp.remakeConstraints { (make) in
+                make.leading.trailing.equalToSuperview()
+                make.height.equalTo(216 + 44)
+                make.top.equalTo(self.snp.bottom)
+            }
+            self.markPicker.snp.remakeConstraints { (make) in
+                make.leading.trailing.equalToSuperview()
+                make.height.equalTo(216 + 44)
+                make.top.equalTo(self.snp.bottom)
+            }
+            self.devicePicker.snp.remakeConstraints { (make) in
+                make.leading.trailing.equalToSuperview()
+                make.height.equalTo(216 + 44)
+                make.top.equalTo(self.snp.bottom)
+            }
+        }
+        
+        
+        
+        
+        
+    }
+    
+    func hidenAllSubViewButShow(_ sender :UIView)  {
+        hidenAllSubView()
+        
+        UIView.animate(withDuration: 1) {
+            sender.snp.remakeConstraints { (make) in
+                make.leading.trailing.equalToSuperview()
+                make.height.equalTo(216 + 44)
+                 make.top.equalTo(self.snp.bottom).offset(-260)
+            }
+        }
+    }
+
+    //日期选择其方法
+    func dateChanged(datePick: UIDatePicker)  {
+        //更新提醒时间文本框
+        let formatter = DateFormatter()
+        //日期样式
+        formatter.dateFormat = "MM-dd"
+     //   print(formatter.string(from: datePicker.date))
+        
+    }
+    
+    func setViewType (viewtype:TranslucenViewType)  {
+        
+        print("选择了viewtype:\(viewtype)")
+        switch viewtype {
+        case .date:
+            print("date")
+            hidenAllSubViewButShow(datePicker)
+            
+        case .type:
+            print("type")
+            hidenAllSubViewButShow(typePicker)
+        case .marker:
+            print("marker")
+            hidenAllSubViewButShow(markPicker)
+        default:
+            print("device")
+           hidenAllSubViewButShow(devicePicker)
+        }
+    }
+
+}
+
+extension TranslucentView{
+    //设备列表
+    func device_getHttpRequest(_ station_id : String)  {
+        log.warning(Thread.current)
+        let username = AppShare.username
+        let client_key = AppShare.client_key
+        let  token  = AppShare.token
+        let os = AppShare.os
+        g_device_getHttpRequest(username, client_key: client_key, token: token, os: os, station_id: station_id, success: device_getHttpSuccess, fail: device_getHttpfail)
+    }
+    func device_getHttpSuccess(_ json :JSON) {
+        mDeviceGetInfo =  Device_getInfo.fromJSON(json)
+        log.debug(mDeviceGetInfo?.result)
+        let result = mDeviceGetInfo?.result
+        devices = result?.devices
+        log.warning(devices)
+        
+        var tempArr : [Device_data] =  [Device_data]()
+        let allDevice = Device_data(id: "ALL", model: "全部设备", type: nil, address:nil, sw_version: nil, hw_version: nil, serial_no: nil, status: nil, online: nil, pn_code: nil)
+        
+        tempArr.append(allDevice)
+        for device in devices!{
+            tempArr.append(device)
+        }
+        self.devicePicker.deviceArr = tempArr
+       // tableView.reloadData()
+    }
+    func device_getHttpfail(){
+        log.debug("失败")
+    }
+}

+ 38 - 0
SolarStation/View/SSAccoutCell.swift

@@ -0,0 +1,38 @@
+//
+//  SSAccoutCell.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/14.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import UIKit
+
+class SSAccoutCell: UITableViewCell {
+
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        // Initialization code
+    }
+    
+    override func setSelected(_ selected: Bool, animated: Bool) {
+        super.setSelected(selected, animated: animated)
+
+        // Configure the view for the selected state
+    }
+    
+    @IBOutlet weak var nameLabel: UILabel!
+    @IBOutlet weak var nameValue: UILabel!
+    
+    var mNameLabel : String = "" {
+        didSet{
+            self.nameLabel.text = mNameLabel
+        }
+    } 
+    var mNameValue  :String? {
+        didSet{
+            self.nameValue.text = self.mNameValue
+        }
+    }
+    
+}

+ 75 - 0
SolarStation/View/SSAccoutCell.xib

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
+        <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="97" id="KGk-i7-Jjw" customClass="SSAccoutCell" customModule="SolarStationSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="321" height="97"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="321" height="96.5"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="公司" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="otd-8X-g3M">
+                        <rect key="frame" x="16" y="32" width="50" height="18"/>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="50" id="ivA-St-CuY"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="信息文化电站管理有限公司" textAlignment="right" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rQx-bh-eZP">
+                        <rect key="frame" x="66" y="32" width="239" height="18"/>
+                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                        <nil key="textColor"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9c8-G1-GKj" userLabel="topline">
+                        <rect key="frame" x="16" y="11" width="289" height="1"/>
+                        <color key="backgroundColor" red="0.85127914507772018" green="0.85127914507772018" blue="0.85127914507772018" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="displayP3"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="1" id="cDY-da-eHV"/>
+                        </constraints>
+                    </view>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bTh-wr-sxt" userLabel="bottomline">
+                        <rect key="frame" x="16" y="85" width="289" height="1"/>
+                        <color key="backgroundColor" red="0.85127914510000002" green="0.85127914510000002" blue="0.85127914510000002" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="displayP3"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="1" id="X3f-fM-FCa"/>
+                        </constraints>
+                    </view>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="bTh-wr-sxt" firstAttribute="trailing" secondItem="H2p-sc-9uM" secondAttribute="trailingMargin" id="1hQ-tN-bRI"/>
+                    <constraint firstItem="otd-8X-g3M" firstAttribute="top" secondItem="9c8-G1-GKj" secondAttribute="bottom" constant="20" id="3MR-DV-muC"/>
+                    <constraint firstAttribute="bottomMargin" secondItem="bTh-wr-sxt" secondAttribute="bottom" id="ELB-eL-mCM"/>
+                    <constraint firstAttribute="trailingMargin" secondItem="9c8-G1-GKj" secondAttribute="trailing" id="OeS-V3-sgg"/>
+                    <constraint firstItem="rQx-bh-eZP" firstAttribute="top" secondItem="9c8-G1-GKj" secondAttribute="bottom" constant="20" id="YQh-gN-eF3"/>
+                    <constraint firstItem="otd-8X-g3M" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leadingMargin" id="iyB-WE-MJN"/>
+                    <constraint firstItem="bTh-wr-sxt" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leadingMargin" id="o2k-1y-War"/>
+                    <constraint firstItem="9c8-G1-GKj" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leadingMargin" id="oE4-9b-6tJ"/>
+                    <constraint firstItem="9c8-G1-GKj" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="topMargin" id="qHZ-Ra-Y8P"/>
+                    <constraint firstItem="rQx-bh-eZP" firstAttribute="trailing" secondItem="H2p-sc-9uM" secondAttribute="trailingMargin" id="tFS-NY-qyd"/>
+                    <constraint firstItem="rQx-bh-eZP" firstAttribute="leading" secondItem="otd-8X-g3M" secondAttribute="trailing" id="tgl-TE-FbL"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
+            <connections>
+                <outlet property="nameLabel" destination="otd-8X-g3M" id="t6a-J1-yIE"/>
+                <outlet property="nameValue" destination="rQx-bh-eZP" id="jAp-QF-t9o"/>
+            </connections>
+            <point key="canvasLocation" x="45.5" y="79.5"/>
+        </tableViewCell>
+    </objects>
+</document>

+ 105 - 0
SolarStation/moya/AlarmApi.swift

@@ -0,0 +1,105 @@
+//
+//  AlarmApi.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/10/19.
+//  Copyright © 2018 weclouds. All rights reserved.
+//
+
+import Foundation
+import Moya
+import Alamofire
+//import RxSwift
+//import RxCocoa
+
+let AlarmProvider = MoyaProvider<AlarmAPI>()
+enum AlarmAPI {
+    case alarm_get_new_msg_count(username:String, client_key:String, token:String,os:String,station_id:String,project_id:String?)
+    case alarm_get(username:String, client_key:String, token:String,os:String,station_id:String,project_id:String?,date:String?,alarm_type:String?,label:String?,device_id:String?)
+    
+    
+}
+
+extension AlarmAPI:TargetType {
+    var base :String {
+        return moyaBase
+    }
+    //请求的url
+    public var baseURL: URL {return URL(string:base)!}
+    //详细的路径
+    public var path:String {
+        switch self {
+        case .alarm_get_new_msg_count:
+            return "/alarm/get_new_msg_count"
+        case .alarm_get:
+            return "/alarm/get"
+        }
+    }
+    //请求的方式
+    public   var method: Moya.Method {
+        switch self {
+        case .alarm_get_new_msg_count,.alarm_get :
+            return .post
+        }
+    }
+    //单元测试用
+    public  var sampleData:Data {
+        switch self {
+        case .alarm_get_new_msg_count:
+            return stubbedResponse("alarm_get_new_msg_count")
+        case .alarm_get:
+            return stubbedResponse("alarm_get")
+        }
+    }
+    //任务
+    public var task: Task {
+        switch self {
+       
+            
+        case .alarm_get_new_msg_count(let username, let client_key, let token, let os, let station_id, let project_id):
+            var p:[String: Any] =
+                ["username" :username,
+                 "client_key":client_key,
+                 "token":token,
+                 "os":os,
+                 "station_id":station_id]
+            if let  project_id = project_id {
+                p["project_id"] = project_id
+            }
+            return .requestParameters(parameters:p,
+                                      encoding: URLEncoding.default)
+        case .alarm_get(let username, let client_key, let token, let os, let station_id, let project_id, let date, let alarm_type, let label, let device_id):
+            var p:[String: Any] =
+                ["username" :username,
+                 "client_key":client_key,
+                 "token":token,
+                 "os":os,
+                 "station_id":station_id]
+            if let  project_id = project_id {
+                p["project_id"] = project_id
+            }
+            if let  date = date {
+                p["date"] = date
+            }
+            if let  alarm_type = alarm_type {
+                p["alarm_type"] = alarm_type
+            }
+            if let  label = label {
+                p["label"] = label
+            }
+            if let  device_id = device_id {
+                p["device_id"] = device_id
+            }
+            return .requestParameters(parameters:p,
+                                      encoding: URLEncoding.default)
+        }
+    }
+    //请求头信息
+    public var headers: [String : String]? {
+        return nil
+    }
+    
+}
+
+
+

文件差异内容过多而无法显示
+ 311 - 0
SolarStation/moya/DeviceApi.swift


+ 103 - 0
SolarStation/moya/HomeApi.swift

@@ -0,0 +1,103 @@
+//
+//  HomeApi.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/23.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import Moya
+import Alamofire
+//import RxSwift
+//import RxCocoa
+let HomeProvider = MoyaProvider<HomeAPI>()
+enum HomeAPI {
+    case home_data(username:String, client_key:String, token:String,os:String)
+    case station_get(username:String, client_key:String, token:String,os:String,project_id:String?,lng_low:String?,lng_high:String?,lat_low:String?,lat_high:String?,keyword:String?)
+    case project_get(username:String, client_key:String, token:String,os:String,show_station:String?)
+}
+extension HomeAPI :TargetType {
+    var base :String {
+        return moyaBase
+    }
+    //请求的url
+    public var baseURL: URL {return URL(string:base)!}
+    
+    public var path: String {
+        switch self {
+        case .home_data:
+            return "home/data"
+        case .project_get:
+            return "project/get"
+        case .station_get:
+            return "station/get"
+        }
+    }
+    
+   public var method: Moya.Method {
+          return .post
+    }
+    
+   public var sampleData: Data {
+    switch self {
+    case .home_data:
+        return stubbedResponse("home_data")
+    case .project_get:
+        return stubbedResponse("project_get")
+    case .station_get:
+        return stubbedResponse("station_get")
+    }
+    }
+    
+   public var task: Task {
+    switch self {
+            case .home_data(let username,let  client_key, let token , let os):
+                return .requestParameters(parameters: ["username" :username,
+                      "client_key":client_key,
+                      "token":token,
+                      "os":os],
+                     encoding: URLEncoding.default)
+            case .station_get(let username ,let  client_key ,let token,let  os ,let  project_id ,let  lng_low ,let  lng_high ,let  lat_low,let  lat_high,let  keyword ):
+                var p:[String: Any] =
+                    ["username" :username,
+                                      "client_key":client_key,
+                                      "token":token,
+                                      "os":os]
+                if let project_id = project_id {
+                    p["project_id"] = project_id
+                }
+                if let lng_low = lng_low {
+                    p["lng_low"] = lng_low
+                }
+                if let lng_high = lng_high{
+                    p["lng_high"] = lng_high
+                }
+                if let lat_low = lat_low{
+                    p["lat_low"] = lat_low
+                }
+                if let lat_high  = lat_high{
+                    p["lat_high"] = lat_high
+                }
+                if let keyword = keyword{
+                    p["keyword"] = keyword
+                }
+                return .requestParameters(parameters: p, encoding: URLEncoding.default)
+           case .project_get(let username , let client_key , let token, let os,let  show_station):
+            var p:[String: Any] =
+                ["username" :username,
+                 "client_key":client_key,
+                 "token":token,
+                 "os":os]
+            if let show_station = show_station{
+                p["show_station"] = show_station
+            }
+                return .requestParameters(parameters: p, encoding: URLEncoding.default)
+        }
+    }
+    
+  public  var headers: [String : String]? {
+        return nil
+    }
+    
+}

文件差异内容过多而无法显示
+ 661 - 0
SolarStation/moya/HttpRequest.swift


+ 64 - 0
SolarStation/moya/LoginApi.swift

@@ -0,0 +1,64 @@
+//
+//  LoginApi.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/3.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import Moya
+import Alamofire
+//import RxSwift
+//import RxCocoa
+
+let LoginProvider = MoyaProvider<LoginAPI>()
+enum LoginAPI {
+    case common_login(username:String, client_key:String, password:String,os:String)
+}
+
+extension LoginAPI:TargetType {
+    var base :String {
+        return moyaBase
+    }
+    //请求的url
+    public var baseURL: URL {return URL(string:base)!}
+    //详细的路径
+   public var path:String {
+        switch self {
+        case .common_login:
+            return "/common/login"
+        }
+    }
+    //请求的方式
+  public   var method: Moya.Method {
+        switch self {
+        case .common_login :
+            return .post
+        }
+    }
+    //单元测试用
+  public  var sampleData:Data {
+        switch self {
+        case .common_login:
+            return stubbedResponse("common_login")
+        }
+    }
+    //任务
+    public var task: Task {
+        switch self {
+        case .common_login(let username, let client_key, let password,let  os):
+            return .requestParameters(parameters: [
+                "username":username,
+                "client_key": client_key,
+                "password": password,
+                "os":os
+                ], encoding: URLEncoding.default)
+        }
+    }
+    //请求头信息
+    public var headers: [String : String]? {
+        return nil
+    }
+    
+}

+ 94 - 0
SolarStation/moya/ProjectApi.swift

@@ -0,0 +1,94 @@
+//
+//  ProjectApi.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/9/4.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import Moya
+import Alamofire
+//import RxSwift
+//import RxCocoa
+
+let ProjectProvider = MoyaProvider<ProjectAPI>()
+enum ProjectAPI {
+    case project_data(username:String, client_key:String, token:String,os:String,id:String)//项目信息
+    case project_save(username:String, client_key:String, token:String,os:String,id:String?,name:String,guest_name:String,company_name:String,address:String)// 添加/修改项目
+     case project_del(username:String, client_key:String, token:String,os:String,id:String)//
+}
+
+extension ProjectAPI :TargetType{
+    var base :String {
+        return moyaBase
+    }
+    //请求的url
+    public var baseURL: URL {return URL(string:base)!}
+    
+    public var path: String {
+        switch self {
+        case .project_data:
+            return "project/data"
+        case .project_save:
+            return "project/save"
+        case .project_del:
+            return "project/del"
+        }
+    }
+    
+    public var method: Moya.Method {
+        return .post
+    }
+    
+    public var sampleData: Data {
+        switch self {
+        case .project_data:
+            return stubbedResponse("project_data")
+        case .project_save:
+            return stubbedResponse("project_save")
+        case .project_del:
+            return stubbedResponse("project_del")
+        }
+    }
+    
+    public var task: Task {
+        switch self {
+        case .project_data(let username,let  client_key, let token , let os,let id):
+            return .requestParameters(parameters: ["username" :username,
+                                                   "client_key":client_key,
+                                                   "token":token,
+                                                   "os":os,
+                                                   "id":id],
+                                      encoding: URLEncoding.default)
+        
+        case .project_save(let username, let client_key, let token, let os, let id, let name, let guest_name, let company_name, let address):
+            var p:[String: Any] =
+                ["username" :username,
+                 "client_key":client_key,
+                 "token":token,
+                 "os":os,
+                 "name":name,
+                 "guest_name":guest_name,
+                 "company_name":company_name,
+                 "address":address]
+            if let id = id {
+                p["id"] = id
+            }
+            return .requestParameters(parameters:p,
+                                      encoding: URLEncoding.default)
+        case .project_del(let username, let client_key, let token, let os, let id):
+            return .requestParameters(parameters: ["username" :username,
+                                                   "client_key":client_key,
+                                                   "token":token,
+                                                   "os":os,
+                                                   "id":id],
+                                      encoding: URLEncoding.default)
+        }
+    }
+    
+    public  var headers: [String : String]? {
+        return nil
+    }
+    
+}

+ 49 - 0
SolarStation/moya/ProviderSupport.swift

@@ -0,0 +1,49 @@
+//
+//  ProviderSupport.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/3.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import Moya
+import  Alamofire
+//import RxSwift
+//import RxCocoa
+
+
+//正式环境 : https://station-iot.com/api/
+//测试环境 :http://test.station-iot.com/api/
+let moyaBase = "http://test.station-iot.com/api"
+let ImageBase = "https://station-iot.com"
+//MARK: - Provider support
+
+func stubbedResponse(_ filename:String) ->Data!{
+    @objc class TestClass:NSObject{}
+    
+    let bundle  = Bundle(for: TestClass.self)
+    let path = bundle.path(forResource: filename, ofType: "json")
+    return (try? Data(contentsOf: URL(fileURLWithPath: path!)))
+    
+}
+
+private extension String{
+    var URLEscapedString :String{
+        return self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
+    }
+}
+
+func url(_ route:TargetType) -> String {
+    return route.baseURL.appendingPathComponent(route.path).absoluteString
+}
+
+public func  JOSNResponseDataFormatter(_ data: Data)->Data{
+    do{
+        let dataAsJSON = try JSONSerialization.jsonObject(with: data)
+        let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
+        return prettyData
+    }catch{
+        return data//fallback to original data if it can't be serialized
+    }
+}

文件差异内容过多而无法显示
+ 226 - 0
SolarStation/moya/StationApi.swift


+ 92 - 0
SolarStation/moya/model/AlarmApiModel.swift

@@ -0,0 +1,92 @@
+//
+//  AlarmApiModel.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/10/19.
+//  Copyright © 2018 weclouds. All rights reserved.
+//
+
+import UIKit
+import SwiftyJSON
+//MARK:获取报警信息列表/搜索报警信息 alarm/get
+
+struct AlarmData {
+    var id :String? // 报警信息id
+    var device_id :String? // 设备id
+    var alarm_time :String? // 报警时间
+    var alarm_type :String? // 报警类型
+    var device_type: String? //设备类型(0控制器, 1逆变器)
+    var serial_no :String? // 设备序列号
+    var device_address:String? // 设备地址
+    var alarm_desc:String? // 报警描述
+    var marker :String? // 标注(0未标注, 1已标注)
+    var recovery_time :String? // 恢复时间
+}
+struct Alarm_getResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var alarms     : [AlarmData]?
+}
+
+class Alarm_getInfo: NSObject {
+    var result :Alarm_getResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Alarm_getResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    static func fromJSON(_ json:JSON) ->Alarm_getInfo{
+        var result = Alarm_getResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let alarms = json["data"].array
+        var _alarms = [AlarmData]()
+        if let alarms = alarms,alarms.count > 0 {
+            for pJSON in alarms{
+                let id = pJSON["id"].stringValue
+               let device_id = pJSON["device_id"].stringValue
+                let alarm_time = pJSON["alarm_time"].stringValue
+                let alarm_type = pJSON["alarm_type"].stringValue
+                let device_type = pJSON["device_type"].stringValue
+                var deviceTypeStr = ""
+                switch device_type{
+                case "0":
+                    deviceTypeStr = "控制器"
+                case "1":
+                    deviceTypeStr = "逆变器"
+                default:
+                    deviceTypeStr = ""
+                }
+                let serial_no = pJSON["serial_no"].stringValue
+                let device_address = pJSON["device_address"].stringValue
+                let alarm_desc = pJSON["alarm_desc"].stringValue
+                let marker = pJSON["marker"].stringValue
+                var makerStr = ""
+                switch marker {
+                case "0":
+                    makerStr = "未标注"
+                case "1":
+                    makerStr = "已标注"
+                default:
+                    makerStr = ""
+                }
+                let recovery_time = pJSON["recovery_time"].stringValue
+                _alarms.append(AlarmData(id: id, device_id: device_id, alarm_time: alarm_time, alarm_type:alarm_type , device_type: deviceTypeStr, serial_no: serial_no, device_address: device_address, alarm_desc: alarm_desc, marker: makerStr
+                    , recovery_time: recovery_time))
+            }
+        }
+        result.alarms = _alarms
+        
+        
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Alarm_getInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}

文件差异内容过多而无法显示
+ 621 - 0
SolarStation/moya/model/DeviceApiModel.swift


+ 217 - 0
SolarStation/moya/model/HomeApiModel.swift

@@ -0,0 +1,217 @@
+//
+//  HomeApiModel.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/23.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import SwiftyJSON
+
+//MARK: home/data
+struct Home_dataResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var project_count :String?  //项目数量
+    var station_count: String? //电站数量
+    var fault_count :String? //故障总数
+    var electric_reduction: String?//节约电量
+    var coal_reduction: String? //节约标准煤
+    var co2_reduction:String?//CO2减排
+    var so2_reduction:String?//SO2减排
+    var day_generating:String?//当日发电量
+    var day_consumption :String?//当日用电量
+    var month_generating :String?//当月发电量
+    var month_consumption: String?//   当月用电量
+    var year_generating :String? //当年发电量
+    var year_consumption :String? //当年用电量
+    var total_generating :String? //累计发电量
+    var total_consumption:String? //累计用电量
+}
+
+class Home_dataInfo: NSObject {
+    var result:Home_dataResult!
+    var isSuccess:Bool = false
+    var status:HttpApiStatus?
+    
+    init(result:Home_dataResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    
+    static func fromJSON(_ json:JSON) -> Home_dataInfo{
+        var  result  = Home_dataResult()
+        
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        //
+        log.debug(status)
+        let msg = json["msg"].stringValue
+        let  data = json["data"]
+        result.status = status
+       result.msg = msg
+        result.project_count = String(data["project_count"].intValue)
+        result.station_count = String(data["station_count"].intValue)
+        result.fault_count = String(data["fault_count"].intValue)
+        result.electric_reduction = String(data["electric_reduction"].intValue)
+        result.coal_reduction = String(data["coal_reduction"].intValue)
+        result.co2_reduction = String(data["co2_reduction"].intValue)
+        result.so2_reduction = String(data["so2_reduction"].intValue)
+        result.day_generating = String(data["day_generating"].intValue)
+        result.day_consumption = String(data["day_consumption"].intValue)
+        result.month_generating = String(data["month_generating"].intValue)
+        result.month_consumption = String(data["month_consumption"].intValue)
+        result.year_generating = String(data["year_generating"].intValue)
+        result.year_consumption =
+            String(data["year_consumption"].intValue)
+        result.total_generating = String(data["total_generating"].intValue)
+        result.total_consumption = String(data["total_consumption"].intValue)
+        var isSuccess = false
+        if status == .Success {
+            isSuccess = true
+        }
+        return Home_dataInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+//MARK :station/get
+struct HStation {
+    var station_id : String? //电站id
+     var project_id : String?//项目id
+     var station_name : String?//电站名称
+     var station_img : String?//电站图片
+     var battery_voltage : Float?//蓄电池电压
+     var cur_chg_pow : Float?//当前充电功率
+     var cur_dischg_pow : Float? //当前放电功率
+     var address : String? //电站地址
+     var status : String? //电站状态(1正常,0异常)
+     var longitude : Double? //电站经度
+    var latitude :Double?//电站纬度
+    
+}
+struct Station_getResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var stations         :[HStation]?
+    
+}
+
+class Station_getInfo: NSObject {
+    var result :Station_getResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Station_getResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    static func fromJSON(_ json:JSON) ->Station_getInfo{
+        var result = Station_getResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let stations = json["data"].array
+        var _stations = [HStation]()
+        if let stations = stations,stations.count > 0 {
+            for pJSON in stations{
+                let station_id = pJSON["station_id"].stringValue
+                let project_id = pJSON["project_id"].stringValue
+                let station_name = pJSON["station_name"].stringValue
+                let station_img = pJSON["station_img"].stringValue
+                let battery_voltage = pJSON["battery_voltage"].floatValue
+                let cur_chg_pow = pJSON["cur_chg_pow"].floatValue
+                let cur_dischg_pow = pJSON["cur_dischg_pow"].floatValue
+                let address = pJSON["address"].stringValue
+                let status = pJSON["status"].stringValue
+                let longitude = pJSON["longitude"].doubleValue
+                let latitude = pJSON["latitude"].doubleValue
+                _stations.append((HStation(station_id: station_id, project_id: project_id, station_name: station_name, station_img: station_img, battery_voltage: battery_voltage, cur_chg_pow: cur_chg_pow, cur_dischg_pow: cur_dischg_pow, address: address, status: status, longitude: longitude, latitude: latitude)))
+             }
+        }
+        result.stations = _stations
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Station_getInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+//MARK: Projet/get
+struct Station_data {
+    var station_id : String?
+    var station_name : String?
+    var station_img : String?
+    var battery_voltage : String?
+    var cur_chg_pow : String?
+    var cur_dischg_pow : String?
+    var status : String?
+}
+//
+struct Project_data {
+    var project_id : String?
+    var project_name : String?
+    var station_count : String?
+    var fault_count : String?
+    var station_dtata  : [Station_data]?
+    
+}
+struct Project_getResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var projet_data  :[Project_data]?
+}
+
+class Project_getInfo: NSObject {
+    var result :Project_getResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Project_getResult,isSuccess:Bool,status:HttpApiStatus?) {
+        self.result = result
+        self.isSuccess = isSuccess
+        self.status = status
+    }
+    static func fromJSON(_ json:JSON) ->Project_getInfo{
+        var result = Project_getResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let projects = json["data"].array
+        var _projects = [Project_data]()
+        if let projcets = projects,projcets.count > 0 {
+            for pJSON in projcets{
+                let  project_id = pJSON["project_id"].stringValue
+                let  project_name = pJSON["project_name"].stringValue
+                let  station_count = pJSON["station_count"].stringValue
+                let  fault_count = pJSON["fault_count"].stringValue
+                let  station_data = pJSON["station_data"].array
+                var _station_data = [Station_data]()
+                if let station_data = station_data , station_data.count > 0 {
+                    for sJson in station_data {
+                        let station_id = sJson[""].stringValue;
+                         let station_name = sJson["station_name"].stringValue;
+                         let station_img = sJson["station_img"].stringValue;
+                         let battery_voltage = sJson["battery_voltage"].stringValue;
+                         let cur_chg_pow = sJson["cur_chg_pow"].stringValue;
+                         let cur_dischg_pow = sJson["cur_dischg_pow"].stringValue;
+                         let status = sJson["status"].stringValue;
+                        _station_data.append(Station_data(station_id: station_id, station_name: station_name, station_img: station_img, battery_voltage: battery_voltage, cur_chg_pow: cur_chg_pow, cur_dischg_pow: cur_dischg_pow, status: status))
+                    }
+                }
+                _projects.append(Project_data(project_id: project_id, project_name: project_name, station_count: station_count, fault_count: fault_count, station_dtata: _station_data))
+            }
+        }
+        result.projet_data = _projects
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Project_getInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+
+}

+ 67 - 0
SolarStation/moya/model/LoginApiModel.swift

@@ -0,0 +1,67 @@
+//
+//  LoginApiModel.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/8/3.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import SwiftyJSON
+
+struct Conmon_loginResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var token       :String?
+    var company :String?
+    var address   :String?
+    var email       :String?
+    var mobile     :String?
+    var logo         :String?
+    var role          :String?
+    var item_list  :String?
+    
+}
+
+enum HttpApiStatus :String {
+    case Success = "0000"
+    case Error1 = "0001"
+    case Error2 = "0002"
+    case Error3 = "0003"
+    case Error4 = "0004"
+    case Error5 = "0100"
+    case Error6 = "0101"
+    case Error7 = "0102"
+}
+
+class Common_loginInfo : NSObject {
+    var result: Conmon_loginResult?
+    var isSuccess:Bool = false
+    var  status :HttpApiStatus?
+    
+    init(result:Conmon_loginResult?,isSuccess:Bool,status:HttpApiStatus?) {
+        self.result = result
+        self.isSuccess = isSuccess
+        self.status = status
+    }
+    static func fromJSON(_ json:JSON) -> Common_loginInfo?  {
+        print("aaa")
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        let msg = json["msg"].stringValue
+        let  data = json["data"]
+        let token = data["token"].stringValue
+        let company = data["company"].string
+        let address = data["address"].string
+        let email = data["email"].string
+        let mobile = data["mobile"].string
+        let logo  = data["logo"].string
+        let role = data["role"].string
+        let item_list = data["item_list"].string
+        var isSuccess = false
+        if status == .Success {
+            isSuccess = true
+        }
+        let result  = Conmon_loginResult(status: status, msg: msg, token: token, company: company, address: address, email: email, mobile: mobile, logo: logo, role: role, item_list: item_list)
+        return Common_loginInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}

+ 92 - 0
SolarStation/moya/model/ProjectApiModel.swift

@@ -0,0 +1,92 @@
+//
+//  ProjectApiModel.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/9/4.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import SwiftyJSON
+
+//project/data
+struct Project_dataResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var project_name:String? //项目名称
+    var guest_name:String? //客户名称
+    var company_name:String? // 公司名称
+    var address:String? // 详细地址
+    var station_count:String? // 电站数量/装机数
+    var create_time:String?  // 创建时间
+    var fault_count:String? // 故障总数
+    var electric_reduction:String? //节约电量(Mwh)
+    var coal_reduction:String? // 节约标准煤(T)
+    var co2_reduction:String? // CO2减排(T)
+    var so2_reduction:String? // SO2减排(T)
+    var day_generating:[String]? //当日发电量
+    var day_consumption:[String]? //  当日用电量(Mwh)
+    var month_generating:[String]? //当月发电量(Mwh)
+    var month_consumption:[String]? // 当月用电量(Mwh)
+    var year_generating:[String]? // 当年发电量(Mwh)
+    var year_consumption:[String]? // 当年用电量(Mwh)
+    var total_generating:[String]? // 累计发电量(Mwh)
+    var total_consumption:[String]? // 累计用电量(Mwh)
+}
+
+class Project_dataInfo: NSObject {
+    var result:Project_dataResult!
+    var isSuccess:Bool = false
+    var status:HttpApiStatus?
+    
+    init(result:Project_dataResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    
+    static func fromJSON(_ json:JSON) -> Project_dataInfo{
+        var  result  = Project_dataResult()
+        
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        //
+        log.debug(status)
+        let msg = json["msg"].stringValue
+        let  data = json["data"]
+        result.project_name = data["project_name"].stringValue
+        result.guest_name = data["guest_name"].stringValue
+        result.company_name = data["company_name"].stringValue
+        result.address = data["address"].stringValue
+        result.station_count = data["station_count"].stringValue
+        result.create_time = data["create_time"].stringValue
+        result.fault_count = data["fault_count"].stringValue
+        result.electric_reduction = data["electric_reduction"].stringValue
+        result.coal_reduction = data["coal_reduction"].stringValue
+        result.co2_reduction = data["co2_reduction"].stringValue
+        result.so2_reduction = data["so2_reduction"].stringValue
+        let _day_generating = data["day_generating"].stringValue
+        result.day_generating = _day_generating.douleStrToIntStrArr()
+        
+        let _day_consumption = data["day_consumption"].stringValue
+         result.day_consumption = _day_consumption.douleStrToIntStrArr()
+        let _month_generating = data["month_generating"].stringValue
+         result.month_generating = _month_generating.douleStrToIntStrArr()
+         let _month_consumption = data["month_consumption"].stringValue
+         result.month_consumption = _month_consumption.douleStrToIntStrArr()
+         let _year_generating = data["year_generating"].stringValue
+         result.year_generating = _year_generating.douleStrToIntStrArr()
+         let _year_consumption = data["year_consumption"].stringValue
+         result.year_consumption = _year_consumption.douleStrToIntStrArr()
+         let _total_generating = data["total_generating"].stringValue
+         result.total_generating = _total_generating.douleStrToIntStrArr()
+        let _total_consumption = data["total_consumption"].stringValue
+         result.total_consumption = _total_consumption.douleStrToIntStrArr()
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success {
+            isSuccess = true
+        }
+        return Project_dataInfo(result: result, isSuccess: isSuccess, status: status)
+}
+  
+}

+ 354 - 0
SolarStation/moya/model/StationApiModel.swift

@@ -0,0 +1,354 @@
+//
+//  StationApiModel.swift
+//  SolarStationSwift
+//
+//  Created by weclouds on 2018/9/4.
+//  Copyright © 2018年 weclouds. All rights reserved.
+//
+
+import Foundation
+import SwiftyJSON
+
+public struct CommonGetData {
+    var id : String?
+    var name :String?
+}
+
+struct Common_get_countryResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var country_data  :[CommonGetData]?
+}
+
+class Common_get_countryInfo: NSObject {
+    var result :Common_get_countryResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Common_get_countryResult,isSuccess:Bool,status:HttpApiStatus?) {
+        self.result = result
+        self.isSuccess = isSuccess
+        self.status = status
+    }
+    static func fromJSON(_ json:JSON) ->Common_get_countryInfo{
+        var result = Common_get_countryResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let countries = json["data"].array
+        var _countries = [CommonGetData]()
+        if let countries =  countries,countries.count > 0 {
+            for cJSON in countries{
+                let id = cJSON["id"].stringValue
+                let name = cJSON["name"].stringValue
+                _countries.append(CommonGetData(id: id, name: name))
+            }
+        }
+        result.country_data = _countries
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Common_get_countryInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+
+
+struct Common_get_provinceResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var province_data  :[CommonGetData]?
+}
+
+class Common_get_provinceInfo: NSObject {
+    var result :Common_get_provinceResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Common_get_provinceResult,isSuccess:Bool,status:HttpApiStatus?) {
+        self.result = result
+        self.isSuccess = isSuccess
+        self.status = status
+    }
+    static func fromJSON(_ json:JSON) ->Common_get_provinceInfo{
+        var result = Common_get_provinceResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let provinces = json["data"].array
+        var _provinces = [CommonGetData]()
+        if let provinces =  provinces,provinces.count > 0 {
+            for cJSON in provinces{
+                let id = cJSON["id"].stringValue
+                let name = cJSON["name"].stringValue
+                _provinces.append(CommonGetData(id: id, name: name))
+            }
+        }
+        result.province_data = _provinces
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Common_get_provinceInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+//MARK:电站详情
+struct Station_detailResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var name :String?  // 电站名称
+    var project_id :String? //所属项目ID
+    var project_name :String?// 所属项目名称
+    var install_time :String?// 安装日期
+    var designer :String?// 设计厂商
+    var photo :String?// 电站照片
+    var panel_power :String?// 电池板总功率
+    var panel_type :String? // 电池板类型(0单晶硅,1多晶硅,2非晶硅,3其他)
+    var panel_series_count :String? // 电池板串联数量
+    var panel_parallel_count :String?// 电池板并联数量
+    var panel_count :String? // 电池板总数量
+    var panel_voltage :String? // 电池板总开路电压
+    var panel_current :String?// 电池板总工作电流
+    var panel_single_power :String? // 单块电池板功率
+    var panel_single_vmp :String? // 单块电池板vmp
+    var panel_single_voc :String? // 单块电池板voc
+    var panel_single_imp :String? // 单块电池板imp
+    var panel_single_isc :String? // 单块电池板isc
+    var panel_remark :String? // 电池板信息备注
+    var battery_type :String? // 蓄电池类型(0自定义,1开口FLD,2密封SLD,3胶体GEL,4锂电池LI)
+    var battery_single_voltage :String? // 单节电池电压
+    var battery_single_capacity :String? // 单节电池电量
+    var battery_series_count :String? // 电池串联数量
+    var battery_parallel_count :String? // 电池并联数量
+    var battery_count :String? // 电池总数量
+    var battery_voltage :String? // 电池总电压
+    var battery_capacity :String? // 电池总电量
+    var battery_remark :String? // 电池信息备注
+    var load_type :String? // 负载类型(0直流,1交流,2直流+交流)
+    var load_power :String? // 负载功率
+    var country_id :String? // 国家id
+    var province_id :String? // 省份id
+    var address :String? // 详细地址
+    var longitude :String? // 经度
+    var latitude :String? // 纬度
+    var altitude :String? // 海拔
+    var max_annual_temper :String? // 最高年气温
+    var min_annual_temper :String? // 最低年气温
+    var geo_remark :String? // 地理信息备注    
+
+}
+
+class Station_detailInfo: NSObject {
+    var result :Station_detailResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Station_detailResult,isSuccess:Bool,status:HttpApiStatus?) {
+        self.result = result
+        self.isSuccess = isSuccess
+        self.status = status
+    }
+    static func fromJSON(_ json:JSON) ->Station_detailInfo{
+        var result = Station_detailResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let data = json["data"].dictionary
+        result.name = data!["name"]?.stringValue
+        result.project_id = data!["project_id"]?.stringValue
+        result.project_name = data!["project_name"]?.stringValue
+        result.install_time = data!["install_time"]?.stringValue
+        result.designer = data!["designer"]?.stringValue
+        result.photo = data!["photo"]?.stringValue
+        result.panel_power = data!["panel_power"]?.stringValue
+        result.panel_type = data!["panel_type"]?.stringValue
+        result.panel_series_count = data!["panel_series_count"]?.stringValue
+        result.panel_parallel_count = data!["panel_parallel_count"]?.stringValue
+        result.panel_count = data!["panel_count"]?.stringValue
+        result.panel_voltage = data!["panel_voltage"]?.stringValue
+        result.panel_current = data!["panel_current"]?.stringValue
+        result.panel_single_power = data!["panel_single_power"]?.stringValue
+        result.panel_single_vmp = data!["panel_single_vmp"]?.stringValue
+        result.panel_single_voc = data!["panel_single_voc"]?.stringValue
+        result.panel_single_imp = data!["panel_single_imp"]?.stringValue
+        result.panel_single_isc = data!["panel_single_isc"]?.stringValue
+        result.panel_remark = data!["panel_remark"]?.stringValue
+        result.battery_type = data!["battery_type"]?.stringValue
+        result.battery_single_voltage = data!["battery_single_voltage"]?.stringValue
+        result.battery_single_capacity = data!["battery_single_capacity"]?.stringValue
+        result.battery_series_count = data!["battery_series_count"]?.stringValue
+        result.battery_parallel_count = data!["battery_parallel_count"]?.stringValue
+        result.battery_count = data!["battery_count"]?.stringValue
+        result.battery_voltage = data!["battery_voltage"]?.stringValue
+        result.battery_capacity = data!["battery_capacity"]?.stringValue
+        result.battery_remark = data!["battery_remark"]?.stringValue
+        result.load_type = data!["load_type"]?.stringValue
+        result.load_power = data!["load_power"]?.stringValue
+        result.country_id = data!["country_id"]?.stringValue
+        result.province_id = data!["province_id"]?.stringValue
+        result.address = data!["address"]?.stringValue
+        result.longitude = data!["longitude"]?.stringValue
+        result.latitude = data!["latitude"]?.stringValue
+        result.altitude = data!["altitude"]?.stringValue
+        result.max_annual_temper = data!["max_annual_temper"]?.stringValue
+        result.min_annual_temper = data!["min_annual_temper"]?.stringValue
+        result.geo_remark = data!["geo_remark"]?.stringValue
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Station_detailInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+
+//MARK: station/data
+struct Station_dataResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+    var station_name :String?//电站名称
+    var run_days : String?//总运行天数
+    var battery_over_times : String?//蓄电池总过放次数
+    var battery_chg_times : String? //蓄电池总充满次数
+    var project_count :String?  //项目数量
+    var station_count: String? //电站数量
+    var fault_count :String? //故障总数
+    var electric_reduction: String?//节约电量
+    var coal_reduction: String? //节约标准煤
+    var co2_reduction:String?//CO2减排
+    var so2_reduction:String?//SO2减排
+    var day_generating:[String]?//当日发电量
+    var day_consumption:[String]? //  当日用电量(Mwh)
+    var month_generating:[String]? //当月发电量(Mwh)
+    var month_consumption:[String]? // 当月用电量(Mwh)
+    var year_generating:[String]? // 当年发电量(Mwh)
+    var year_consumption:[String]? // 当年用电量(Mwh)
+    var total_generating:[String]? // 累计发电量(Mwh)
+    var total_consumption:[String]? // 累计用电量(Mwh)
+}
+
+
+class Station_dataInfo: NSObject {
+    var result:Station_dataResult!
+    var isSuccess:Bool = false
+    var status:HttpApiStatus?
+    
+    init(result:Station_dataResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    static func fromJSON(_ json:JSON) -> Station_dataInfo{
+        var  result  = Station_dataResult()
+        
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        //
+        log.debug(status)
+        let msg = json["msg"].stringValue
+        let  data = json["data"]
+        result.status = status
+        result.msg = msg
+        result.project_count = String(data["project_count"].intValue)
+        result.station_count = String(data["station_count"].intValue)
+        result.fault_count = String(data["fault_count"].intValue)
+        result.electric_reduction = String(data["electric_reduction"].intValue)
+        result.coal_reduction = String(data["coal_reduction"].intValue)
+        result.co2_reduction = String(data["co2_reduction"].intValue)
+        result.so2_reduction = String(data["so2_reduction"].intValue)
+        let _day_generating = data["day_generating"].stringValue
+        result.day_generating = _day_generating.douleStrToIntStrArr()
+        
+        let _day_consumption = data["day_consumption"].stringValue
+        result.day_consumption = _day_consumption.douleStrToIntStrArr()
+        let _month_generating = data["month_generating"].stringValue
+        result.month_generating = _month_generating.douleStrToIntStrArr()
+        let _month_consumption = data["month_consumption"].stringValue
+        result.month_consumption = _month_consumption.douleStrToIntStrArr()
+        let _year_generating = data["year_generating"].stringValue
+        result.year_generating = _year_generating.douleStrToIntStrArr()
+        let _year_consumption = data["year_consumption"].stringValue
+        result.year_consumption = _year_consumption.douleStrToIntStrArr()
+        let _total_generating = data["total_generating"].stringValue
+        result.total_generating = _total_generating.douleStrToIntStrArr()
+        let _total_consumption = data["total_consumption"].stringValue
+        result.total_consumption = _total_consumption.douleStrToIntStrArr()
+        var isSuccess = false
+        if status == .Success {
+            isSuccess = true
+        }
+        return Station_dataInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}
+
+
+
+
+
+//查询充电/放电日志
+//station/get_power_log
+
+
+struct Station_get_power_logResult {
+    var status      :HttpApiStatus?
+    var msg         :String?
+  //  var devices         :[Device_data]?
+    var max:String?//最大值
+    var min :String?//最小值
+    var avg :String?//平均值
+    var log_xValues:[String]? //横坐标
+    var log_yValues:[String]? //纵中标
+}
+
+class Station_get_power_logInfo: NSObject {
+    var result :Station_get_power_logResult!
+    var isSuccess:Bool = false
+    var status : HttpApiStatus?
+    
+    init(result:Station_get_power_logResult!, isSuccess:Bool, status:HttpApiStatus?) {
+        self.result = result; self.isSuccess = isSuccess; self.status = status
+    }
+    
+    static func fromJSON(_ json:JSON) ->Station_get_power_logInfo{
+        var result = Station_get_power_logResult()
+        let status = HttpApiStatus(rawValue: json["code"].stringValue)
+        
+        let msg = json["msg"].string
+        let data = json["data"]
+        result.max = data["max"].stringValue
+        result.min = data["min"].stringValue
+        result.avg = data["avg"].stringValue
+        //y值数组
+        var _log_yValues = [String]()
+        
+        //访问原始数据
+        var log = data["log"]
+        if let logDict = log.dictionaryObject {
+            var log_xValues = Array(logDict.keys)
+            log_xValues.sort(by: { (date1 :String ,date2:String) in
+                let d1 = stringConvertDate(string: date1)
+                let d2 = stringConvertDate(string: date2)
+                return d1.compare(d2) == .orderedAscending
+            })
+            result.log_xValues = log_xValues
+            
+            for xValue in log_xValues{
+                _log_yValues.append(logDict[xValue] as! String)
+            }
+        }
+       result.log_yValues = _log_yValues
+        result.status = status
+        result.msg = msg
+        var isSuccess = false
+        if status == .Success{
+            isSuccess = true
+        }
+        return Station_get_power_logInfo(result: result, isSuccess: isSuccess, status: status)
+    }
+}