liuxiaolong
2019-07-31 e70b62f740db3a723e768892284eb00a2e30f320
service/FaceCompareService.go
@@ -1,7 +1,6 @@
package service
import (
   esApi "basic.com/pubsub/esutil.git"
   "basic.com/pubsub/protomsg.git"
   "github.com/gogo/protobuf/proto"
   "github.com/satori/go.uuid"
@@ -10,11 +9,9 @@
   "nanomsg.org/go-mangos/transport/ipc"
   "nanomsg.org/go-mangos/transport/tcp"
   "sort"
   "strconv"
   "sync"
   "webserver/extend/config"
   "webserver/extend/logger"
   "webserver/extend/util"
)
type FaceCompareService struct {
@@ -31,26 +28,26 @@
type CompareOnce struct {
   CompareNum string `json:"compareOnce"`
   CompareData []CompareResult `json:"compareData"`
   CompareData *[]*protomsg.SdkCompareEach `json:"compareData"`
}
type CompareResultWrapper struct {
   CompareData []CompareResult
   By func(p,q *CompareResult) bool
   CompareData *[]*protomsg.SdkCompareEach
   By func(p,q *protomsg.SdkCompareEach) bool
}
func (crw CompareResultWrapper) Len()int {
   return len(crw.CompareData)
   return len(*crw.CompareData)
}
func (crw CompareResultWrapper) Swap(i,j int) {
   crw.CompareData[i],crw.CompareData[j] = crw.CompareData[j],crw.CompareData[i]
   (*crw.CompareData)[i],(*crw.CompareData)[j] = (*crw.CompareData)[j],(*crw.CompareData)[i]
}
func (crw CompareResultWrapper) Less(i,j int) bool{
   return crw.By(&crw.CompareData[i],&crw.CompareData[j])
   return crw.By((*crw.CompareData)[i],(*crw.CompareData)[j])
}
func SortByScore(list []CompareResult) {
   sort.Sort(CompareResultWrapper{list, func(p, q *CompareResult) bool {
func SortByScore(list *[]*protomsg.SdkCompareEach) {
   sort.Sort(CompareResultWrapper{list, func(p, q *protomsg.SdkCompareEach) bool {
      return q.CompareScore < p.CompareScore //递减排序
   }})
}
@@ -76,45 +73,12 @@
var CaptureTable = "capturetable" // 抓拍库
type CompareResult struct {
   Id string `json:"id"`
   CompareScore float32 `json:"compareScore"`
   CameraId string `json:"cameraId"`
   CameraAddr string `json:"cameraAddr"`
   PicDate string `json:"picDate"`
   Content string `json:"content"`
   IsAlarm int `json:"isAlarm"`
   PicMaxUrl string `json:"picMaxUrl"`
   PicSmUrl []string `json:"picSmUrl"`
   Sex string `json:"sex"`
   AgeDescription string `json:"ageDescription"`
   Race string `json:"race"`
   TaskId string `json:"taskId"`
   TaskName string `json:"taskName"`
   BaseInfo []DbPersonVo `json:"baseInfo"`
   VideoUrl string `json:"videoUrl"`
   SdkName string `json:"sdkName"`
}
type DbPersonVo struct {
   BwType string `json:"bwType"`
   CompareScore float32 `json:"compareScore"`
   IdCard string `json:"idCard"`
   MonitorLevel string `json:"monitorLevel"`
   PersonId string `json:"personId"`
   PersonName string `json:"personName"`
   PersonPicUrl string `json:"personPicUrl"`
   PhoneNum string `json:"phoneNum"`
   Sex string `json:"sex"`
   TableId string `json:"tableId"`
   TableName string `json:"tableName"`
}
func (sv *FaceCompareService) Compare() *CompareOnce{
   b, err := proto.Marshal(&sv.CompareArgs)
   compServerList := config.CompServerInfo.Url
   logger.Debug("compServerList:", compServerList)
   //1.向各个compare进程发起请求拿到比对结果
   resultList :=make([]CompareResult,0)
   resultList :=make([]*protomsg.SdkCompareEach,0)
   for _,str :=range compServerList{
      reqUrl := "tcp://"+str
      resultB := doCompareRequest(reqUrl,b)
@@ -131,7 +95,8 @@
      logger.Debug("comp len(rList):", len(sdkCompResult.CompareResult))
      if len(sdkCompResult.CompareResult) >0 {
         resultList = append(resultList, FillDataToCompareResult(&sdkCompResult)...)
         resultList = append(resultList, sdkCompResult.CompareResult...)
         //resultList = append(resultList, FillDataToCompareResult(&sdkCompResult)...)
      }
   }
   logger.Debug("comp totalList.len:", len(resultList))
@@ -139,7 +104,7 @@
   //2.缓存比对结果
   co := &CompareOnce{
      CompareNum: sv.CompareNum,
      CompareData: resultList,
      CompareData: &resultList,
   }
   SetCompResultByNum(co)
@@ -174,112 +139,4 @@
   }
   sock.Close()
   return &msg
}
//填充向前端返回的数据
func FillDataToCompareResult(compResult *protomsg.SdkCompareResult) []CompareResult {
   resultList :=make([]CompareResult,0)
   dbPersonM := make(map[string]*protomsg.SdkCompareEach, 0)
   captureM := make(map[string]*protomsg.SdkCompareEach, 0)
   personIds :=make([]string,0)
   captureIds := make([]string,0)
   for _,v :=range compResult.CompareResult{
      if v.Tableid == CaptureTable {
         captureM[v.Id] = v
         captureIds = append(captureIds,v.Id)
      } else {
         dbPersonM[v.Id] = v
         personIds = append(personIds,v.Id)
      }
   }
   logger.Debug("comp len(personIds):", len(personIds))
   logger.Debug("comp len(captureIds):", len(captureIds))
   esServerIp := config.EsInfo.Masterip
   esServerPort := config.EsInfo.Httpport
   index := config.EsInfo.EsIndex.Dbtablepersons.IndexName
   var dbpersons []protomsg.Dbperson
   if len(personIds) >0 {
      dbpersons, _ = esApi.Dbpersoninfosbyid(personIds, index, esServerIp, esServerPort)
   }
   logger.Debug("comp dbpersons.len:", len(dbpersons))
   if dbpersons !=nil {
      for _,p :=range dbpersons {
         var dbP = DbPersonVo {
            PersonId: p.Id,
            IdCard: p.IdCard,
            CompareScore: util.ParseScore(dbPersonM[p.Id].CompareScore),
            MonitorLevel: p.MonitorLevel,
            PersonName: p.PersonName,
            PersonPicUrl: p.PersonPicUrl,
            PhoneNum: p.PhoneNum,
            Sex: p.Sex,
            TableId: p.TableId,
         }
         dbTableInfos, _ := esApi.Dbtablefosbyid([]string{p.TableId}, config.EsInfo.EsIndex.DbTables.IndexName, esServerIp, esServerPort)
         if dbTableInfos !=nil{
            dbP.BwType = dbTableInfos[0].BwType
            dbP.TableName = dbTableInfos[0].TableName
         }
         var cr = CompareResult{
            BaseInfo:[]DbPersonVo{ dbP },
         }
         resultList = append(resultList,cr)
      }
   }
   if len(captureIds) >0 {
      videopersons, _ := esApi.Videopersonsinfosbyid(captureIds, config.EsInfo.EsIndex.VideoPersons.IndexName, config.EsInfo.Masterip, config.EsInfo.Httpport)
      logger.Debug("comp videoPersons.len:",len(videopersons))
      for _,vp :=range videopersons {
         isAlarmInt, _ := strconv.Atoi(vp.IsAlarm)
         bi := make([]DbPersonVo,0)
         for _,p :=range vp.BaseInfo {
            bi = append(bi, DbPersonVo{
               PersonId: p.PersonId,
               IdCard: p.IdCard,
               CompareScore: util.ParseScore(p.CompareScore),
               MonitorLevel: parseMonitorLevel(p.MonitorLevel),
               PersonName: p.PersonName,
               PersonPicUrl: p.PersonPicUrl,
               PhoneNum: p.PhoneNum,
               Sex: p.Sex,
               TableId: p.TableId,
            })
         }
         vpE := CompareResult{
            Id: vp.Id,
            CompareScore: util.ParseScore(captureM[vp.Id].CompareScore),
            CameraId: vp.CameraId,
            CameraAddr: vp.CameraAddr,
            PicDate: vp.PicDate,
            PicMaxUrl: vp.PicMaxUrl,
            PicSmUrl: vp.PicSmUrl,
            IsAlarm: isAlarmInt,
            Sex: vp.Sex,
            AgeDescription: vp.AgeDescription,
            Race: vp.Race,
            TaskName: vp.TaskName,
            TaskId: vp.TaskId,
            VideoUrl: vp.VideoUrl,
            BaseInfo: bi,
            SdkName: "人脸",
         }
         resultList = append(resultList,vpE)
      }
   }
   return  resultList
}
func parseMonitorLevel(level string) string {
   if level == "1" {
      return "一级"
   }
   if level == "2" {
      return "二级"
   }
   if level == "3" {
      return "三级"
   }
   return level
}