liuxiaolong
2019-10-29 262c28082842d9f487f187075da0ce7a6ed3b31d
controllers/fileController.go
@@ -6,6 +6,7 @@
   "basic.com/pubsub/protomsg.git"
   "bytes"
   "encoding/base64"
   "encoding/json"
   "errors"
   "fmt"
   "github.com/gin-gonic/gin"
@@ -280,6 +281,7 @@
         logger.Debug("localConfig is wrong!!!")
         return nil
      }
      logger.Debug("captureIds:",strings.Join(captureIds,","))
      videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)))
      logger.Debug("comp videoPersons.len:",len(videopersons))
      for _,vp :=range videopersons {
@@ -390,56 +392,56 @@
      return
   }
   var faceB []byte
   var uploadImage string
   var smImages []string
   //if searchBody.CaptureId != "" {//做查找此人,搜所有抓拍和底库
   //   searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CaptureId, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)))
   //   if err !=nil {
   //      util.ResponseFormat(c, code.ComError, "抓拍数据不存在,请检查")
   //      return
   //   }
   //   if searchBase64Fea !=""{
   //      decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea)
   //      if err !=nil {
   //         util.ResponseFormat(c, code.ComError, "本条抓怕特征不是base64,请检查")
   //         return
   //      }
   //      faceB = decodeF
   //   }
   //} else {//做以图搜图
   //
   //}
   logger.Debug("compTargetId:",searchBody.CompTargetId,",compTargetType:",searchBody.CompTargetType)
   if searchBody.CompTargetId != "" {//做查找此人,按抓拍的人脸或者底库的人脸以图搜图
      if searchBody.CompTargetType == 0 {//本张人脸是底库人脸
         var dbpApi dbapi.DbPersonApi
         dbPersons, e := dbpApi.Dbpersoninfosbyid([]string{searchBody.CompTargetId})
         if e ==nil && dbPersons !=nil && len(dbPersons) ==1 {
            searchBase64Fea := dbPersons[0].FaceFeature
            if searchBase64Fea != "" {
               decodeF, err := base64.StdEncoding.DecodeString(dbPersons[0].FaceFeature)
               if err !=nil {
                  util.ResponseFormat(c, code.ComError, "本条底库人员特征不是base64,请检查")
                  return
               }
               faceB = decodeF
            } else {
               util.ResponseFormat(c, code.ComError, "本条底库人员特征为空,请检查")
               return
            }
         } else {
            util.ResponseFormat(c, code.ComError, "底库人员查询失败,请检查")
            return
         }
      } else {
         searchBase64Fea, err := esApi.GetVideoPersonFaceFeatureById(searchBody.CompTargetId, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)))
         if err !=nil {
            util.ResponseFormat(c, code.ComError, "抓拍数据不存在,请检查")
            return
         }
   if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{
      httpPicUrl := ""
      idx := strings.LastIndex(searchBody.PicUrl, ":")
      if idx>-1 {
         httpPicUrl = "http://"+localConf.WebPicIp+searchBody.PicUrl[idx:]
      } else {
         util.ResponseFormat(c, code.RequestParamError, "图片路径有误,请重新上传图片")
         if searchBase64Fea !=""{
            decodeF, err := base64.StdEncoding.DecodeString(searchBase64Fea)
            if err !=nil {
               util.ResponseFormat(c, code.ComError, "本条抓怕特征不是base64,请检查")
               return
            }
            faceB = decodeF
         }
      }
   } else {//做以图搜图
      if searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
         util.ResponseFormat(c, code.RequestParamError, "以图搜图PicUrl不能为空")
         return
      }
      logger.Debug("httpPicUrl:",httpPicUrl)
      rb,err := util.ReadImgData(httpPicUrl)
      if err !=nil {
         util.ResponseFormat(c, code.RequestParamError, "读取图片失败,请重新上传图片")
         return
      }
      feaB, oriImg, smImgs, e := GetFeaFromOneFaceImg(rb)
      if e !=nil {
         util.ResponseFormat(c, code.RequestParamError, "未提取到特征,请重新上传图片")
      if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{
         util.ResponseFormat(c, code.RequestParamError, "人脸特征未检测,请重新上传图片")
         return
      } else {
         uploadImage = oriImg
         smImages = smImgs
         faceB = feaB
         faceB = face.FaceBytes
      }
   } else {
      faceB = face.FaceBytes
   }
   if faceB == nil {
@@ -499,9 +501,7 @@
      CompareData: &totalData,
   })
   m := make(map[string]interface{},5)
   m["uploadImage"] = uploadImage
   m["smImage"] = smImages
   m := make(map[string]interface{},3)
   if totalData != nil && totalData.Len() > 0{
      sort.Sort(totalData)
      total := totalData.Len()
@@ -526,78 +526,138 @@
   util.ResponseFormat(c,code.Success,m)
}
func GetCompareDataTwice(co *service.CompareOnce,arg *models.EsSearch) map[string]interface{} {
   //camIds := arg.TreeNodes
   //tabIds := arg.Tabs
   //taskIds := arg.Tasks
   //alarmLevels := arg.AlarmLevel
   //timeArr := arg.SearchTime
   //input := arg.InputValue
   //resultList := make([]CompareResult,0)
   //for _,each :=range *co.CompareData {
   //   if each.Id !=""{
   //      n :=0
   //      if len(camIds) == 0 || isInArr(each.CameraId,camIds) {
   //         n++
   //      }
   //      if len(tabIds) == 0 {
   //         n++
   //      }
   //      if len(taskIds) == 0 || isInArr(each.TaskId, taskIds) {
   //         n++
   //      }
   //      //判断报警等级
   //      if len(alarmLevels) == 0 {
   //
   //      }
   //      n++
   //      //判断时间
   //      if len(timeArr) == 0 {
   //
   //      }
   //      n++
   //      if input == ""{
   //
   //      }
   //      n++
   //      if n == 6 {
   //         resultList = append(resultList,cr)
   //      }
   //   } else {
   //      resultList = append(resultList,cr)
   //   }
   //}
type PersonId struct {
   Id string `json:"id"`
}
   //logger.Debug("GetCompareDataTwice.data:",resultList)
   //service.SortByScore(resultList)
   from := (arg.Page-1)*arg.Size
   to := from + arg.Size
   var sCompResult protomsg.SdkCompareResult
   total := len(*co.CompareData)
   if total <= to {
      sCompResult.CompareResult = (*co.CompareData)[from:total]
   } else {
      sCompResult.CompareResult = (*co.CompareData)[from:to]
   }
   resultList := FillDataToCompareResult(&sCompResult)
func GetCompareDataTwice(co *service.CompareOnce,searchBody *models.EsSearch) map[string]interface{} {
   m := make(map[string]interface{},0)
   m["total"] = total
   m["compareNum"] = arg.CompareNum
   m["totalList"] = resultList
   //if from < len(resultList) {
   //   if to <= len(resultList) {
   //      m["totalList"] = resultList[from:to]
   //   } else {
   //      lte := len(resultList)
   //      m["totalList"] = resultList[from:lte]
   //   }
   from := (searchBody.Page-1)*searchBody.Size
   to := from + searchBody.Size
   var hasCompEsPerson = false
   if searchBody.DataBases !=nil {
      for idx,tableId :=range searchBody.DataBases {
         if tableId == "esData" {
            hasCompEsPerson = true
            searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...)
            break
         }
      }
   }
   if hasCompEsPerson {//二次检索ES比对结果
      arg := protomsg.CompareArgs{
         CompareThreshold: searchBody.Threshold,
      }
      localConf, err := cache.GetServerInfo()
      if err ==nil && localConf.AlarmIp != "" && localConf.ServerId != "" {
         arg.Source = true // 标识来源是web
         arg.AlarmLevel = searchBody.AlarmLevel
         arg.Tasks = searchBody.Tasks
         arg.TreeNodes = searchBody.TreeNodes
         arg.Tabs = searchBody.Tabs
         arg.SearchTime = searchBody.SearchTime
         arg.InputValue = searchBody.InputValue
         arg.Collection = searchBody.Collection
         arg.AnalyServerId = localConf.ServerId
         alarmLevelTypes := strings.Replace(strings.Trim(fmt.Sprint(getAlarmLevel(searchBody.AlarmLevel)), "[]"), " ", "\",\"", -1)
         captureIds := esApi.GetAllLocalVideopersonsId(arg, config.EsInfo.EsIndex.VideoPersons.IndexName, localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), alarmLevelTypes)
         logger.Debug("searchPhoto first Result.len:",len(*co.CompareData),"twice len(captureIds):",len(captureIds))
         if captureIds !=nil {
            var aResult protomsg.SdkCompareResult
            aList := getTwiceSearchResult(co, &captureIds)
            aTotal := aList.Len()
            if aTotal <= to {
               aResult.CompareResult = (*aList)[from:aTotal]
            } else {
               aResult.CompareResult = (*aList)[from:to]
            }
            out := FillDataToCompareResult(&aResult)
            m["total"] = aTotal
            m["compareNum"] = searchBody.CompareNum
            m["totalList"] = out
            return m
         } else {
            m["total"] = 0
            m["compareNum"] = searchBody.CompareNum
            m["totalList"] = []interface{}{}
            return m
         }
      }
   } else {//底库数据的二次检索
      var dbpApi dbapi.DbPersonApi
      personIds, _ := dbpApi.FindLikePersonIds(searchBody.DataBases, searchBody.InputValue)
      logger.Debug("searchPhoto first Result.len:",len(*co.CompareData),"personIds:",personIds)
      if personIds !=nil {
         var pIds []PersonId
         b, _ := json.Marshal(personIds)
         json.Unmarshal(b, &pIds)
         if len(pIds) >0 {
            var personIdArr []string
            for _,pid :=range pIds{
               personIdArr = append(personIdArr, pid.Id)
            }
            var aResult protomsg.SdkCompareResult
            aList := getTwiceSearchResult(co, &personIdArr)
            aTotal := aList.Len()
            if aTotal <= to {
               aResult.CompareResult = (*aList)[from:aTotal]
            } else {
               aResult.CompareResult = (*aList)[from:to]
            }
            out := FillDataToCompareResult(&aResult)
            m["total"] = aTotal
            m["compareNum"] = searchBody.CompareNum
            m["totalList"] = out
            return m
         }
      } else {
         m["total"] = 0
         m["compareNum"] = searchBody.CompareNum
         m["totalList"] = []interface{}{}
         return m
      }
   }
   //var sCompResult protomsg.SdkCompareResult
   //total := len(*co.CompareData)
   //if total <= to {
   //   sCompResult.CompareResult = (*co.CompareData)[from:total]
   //} else {
   //   m["totalList"] = []CompareResult{}
   //   sCompResult.CompareResult = (*co.CompareData)[from:to]
   //}
   //resultList := FillDataToCompareResult(&sCompResult)
   m["total"] = 0
   m["compareNum"] = searchBody.CompareNum
   m["totalList"] = []interface{}{}
   return m
}
func getTwiceSearchResult(co *service.CompareOnce, scopeIds *[]string) *service.CompareList{
   m := make(map[string]string)
   for _,capId :=range *scopeIds {
      m[capId] = capId
   }
   var totalData service.CompareList
   for _,each :=range *co.CompareData {
      if _,ok :=m[each.Id];ok{
         totalData = append(totalData, each)
      }
   }
   if totalData != nil && totalData.Len() > 0{
      sort.Sort(totalData)
   }
   return &totalData
}
func isInArr(id string,arr []string) bool {
   for _,v :=range arr {
      if v == id {