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 --- rule/service.go | 283 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 207 insertions(+), 76 deletions(-) diff --git a/rule/service.go b/rule/service.go index 4de8888..dfcb083 100644 --- a/rule/service.go +++ b/rule/service.go @@ -2,140 +2,272 @@ import ( "basic.com/valib/logger.git" + "encoding/csv" "fmt" + "os" + "ruleModelEngine/cache" + "ruleModelEngine/config" "ruleModelEngine/data" "ruleModelEngine/db" + "ruleModelEngine/task" + "strconv" + "time" ) -//func PrintFilteredPersonnelInfo(filteredPersonnelInfo []db.PersonnelInfo) { -// for _, pi := range filteredPersonnelInfo { -// fmt.Printf("DocumentNumber: %s\n", pi.DocumentNumber) -// fmt.Printf("TotalCaptureCount: %d\n", pi.TotalCaptureCount) -// fmt.Printf("TotalCaptureDays: %d\n", pi.TotalCaptureDays) -// fmt.Printf("PersonnelStatus: %s\n", pi.PersonnelStatus) // -// fmt.Println("CaptureDetails:") -// for _, cd := range pi.CaptureDetails { -// fmt.Printf(" Date: %s\n", cd.Date) -// fmt.Printf(" TotalCaptureCount: %d\n", cd.TotalCaptureCount) -// fmt.Println(" Captures:") -// for _, c := range cd.Captures { -// fmt.Printf(" DataTime: %s\n", c.DataTime) -// fmt.Printf(" Location: %s\n", c.Location) +//// 妫�鏌ヨ鍒欒〃涔﹀惁瀛樺湪寮傚父 +//func checkRuleValidity(rules []db.PersonnelStatusRule) bool { +// for i := 0; i < len(rules); i++ { +// for j := i + 1; j < len(rules); j++ { +// ruleI := rules[i] +// ruleJ := rules[j] +// //fmt.Println(ruleI.DetectionDaysStart,ruleI.DetectionDaysEnd) +// //fmt.Println(ruleJ.DetectionDaysStart,ruleJ.DetectionDaysEnd) +// if (ruleI.DetectionDaysStart <= ruleJ.DetectionDaysEnd && ruleI.DetectionDaysStart >= ruleJ.DetectionDaysStart) || +// (ruleI.DetectionDaysEnd <= ruleJ.DetectionDaysEnd && ruleI.DetectionDaysEnd >= ruleJ.DetectionDaysStart) || +// (ruleI.DetectionDaysStart <= ruleJ.DetectionDaysStart && ruleI.DetectionDaysEnd >= ruleJ.DetectionDaysEnd) { +// return false // } // } -// fmt.Println() // } +// return true //} -// 璁$畻甯哥敤鍦板潃 -//func assignFrequentAddress(personnelInfo []db.PersonnelInfo) []db.PersonnelInfo { -// for i := range personnelInfo { -// addressCounts := make(map[string]int) -// var maxAddress string -// maxCount := 0 -// for _, detail := range personnelInfo[i].CaptureDetails { -// for _, capture := range detail.Captures { -// addressCounts[capture.Location]++ -// if addressCounts[capture.Location] > maxCount { -// maxCount = addressCounts[capture.Location] -// maxAddress = capture.Location -// } -// } -// } -// personnelInfo[i].FrequentAddress = maxAddress -// } -// return personnelInfo -//} +func writeCSV(filename string, data []db.CaptureInfo) error { + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() -// 妫�鏌ヨ鍒欒〃涔﹀惁瀛樺湪寮傚父 -func checkRuleValidity(rules []db.PersonnelStatusRule) bool { - for i := 0; i < len(rules); i++ { - for j := i + 1; j < len(rules); j++ { - ruleI := rules[i] - ruleJ := rules[j] - //fmt.Println(ruleI.DetectionDaysStart,ruleI.DetectionDaysEnd) - //fmt.Println(ruleJ.DetectionDaysStart,ruleJ.DetectionDaysEnd) - if (ruleI.DetectionDaysStart <= ruleJ.DetectionDaysEnd && ruleI.DetectionDaysStart >= ruleJ.DetectionDaysStart) || - (ruleI.DetectionDaysEnd <= ruleJ.DetectionDaysEnd && ruleI.DetectionDaysEnd >= ruleJ.DetectionDaysStart) || - (ruleI.DetectionDaysStart <= ruleJ.DetectionDaysStart && ruleI.DetectionDaysEnd >= ruleJ.DetectionDaysEnd) { - return false - } + writer := csv.NewWriter(file) + defer writer.Flush() + + // Write header + header := []string{"妗f缂栧彿", "鎶撴媿澶╂暟", "杩囧澶╂暟", "鍒嗙被", "甯哥敤鍦板潃"} + if err := writer.Write(header); err != nil { + return err + } + + // Write data + for _, info := range data { + record := []string{ + info.DocumentNumber, + strconv.Itoa(info.CaptureDays), + strconv.Itoa(info.OvernightStays), + info.Status, + info.FrequentAddress, + } + if err := writer.Write(record); err != nil { + return err } } - return true + + return nil +} + +func executeEnteringButNotLeaving(communityId string) { + //杩涘嚭寮傚父甯冩帶浠诲姟锛屾殏鏃跺綊绫诲埌鏍囩璁$畻閮ㄥ垎 + //fmt.Println("杩涘嚭寮傚父寮�濮嬪叆鍙o紒锛侊紒锛侊紒锛�") + tasks, err := db.GetAllTaskData() + if err != nil { + logger.Error("GetAllTaskData Error", err) + } + var tkInfo db.Task + for _, taskInfo := range tasks { + if taskInfo.Name == "杩涘嚭寮傚父" { + tkInfo.Id = taskInfo.Id + tkInfo.Name = taskInfo.Name + } + } + + //fmt.Println("tkInfo: ", tkInfo) + //fmt.Println("docNumIdMap: ", len(docNumIdMap)) + //鑾峰彇鍟嗕綇妤糲ameraid + + cameraIds := make([]string, 0) + for _, deviceInfo := range cache.Device { + if deviceInfo.CommunityID == communityId && deviceInfo.BuildingType == db.BuildingTypeMixedUse { + cameraIds = append(cameraIds, deviceInfo.DeviceCode) + } + } + + if len(cameraIds) == 0 { + logger.Info("涓嶅瓨鍦ㄥ晢浣忔ゼ璁惧锛�", cameraIds) + return + } + //鏌ヨ寰呭垽鏂繘鍑哄紓甯搁璀︽。妗� + days := config.Api.AInterval + docNumIdMap, err := db.QueryLastIdByDayRange(communityId, cameraIds, days, days-1) + if err != nil { + logger.Error("QueryByDayRange err: ", err) + } + for docNumber, id := range docNumIdMap { + //fmt.Println(docNumber, id) + alarmRules := make([]db.AlarmRule, 0) + flag := task.EnteringButNotLeaving(docNumber, communityId, cameraIds, days) + if flag == true { + alarmRules = append(alarmRules, db.AlarmRule{RuleId: strconv.Itoa(tkInfo.Id), RuleText: tkInfo.Name, AlarmLevel: "0"}) + } + //fmt.Println("alarmRules: ", id, alarmRules) + addFlag, err := db.AddAlarmRules(alarmRules, id) + if err != nil { + logger.Error("AddAlarmRules err: ", err) + } + if addFlag == true { + logger.Info("AddAlarmRules success: ", id) + } + } } // 鎵ц绋嬪簭鍏ュ彛 func ExecuteTask() { + //return ruleInfo, err := db.GetAllData() if err != nil { logger.Error("GetAllData Error", err) } fmt.Println("ruleInfo: ", ruleInfo) + statusNo := make(map[string]int) + statusNo["stranger"] = db.StatusStranger + statusNo["visitor"] = db.StatusVisitor + statusNo["resident"] = db.StatusResident communityIDs, err := db.GetCommunityIDs() - //fmt.Println("communityIDs:", communityIDs) + fmt.Println("communityIDs:", communityIDs) if err != nil { logger.Error("GetCommunityIDs Error", err) } + labeManage, err := db.GeIdentityLabels() + if err != nil { + logger.Error("GetDBPersonStatusData Error", err) + } + //fmt.Println(labeManage) for _, communityID := range communityIDs { + executeEnteringButNotLeaving(communityID) + + //涓囧叏绀惧尯 + //if communityID != "50010101010000001001" { + // continue + //} + fmt.Println("communityID: ", communityID) + //continue + now := time.Now() + timeThresholdDay := now.AddDate(0, 0, -config.Api.TimeThreshold) + timeThresholdDayZeroTime := time.Date(timeThresholdDay.Year(), timeThresholdDay.Month(), timeThresholdDay.Day(), 0, 0, 0, 0, timeThresholdDay.Location()).Unix() + fmt.Println("姣斿鏃堕棿鎴筹細", timeThresholdDayZeroTime) //鏌ヨ绀惧尯鍐呬汉鍛樻。妗堬紝鏂逛究鏁版嵁鏇存柊 - personStatus, err := db.GetDBPersonStatusData(communityID) + personStatusList, err := db.QueryPersonStatusWithPagination(communityID, timeThresholdDayZeroTime) if err != nil { - logger.Error("GetDBPersonStatusData Error", err) + logger.Error("QueryPersonStatusWithPagination err: ", err) } - labeManage, err := db.GetLabelManageIdentity(2) - if err != nil { - logger.Error("GetDBPersonStatusData Error", err) + + documentNumberIDS := make([]string, 0) + for _, personStatus := range personStatusList { + //fmt.Println("personStatus.LastAppearanceTime: ", personStatus.LastAppearanceTime) + documentNumberIDS = append(documentNumberIDS, personStatus.DocumentNumber) + //涓氬姟閫昏緫 } - //fmt.Println(labeManage) - //fmt.Println("personStatus: ", personStatus) - //fmt.Println("CcmmunityIDs: ", cmmunityID) - //鎸夌ぞ鍖篿d鏌ヨ杩戜竴涓湀es鏁版嵁 - captureInfos, err := db.Query1MDataByCommunityId(communityID) - //fmt.Println("captureInfos: ", captureInfos) - for i := range captureInfos { - captureDays := data.CalculateCaptureDays(captureInfos[i].CaptureDetail) - captureInfos[i].CaptureDays = captureDays - //fmt.Println("璇ヤ汉鍛樺嚭鐜板ぉ鏁颁负", captureInfos[i].CaptureDays) - captureInfos[i].Status = data.SetStatus(captureDays, ruleInfo) - data.SetFrequentAddress(&captureInfos[i]) - } - if err != nil { - logger.Error("MatchAllTargets Error", err) + fmt.Println("绀惧尯妗f鎬绘潯鏁帮細", len(documentNumberIDS)) + + captureInfos := make([]db.CaptureInfo, 0) + batchSize := config.Elastic.BatchSize + //fmt.Println(batchSize) + for i := 0; i < len(documentNumberIDS); i += batchSize { + end := i + batchSize + if end > len(documentNumberIDS) { + end = len(documentNumberIDS) + } + batch := documentNumberIDS[i:end] + //fmt.Println("batch: ", batch) + batchCaptureInfos, err := db.QueryByTimeThresholdDataByCommunityId(communityID, batch, config.Api.TimeThreshold) + if err != nil { + logger.Error("Query1MDataByCommunityId Error", err) + } + if len(batchCaptureInfos) == 0 { + continue + } + //fmt.Println("batchCaptureInfos: ", batchCaptureInfos) + captureInfos = append(captureInfos, batchCaptureInfos...) } if len(captureInfos) == 0 { continue } + fmt.Println("鍏辫鏈夋。妗堟暟鎹潯鏁颁负锛�", len(captureInfos)) + //琛ュ叏鍒嗘瀽鎵�闇�鏁版嵁 + for i := range captureInfos { + captureDays, overnightCount := data.CalculateCaptureDays(captureInfos[i].CaptureDetail) + captureInfos[i].CaptureDays = captureDays + captureInfos[i].OvernightStays = overnightCount + + captureInfos[i].Status = data.SetStatus(captureDays, ruleInfo) + if captureInfos[i].OvernightStays >= 5 && (captureInfos[i].CaptureDays <= 14 && captureInfos[i].CaptureDays >= 5) { + captureInfos[i].Status = "resident" + } + //fmt.Println("SetStatus: ", captureInfos[i].Status) + age, err := db.QueryAgeById(captureInfos[i].DocumentNumber) + if err != nil { + logger.Error("QueryAgeById ERROR", err) + } + captureInfos[i].Age = age + captureInfos[i].FrequentAddress = data.GetFrequentAddress(captureInfos[i].CaptureDetail) + + //fmt.Println("CaptureDetail: ", captureInfos[i].DocumentNumber, captureInfos[i].CaptureDays, captureInfos[i].CaptureDetail) + } + //err1 := writeCSV("report.csv", captureInfos) + //if err != nil { + // fmt.Println(err1) + //} + //continue + //fmt.Println("residentCount: ", residentCount) //fmt.Println("captureInfosQ: ", captureInfos) for _, identity := range labeManage { switch identity.Name { case "鏈嶅姟浜哄憳": - identity, attribute := CreateLinearModel(captureInfos, communityID, 2.68, identity.ValidDays) + identity, attribute := CreateLinearModel(captureInfos, communityID, 2.68, identity.ValidDays, identity.ID) + errIdentity := db.UpdateDBPersonLabel(identity) if errIdentity != nil { logger.Error("UpdateDBPersonLabel Error", errIdentity) } + captureInfos = attribute } } - //CreateProcessModel(captureInfos, 30) + + identity := CreateProcessModel(captureInfos, 30, communityID, labeManage) + errIdentity := db.UpdateDBPersonLabel(identity) + if errIdentity != nil { + logger.Error("UpdateDBPersonLabel Error", errIdentity) + } + //continue - //fmt.Println("captureInfos: ", captureInfos) - postCaptureInfos := data.ProcessData(captureInfos, personStatus, ruleInfo, communityID) - //fmt.Println("postCaptureInfos: ", postCaptureInfos) - //fmt.Println("鍏辫繃婊ゆ潯鏁帮細", len(captureInfos)-len(postCaptureInfos)) + + postCaptureInfos := data.ProcessData(captureInfos, personStatusList, ruleInfo, statusNo, communityID) + for _, inf := range postCaptureInfos { + fmt.Println("---->pause prepare: capture ", inf.DocumentNumber, inf.Status, inf.FrequentAddress) + //return + //time.Sleep(time.Second * 10) + + //fmt.Println("inf: ", inf.DocumentNumber, inf.Status, inf.FrequentAddress, inf.LastAppearanceStatusTime) + } + fmt.Println("鍏辨洿鏂版。妗堟暟锛�", len(postCaptureInfos)) + //fmt.Println("----->captureInfos: ", len(captureInfos)) + //continue UpdatePersonInfoErr := db.UpdatePersonInfo(postCaptureInfos, communityID) if UpdatePersonInfoErr != nil { logger.Error("MatchPermanentResidentTargets Error: ", UpdatePersonInfoErr) } resident, DocNumberErr := db.GetResidentData("resident", communityID) + //fmt.Println(resident) + //return if DocNumberErr != nil { logger.Error("GetDocNumberFromPersonStatus Error: ", DocNumberErr) } + //fmt.Println(resident) + //fmt.Println("resident: ", resident) mio := processResidentStatus(resident) //fmt.Println("mip: ", mio) UpdateMoveInoutErr := db.UpdateMoveInout(mio) @@ -143,5 +275,4 @@ logger.Error("UpdateMoveInoutErr Error: ", UpdateMoveInoutErr) } } - } -- Gitblit v1.8.0