From 3737ab3dd0cc753be986638316c96cb3114601e4 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期日, 29 九月 2024 16:20:46 +0800
Subject: [PATCH] fix db column

---
 data/prepare.go |  180 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 139 insertions(+), 41 deletions(-)

diff --git a/data/prepare.go b/data/prepare.go
index 8b0f675..86d24cc 100644
--- a/data/prepare.go
+++ b/data/prepare.go
@@ -2,7 +2,10 @@
 
 import (
 	"fmt"
+	"regexp"
+	"ruleModelEngine/config"
 	"ruleModelEngine/db"
+	"strings"
 	"time"
 )
 
@@ -64,44 +67,140 @@
 	return rules[1].Name
 }
 
-// SetFrequentAddress 鏂规硶璁$畻鍑虹幇鏈�棰戠箒鐨勫嚭琛屽湴鍧�骞惰缃负甯哥敤鍦板潃
-func SetFrequentAddress(c *db.CaptureInfo) {
-	outAddressCounts := make(map[string]int)
-	inAddressCounts := make(map[string]int)
-	// 缁熻姣忎釜鍑鸿鍦板潃鐨勫嚭鐜版鏁�
-	for _, detail := range c.CaptureDetail {
-		if detail.Direction == "out" {
-			outAddressCounts[detail.CaptureAddress]++
+// 鑾峰彇甯哥敤鍦板潃
+func getfrAddress(pointAddress map[string]int) string {
+	maxCount := 0
+	maxCountAddress := ""
+	re1F, _ := regexp.Compile(`\b1F\b`)
+	reNoF, _ := regexp.Compile(`^[^F]*$`)
+	reNegF := regexp.MustCompile(`-`)
+	for address, count := range pointAddress {
+		matchFlag1F := re1F.MatchString(address)
+		matchFlagNoF := reNoF.MatchString(address)
+		matchFlagNegF := reNegF.MatchString(address)
+		if address == "" || matchFlag1F || matchFlagNoF || matchFlagNegF {
+			continue
 		}
-		if detail.Direction == "in" {
-			inAddressCounts[detail.CaptureAddress]++
+		if count > maxCount {
+			maxCount = count
+			maxCountAddress = address
 		}
 	}
+	return maxCountAddress
+}
 
-	// 鎵惧埌鍑虹幇娆℃暟鏈�澶氱殑鍑鸿鍦板潃
-	maxOutCount := 0
+// SetFrequentAddress 鏂规硶璁$畻鍑虹幇鏈�棰戠箒鐨勫嚭琛屽湴鍧�骞惰缃负甯哥敤鍦板潃
+func GetFrequentAddress(captureDetail []db.CaptureDetail) string {
+	// 缁熻姣忎釜鍑鸿鍦板潃鐨勫嚭鐜版鏁�
+	//pointDate 闈舵爣鏃ユ湡锛宲ointAddress闈舵爣鍦板潃
+	pointDate := ""
+	pointAddress := make(map[string]int, 0)
+	//dateAddress 鎸夋棩鏈熸眹鎬诲崟鏃ュ父鐢ㄥ湴鍧�
+	dateAddress := make(map[string]string, 0)
+	//floor1Address 鍚庡鍦板潃锛屼负1妤煎湴鍧�
+	floor1Address := ""
+	//captureDays 鎸夋棩鏈熷幓閲嶇粺璁℃�绘姄鎷嶅ぉ鏁�
+	captureDays := make(map[string]int, 0)
+	//frequentAddress 鏈�缁堣缃殑甯哥敤鍦板潃
 	var frequentAddress string
-	for address, count := range outAddressCounts {
-		if count > maxOutCount {
-			maxOutCount = count
-			frequentAddress = address
+	//姝e垯 鍒ゆ柇鍦板潃鏄惁鍖呭惈1F瀛楁牱锛屽畬鍏ㄥ尮閰�
+	re1F, _ := regexp.Compile(`\b1F\b`)
+	reNoF, _ := regexp.Compile(`^[^F]*$`)
+	// 閬嶅巻鎵�鏈夋姄鎷嶆暟鎹�
+	for index, detail := range captureDetail {
+		//fmt.Println("鎶撴媿鍦板潃锛�", detail.CaptureAddress)
+		//fmt.Println("鎶撴媿鏃ユ湡锛�", detail.CaptureDate)
+		//dateStr鎴彇鐨勬棩鏈燂紝涓篩YYY-MM-DD
+		dateStr := strings.Split(detail.CaptureDate, " ")[0]
+		//鍘婚噸缁熻鎶撴媿澶╂暟 captureDays
+		captureDays[dateStr]++
+		//鍖归厤鏄惁鏄�1F
+		matchFlag1F := re1F.MatchString(detail.CaptureAddress)
+		matchFlagNoF := reNoF.MatchString(detail.CaptureAddress)
+		if matchFlag1F {
+			//濡傛灉鏄紝 鎻愬墠璁剧疆濂藉鐢ㄥ湴鍧� floor1Address = detail.CaptureAddress
+			floor1Address = detail.CaptureAddress
 		}
-	}
-	if frequentAddress == "" {
-		maxInCount := 0
-		for address, count := range inAddressCounts {
-			if count > maxInCount {
-				maxInCount = count
-				frequentAddress = address
+		if matchFlagNoF && floor1Address == "" {
+			//濡傛灉鏄紝 鎻愬墠璁剧疆濂藉鐢ㄥ湴鍧� floor1Address = detail.CaptureAddress
+			floor1Address = detail.CaptureAddress
+		}
+		//fmt.Println("now floor1Address:", floor1Address,"\tnow detail CaptureAddress",detail.CaptureAddress)
+		//鍒ゆ柇鏃ユ湡鏍囨槸鍚︽弧瓒虫潯浠� 鍒ゆ柇鏃ユ湡鏍囨槸鍚︿负绌猴紝鑻ヤ负绌鸿〃绀烘槸绗竴涓厓绱狅紝鍒濆鍖栨棩鏈熼澏鏍�
+		if pointDate == "" {
+			//鍒濆鍖栨棩鏈熼澏鏍囦负褰撳墠鏃ユ湡
+			pointDate = dateStr
+			//鎶婂綋鍓嶆棩鏈熺殑
+			pointAddress[detail.CaptureAddress]++
+			//鑻ヤ负鏈�鍚庝竴鏉″垯璁$畻鍗曟棩甯哥敤鍦板潃
+			if index == len(captureDetail)-1 {
+				//fmt.Println("澶勭悊鍓峱ointAddress琛細", pointAddress)
+				//杩欎唬琛ㄤ粎鏈変竴鏉℃暟鎹紝灏嗕細鐩存帴鎶婂綋鍓嶅湴鍧�鍔犲叆dateAddress 鏃ユ湡姹囨�诲崟鏃ュ父鐢ㄥ湴鍧�琛ㄥ唴 涓嬫柟continue浼氱洿鎺ョ粨鏉熷惊鐜�
+				//鍚﹀垯浼氬垵濮嬪寲pointDate鍜宲ointAddress
+				dateAddress[pointDate] = detail.CaptureAddress
 			}
+			continue
+		}
+		//鑻ユ棩鏈熸爣鐩哥瓑鍒欎负鍚屼竴澶�
+		if pointDate == dateStr {
+			//pointAddress闈舵爣鏃ユ湡鏁扮粍瀵瑰簲妤煎眰鍦板潃鏁�+1
+			pointAddress[detail.CaptureAddress]++
+			//鑻ヤ负鏈�鍚庝竴鏉″垯璁$畻鍗曟棩甯哥敤鍦板潃
+			if index == len(captureDetail)-1 {
+				//fmt.Println("澶勭悊鍓峱ointAddress琛細", pointAddress)
+				//璁$畻鍗曟棩甯哥敤鍦板潃 鑻ュ湴鍧�鍐呴兘涓�1F鎴栬�呯┖鍦板潃锛屼細杩斿洖绌哄湴鍧�
+				dateAddress[pointDate] = getfrAddress(pointAddress)
+				continue
+			}
+			//涓嶇浉绛夊垯涓烘柊鐨勬棩鏈燂紝棣栧厛璁$畻鍑哄綋鏃ョ殑甯哥敤鍦板潃锛岀劧鍚庨噸鏂板垵濮嬪寲鏃ユ湡鏍囧拰鍦板潃鏍囨暟缁�
+		} else {
+			//鑻ヤ负鏈�鍚庝竴鏉″垯璁$畻鍗曟棩甯哥敤鍦板潃
+			if index == len(captureDetail)-1 {
+				//鎶婂綋鍓嶆渶鍚庝竴鏉″姞鍏�	pointAddress闈舵爣鍦板潃
+				pointAddress[detail.CaptureAddress]++
+				//
+				//fmt.Println("澶勭悊鍓峱ointAddress琛細", pointAddress)
+				//璁$畻鍗曟棩甯哥敤鍦板潃 鑻ュ湴鍧�鍐呴兘涓�1F鎴栬�呯┖鍦板潃锛屼細杩斿洖绌哄湴鍧�
+				dateAddress[pointDate] = getfrAddress(pointAddress)
+				continue
+			}
+			//涓嶄负鏈�鍚庝竴鏉¤〃绀鸿繖鏄柊鐨勪竴澶╃殑鎶撴媿鍦板潃鏁版嵁锛岄渶瑕佽绠椾箣鍓嶄竴澶╃殑鍗曟棩甯哥敤鍦板潃
+			dateAddress[pointDate] = getfrAddress(pointAddress)
+			//鍒濆鍖栨柊鐨勪竴澶╃殑闈舵爣鏃ユ湡鍜宲ointAddress 闈舵爣鍦板潃鏁扮粍
+			pointDate = dateStr
+			pointAddress = make(map[string]int, 0)
 		}
 	}
-	// 灏嗗嚭鐜版鏁版渶澶氱殑鍑鸿鍦板潃璁剧疆涓哄父鐢ㄥ湴鍧�
-	c.FrequentAddress = frequentAddress
+	//fmt.Println("鎶撴媿鍦板潃寰呭鐞嗙粨鏋勮〃锛�", dateAddress)
+	//fmt.Println("dareAddress len: ", len(dateAddress))
+	//鍒ゆ柇鎶撴媿鐨勯潪1妤奸潪绌洪潪鍦颁笅鐨勫ぉ鏁板崰姣旀�诲ぉ鏁�
+	if float64(len(dateAddress))/float64(len(captureDays))*100 >= float64(config.Api.CapAddrDaysThreshold) {
+		//fmt.Println("闈�1妤奸潪绌烘姄鎷嶅崰姣�: ", float64(len(dateAddress))/float64(len(captureDays))*100)
+		//鍒濆鍖栧湴鍧�鍒楄〃锛屾寜鍦板潃璁℃暟
+		addressCount := make(map[string]int)
+		//閬嶅巻涔嬪墠姹囨�荤殑鍗曟棩甯哥敤鍦板潃鍒楄〃
+		for _, address := range dateAddress {
+			//瀵瑰簲鍦板潃鏁�+1
+			addressCount[address]++
+		}
+		//澶嶅埗甯哥敤鍦板潃缁欐渶缁堢粨鏋滐紝鑻ュ湴鍧�鍐呴兘涓�1F鎴栬�呯┖鍦板潃锛屼細杩斿洖绌哄湴鍧�
+		frequentAddress = getfrAddress(addressCount)
+	} else {
+		//鑻ヤ笉婊¤冻闈�1妤奸潪绌烘姄鎷嶅崰姣旓紝鍒欑洿鎺ユ妸澶囩敤鍦板潃锛�1F锛夎祴鍊肩粰鏈�缁堢粨鏋�
+		frequentAddress = floor1Address
+	}
+	//鑻ュ瓨鍦ㄦ弧瓒抽潪1妤奸潪绌烘姄鎷嶅崰姣旓紝浣嗘槸鏈�缁堢粨鏋滄槸绌哄湴鍧�锛屽垯璧嬪�煎鐢ㄥ湴鍧�锛�1F锛変负鏈�缁堢粨鏋�
+	if frequentAddress == "" {
+		frequentAddress = floor1Address
+	}
+	//fmt.Println("in address: ", inAddressCounts)
+	//fmt.Println("out address: ", outAddressCounts)
+	//fmt.Println("final address: ", 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, statusNo map[string]int, communityID string) []db.PersonStatus {
 	filteredInfos := make([]db.PersonStatus, 0)
 
 	// 鏋勫缓蹇�熸煡鎵剧储寮曪紝鏂逛究鏌ユ壘瀵瑰簲鐨勪汉鍛樼姸鎬佸拰瑙勫垯
@@ -109,35 +208,34 @@
 	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{OrgId: info.OrgId, 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 {
+		//if (info.Status == person.Status || info.CaptureDays <= ruleIndex[person.DocumentNumber].DetectionDaysEnd) &&
+		//	info.FrequentAddress == person.FrequentAddress {
+		//	continue
+		//}
+		// 鏇存柊杩囨护鍚庣殑淇℃伅鍒楄〃
+		//fmt.Println("LastAppearanceTime: ", person.LastAppearanceTime)
+		if statusNo[person.Status] > statusNo[info.Status] {
 			continue
 		}
-
-		// 鏇存柊杩囨护鍚庣殑淇℃伅鍒楄〃
-		filteredInfos = append(filteredInfos, db.PersonStatus{OrgId: info.OrgId, CommunityID: communityID, DocumentNumber: info.DocumentNumber, Status: info.Status, FrequentAddress: info.FrequentAddress})
+		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