zhangzengfei
2024-09-29 3737ab3dd0cc753be986638316c96cb3114601e4
rule/engine.go
@@ -2,7 +2,6 @@
import (
   "basic.com/valib/logger.git"
   "errors"
   "fmt"
   "math"
   "ruleModelEngine/db"
@@ -18,19 +17,17 @@
   // 遍历Resident结构体切片
   for _, resident := range residents {
      //fmt.Println("gogogogo!!!!!!!!!!!!!!!!!!!!!!!!!!!")
      // 将字符串类型的时间转换为time.Time类型,并只保留年月日
      lastAppearanceTime := time.Unix(resident.LastAppearanceTime, 0)
      lastAppearanceDate := time.Date(lastAppearanceTime.Year(), lastAppearanceTime.Month(), lastAppearanceTime.Day(), 0, 0, 0, 0, lastAppearanceTime.Location())
      //lastAppearanceTime, err := time.Parse("2006-01-02", resident.LastAppearanceTime)
      datePart := strings.Split(resident.CreateAt, "T")[0]
      createdAt, err := time.Parse("2006-01-02", datePart)
      createdAt, err := time.Parse("2006-01-02", resident.CreateAt)
      if err != nil {
         fmt.Println(err)
         // 处理时间解析错误
         // 可以选择跳过该条数据或者记录日志
         continue
      }
      // 计算LastAppearanceTime和CreateAt距离当前日期的天数
      daysSinceLastAppearance := currentDate.Sub(lastAppearanceDate).Hours() / 24
      daysSinceCreateAt := currentDate.Sub(createdAt).Hours() / 24
@@ -57,12 +54,15 @@
         }
      }
      if status == "" {
         continue
      }
      //fmt.Println("status: ", status)
      moveInout = append(moveInout, db.MoveInout{
         DocumentNumber: resident.DocumentNumber,
         CommunityID:    resident.CommunityID,
         MoveInDate:     createdAt,           // 存储年月日
         MoveOutDate:    &lastAppearanceDate, // 存储年月日
         CommunityID:    resident.CommunityId,
         MoveInDate:     createdAt.Format("2006-01-02"),          // 存储年月日
         MoveOutDate:    lastAppearanceDate.Format("2006-01-02"), // 存储年月日
         MoveType:       moveType,
         Status:         status,
      })
