SBTHistoryDataVCtr.swift 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. //
  2. // SBTHistoryDataVCtr.swift
  3. // SolarBT
  4. //
  5. // Created by weclouds on 2019/2/1.
  6. // Copyright © 2019 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import PKHUD
  10. //统计数据
  11. struct StatisticsData {
  12. var totalGenerationCapacity :String? // 累计发电量
  13. var totalDischargeCapacity :String? //累计放电量
  14. var runTime :String? // 总运行天数
  15. var overTimes :String? //过放次数
  16. var fullTimes :String?//充满次数
  17. var chargingAmpereHour :String? // 充电安时数
  18. var dischargeAmpereHour :String?// 放电安时数
  19. }
  20. struct OneDayData {
  21. var his_batteryVoltageMin :String? // 蓄电池最低电压
  22. var his_batteryVoltageMax :String? // 蓄电池最高电压
  23. var his_chargingCurrentMax :String?// 充电最大电流
  24. var his_chargingPowerMax :String? // 充电最大功率
  25. var his_chargingAmpereHour :String? // 充电安时数
  26. var his_dischargeCurrentmax:String? // 放电最大电流
  27. var his_dischargePowerMax :String? // 放电最大功率
  28. var his_dischargeAmpereHour :String? // 放电安时数
  29. var his_generationCapacity:String? // 发电量
  30. var his_dischargeCapacity :String?// 充电量
  31. }
  32. class SBTHistoryDataVCtr: UIViewController {
  33. var isRefresh : Bool? = false
  34. var countdown : Int? = 0
  35. var isOld :Bool?
  36. /// var uartCommandTimer : Timer? // 定时器
  37. var belKey:String?
  38. var deviceName:String? // 设备名称
  39. var isDemo:Bool? = false
  40. var weekData : [OneDayData]? = [OneDayData]()//一周数据
  41. var mStatistics : StatisticsData?
  42. var headerArr : [StatisticsData]? = [StatisticsData]()
  43. var isChange :Bool?
  44. lazy var tableView: UITableView = {
  45. let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: KSCREENHEIGHT - KNavBarHeight - 49 ), style: .plain)
  46. tableView.delegate = self
  47. tableView.dataSource = self
  48. tableView.separatorStyle = .none
  49. tableView.register(SBTHistoryHeaderCell.self, forCellReuseIdentifier: "header")
  50. tableView.register(SBTHistoryDataCell.self, forCellReuseIdentifier: "data")
  51. return tableView
  52. }()
  53. }
  54. //MARK:生命周期
  55. extension SBTHistoryDataVCtr{
  56. override func viewWillAppear(_ animated: Bool) {
  57. super.viewWillAppear(animated)
  58. if self.isDemo == false {
  59. notificationRegister()
  60. }
  61. BabyBluetoothSwift.shareInstance()?.clearHistoryDataBlock = { (dataDict) in
  62. g_showHUD("clear_history_success".da_localizedStr())
  63. }
  64. // initData()
  65. }
  66. override func viewDidDisappear(_ animated: Bool) {
  67. super.viewDidDisappear(animated)
  68. if self.isDemo == false {
  69. notificationUnRegister()
  70. //停止定时器
  71. }
  72. }
  73. override func viewDidLoad() {
  74. super.viewDidLoad()
  75. self.isChange = false
  76. if self.isDemo == true {
  77. initData(SBTData().DemoData)
  78. }else{
  79. let plist = CLDeviceDataPlist()
  80. let dataDict = plist.findData(deviceDetailPlist, key: self.belKey!)
  81. initData(dataDict as! [String : Any])
  82. }
  83. let buttonSelected = UserDefaults.standard.value(forKey: SBTHistoryDataChartOrFormSelected) as? String
  84. //log.debug("表格柱状图切换----\(buttonSelected)")
  85. if buttonSelected == nil || buttonSelected == "0"{
  86. // cell.toolButtonSelectedIndex = "0"
  87. self.isChange = false
  88. }else{
  89. self.isChange = true
  90. // cell.toolButtonSelectedIndex = buttonSelected
  91. }
  92. createUI()
  93. }
  94. override func viewDidAppear(_ animated: Bool) {
  95. super.viewDidAppear(animated)
  96. }
  97. }
  98. //MARK : 定时器
  99. extension SBTHistoryDataVCtr{
  100. }
  101. //MARK: CreateUI
  102. extension SBTHistoryDataVCtr{
  103. func createUI() {
  104. self.view.addSubview(self.tableView)
  105. }
  106. func initData(_ dataDict: [String:Any]) {
  107. weekData?.removeAll()
  108. self.headerArr?.removeAll()
  109. let key = DeviceDictKey()
  110. let totalGenerationCapacity = dataDict[key.generatEnergyTotal] as! String
  111. let totalDischargeCapacity = dataDict[key.usedEnergyTotal] as! String
  112. let runTime = dataDict[key.runTime] as! String
  113. let overTimes = dataDict[key.overTimes] as! String
  114. let fullTimes = dataDict[key.fullTimes] as! String
  115. let chargingAmpereHour = dataDict[key.chargingAmpereHour] as! String
  116. let dischargeAmpereHour = dataDict[key.dischargeAmpereHour] as! String
  117. mStatistics = StatisticsData(totalGenerationCapacity: totalGenerationCapacity, totalDischargeCapacity: totalDischargeCapacity, runTime: runTime, overTimes: overTimes, fullTimes: fullTimes, chargingAmpereHour: chargingAmpereHour, dischargeAmpereHour: dischargeAmpereHour)
  118. // log.debug("mStatistics = \(mStatistics!)")
  119. self.headerArr?.append(mStatistics!)
  120. let historyArr : [[String : Any]] = dataDict[key.historydatas] as! [[String : Any]]
  121. for i in 0..<historyArr.count {
  122. let dayData = historyArr[i]
  123. let his_batteryVoltageMin = dayData[key.his_batteryVoltageMin] as! String
  124. let his_batteryVoltageMax = dayData[key.his_batteryVoltageMax] as! String
  125. let his_chargingCurrentMax = dayData[key.his_chargingCurrentMax] as! String
  126. let his_chargingPowerMax = dayData[key.his_chargingPowerMax] as! String
  127. let his_chargingAmpereHour = dayData[key.his_chargingAmpereHour] as! String
  128. let his_dischargeCurrentmax = dayData[key.his_dischargeCurrentmax] as! String
  129. let his_dischargePowerMax = dayData[key.his_dischargePowerMax] as! String
  130. let his_dischargeAmpereHour = dayData[key.his_dischargeAmpereHour] as! String
  131. let his_generationCapacity = dayData[key.his_generationCapacity] as! String
  132. let his_dischargeCapacity = dayData[key.his_dischargeCapacity] as! String
  133. let onedata = OneDayData(his_batteryVoltageMin: his_batteryVoltageMin,
  134. his_batteryVoltageMax: his_batteryVoltageMax,
  135. his_chargingCurrentMax: his_chargingCurrentMax,
  136. his_chargingPowerMax: his_chargingPowerMax,
  137. his_chargingAmpereHour: his_chargingAmpereHour,
  138. his_dischargeCurrentmax: his_dischargeCurrentmax,
  139. his_dischargePowerMax: his_dischargePowerMax,
  140. his_dischargeAmpereHour: his_dischargeAmpereHour,
  141. his_generationCapacity: his_generationCapacity,
  142. his_dischargeCapacity: his_dischargeCapacity)
  143. weekData?.append(onedata)
  144. }
  145. // self.tableView.reloadData()
  146. }
  147. //注册通知、 获取数据
  148. func notificationRegister() {
  149. NotificationCenter.default.addObserver(self, selector: #selector(SBTHistoryDataVCtr.uartDataReciveNotify(_:)), name: NSNotification.Name(rawValue: kBabyBluetoothNotificationAllDataRecieve), object: nil)
  150. //kBabyBluetoothNotificationCumulativeDataRecieve
  151. NotificationCenter.default.addObserver(self, selector: #selector(SBTHistoryDataVCtr.uartCumulativeDataReciveNotify(_:)), name: NSNotification.Name(rawValue: kBabyBluetoothNotificationCumulativeDataRecieve), object: nil)
  152. NotificationCenter.default.addObserver(self, selector: #selector(updateChuange(_:)), name: NSNotification.Name(kNotifisionDeviceDatailDataHistoryDataRecieve), object: nil)
  153. NotificationCenter.default.addObserver(self, selector: #selector(refreshStatusNotify(_:)), name: NSNotification.Name(kNotifitionSBTDeviceDetailVCtrRefreshStatus), object: nil)
  154. }
  155. //注销通知
  156. func notificationUnRegister() {
  157. NotificationCenter.default.removeObserver(self)
  158. }
  159. @objc func refreshStatusNotify(_ notif:Notification) {
  160. log.debug(notif.userInfo)
  161. let statusTime = notif.userInfo!["countdown"] as! String //统计倒计时事件
  162. self.countdown = Int(statusTime)
  163. isRefresh = true
  164. if statusTime == "0" {
  165. isRefresh = false
  166. }
  167. }
  168. @objc func updateChuange(_ notif:Notification) {
  169. log.debug(notif.userInfo)
  170. // let dataDict = notif.userInfo
  171. // loadUIRefresh(dataDict as! [String : Any])
  172. loadCumulativeUIRefresh(notif.userInfo as! [String : Any])
  173. }
  174. //通知事件 --统计数据
  175. @objc func uartCumulativeDataReciveNotify(_ notify:Notification) {
  176. }
  177. //通知事件
  178. @objc func uartDataReciveNotify(_ notify:Notification) {
  179. // loadHisDataUIRefresh()
  180. }
  181. func loadCumulativeUIRefresh(_ dataDict : [String : Any]) {
  182. DispatchQueue.main.async {
  183. log.debug("刷新数据 loadCumulativeUIRefresh")
  184. self.weekData?.removeAll()
  185. self.headerArr?.removeAll()
  186. // let dataDict = AppShare.cumulativeDataDict
  187. let key = DeviceDictKey()
  188. let totalGenerationCapacity = dataDict[key.generatEnergyTotal] as! String
  189. let totalDischargeCapacity = dataDict[key.usedEnergyTotal] as! String
  190. let runTime = dataDict[key.runTime] as! String
  191. let overTimes = dataDict[key.overTimes] as! String
  192. let fullTimes = dataDict[key.fullTimes] as! String
  193. let chargingAmpereHour = dataDict[key.chargingAmpereHour] as! String
  194. let dischargeAmpereHour = dataDict[key.dischargeAmpereHour] as! String
  195. self.mStatistics = StatisticsData(totalGenerationCapacity: totalGenerationCapacity, totalDischargeCapacity: totalDischargeCapacity, runTime: runTime, overTimes: overTimes, fullTimes: fullTimes, chargingAmpereHour: chargingAmpereHour, dischargeAmpereHour: dischargeAmpereHour)
  196. // log.debug("mStatistics = \(mStatistics!)")
  197. self.headerArr?.append(self.mStatistics!)
  198. let historyArr : [[String : Any]] = dataDict[key.historydatas] as! [[String : Any]]
  199. for i in 0..<historyArr.count {
  200. let dayData = historyArr[i]
  201. let his_batteryVoltageMin = dayData[key.his_batteryVoltageMin] as! String
  202. let his_batteryVoltageMax = dayData[key.his_batteryVoltageMax] as! String
  203. let his_chargingCurrentMax = dayData[key.his_chargingCurrentMax] as! String
  204. let his_chargingPowerMax = dayData[key.his_chargingPowerMax] as! String
  205. let his_chargingAmpereHour = dayData[key.his_chargingAmpereHour] as! String
  206. let his_dischargeCurrentmax = dayData[key.his_dischargeCurrentmax] as! String
  207. let his_dischargePowerMax = dayData[key.his_dischargePowerMax] as! String
  208. let his_dischargeAmpereHour = dayData[key.his_dischargeAmpereHour] as! String
  209. let his_generationCapacity = dayData[key.his_generationCapacity] as! String
  210. let his_dischargeCapacity = dayData[key.his_dischargeCapacity] as! String
  211. let onedata = OneDayData(his_batteryVoltageMin: his_batteryVoltageMin,
  212. his_batteryVoltageMax: his_batteryVoltageMax,
  213. his_chargingCurrentMax: his_chargingCurrentMax,
  214. his_chargingPowerMax: his_chargingPowerMax,
  215. his_chargingAmpereHour: his_chargingAmpereHour,
  216. his_dischargeCurrentmax: his_dischargeCurrentmax,
  217. his_dischargePowerMax: his_dischargePowerMax,
  218. his_dischargeAmpereHour: his_dischargeAmpereHour,
  219. his_generationCapacity: his_generationCapacity,
  220. his_dischargeCapacity: his_dischargeCapacity)
  221. self.weekData?.append(onedata)
  222. }
  223. self.tableView.reloadData()
  224. // self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableView.RowAnimation.fade)
  225. }
  226. }
  227. }
  228. //MARK action method
  229. extension SBTHistoryDataVCtr{
  230. }
  231. extension SBTHistoryDataVCtr: UITableViewDataSource,UITableViewDelegate{
  232. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  233. return 2
  234. }
  235. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  236. if indexPath.row == 0{
  237. return 205
  238. } else{
  239. if isChange! == true {
  240. return 356 + 50
  241. }
  242. return 510 + 50
  243. }
  244. }
  245. //缓存高度 这个 跟定时器一起使用,很有用 真香
  246. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  247. if indexPath.row == 0{
  248. return 205
  249. } else{
  250. if isChange! == true {
  251. return 356 + 50
  252. }
  253. return 510 + 50
  254. }
  255. }
  256. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  257. if indexPath.row == 0 {
  258. let cell = SBTHistoryHeaderCell(style: .default, reuseIdentifier: "header") //这里不能做复用
  259. cell.fillCellData(self.headerArr![indexPath.row])
  260. cell.selectionStyle = .none
  261. return cell
  262. }
  263. else{
  264. let cell : SBTHistoryDataCell = SBTHistoryDataCell(style: .default, reuseIdentifier: "data")
  265. /// log.debug("+++++++++++++++=刷新数据 -- \(self.weekData)")
  266. let buttonSelected = UserDefaults.standard.value(forKey: SBTHistoryDataChartOrFormSelected) as? String
  267. if buttonSelected == nil{
  268. cell.toolButtonSelectedIndex = "0"
  269. }else{
  270. cell.toolButtonSelectedIndex = buttonSelected
  271. }
  272. cell.fillCellData(self.weekData!)
  273. cell.selectionStyle = .none
  274. cell.changeViewCallBack = {(isChartsView) in
  275. log.debug("changeViewCallBack --\(isChartsView)")
  276. if isChartsView{
  277. self.isChange = true
  278. self.tableView.reloadData()
  279. }else{
  280. self.isChange = false
  281. self.tableView.reloadData()
  282. }
  283. }
  284. cell.shareCallback = {(chartView) in
  285. // log.debug("share")
  286. let shotView = SBTScreenShootView(frame: CGRect(x: 0, y: 0, width: KSCREENHEIGHT, height: KSCREENWIDTH ))
  287. shotView.fillChartsData(self.weekData!)
  288. let image = self.screenShotView(view: shotView)
  289. let imageView = UIImageView(image: image)
  290. imageView.frame = self.view.bounds
  291. // self.view.addSubview(imageView);
  292. }
  293. cell.shareFormViewCallback = {
  294. let shotView = SBTFormShotView(frame: CGRect(x: 0, y: 0, width: 540, height: 510))
  295. shotView.fillCellData(self.weekData!)
  296. let image = self.screenShotView(view: shotView)
  297. let imageView = UIImageView(image: image)
  298. imageView.frame = self.view.bounds
  299. }
  300. cell.horizontalScreenCallback = {() in
  301. let vc = SBTHorizontalScreenVCtr()
  302. vc.fillChartsData(self.weekData!)
  303. AppShare.isTimarStop = true
  304. self.navigationController?.pushViewController(vc)
  305. }
  306. cell.clearHistoryDataCallBack = {() in
  307. let alert = UIAlertController(title: "Clear_the_historical?".da_localizedStr(), message: nil
  308. , preferredStyle: .alert)
  309. let confirmAction = UIAlertAction(title: "Yes".da_localizedStr(), style:.destructive) { (action) in
  310. if self.isDemo == true{
  311. g_showHUD("Current_demo_data".da_localizedStr())
  312. }else{
  313. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrRealTimerStop), object: nil)
  314. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrHistoryTimerStop), object: nil)
  315. self.sendclearHistory()
  316. }
  317. }
  318. let cancelAction = UIAlertAction(title: "No".da_localizedStr(), style: .cancel, handler: nil)
  319. alert.addAction(cancelAction)
  320. alert.addAction(confirmAction)
  321. self.present(alert, animated: true, completion: nil)
  322. }
  323. return cell
  324. }
  325. }
  326. func sendclearHistory() {
  327. log.debug("延时时间 -- \(self.countdown) ")
  328. let alert = SBTReadLoadingVCtr(nibName: "SBTReadLoadingVCtr", bundle: nil)
  329. let plist = CLDeviceDataPlist()
  330. let key = DeviceDictKey()
  331. let dataDict1 = plist.findData(deviceDetailPlist, key: self.belKey!)
  332. var productName = " "
  333. if self.isOld == true {
  334. productName = ""
  335. }else{
  336. productName = dataDict1![key.productName] as! String
  337. }
  338. alert.deviceName = productName
  339. alert.message = "Clearing_historical".da_localizedStr()
  340. alert.show()
  341. var arr = [String]()
  342. if self.isOld == true {
  343. arr = ["FF7900000001"]
  344. }else{
  345. arr = ["FF06DF050001"]
  346. }
  347. BabyBluetoothSwift.shareInstance()?.writeData2222(arr, completionHandler: { (result) in
  348. alert.dismiss()
  349. g_showHUD("clear_history_success".da_localizedStr())
  350. NotificationCenter.default.post(name: NSNotification.Name(kNotifitionSBTDeviceDetaiVCtrHistoryTimerStart), object: nil)
  351. })
  352. }
  353. @objc func readHistoryCallback() {
  354. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kNotifitionSBTDeviceDetaiVCtrSendHistory), object: nil)
  355. }
  356. //传入需要截取的view
  357. func screenShotView(view: UIView) -> UIImage {
  358. let imageRet : UIImage
  359. UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0.0)
  360. view.layer.render(in: UIGraphicsGetCurrentContext()!)
  361. imageRet = UIGraphicsGetImageFromCurrentImageContext()!
  362. UIGraphicsEndImageContext()
  363. //保存相册,可以去相册验证截图是否是你想要的 (方法同上)
  364. // UIImageWriteToSavedPhotosAlbum(imageRet, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
  365. sendImage(imageRet)
  366. return imageRet
  367. }
  368. @objc func image(image:UIImage,didFinishSavingWithError error:NSError?,contextInfo:AnyObject) {
  369. if error != nil {
  370. print("保存失败 ---\(error)")
  371. } else {
  372. print("保存成功")
  373. //sendImage(image)
  374. }
  375. }
  376. func sendImage(_ image:UIImage) {
  377. let items = [image]
  378. let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)
  379. activityVC.completionWithItemsHandler = {(activity,success,item,error) in
  380. log.debug("activity --\(activity) --- successs - \(success),item-- \(item) --- error- \(error)")
  381. if success == true {
  382. // g_showHUD("分享成功")
  383. }else{
  384. }
  385. }
  386. self.present(activityVC, animated: true, completion: nil)
  387. }
  388. }