Commit c95df15bdbc829ff897b7168141749c593d003e8

Authored by daifengyi
1 parent b20a10e8

feat:stress model

HDFwear/Home/Model/HealthModel.swift
... ... @@ -635,7 +635,186 @@ class TemperatureModel: Object {
635 635  
636 636 }
637 637  
  638 +//MARK: - 压力
  639 +//jtd!
  640 +class StressModel: Object {
  641 + @Persisted var value: Int = -1
  642 + @Persisted var date: Date? = nil
  643 +
  644 + convenience init(value: Int, date: Date?) {
  645 + self.init()
  646 + self.value = value
  647 + self.date = date
  648 + }
  649 +
  650 + class func toStressArray(_ bytes: [UInt8]) -> [StressModel] {
  651 + var hrArray: [StressModel] = []
  652 + let num = bytes.count/7
  653 + for i in 0..<num {
  654 + 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
  655 + let hr = StressModel(value: Int(bytes[i*7+6]), date: date)
  656 + hrArray.append(hr)
  657 + }
  658 + return hrArray
  659 + }
  660 +
  661 + private func add() {
  662 + if let a = RealmTools.queryObjects(StressModel.self, filter: "date = %@", [self.date ?? Date()]) as? [StressModel] {
  663 + RealmTools.deleteList(a)
  664 + }
  665 + RealmTools.add(self)
  666 + }
  667 + private func isEqual(_ hr: StressModel) -> Bool {
  668 + if self.value == hr.value {
  669 + if self.date!.isInside(date: hr.date!, granularity: .minute) {
  670 + return true
  671 + }
  672 + }
  673 + return false
  674 + }
  675 +
  676 + func realTimeAdd() {
  677 + if let hrArray = RealmTools.queryObjects(StressModel.self) as? [StressModel], let hr = hrArray.last {
  678 + if !self.isEqual(hr) {
  679 + RealmTools.add(self)
  680 + }
  681 + } else {
  682 + RealmTools.add(self)
  683 + }
  684 + }
638 685  
  686 + class func addArray(_ array: [StressModel]) {
  687 + if array.count == 0 {
  688 + return
  689 + }
  690 + for (i, hr) in array.enumerated() {
  691 + if hr == array.first {
  692 + hr.add()
  693 + } else {
  694 + if !hr.isEqual(array[i-1]) {
  695 + hr.add()
  696 + }
  697 + }
  698 + }
  699 + }
  700 +
  701 +
  702 + class func getRecentData(count: Int = 31) -> [StressModel] {
  703 + guard let array = RealmTools.objectsWithPredicateAndSortedForPages(object: self, sortedKey: "date", isAssending: false, pageSize: count) as? [StressModel], array.count > 0 else {
  704 + return []
  705 + }
  706 + return array.reversed()
  707 + }
  708 +
  709 + class func getStressByDay(_ date: Date) -> (hrArray: [StressModel], minHr: [Int], maxHr: [Int]) {
  710 + var hrArray: [StressModel] = []
  711 + var minArray: [Int] = []
  712 + var maxArray: [Int] = []
  713 +
  714 + for h in 0..<24 {
  715 + let hourArray = getHistoryStress(startTime: date.dateAtStartOf(.day)+h.hours, endTime: date.dateAtStartOf(.day)+(h+1).hours)
  716 + for m in 0..<60 {
  717 + var minuteArray: [StressModel] = []
  718 + for hr in hourArray {
  719 + if hr.date!.minute == m {
  720 + minuteArray.append(hr)
  721 + }
  722 + }
  723 + if minuteArray.count > 0 {
  724 + hrArray.append(StressModel(value: minuteArray.last!.value, date: date.dateAtStartOf(.day)+h.hours+m.minutes))
  725 + // hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+h.hours+m.minutes))
  726 + minArray.append(minuteArray.min(\.value)?.value ?? -1)
  727 + maxArray.append(minuteArray.max(\.value)?.value ?? -1)
  728 + }
  729 + }
  730 + }
  731 + /*
  732 + for i in 0..<24 {
  733 + for m in 0..<60 {
  734 + rec += 1
  735 + let minuteArray = getHistoryHeartRate(startTime: date.dateAtStartOf(.day)+i.hours+m.minutes, endTime: date.dateAtStartOf(.day)+i.hours+(m+1).minutes)
  736 + if minuteArray.count > 0 {
  737 + hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+i.hours+m.minutes))
  738 + minArray.append(minuteArray.min(\.value)?.value ?? -1)
  739 + maxArray.append(minuteArray.max(\.value)?.value ?? -1)
  740 + }
  741 + }
  742 + }
  743 + */
  744 +
  745 + // if hrArray.count > 1 {
  746 + // minArray.insert(hrArray[0].value, at: 0)
  747 + // maxArray.insert(hrArray[0].value, at: 0)
  748 + // }
  749 + return (hrArray, minArray, maxArray)
  750 + }
  751 +
  752 + class func getAverageByDay(_ date: Date) -> (hr: StressModel, minHr: Int, maxHr: Int) {
  753 + let startDate = date.dateAt(.startOfDay)
  754 + let array = getHistoryStress(startTime: startDate, endTime: startDate+1.days-1.seconds)
  755 + return (StressModel(value: array.average(\.value), date: startDate), array.min(\.value)?.value ?? -1, array.max(\.value)?.value ?? -1)
  756 + // return BloodPressureModel(dbp: array.average(\.dbp), sbp: array.average(\.sbp), date: startDate)
  757 + }
  758 +
  759 + class func getStressByWeek(_ date: Date) -> (hrArray: [StressModel], minHr: [Int], maxHr: [Int]) {
  760 + var hrArray: [StressModel] = []
  761 + var minArray: [Int] = []
  762 + var maxArray: [Int] = []
  763 + let weekDays = date.compare(.isThisWeek) ? (DateInRegion()-1.days).weekday : 7
  764 + for i in 0..<weekDays {
  765 + let startDate = (date-1.days).dateAt(.startOfWeek)+(i+1).days
  766 + let array = getHistoryStress(startTime: startDate, endTime: startDate+1.days-1.seconds)
  767 + if array.count > 0 {
  768 + hrArray.append(StressModel(value: array.average(\.value), date: startDate))
  769 + minArray.append(array.min(\.value)?.value ?? -1)
  770 + maxArray.append(array.max(\.value)?.value ?? -1)
  771 + }
  772 + }
  773 + return (hrArray, minArray, maxArray)
  774 + }
  775 +
  776 + class func getStressByMonth(_ date: Date) -> (hrArray: [StressModel], minHr: [Int], maxHr: [Int]) {
  777 + var hrArray: [StressModel] = []
  778 + var minArray: [Int] = []
  779 + var maxArray: [Int] = []
  780 + let monthDays = date.compare(.isThisMonth) ? DateInRegion().day : date.monthDays
  781 + for i in 0..<monthDays {
  782 + let startDate = date.dateAt(.startOfMonth)+i.days
  783 + let array = getHistoryStress(startTime: startDate, endTime: startDate+1.days-1.seconds)
  784 + if array.count > 0 {
  785 + hrArray.append(StressModel(value: array.average(\.value), date: startDate))
  786 + minArray.append(array.min(\.value)?.value ?? -1)
  787 + maxArray.append(array.max(\.value)?.value ?? -1)
  788 + }
  789 + }
  790 + return (hrArray, minArray, maxArray)
  791 + }
  792 +
  793 + class func getStressByYear(_ date: Date) -> (hrArray: [StressModel], minHr: [Int], maxHr: [Int]) {
  794 + var hrArray: [StressModel] = []
  795 + var minArray: [Int] = []
  796 + var maxArray: [Int] = []
  797 + let yearMonths = date.compare(.isThisYear) ? DateInRegion().month : 12
  798 + for i in 0..<yearMonths {
  799 + let startDate = date.dateAtStartOf(.year)+i.months
  800 + let array = getHistoryStress(startTime: startDate, endTime: startDate+1.months-1.seconds)
  801 + if array.count > 0 {
  802 + hrArray.append(StressModel(value: array.average(\.value), date: startDate))
  803 + minArray.append(array.min(\.value)?.value ?? -1)
  804 + maxArray.append(array.max(\.value)?.value ?? -1)
  805 + }
  806 + }
  807 + return (hrArray, minArray, maxArray)
  808 + }
  809 +
  810 + private class func getHistoryStress(startTime: Date, endTime: Date) -> [StressModel] {
  811 + guard let array = RealmTools.objectsWithPredicateAndSorted(object: self, predicate: NSPredicate(format: "date >= %@ AND date <= %@", argumentArray:[startTime, endTime]), sortedKey: "date") as? Array<StressModel>, array.count > 0 else {
  812 + return []
  813 + }
  814 + return array
  815 + }
  816 +
  817 +}
639 818  
640 819 //MARK: - 血压
641 820 class BloodPressureModel: Object {
... ...