From b1d7efd8c4ab9c4bf56f62e636a358a5182c09bf Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期六, 28 九月 2024 23:43:58 +0800 Subject: [PATCH] fix db colummn --- data/prepare.go | 207 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 163 insertions(+), 44 deletions(-) diff --git a/data/prepare.go b/data/prepare.go index ac6cf9a..86d24cc 100644 --- a/data/prepare.go +++ b/data/prepare.go @@ -2,15 +2,22 @@ import ( "fmt" + "regexp" + "ruleModelEngine/config" "ruleModelEngine/db" + "strings" "time" ) // 璁$畻鎶撴媿澶╂暟 -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 +25,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 +54,7 @@ captureDays++ } - return captureDays + return captureDays, overnightCount } // 璁剧疆鐘舵�� @@ -43,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) // 鏋勫缓蹇�熸煡鎵剧储寮曪紝鏂逛究鏌ユ壘瀵瑰簲鐨勪汉鍛樼姸鎬佸拰瑙勫垯 @@ -88,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{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{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