Commit b20a10e85d387c01720cbee713264b353a189918

Authored by daifengyi
1 parent 547d2db2

feat:temperature model

HDFwear/Home/Model/HealthModel.swift
... ... @@ -454,6 +454,186 @@ class HeartRateModel: Object {
454 454  
455 455 }
456 456  
  457 +//MARK: - 体温
  458 +//jtd!
  459 +class TemperatureModel: Object {
  460 + @Persisted var value: Int = -1
  461 + @Persisted var date: Date? = nil
  462 +
  463 + convenience init(value: Int, date: Date?) {
  464 + self.init()
  465 + self.value = value
  466 + self.date = date
  467 + }
  468 +
  469 + class func toTemperatureArray(_ bytes: [UInt8]) -> [TemperatureModel] {
  470 + var hrArray: [TemperatureModel] = []
  471 + let num = bytes.count/7
  472 + for i in 0..<num {
  473 + let date = DateInRegion(year: Int(bytes[i*7])+2000, month: Int(bytes[i*7+1]), day: Int(bytes[i*7+2]), hour: Int(bytes[i*7+3]), minute: Int(bytes[i*7+4]), second: Int(bytes[i*7+5])).date
  474 + let hr = TemperatureModel(value: Int(bytes[i*7+6]), date: date)
  475 + hrArray.append(hr)
  476 + }
  477 + return hrArray
  478 + }
  479 +
  480 + private func add() {
  481 + if let a = RealmTools.queryObjects(TemperatureModel.self, filter: "date = %@", [self.date ?? Date()]) as? [TemperatureModel] {
  482 + RealmTools.deleteList(a)
  483 + }
  484 + RealmTools.add(self)
  485 + }
  486 + private func isEqual(_ hr: TemperatureModel) -> Bool {
  487 + if self.value == hr.value {
  488 + if self.date!.isInside(date: hr.date!, granularity: .minute) {
  489 + return true
  490 + }
  491 + }
  492 + return false
  493 + }
  494 +
  495 + func realTimeAdd() {
  496 + if let hrArray = RealmTools.queryObjects(TemperatureModel.self) as? [TemperatureModel], let hr = hrArray.last {
  497 + if !self.isEqual(hr) {
  498 + RealmTools.add(self)
  499 + }
  500 + } else {
  501 + RealmTools.add(self)
  502 + }
  503 + }
  504 +
  505 + class func addArray(_ array: [TemperatureModel]) {
  506 + if array.count == 0 {
  507 + return
  508 + }
  509 + for (i, hr) in array.enumerated() {
  510 + if hr == array.first {
  511 + hr.add()
  512 + } else {
  513 + if !hr.isEqual(array[i-1]) {
  514 + hr.add()
  515 + }
  516 + }
  517 + }
  518 + }
  519 +
  520 +
  521 + class func getRecentData(count: Int = 31) -> [TemperatureModel] {
  522 + guard let array = RealmTools.objectsWithPredicateAndSortedForPages(object: self, sortedKey: "date", isAssending: false, pageSize: count) as? [TemperatureModel], array.count > 0 else {
  523 + return []
  524 + }
  525 + return array.reversed()
  526 + }
  527 +
  528 + class func getTemperatureByDay(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) {
  529 + var hrArray: [TemperatureModel] = []
  530 + var minArray: [Int] = []
  531 + var maxArray: [Int] = []
  532 +
  533 + for h in 0..<24 {
  534 + let hourArray = getHistoryTemperature(startTime: date.dateAtStartOf(.day)+h.hours, endTime: date.dateAtStartOf(.day)+(h+1).hours)
  535 + for m in 0..<60 {
  536 + var minuteArray: [TemperatureModel] = []
  537 + for hr in hourArray {
  538 + if hr.date!.minute == m {
  539 + minuteArray.append(hr)
  540 + }
  541 + }
  542 + if minuteArray.count > 0 {
  543 + hrArray.append(TemperatureModel(value: minuteArray.last!.value, date: date.dateAtStartOf(.day)+h.hours+m.minutes))
  544 + // hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+h.hours+m.minutes))
  545 + minArray.append(minuteArray.min(\.value)?.value ?? -1)
  546 + maxArray.append(minuteArray.max(\.value)?.value ?? -1)
  547 + }
  548 + }
  549 + }
  550 + /*
  551 + for i in 0..<24 {
  552 + for m in 0..<60 {
  553 + rec += 1
  554 + let minuteArray = getHistoryHeartRate(startTime: date.dateAtStartOf(.day)+i.hours+m.minutes, endTime: date.dateAtStartOf(.day)+i.hours+(m+1).minutes)
  555 + if minuteArray.count > 0 {
  556 + hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+i.hours+m.minutes))
  557 + minArray.append(minuteArray.min(\.value)?.value ?? -1)
  558 + maxArray.append(minuteArray.max(\.value)?.value ?? -1)
  559 + }
  560 + }
  561 + }
  562 + */
  563 +
  564 + // if hrArray.count > 1 {
  565 + // minArray.insert(hrArray[0].value, at: 0)
  566 + // maxArray.insert(hrArray[0].value, at: 0)
  567 + // }
  568 + return (hrArray, minArray, maxArray)
  569 + }
  570 +
  571 + class func getAverageByDay(_ date: Date) -> (hr: TemperatureModel, minHr: Int, maxHr: Int) {
  572 + let startDate = date.dateAt(.startOfDay)
  573 + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds)
  574 + return (TemperatureModel(value: array.average(\.value), date: startDate), array.min(\.value)?.value ?? -1, array.max(\.value)?.value ?? -1)
  575 + // return BloodPressureModel(dbp: array.average(\.dbp), sbp: array.average(\.sbp), date: startDate)
  576 + }
  577 +
  578 + class func getTemperatureByWeek(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) {
  579 + var hrArray: [TemperatureModel] = []
  580 + var minArray: [Int] = []
  581 + var maxArray: [Int] = []
  582 + let weekDays = date.compare(.isThisWeek) ? (DateInRegion()-1.days).weekday : 7
  583 + for i in 0..<weekDays {
  584 + let startDate = (date-1.days).dateAt(.startOfWeek)+(i+1).days
  585 + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds)
  586 + if array.count > 0 {
  587 + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate))
  588 + minArray.append(array.min(\.value)?.value ?? -1)
  589 + maxArray.append(array.max(\.value)?.value ?? -1)
  590 + }
  591 + }
  592 + return (hrArray, minArray, maxArray)
  593 + }
  594 +
  595 + class func getTemperatureByMonth(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) {
  596 + var hrArray: [TemperatureModel] = []
  597 + var minArray: [Int] = []
  598 + var maxArray: [Int] = []
  599 + let monthDays = date.compare(.isThisMonth) ? DateInRegion().day : date.monthDays
  600 + for i in 0..<monthDays {
  601 + let startDate = date.dateAt(.startOfMonth)+i.days
  602 + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds)
  603 + if array.count > 0 {
  604 + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate))
  605 + minArray.append(array.min(\.value)?.value ?? -1)
  606 + maxArray.append(array.max(\.value)?.value ?? -1)
  607 + }
  608 + }
  609 + return (hrArray, minArray, maxArray)
  610 + }
  611 +
  612 + class func getTemperatureByYear(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) {
  613 + var hrArray: [TemperatureModel] = []
  614 + var minArray: [Int] = []
  615 + var maxArray: [Int] = []
  616 + let yearMonths = date.compare(.isThisYear) ? DateInRegion().month : 12
  617 + for i in 0..<yearMonths {
  618 + let startDate = date.dateAtStartOf(.year)+i.months
  619 + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.months-1.seconds)
  620 + if array.count > 0 {
  621 + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate))
  622 + minArray.append(array.min(\.value)?.value ?? -1)
  623 + maxArray.append(array.max(\.value)?.value ?? -1)
  624 + }
  625 + }
  626 + return (hrArray, minArray, maxArray)
  627 + }
  628 +
  629 + private class func getHistoryTemperature(startTime: Date, endTime: Date) -> [TemperatureModel] {
  630 + guard let array = RealmTools.objectsWithPredicateAndSorted(object: self, predicate: NSPredicate(format: "date >= %@ AND date <= %@", argumentArray:[startTime, endTime]), sortedKey: "date") as? Array<TemperatureModel>, array.count > 0 else {
  631 + return []
  632 + }
  633 + return array
  634 + }
  635 +
  636 +}
457 637  
458 638  
459 639  
... ...