package service
|
|
import (
|
esApi "basic.com/pubsub/esutil.git"
|
"basic.com/pubsub/protomsg.git"
|
"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
|
}
|
var sdkCompResult protomsg.SdkCompareResult
|
//rList :=make([]protomsg.Esinfo,0)
|
err = proto.Unmarshal(*resultB, &sdkCompResult)
|
if err !=nil {
|
logger.Debug("comp sdkCompareResult unmarshal err:", err)
|
continue
|
}
|
|
logger.Debug("comp len(rList):", len(sdkCompResult.CompareResult))
|
if len(sdkCompResult.CompareResult) >0 {
|
resultList = append(resultList, FillDataToCompareResult(&sdkCompResult)...)
|
}
|
}
|
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(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)
|
}
|
}
|
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
|
}
|