Commit c95df15bdbc829ff897b7168141749c593d003e8
1 parent
b20a10e8
feat:stress model
Showing
1 changed file
with
179 additions
and
0 deletions
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 { | ... | ... |