@@ -71,18 +71,18 @@
   return moveInout
}
func ProcessRuleEngine(personInfos []db.CaptureInfo, ruleInfo []db.PersonnelStatusRule, cmmunityID string) (bool, error) {
   ruleInfoCheck := checkRuleValidity(ruleInfo)
   if ruleInfoCheck == false {
      logger.Error("规则库数据异常")
      return false, errors.New("规则库数据异常")
   }
   fmt.Println("清洗前: ", len(personInfos))
   logger.Info("规则算法执行完毕!!!")
   return true, nil
}
//func ProcessRuleEngine(personInfos []db.CaptureInfo, ruleInfo []db.PersonnelStatusRule, cmmunityID string) (bool, error) {
//   ruleInfoCheck := checkRuleValidity(ruleInfo)
//   if ruleInfoCheck == false {
//      logger.Error("规则库数据异常")
//      return false, errors.New("规则库数据异常")
//   }
//   fmt.Println("清洗前: ", len(personInfos))
//   logger.Info("规则算法执行完毕!!!")
//   return true, nil
//}
func CreateLinearModel(personInfos []db.CaptureInfo, communityID string, threshold float64, validDays int) ([]db.Identity, []db.CaptureInfo) {
func CreateLinearModel(personInfos []db.CaptureInfo, communityID string, threshold float64, validDays int, labelId string) ([]db.Identity, []db.CaptureInfo) {
   identity := make([]db.Identity, 0)
   captureInfo := make([]db.CaptureInfo, 0)
   for _, info := range personInfos {
@@ -111,15 +111,18 @@
            //fmt.Println(addrDataArray)
            //fmt.Println("threshold: ", threshold)
            //fmt.Println("stdDev: ", stdDev)
            info.Status = "fieldworker"
            //info.Status = "fieldworker"
            info.Status = "visitor"
            captureInfo = append(captureInfo, info)
            identity = append(identity, db.Identity{
               CommunityID:    communityID,
               DocumentNumber: info.DocumentNumber,
               LabelId:        3,
               LabelId:        labelId,
               ExpireTime:     GetCurrentDateAddDaysTimestamp(validDays)})
            continue
         }
         captureInfo = append(captureInfo, info)
      } else {
         captureInfo = append(captureInfo, info)
      }
@@ -149,26 +152,32 @@
   fmt.Println(addrData)
}
func CreateProcessModel(personInfos []db.CaptureInfo, days int) {
   timeTOIndex := getIndexForTime(24 * 60)
   dateTOIndex := getIndexForDate(days)
   //fmt.Println(dateTOIndex)
   inModelMatrix := make([][]int, days)
   for i := range inModelMatrix {
      inModelMatrix[i] = make([]int, 24*60)
func CreateProcessModel(personInfos []db.CaptureInfo, days int, communityID string, labelManage []db.LabelManage) []db.Identity {
   labelIndexMap := make(map[string]int)
   for index, labelManageInfo := range labelManage {
      labelIndexMap[labelManageInfo.Name] = index
   }
   outModelMatrix := make([][]int, days)
   for i := range outModelMatrix {
      outModelMatrix[i] = make([]int, 24*60)
   }
   identity := make([]db.Identity, 0)
   for _, info := range personInfos {
      timeTOIndex := getIndexForTime(24 * 60)
      dateTOIndex := getIndexForDate(days)
      //fmt.Println(dateTOIndex)
      inModelMatrix := make([][]int, days)
      for i := range inModelMatrix {
         inModelMatrix[i] = make([]int, 24*60)
      }
      outModelMatrix := make([][]int, days)
      for i := range outModelMatrix {
         outModelMatrix[i] = make([]int, 24*60)
      }
      //fmt.Println("info: ", info)
      for _, captureInfo := range info.CaptureDetail {
         captrueDateTime := captureInfo.CaptureDate
         dateTimeObj, err := time.Parse("2006-01-02 15:04:05", captrueDateTime)
         if err != nil {
            logger.Error("Parse time error", err)
            return
            continue
            //return n/**/il, err
         }
         if isWeekend(dateTimeObj) {
            continue
@@ -184,9 +193,66 @@
            continue
         }
      }
      countMaxRows, colS, colE := CountMaxRows(outModelMatrix, 30, 30)
      logger.Info("规律出勤时间段:", colS, colE, "\t次数: ", countMaxRows)
      if countMaxRows >= 10 {
         if info.Age <= 22 && info.Age >= 7 {
            lIndex := labelIndexMap["学生"]
            identity = append(identity, db.Identity{
               CommunityID:    communityID,
               DocumentNumber: info.DocumentNumber,
               LabelId:        labelManage[lIndex].ID,
               ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
         } else if info.Age >= 23 && info.Age <= 60 {
            lIndex := labelIndexMap["上班族"]
            identity = append(identity, db.Identity{
               CommunityID:    communityID,
               DocumentNumber: info.DocumentNumber,
               LabelId:        labelManage[lIndex].ID,
               ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
         } else if info.Age > 60 {
            lIndex := labelIndexMap["离退休人员"]
            identity = append(identity, db.Identity{
               CommunityID:    communityID,
               DocumentNumber: info.DocumentNumber,
               LabelId:        labelManage[lIndex].ID,
               ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
         }
         //fmt.Println("上班族", info.DocumentNumber, info.Age, countMaxRows, colS, colE)
      } else {
         countMaxRows, colS, colE := CountMaxRows(inModelMatrix, 30, 30)
         logger.Info("规律出勤时间段:", colS, colE, "\t次数: ", countMaxRows)
         if countMaxRows >= 10 {
            if info.Age <= 22 && info.Age >= 7 {
               lIndex := labelIndexMap["学生"]
               identity = append(identity, db.Identity{
                  CommunityID:    communityID,
                  DocumentNumber: info.DocumentNumber,
                  LabelId:        labelManage[lIndex].ID,
                  ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
            } else if info.Age >= 23 && info.Age <= 60 {
               lIndex := labelIndexMap["上班族"]
               identity = append(identity, db.Identity{
                  CommunityID:    communityID,
                  DocumentNumber: info.DocumentNumber,
                  LabelId:        labelManage[lIndex].ID,
                  ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
            } else if info.Age > 60 {
               lIndex := labelIndexMap["离退休人员"]
               identity = append(identity, db.Identity{
                  CommunityID:    communityID,
                  DocumentNumber: info.DocumentNumber,
                  LabelId:        labelManage[lIndex].ID,
                  ExpireTime:     GetCurrentDateAddDaysTimestamp(labelManage[lIndex].ValidDays)})
            }
            //fmt.Println("上班族", info.DocumentNumber, info.Age, countMaxRows, colS, colE)
         }
      }
      //fmt.Println("outModelMatrix: ", outModelMatrix)
      //fmt.Println("inModelMatrix: ", inModelMatrix)
   }
   fmt.Println(outModelMatrix)
   fmt.Println(inModelMatrix)
   return identity
}
// 计算一阶导数