sunty
2024-09-03 b0f374409775bd30ed8f0dc8d47d015d3edc0abb
rule/engine.go
@@ -2,7 +2,6 @@
import (
   "basic.com/valib/logger.git"
   "errors"
   "fmt"
   "math"
   "ruleModelEngine/db"
@@ -57,10 +56,13 @@
         }
      }
      if status == "" {
         continue
      }
      //fmt.Println("status: ", status)
      moveInout = append(moveInout, db.MoveInout{
         DocumentNumber: resident.DocumentNumber,
         CommunityID:    resident.CommunityID,
         CommunityID:    resident.CommunityId,
         MoveInDate:     createdAt,           // 存储年月日
         MoveOutDate:    &lastAppearanceDate, // 存储年月日
         MoveType:       moveType,
@@ -71,18 +73,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 int) ([]db.Identity, []db.CaptureInfo) {
   identity := make([]db.Identity, 0)
   captureInfo := make([]db.CaptureInfo, 0)
   for _, info := range personInfos {
@@ -116,10 +118,12 @@
            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 +153,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 +194,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
}
// 计算一阶导数