package service import ( esApi "basic.com/pubsub/esutil.git" "basic.com/pubsub/protomsg.git" "encoding/json" "github.com/gogo/protobuf/proto" "github.com/satori/go.uuid" "nanomsg.org/go-mangos" "nanomsg.org/go-mangos/protocol/req" "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 { CompareNum string CompareArgs protomsg.CompareArgs } func NewFaceCompareService(args protomsg.CompareArgs) *FaceCompareService { return &FaceCompareService{ CompareNum: uuid.NewV4().String(), CompareArgs:args, } } type CompareOnce struct { CompareNum string `json:"compareOnce"` CompareData []CompareResult `json:"compareData"` } type CompareResultWrapper struct { CompareData []CompareResult By func(p,q *CompareResult) bool } func (crw CompareResultWrapper) Len()int { return len(crw.CompareData) } func (crw CompareResultWrapper) Swap(i,j int) { 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]) } func SortByScore(list []CompareResult) { sort.Sort(CompareResultWrapper{list, func(p, q *CompareResult) bool { return q.CompareScore < p.CompareScore //递减排序 }}) } var compResultHisM = make(map[string]*CompareOnce,0) var lock sync.Mutex func SetCompResultByNum(co *CompareOnce) { lock.Lock() defer lock.Unlock() compResultHisM[co.CompareNum] = co } func GetCompResultByNum(num string) *CompareOnce { lock.Lock() defer lock.Unlock() if co,ok := compResultHisM[num];ok { return co } else { return nil } } 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) for _,str :=range compServerList{ reqUrl := "tcp://"+str resultB := doCompareRequest(reqUrl,b) if resultB == nil || len(*resultB) ==0 { continue } rList :=make([]protomsg.Esinfo,0) err = json.Unmarshal(*resultB, &rList) if err !=nil{ logger.Debug("comp recv result Unmarshal err:", err) continue } logger.Debug("comp len(rList):", len(rList)) if len(rList) >0 { resultList = append(resultList, FillDataToCompareResult(&rList)...) } } logger.Debug("comp totalList.len:", len(resultList)) //2.缓存比对结果 co := &CompareOnce{ CompareNum: sv.CompareNum, CompareData: resultList, } SetCompResultByNum(co) return co } func doCompareRequest(url string,args []byte) *[]byte{ logger.Debug("comp reqUrl:",url) var sock mangos.Socket var err error var msg []byte if sock,err = req.NewSocket();err !=nil { logger.Debug("comp can't new req socket:%s",err.Error()) return nil } sock.AddTransport(ipc.NewTransport()) sock.AddTransport(tcp.NewTransport()) if err = sock.Dial(url);err !=nil { logger.Debug("comp can't dial on req socket:%s",err.Error()) return nil } sock.SetOption(mangos.OptionMaxRecvSize, 1024*1024*100) //sock.SetOption(mangos.OptionRecvDeadline, time.Second*10) if err = sock.Send(args);err !=nil { logger.Debug("comp can't send message on push socket:%s",err.Error()) return nil } if msg,err = sock.Recv();err !=nil { logger.Debug("comp sock.Recv receive err:%s",err.Error()) return nil } sock.Close() return &msg } //填充向前端返回的数据 func FillDataToCompareResult(rList *[]protomsg.Esinfo) []CompareResult { resultList :=make([]CompareResult,0) dbPersonM := make(map[string]*protomsg.Esinfo,0) captureM := make(map[string]*protomsg.Esinfo,0) personIds :=make([]string,0) captureIds := make([]string,0) for _,v :=range *rList{ 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 personIds:", personIds) logger.Debug("comp captureIds:",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) } } var capturePersons []protomsg.Videopersons if len(captureIds) >0 { logger.Debug("comp capturePersons.len:", len(capturePersons)) 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 }