From 16b34c939d6790fe6ebe61f8f0e85fe80ee52224 Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期三, 29 五月 2024 14:44:16 +0800
Subject: [PATCH] 修改准备数据流程,适应较大数据量的操作

---
 data/prepare.go |   64 ++++++++++++++++++++------------
 1 files changed, 40 insertions(+), 24 deletions(-)

diff --git a/data/prepare.go b/data/prepare.go
index ac6cf9a..1d38dd2 100644
--- a/data/prepare.go
+++ b/data/prepare.go
@@ -7,10 +7,14 @@
 )
 
 // 璁$畻鎶撴媿澶╂暟
-func CalculateCaptureDays(details []db.CaptureDetail) int {
+func CalculateCaptureDays(details []db.CaptureDetail) (int, int) {
 	// 浣跨敤 map 鏉ュ瓨鍌ㄦ瘡澶╂槸鍚︽湁鎶撴媿璁板綍
 	captureMap := make(map[string]bool)
-	for _, detail := range details {
+	//pointDate := ""
+	//pointTime := ""
+	//pointDirection := ""
+	overnightCount := 0
+	for i, detail := range details {
 		// 瑙f瀽鎶撴媿鏃ユ湡
 		layout := "2006-01-02 15:04:05"
 		captureTime, err := time.Parse(layout, detail.CaptureDate)
@@ -18,10 +22,27 @@
 			fmt.Println("瑙f瀽鎶撴媿鏃ユ湡鏃跺嚭閿�:", err)
 			continue
 		}
+		//fmt.Println(captureTime, detail.Direction)
 		// 鑾峰彇鏃ユ湡閮ㄥ垎
 		date := captureTime.Format("2006-01-02")
+		//time := captureTime.Format("15:04:05")
 		// 鍦� map 涓爣璁拌繖涓�澶╂湁鎶撴媿璁板綍
 		captureMap[date] = true
+		if i == len(details)-1 {
+			break
+		}
+
+		// 绗竴涓獙璇佹潯浠讹細褰撳墠涓� in锛屾椂闂村湪涓嬪崍 16 鐐逛互鍚�
+		currTime, _ := time.Parse("2006-01-02 15:04:05", detail.CaptureDate)
+		if detail.Direction == "in" && currTime.Hour() >= 16 {
+			// 绗簩涓獙璇佹潯浠讹細涓嬩竴涓负 out锛屾椂闂村湪涓婂崍 5 鐐逛箣鍚� 12 鐐逛箣鍓�
+			nextDetail := details[i+1]
+			nextTime, _ := time.Parse("2006-01-02 15:04:05", nextDetail.CaptureDate)
+			nextDay := nextTime.AddDate(0, 0, -1).Format("2006-01-02")
+			if nextDetail.Direction == "out" && nextTime.Hour() >= 5 && nextTime.Hour() < 12 && nextDay == detail.CaptureDate[:10] {
+				overnightCount++
+			}
+		}
 	}
 
 	// 缁熻鏈夋姄鎷嶈褰曠殑澶╂暟
@@ -30,7 +51,7 @@
 		captureDays++
 	}
 
-	return captureDays
+	return captureDays, overnightCount
 }
 
 // 璁剧疆鐘舵��
@@ -44,11 +65,11 @@
 }
 
 // SetFrequentAddress 鏂规硶璁$畻鍑虹幇鏈�棰戠箒鐨勫嚭琛屽湴鍧�骞惰缃负甯哥敤鍦板潃
-func SetFrequentAddress(c *db.CaptureInfo) {
+func GetFrequentAddress(captureDetail []db.CaptureDetail) string {
 	outAddressCounts := make(map[string]int)
 	inAddressCounts := make(map[string]int)
 	// 缁熻姣忎釜鍑鸿鍦板潃鐨勫嚭鐜版鏁�
-	for _, detail := range c.CaptureDetail {
+	for _, detail := range captureDetail {
 		if detail.Direction == "out" {
 			outAddressCounts[detail.CaptureAddress]++
 		}
@@ -75,12 +96,11 @@
 			}
 		}
 	}
-	// 灏嗗嚭鐜版鏁版渶澶氱殑鍑鸿鍦板潃璁剧疆涓哄父鐢ㄥ湴鍧�
-	c.FrequentAddress = frequentAddress
+	return frequentAddress
 }
 
 // processData 鍑芥暟澶勭悊鏁版嵁锛屾牴鎹姹傝繃婊ゆ帀鏁版嵁骞舵牴鎹鍒欐洿鏂扮姸鎬�
-func ProcessData(captureInfos []db.CaptureInfo, personStatus []db.PersonStatus, ruleInfos []db.PersonnelStatusRule, communityID string) []db.PersonStatus {
+func ProcessData(captureInfos []db.CaptureInfo, personStatus []*db.PersonStatus, ruleInfos []db.PersonnelStatusRule, communityID string) []db.PersonStatus {
 	filteredInfos := make([]db.PersonStatus, 0)
 
 	// 鏋勫缓蹇�熸煡鎵剧储寮曪紝鏂逛究鏌ユ壘瀵瑰簲鐨勪汉鍛樼姸鎬佸拰瑙勫垯
@@ -88,35 +108,31 @@
 	ruleIndex := make(map[string]db.PersonnelStatusRule)
 
 	for _, person := range personStatus {
-		statusIndex[person.DocumentNumber] = person
+		statusIndex[person.DocumentNumber] = *person
 	}
 
 	for _, rule := range ruleInfos {
 		ruleIndex[rule.Name] = rule
 	}
-
+	//fmt.Println("statusIndex: ", statusIndex)
+	//fmt.Println("ruleIndex: ", ruleIndex)
 	// 澶勭悊姣忎釜鎶撴媿淇℃伅
 	for _, info := range captureInfos {
 		//fmt.Println("info", info.DocumentNumber, info.Status, info.FrequentAddress)
 		//fmt.Println("person", statusIndex[info.DocumentNumber].DocumentNumber, statusIndex[info.DocumentNumber].Status, statusIndex[info.DocumentNumber].FrequentAddress)
 		// 妫�鏌ユ槸鍚﹀瓨鍦ㄥ搴旂殑浜哄憳鐘舵��
-		person, ok := statusIndex[info.DocumentNumber]
-		if !ok {
-			// 涓嶅瓨鍦ㄥ搴旂殑浜哄憳鐘舵�佷负鏂版暟鎹�
-			filteredInfos = append(filteredInfos, db.PersonStatus{CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress})
-			continue
-		}
-
+		person := statusIndex[info.DocumentNumber]
+		//fmt.Println("person: ", person.DocumentNumber, person.Status, person.FrequentAddress, person.LastAppearanceTime, person.LastAppearanceStatusTime)
 		// 鍒ゆ柇鐘舵�佸拰甯哥敤鍦板潃鏄惁鐩哥瓑锛屽鏋滅浉绛夊垯蹇界暐
-		if (info.Status == person.Status || info.CaptureDays <= ruleIndex[person.DocumentNumber].DetectionDaysEnd) &&
-			info.FrequentAddress == person.FrequentAddress {
-			continue
-		}
-
+		//if (info.Status == person.Status || info.CaptureDays <= ruleIndex[person.DocumentNumber].DetectionDaysEnd) &&
+		//	info.FrequentAddress == person.FrequentAddress {
+		//	continue
+		//}
 		// 鏇存柊杩囨护鍚庣殑淇℃伅鍒楄〃
-		filteredInfos = append(filteredInfos, db.PersonStatus{CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress})
+		//fmt.Println("LastAppearanceTime: ", person.LastAppearanceTime)
+		filteredInfos = append(filteredInfos, db.PersonStatus{CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress, LastAppearanceStatusTime: person.LastAppearanceTime})
 
 	}
-
+	//fmt.Println("filteredInfos: ", filteredInfos)
 	return filteredInfos
 }

--
Gitblit v1.8.0